#566 - Refactor internals - SpiExpression, add prepareExpression() to merge queryAutoTuneHash() and queryPlanHash() - refactor InQuery and Exists query

This commit is contained in:
Robin Bygrave
2016-02-13 20:52:41 +13:00
parent 769e4bb488
commit ca944eb756
7 changed files with 41 additions and 53 deletions
@@ -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<Object> getBindValues();
List<Object> getBindValues();
/**
* Increments the parameter index and returns that value.
@@ -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<Object> bindValues = er.getBindValues();
List<Object> bindValues = er.getBindValues();
for (int i = 0; i < bindValues.size(); i++) {
bindParams.setParameter(++count, bindValues.get(i));
}
@@ -21,7 +21,9 @@ public class ExistsExpression implements SpiExpression {
private final SpiQuery<?> subQuery;
private transient CQuery<?> compiledSubQuery;
private List<Object> 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<Object> bindParams = compiledSubQuery.getPredicates().getWhereExprBindValues();
if (bindParams == null) {
return;
}
for (int i = 0; i < bindParams.size(); i++) {
request.addBindValue(bindParams.get(i));
}
@@ -20,7 +20,9 @@ class InQueryExpression extends AbstractExpression {
private final SpiQuery<?> subQuery;
private transient CQuery<?> compiledSubQuery;
private List<Object> 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<Object> bindParams = compiledSubQuery.getPredicates().getWhereExprBindValues();
if (bindParams == null) {
return;
}
for (int i = 0; i < bindParams.size(); i++) {
request.addBindValue(bindParams.get(i));
}
@@ -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<Object> getWhereExprBindValues() {
public List<Object> getWhereExprBindValues() {
return where.getBindValues();
}
@@ -340,7 +340,7 @@ public class DefaultExpressionList<T> implements SpiExpressionList<T> {
}
@Override
public ArrayList<Object> buildBindValues(SpiExpressionRequest request) {
public List<Object> buildBindValues(SpiExpressionRequest request) {
for (int i = 0, size = list.size(); i < size; i++) {
SpiExpression expression = list.get(i);
@@ -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<Object> bindValues = new ArrayList<Object>();
private final List<Object> bindValues = new ArrayList<Object>();
private final DeployParser deployParser;
@@ -140,7 +141,7 @@ public class DefaultExpressionRequest implements SpiExpressionRequest {
return sql.toString();
}
public ArrayList<Object> getBindValues() {
public List<Object> getBindValues() {
return bindValues;
}