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