diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionRequest.java b/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionRequest.java index 913b6ac73..98069d29e 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiExpressionRequest.java @@ -1,11 +1,11 @@ package com.avaje.ebeaninternal.api; -import java.util.ArrayList; - import com.avaje.ebeaninternal.server.core.JsonExpressionHandler; import com.avaje.ebeaninternal.server.core.SpiOrmQueryRequest; import com.avaje.ebeaninternal.server.deploy.BeanDescriptor; +import java.util.List; + /** * Request object used for gathering expression sql and bind values. */ @@ -54,7 +54,7 @@ public interface SpiExpressionRequest { /** * Return the ordered list of bind values for all expressions in this request. */ - ArrayList getBindValues(); + List getBindValues(); /** * Increments the parameter index and returns that value. diff --git a/src/main/java/com/avaje/ebeaninternal/server/deploy/IntersectionRow.java b/src/main/java/com/avaje/ebeaninternal/server/deploy/IntersectionRow.java index 68e0d5474..a55a88115 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/deploy/IntersectionRow.java +++ b/src/main/java/com/avaje/ebeaninternal/server/deploy/IntersectionRow.java @@ -2,6 +2,7 @@ package com.avaje.ebeaninternal.server.deploy; import java.util.ArrayList; import java.util.LinkedHashMap; +import java.util.List; import java.util.Map; import com.avaje.ebean.EbeanServer; @@ -98,7 +99,7 @@ public class IntersectionRow { sb.append(er.getSql()); sb.append(" ) "); - ArrayList bindValues = er.getBindValues(); + List bindValues = er.getBindValues(); for (int i = 0; i < bindValues.size(); i++) { bindParams.setParameter(++count, bindValues.get(i)); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/ExistsExpression.java b/src/main/java/com/avaje/ebeaninternal/server/expression/ExistsExpression.java index 7071bdb48..1c5c1852e 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/ExistsExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/ExistsExpression.java @@ -21,7 +21,9 @@ public class ExistsExpression implements SpiExpression { private final SpiQuery subQuery; - private transient CQuery compiledSubQuery; + private List bindParams; + + private String sql; public ExistsExpression(SpiQuery subQuery, boolean not) { this.subQuery = subQuery; @@ -30,26 +32,26 @@ public class ExistsExpression implements SpiExpression { @Override public void prepareExpression(BeanQueryRequest request) { - // queryPlanHash executes prior to addSql() or addBindValues() - // ... so compiledQuery will exist - compiledSubQuery = compileSubQuery(request); - } - @Override - public void queryPlanHash(HashQueryPlanBuilder builder) { - builder.add(ExistsExpression.class).add(not); - subQuery.queryAutoTuneHash(builder); + CQuery subQuery = compileSubQuery(request); + this.bindParams = subQuery.getPredicates().getWhereExprBindValues(); + this.sql = subQuery.getGeneratedSql().replace('\n', ' '); } /** * Compile/build the sub query. */ private CQuery compileSubQuery(BeanQueryRequest queryRequest) { - SpiEbeanServer ebeanServer = (SpiEbeanServer) queryRequest.getEbeanServer(); return ebeanServer.compileQuery(subQuery, queryRequest.getTransaction()); } + @Override + public void queryPlanHash(HashQueryPlanBuilder builder) { + builder.add(ExistsExpression.class).add(not); + builder.add(sql).add(bindParams.size()); + } + @Override public int queryBindHash() { return subQuery.queryBindHash(); @@ -58,26 +60,17 @@ public class ExistsExpression implements SpiExpression { @Override public void addSql(SpiExpressionRequest request) { - String subSelect = compiledSubQuery.getGeneratedSql(); - subSelect = subSelect.replace('\n', ' '); - if (not) { request.append(" not"); } request.append(" exists ("); - request.append(subSelect); + request.append(sql); request.append(") "); } @Override public void addBindValues(SpiExpressionRequest request) { - List bindParams = compiledSubQuery.getPredicates().getWhereExprBindValues(); - - if (bindParams == null) { - return; - } - for (int i = 0; i < bindParams.size(); i++) { request.addBindValue(bindParams.get(i)); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/expression/InQueryExpression.java b/src/main/java/com/avaje/ebeaninternal/server/expression/InQueryExpression.java index 1934fc3cf..21ba19cc2 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/expression/InQueryExpression.java +++ b/src/main/java/com/avaje/ebeaninternal/server/expression/InQueryExpression.java @@ -20,7 +20,9 @@ class InQueryExpression extends AbstractExpression { private final SpiQuery subQuery; - private transient CQuery compiledSubQuery; + private List bindParams; + + private String sql; public InQueryExpression(String propertyName, SpiQuery subQuery, boolean not) { super(propertyName); @@ -30,13 +32,16 @@ class InQueryExpression extends AbstractExpression { @Override public void prepareExpression(BeanQueryRequest request) { - compiledSubQuery = compileSubQuery(request); + + CQuery subQuery = compileSubQuery(request); + this.bindParams = subQuery.getPredicates().getWhereExprBindValues(); + this.sql = subQuery.getGeneratedSql().replace('\n', ' '); } @Override public void queryPlanHash(HashQueryPlanBuilder builder) { builder.add(InQueryExpression.class).add(propName).add(not); - subQuery.queryAutoTuneHash(builder); + builder.add(sql).add(bindParams.size()); } /** @@ -56,28 +61,18 @@ class InQueryExpression extends AbstractExpression { @Override public void addSql(SpiExpressionRequest request) { - String subSelect = compiledSubQuery.getGeneratedSql(); - subSelect = subSelect.replace('\n', ' '); - - String propertyName = getPropertyName(); - request.append(" (").append(propertyName).append(")"); + request.append(" (").append(getPropertyName()).append(")"); if (not) { request.append(" not"); } request.append(" in ("); - request.append(subSelect); + request.append(sql); request.append(") "); } @Override public void addBindValues(SpiExpressionRequest request) { - List bindParams = compiledSubQuery.getPredicates().getWhereExprBindValues(); - - if (bindParams == null) { - return; - } - for (int i = 0; i < bindParams.size(); i++) { request.addBindValue(bindParams.get(i)); } diff --git a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryPredicates.java b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryPredicates.java index e3570defb..152ac6712 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/query/CQueryPredicates.java +++ b/src/main/java/com/avaje/ebeaninternal/server/query/CQueryPredicates.java @@ -1,16 +1,6 @@ package com.avaje.ebeaninternal.server.query; -import java.sql.SQLException; -import java.sql.Timestamp; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; - import com.avaje.ebean.RawSql; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.avaje.ebeaninternal.api.BindParams; import com.avaje.ebeaninternal.api.BindParams.OrderedList; import com.avaje.ebeaninternal.api.SpiExpressionList; @@ -24,6 +14,14 @@ import com.avaje.ebeaninternal.server.querydefn.OrmQueryProperties; import com.avaje.ebeaninternal.server.type.DataBind; import com.avaje.ebeaninternal.server.util.BindParamsParser; import com.avaje.ebeaninternal.util.DefaultExpressionRequest; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.HashSet; +import java.util.List; +import java.util.Set; /** * Compile Query Predicates. @@ -465,7 +463,7 @@ public class CQueryPredicates { /** * Return the bind values for the where expression. */ - public ArrayList getWhereExprBindValues() { + public List getWhereExprBindValues() { return where.getBindValues(); } diff --git a/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionList.java b/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionList.java index 313c31288..7df81fc96 100644 --- a/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionList.java +++ b/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionList.java @@ -340,7 +340,7 @@ public class DefaultExpressionList implements SpiExpressionList { } @Override - public ArrayList buildBindValues(SpiExpressionRequest request) { + public List buildBindValues(SpiExpressionRequest request) { for (int i = 0, size = list.size(); i < size; i++) { SpiExpression expression = list.get(i); diff --git a/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionRequest.java b/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionRequest.java index 510d62ba0..739071934 100644 --- a/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/util/DefaultExpressionRequest.java @@ -2,6 +2,7 @@ package com.avaje.ebeaninternal.util; import java.sql.SQLException; import java.util.ArrayList; +import java.util.List; import com.avaje.ebeaninternal.api.SpiExpressionList; import com.avaje.ebeaninternal.api.SpiExpressionRequest; @@ -20,7 +21,7 @@ public class DefaultExpressionRequest implements SpiExpressionRequest { private final StringBuilder sql = new StringBuilder(); - private final ArrayList bindValues = new ArrayList(); + private final List bindValues = new ArrayList(); private final DeployParser deployParser; @@ -140,7 +141,7 @@ public class DefaultExpressionRequest implements SpiExpressionRequest { return sql.toString(); } - public ArrayList getBindValues() { + public List getBindValues() { return bindValues; }