#566 - Refactor internals - SpiExpression, add prepareExpression() to merge queryAutoTuneHash() and queryPlanHash() - tidy up createQueryRequest

This commit is contained in:
Robin Bygrave
2016-02-16 08:57:12 +13:00
parent 1aeffd31e0
commit 4df2d4020e
6 changed files with 34 additions and 56 deletions
@@ -130,22 +130,11 @@ public interface SpiEbeanServer extends EbeanServer, BeanLoader, BeanCollectionL
*/
void remoteTransactionEvent(RemoteTransactionEvent event);
/**
* Create a query request object.
*/
<T> SpiOrmQueryRequest<T> createQueryRequest(BeanDescriptor<T> desc, SpiQuery<T> q,
Transaction t);
/**
* Compile a query.
*/
<T> CQuery<T> compileQuery(Query<T> query, Transaction t);
/**
* Return the queryEngine for this server.
*/
CQueryEngine getQueryEngine();
/**
* Execute the findId's query but without copying the query.
* <p>
@@ -294,6 +294,11 @@ public interface SpiQuery<T> extends Query<T> {
*/
boolean initManyWhereJoins();
/**
* Return true if one Many fetch join is allowed.
*/
boolean isAllowOneManyFetch();
/**
* Return the joins required to support predicates on the many properties.
*/
@@ -15,7 +15,6 @@ import com.avaje.ebean.config.ServerConfig;
import com.avaje.ebean.config.dbplatform.DatabasePlatform;
import com.avaje.ebean.dbmigration.DdlGenerator;
import com.avaje.ebean.event.BeanPersistController;
import com.avaje.ebean.event.BeanQueryAdapter;
import com.avaje.ebean.event.readaudit.ReadAuditLogger;
import com.avaje.ebean.event.readaudit.ReadAuditPrepare;
import com.avaje.ebean.meta.MetaInfoManager;
@@ -1059,7 +1058,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
return createQueryRequest(desc, spiQuery, t);
}
public <T> SpiOrmQueryRequest<T> createQueryRequest(BeanDescriptor<T> desc, SpiQuery<T> query, Transaction t) {
private <T> SpiOrmQueryRequest<T> createQueryRequest(BeanDescriptor<T> desc, SpiQuery<T> query, Transaction t) {
if (desc.isAutoTunable() && !query.isSqlSelect() && !autoTuneService.tuneQuery(query)) {
// use deployment FetchType.LAZY/EAGER annotations
@@ -1067,13 +1066,7 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
query.setDefaultSelectClause();
}
if (query.selectAllForLazyLoadProperty()) {
// we need to select all properties to ensure the lazy load property
// was included (was not included by default or via autoTune).
if (logger.isDebugEnabled()) {
logger.debug("Using selectAllForLazyLoadProperty");
}
}
query.selectAllForLazyLoadProperty();
// if determine cost and no origin for AutoTune
if (query.getParentNode() == null) {
@@ -1087,29 +1080,10 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer {
query.setSqlDistinct(true);
}
boolean allowOneManyFetch = true;
if (Mode.LAZYLOAD_MANY.equals(query.getMode())) {
allowOneManyFetch = false;
query.convertManyFetchJoinsToQueryJoins(query.isAllowOneManyFetch(), queryBatchSize);
} else if (query.hasMaxRowsOrFirstRow() && !query.isRawSql() && !query.isSqlSelect()) {
// convert ALL fetch joins to Many's to be query joins
// so that limit offset type SQL clauses work
allowOneManyFetch = false;
}
query.convertManyFetchJoinsToQueryJoins(allowOneManyFetch, queryBatchSize);
SpiTransaction serverTrans = (SpiTransaction) t;
OrmQueryRequest<T> request = new OrmQueryRequest<T>(this, queryEngine, query, desc, serverTrans);
BeanQueryAdapter queryAdapter = desc.getQueryAdapter();
if (queryAdapter != null) {
// adaption of the query probably based on the
// current user
queryAdapter.preQuery(request);
}
// the query hash after any tuning
OrmQueryRequest<T> request = new OrmQueryRequest<T>(this, queryEngine, query, desc, (SpiTransaction) t);
request.adapterPreQuery();
request.prepareQuery();
return request;
@@ -10,6 +10,7 @@ import com.avaje.ebean.bean.BeanCollection;
import com.avaje.ebean.bean.EntityBean;
import com.avaje.ebean.bean.PersistenceContext;
import com.avaje.ebean.event.BeanFindController;
import com.avaje.ebean.event.BeanQueryAdapter;
import com.avaje.ebean.event.BeanQueryRequest;
import com.avaje.ebeaninternal.api.BeanIdList;
import com.avaje.ebeaninternal.api.HashQuery;
@@ -129,6 +130,16 @@ public final class OrmQueryRequest<T> extends BeanRequest implements BeanQueryRe
return loadContext;
}
/**
* Run BeanQueryAdapter preQuery() if needed.
*/
public void adapterPreQuery() {
BeanQueryAdapter queryAdapter = beanDescriptor.getQueryAdapter();
if (queryAdapter != null) {
queryAdapter.preQuery(this);
}
}
/**
* Prepare the query and calculate the query plan key.
*/
@@ -328,10 +339,6 @@ public final class OrmQueryRequest<T> extends BeanRequest implements BeanQueryRe
return (Map<?, ?>) queryEngine.findMany(this);
}
public SpiQuery.Type getQueryType() {
return query.getType();
}
/**
* Return a bean specific finder if one has been set.
*/
@@ -440,6 +440,19 @@ public class DefaultOrmQuery<T> implements SpiQuery<T> {
this.lazyLoadManyPath = lazyLoadManyPath;
}
@Override
public boolean isAllowOneManyFetch() {
if (Mode.LAZYLOAD_MANY.equals(getMode())) {
return false;
} else if (hasMaxRowsOrFirstRow() && !isRawSql() && !isSqlSelect()) {
return false;
}
return true;
}
/**
* Convert any many joins fetch joins to query joins.
*/