From 4df2d4020ebcaccb26bec3e1b76dba7a7dc8ec94 Mon Sep 17 00:00:00 2001 From: Robin Bygrave Date: Tue, 16 Feb 2016 08:57:12 +1300 Subject: [PATCH] #566 - Refactor internals - SpiExpression, add prepareExpression() to merge queryAutoTuneHash() and queryPlanHash() - tidy up createQueryRequest --- .../ebeaninternal/api/SpiEbeanServer.java | 11 ------ .../com/avaje/ebeaninternal/api/SpiQuery.java | 5 +++ .../server/core/DefaultServer.java | 36 +++---------------- .../server/core/OrmQueryRequest.java | 15 +++++--- .../server/querydefn/DefaultOrmQuery.java | 13 +++++++ .../ebeaninternal/api/TDSpiEbeanServer.java | 10 ------ 6 files changed, 34 insertions(+), 56 deletions(-) diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanServer.java b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanServer.java index 7e8b76d9b..69b0a4742 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanServer.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiEbeanServer.java @@ -130,22 +130,11 @@ public interface SpiEbeanServer extends EbeanServer, BeanLoader, BeanCollectionL */ void remoteTransactionEvent(RemoteTransactionEvent event); - /** - * Create a query request object. - */ - SpiOrmQueryRequest createQueryRequest(BeanDescriptor desc, SpiQuery q, - Transaction t); - /** * Compile a query. */ CQuery compileQuery(Query query, Transaction t); - /** - * Return the queryEngine for this server. - */ - CQueryEngine getQueryEngine(); - /** * Execute the findId's query but without copying the query. *

diff --git a/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java b/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java index c9def4a75..02f48ae67 100644 --- a/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/api/SpiQuery.java @@ -294,6 +294,11 @@ public interface SpiQuery extends Query { */ boolean initManyWhereJoins(); + /** + * Return true if one Many fetch join is allowed. + */ + boolean isAllowOneManyFetch(); + /** * Return the joins required to support predicates on the many properties. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java index d00d5793b..5667dd5fe 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/DefaultServer.java @@ -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 SpiOrmQueryRequest createQueryRequest(BeanDescriptor desc, SpiQuery query, Transaction t) { + private SpiOrmQueryRequest createQueryRequest(BeanDescriptor desc, SpiQuery 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 request = new OrmQueryRequest(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 request = new OrmQueryRequest(this, queryEngine, query, desc, (SpiTransaction) t); + request.adapterPreQuery(); request.prepareQuery(); return request; diff --git a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java index 952dfa2ca..9cf5e7886 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/com/avaje/ebeaninternal/server/core/OrmQueryRequest.java @@ -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 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 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. */ diff --git a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 71ec91532..a288d9a80 100644 --- a/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/com/avaje/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -440,6 +440,19 @@ public class DefaultOrmQuery implements SpiQuery { 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. */ diff --git a/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java index b8917b790..6ed966cff 100644 --- a/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java +++ b/src/test/java/com/avaje/ebeaninternal/api/TDSpiEbeanServer.java @@ -147,21 +147,11 @@ public class TDSpiEbeanServer implements SpiEbeanServer { } - @Override - public SpiOrmQueryRequest createQueryRequest(BeanDescriptor desc, SpiQuery q, Transaction t) { - return null; - } - @Override public CQuery compileQuery(Query query, Transaction t) { return null; } - @Override - public CQueryEngine getQueryEngine() { - return null; - } - @Override public int delete(Query query, Transaction t) { return 0;