diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiExpression.java b/src/main/java/com/avaje/ebeaninternal/api/SpiExpression.java index 28cdf61c5..d2987fc53 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiExpression.java @@ -17,32 +17,26 @@ public interface SpiExpression extends Expression { *
*/ void containsMany(BeanDescriptor> desc, ManyWhereJoins whereManyJoins); - - /** + + /** + * Prepare the expression. For example, compile sub-query expressions etc. + */ + void prepareExpression(BeanQueryRequest> request); + + /** * Calculate a hash value used to identify a query for AutoTune tuning. ** That is, if the hash changes then the query will be considered different * from an AutoTune perspective and get different tuning. *
*/ - void queryAutoTuneHash(HashQueryPlanBuilder builder); - - /** - * Calculate a hash value for the expression. - * This includes the expression type and property but should exclude - * the bind values. - *- * This is used where queries are the same except for the bind values, in which - * case the query execution plan can be reused. - *
- */ - void queryPlanHash(BeanQueryRequest> request, HashQueryPlanBuilder builder); - + void queryPlanHash(HashQueryPlanBuilder builder); + /** * Return the hash value for the values that will be bound. */ int queryBindHash(); - + /** * Add some sql to the query. *
@@ -61,7 +55,7 @@ public interface SpiExpression extends Expression {
/**
* Add the parameter values to be set against query. For each ? place holder
* there should be a corresponding value that is added to the bindList.
- *
+ *
* @param request
* the associated request.
*/
diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionList.java b/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionList.java
index 1cacf0a45..98c7ee1fd 100644
--- a/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionList.java
+++ b/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionList.java
@@ -1,13 +1,12 @@
package com.avaje.ebeaninternal.api;
-import java.util.ArrayList;
-import java.util.List;
-
import com.avaje.ebean.ExpressionFactory;
import com.avaje.ebean.ExpressionList;
import com.avaje.ebean.event.BeanQueryRequest;
import com.avaje.ebeaninternal.server.deploy.BeanDescriptor;
+import java.util.List;
+
/**
* Internal extension of ExpressionList.
*/
@@ -59,13 +58,18 @@ public interface SpiExpressionList
diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetail.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetail.java index e8d0cc46b..4140c607e 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetail.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryDetail.java @@ -1,5 +1,14 @@ package com.avaje.ebeaninternal.server.querydefn; +import com.avaje.ebean.FetchConfig; +import com.avaje.ebeaninternal.api.HashQueryPlanBuilder; +import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; +import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssoc; +import com.avaje.ebeaninternal.server.el.ElPropertyDeploy; +import com.avaje.ebeaninternal.server.el.ElPropertyValue; +import com.avaje.ebeaninternal.server.query.SplitName; + +import javax.persistence.PersistenceException; import java.io.Serializable; import java.util.ArrayList; import java.util.Collections; @@ -11,17 +20,6 @@ import java.util.List; import java.util.Map; import java.util.Set; -import javax.persistence.PersistenceException; - -import com.avaje.ebean.FetchConfig; -import com.avaje.ebean.event.BeanQueryRequest; -import com.avaje.ebeaninternal.api.HashQueryPlanBuilder; -import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; -import com.avaje.ebeaninternal.server.deploy.BeanPropertyAssoc; -import com.avaje.ebeaninternal.server.el.ElPropertyDeploy; -import com.avaje.ebeaninternal.server.el.ElPropertyValue; -import com.avaje.ebeaninternal.server.query.SplitName; - /** * Represents the internal structure of an Object Relational query. *
@@ -65,17 +63,17 @@ public class OrmQueryDetail implements Serializable {
/**
* Calculate the hash for the query plan.
*/
- public void queryPlanHash(BeanQueryRequest> request, HashQueryPlanBuilder builder) {
+ public void queryPlanHash(HashQueryPlanBuilder builder) {
if (baseProps == null) {
builder.add(false);
} else {
builder.add(true);
- baseProps.queryPlanHash(request, builder);
+ baseProps.queryPlanHash(builder);
}
if (fetchPaths != null) {
for (OrmQueryProperties p : fetchPaths.values()) {
- p.queryPlanHash(request, builder);
+ p.queryPlanHash(builder);
}
}
}
diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryProperties.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryProperties.java
index 21dba9a65..75171d86e 100644
--- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryProperties.java
+++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/OrmQueryProperties.java
@@ -1,18 +1,9 @@
package com.avaje.ebeaninternal.server.querydefn;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Set;
-
import com.avaje.ebean.ExpressionFactory;
import com.avaje.ebean.FetchConfig;
import com.avaje.ebean.OrderBy;
import com.avaje.ebean.Query;
-import com.avaje.ebean.event.BeanQueryRequest;
import com.avaje.ebeaninternal.api.HashQueryPlanBuilder;
import com.avaje.ebeaninternal.api.SpiExpression;
import com.avaje.ebeaninternal.api.SpiExpressionFactory;
@@ -23,6 +14,14 @@ import com.avaje.ebeaninternal.server.lib.util.StringHelper;
import com.avaje.ebeaninternal.server.query.SplitName;
import com.avaje.ebeaninternal.util.FilterExpressionList;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
/**
* Represents the Properties of an Object Relational query.
*/
@@ -334,7 +333,7 @@ public class OrmQueryProperties implements Serializable {
* Calculate the query plan hash.
*/
@SuppressWarnings("unchecked")
- public void queryPlanHash(BeanQueryRequest> request, HashQueryPlanBuilder builder) {
+ public void queryPlanHash(HashQueryPlanBuilder builder) {
builder.add(path);
if (properties != null) {
@@ -344,7 +343,7 @@ public class OrmQueryProperties implements Serializable {
}
builder.add(filterMany != null);
if (filterMany != null) {
- filterMany.queryPlanHash(request, builder);
+ filterMany.queryPlanHash(builder);
}
builder.add(lazyFetchBatch);
builder.add(queryFetchBatch);
diff --git a/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionList.java b/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionList.java
index 7715da72c..313c31288 100644
--- a/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionList.java
+++ b/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionList.java
@@ -349,15 +349,10 @@ public class DefaultExpressionList