diff --git a/src/main/java/com/avaje/ebeaninternal/api/CQueryPlanKey.java b/src/main/java/com/avaje/ebeaninternal/api/CQueryPlanKey.java new file mode 100644 index 000000000..b169dca82 --- /dev/null +++ b/src/main/java/com/avaje/ebeaninternal/api/CQueryPlanKey.java @@ -0,0 +1,14 @@ +package com.avaje.ebeaninternal.api; + +/** + * Key used for caching query plans for ORM and RawSql queries. + */ +public interface CQueryPlanKey { + + /** + * Used by read audit such that we can log read audit entries without the full sql + * (which would make the read audit logs verbose). + */ + String getPartialKey(); + +} diff --git a/src/main/java/com/avaje/ebeaninternal/api/HashQuery.java b/src/main/java/com/avaje/ebeaninternal/api/HashQuery.java index 0a560a57b..5d8f6f3ae 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/HashQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/api/HashQuery.java @@ -5,32 +5,18 @@ package com.avaje.ebeaninternal.api; */ public class HashQuery { - private final HashQueryPlan planHash; + private final CQueryPlanKey planHash; private final int bindHash; /** * Create the HashQuery. */ - public HashQuery(HashQueryPlan planHash, int bindHash) { + public HashQuery(CQueryPlanKey planHash, int bindHash) { this.planHash = planHash; this.bindHash = bindHash; } - /** - * Return the query plan hash. - */ - public HashQueryPlan getPlanHash() { - return planHash; - } - - /** - * Return the bind values hash. - */ - public int getBindHash() { - return bindHash; - } - public int hashCode() { int hc = 31 * planHash.hashCode(); hc = 31 * hc + bindHash; diff --git a/src/main/java/com/avaje/ebeaninternal/api/HashQueryPlanBuilder.java b/src/main/java/com/avaje/ebeaninternal/api/HashQueryPlanBuilder.java index ecbe059c1..9365d6b20 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/HashQueryPlanBuilder.java +++ b/src/main/java/com/avaje/ebeaninternal/api/HashQueryPlanBuilder.java @@ -9,14 +9,12 @@ public class HashQueryPlanBuilder { private int bindCount; - private String rawSql; - public HashQueryPlanBuilder() { this.planHash = 92821; } public String toString() { - return planHash+":"+bindCount+(rawSql != null ? ":r" : ""); + return planHash+":"+bindCount; } /** @@ -58,19 +56,24 @@ public class HashQueryPlanBuilder { bindCount += extraBindCount; } - /** - * Add raw sql to the hash. - */ - public void addRawSql(String rawSql) { - this.rawSql = rawSql; + public void bindIfNotNull(Object someValue) { + if (someValue != null) { + bindCount++; + } } /** * Build and return the calculated HashQueryPlan. */ - public HashQueryPlan build() { - return new HashQueryPlan(rawSql, planHash, bindCount); + public String build() { + return planHash+"_"+bindCount; } - + public int getPlanHash() { + return planHash; + } + + public int getBindCount() { + return bindCount; + } } diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiExpression.java b/src/main/java/com/avaje/ebeaninternal/api/SpiExpression.java index d2987fc53..bacd508de 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiExpression.java @@ -37,6 +37,16 @@ public interface SpiExpression extends Expression { */ int queryBindHash(); + /** + * Return true if the expression is the same without taking into account bind values. + */ + boolean isSameByPlan(SpiExpression other); + + /** + * Return true if the expression is the same with respect to bind values. + */ + boolean isSameByBind(SpiExpression other); + /** * Add some sql to the query. *
@@ -65,4 +75,10 @@ public interface SpiExpression extends Expression {
* Validate all the properties/paths associated with this expression.
*/
void validate(SpiExpressionValidation validation);
+
+ /**
+ * Return a copy of the expression for use in the query plan key.
+ */
+ SpiExpression copyForPlanKey();
+
}
diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionList.java b/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionList.java
index 98c7ee1fd..de075203c 100644
--- a/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionList.java
+++ b/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionList.java
@@ -1,16 +1,13 @@
package com.avaje.ebeaninternal.api;
-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.
*/
-public interface SpiExpressionList
- * Predicates on Many properties require an extra independent join clause.
- *
- * The list of expressions are evaluated in order building a sql statement
- * with bind parameters.
- *
- * Expressions are evaluated in order and all the resulting bind values are
- * returned as a List.
- *
- * After deserialisation so that it can be further modified. - *
- */ - @Override - public void setExpressionFactory(ExpressionFactory expr) { - this.expr = expr; - } - /** * Return a copy of the expression list. *
@@ -88,6 +81,14 @@ public class DefaultExpressionList