Author: michiel
Date: 2009-06-29 15:25:38 +0200 (Mon, 29 Jun 2009)
New Revision: 36467

Modified:
   
mmbase/trunk/core/src/main/java/org/mmbase/storage/search/implementation/BasicSearchQuery.java
Log:
caching only the hashcodes of unmodifiable queries

Modified: 
mmbase/trunk/core/src/main/java/org/mmbase/storage/search/implementation/BasicSearchQuery.java
===================================================================
--- 
mmbase/trunk/core/src/main/java/org/mmbase/storage/search/implementation/BasicSearchQuery.java
      2009-06-29 13:22:33 UTC (rev 36466)
+++ 
mmbase/trunk/core/src/main/java/org/mmbase/storage/search/implementation/BasicSearchQuery.java
      2009-06-29 13:25:38 UTC (rev 36467)
@@ -45,8 +45,6 @@
 
     private boolean aggregating = false;
 
-    /** Two variables to speed up hashCode() by caching the result */
-    private boolean hasChangedHashcode = true;
     private int savedHashcode = -1;
 
     /**
@@ -64,7 +62,6 @@
      */
     public BasicSearchQuery(boolean aggregating) {
         this.aggregating = aggregating;
-        hasChangedHashcode = true;
     }
 
     /**
@@ -106,7 +103,6 @@
             log.debug("Unknown copy method " + copyMethod);
             break;
         }
-        hasChangedHashcode = true;
     }
 
 
@@ -181,7 +177,6 @@
         }
         //log.info("copied steps " + q.getSteps() + " became " + steps);
         unmodifiableSteps = Collections.unmodifiableList(steps);
-        hasChangedHashcode = true;
     }
     protected void copyFields(SearchQuery q) {
         if (! modifiable) throw new IllegalStateException("Unmodifiable");
@@ -198,7 +193,6 @@
             BasicStepField newField = addField(newStep, 
bul.getField(field.getFieldName()));
             newField.setAlias(field.getAlias());
         }
-        hasChangedHashcode = true;
         //log.info("copied fields " + q.getFields() + " became " + fields);
     }
     protected void copySortOrders(SearchQuery q) {
@@ -219,7 +213,6 @@
             BasicSortOrder newSortOrder = addSortOrder(newField);
             newSortOrder.setDirection(sortOrder.getDirection());
         }
-        hasChangedHashcode = true;
     }
 
     /**
@@ -318,7 +311,6 @@
     public BasicSearchQuery setDistinct(boolean distinct) {
         if (! modifiable) throw new IllegalStateException("Unmodifiable");
         this.distinct = distinct;
-        hasChangedHashcode = true;
         return this;
     }
 
@@ -335,7 +327,6 @@
             throw new IllegalArgumentException( "Invalid maxNumber value: " + 
maxNumber);
         }
         this.maxNumber = maxNumber;
-        hasChangedHashcode = true;
         return this;
     }
 
@@ -353,7 +344,6 @@
             "Invalid offset value: " + offset);
         }
         this.offset = offset;
-        hasChangedHashcode = true;
         return this;
     }
 
@@ -368,7 +358,6 @@
         if (! modifiable) throw new IllegalStateException("Unmodifiable");
         BasicStep step = new BasicStep(builder);
         steps.add(step);
-        hasChangedHashcode = true;
         return step;
     }
 
@@ -395,7 +384,6 @@
         BasicRelationStep relationStep = new BasicRelationStep(builder, 
previous, next);
         steps.add(relationStep);
         steps.add(next);
-        hasChangedHashcode = true;
         return relationStep;
     }
 
@@ -417,7 +405,6 @@
         BasicStepField field = new BasicStepField(step, fieldDefs);
         assert ! fields.contains(field) : "" + field + " is already one of " + 
fields;
         fields.add(field);
-        hasChangedHashcode = true;
         return field;
     }
 
@@ -433,7 +420,6 @@
         int i = fields.indexOf(field);
         if (i == -1) {
             fields.add(field);
-            hasChangedHashcode = true;
         } else {
             field = (BasicStepField) fields.get(i);
         }
@@ -466,13 +452,11 @@
                 mapField(field, stepField);
             }
         }
-        hasChangedHashcode = true;
     }
 
     public void removeFields() {
         if (! modifiable) throw new IllegalStateException("Unmodifiable");
         fields.clear();
-        hasChangedHashcode = true;
     }
 
     /**
@@ -495,7 +479,6 @@
         }
         BasicAggregatedField stepField = new BasicAggregatedField(step, field, 
aggregationType);
         fields.add(stepField);
-        hasChangedHashcode = true;
         return stepField;
     }
 
@@ -516,7 +499,6 @@
             sortOrder = new BasicSortOrder(field);
         }
         sortOrders.add(sortOrder);
-        hasChangedHashcode = true;
         return sortOrder;
     }
 
@@ -529,7 +511,6 @@
     public void setConstraint(Constraint constraint) {
         if (! modifiable) throw new IllegalStateException("Unmodifiable");
         this.constraint = constraint;
-        hasChangedHashcode = true;
     }
 
     // javadoc is inherited
@@ -581,7 +562,6 @@
 
     public void setCachePolicy(CachePolicy policy) {
         if (! modifiable) throw new IllegalStateException("Unmodifiable");
-        hasChangedHashcode = true;
         this.cachePolicy = policy;
     }
 
@@ -629,18 +609,25 @@
         }
     }
 
+    protected int calculateHashCode() {
+         return (distinct? 0: 101)
+             + maxNumber * 17 + offset * 19
+             + 23 * steps.hashCode()
+             + 29 * fields.hashCode()
+             + 31 * sortOrders.hashCode()
+             + 37 * (constraint == null? 0: constraint.hashCode());
+    }
+
     @Override
     public int hashCode() {
-        if (hasChangedHashcode) {
-          savedHashcode = (distinct? 0: 101)
-            + maxNumber * 17 + offset * 19
-            + 23 * steps.hashCode()
-            + 29 * fields.hashCode()
-            + 31 * sortOrders.hashCode()
-            + 37 * (constraint == null? 0: constraint.hashCode());
-          hasChangedHashcode = false;
+        if (modifiable) {
+            return calculateHashCode();
+        } else {
+            if (savedHashcode == -1) {
+                savedHashcode = calculateHashCode();
+            }
+            return savedHashcode;
         }
-        return savedHashcode;
     }
 
     @Override

_______________________________________________
Cvs mailing list
[email protected]
http://lists.mmbase.org/mailman/listinfo/cvs

Reply via email to