diff --git a/src/main/java/io/ebean/Query.java b/src/main/java/io/ebean/Query.java index c7e4ed104..c5a5f425e 100644 --- a/src/main/java/io/ebean/Query.java +++ b/src/main/java/io/ebean/Query.java @@ -236,6 +236,14 @@ public interface Query { */ Query asDraft(); + /** + * Convert the query to a DTO bean query. + *

+ * We effectively use the underlying ORM query to build the SQL and then execute + * and map it into DTO beans. + */ + DtoQuery asDto(Class dtoClass); + /** * Cancel the query execution if supported by the underlying database and * driver. diff --git a/src/main/java/io/ebeaninternal/api/SpiDtoQuery.java b/src/main/java/io/ebeaninternal/api/SpiDtoQuery.java index d2c4b1fb9..c7d3e4f88 100644 --- a/src/main/java/io/ebeaninternal/api/SpiDtoQuery.java +++ b/src/main/java/io/ebeaninternal/api/SpiDtoQuery.java @@ -17,7 +17,7 @@ public interface SpiDtoQuery extends DtoQuery, SpiSqlBinding { /** * Get the query plan for the cache. */ - DtoQueryPlan getQueryPlan(String planKey); + DtoQueryPlan getQueryPlan(Object planKey); /** * Build the query plan. @@ -27,7 +27,7 @@ public interface SpiDtoQuery extends DtoQuery, SpiSqlBinding { /** * Put the query plan into the cache. */ - void putQueryPlan(String planKey, DtoQueryPlan plan); + void putQueryPlan(Object planKey, DtoQueryPlan plan); /** * Return true if the query is in relaxed mapping mode. @@ -43,4 +43,10 @@ public interface SpiDtoQuery extends DtoQuery, SpiSqlBinding { * Return the associated DTO bean type. */ Class getType(); + + /** + * Return an underlying ORM query (if this query is built from an ORM query). + */ + SpiQuery getOrmQuery(); + } diff --git a/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java b/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java index 0e6af2a99..305672805 100644 --- a/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java +++ b/src/main/java/io/ebeaninternal/api/SpiEbeanServer.java @@ -1,5 +1,6 @@ package io.ebeaninternal.api; +import io.ebean.DtoQuery; import io.ebean.EbeanServer; import io.ebean.PersistenceContextScope; import io.ebean.Query; @@ -14,6 +15,7 @@ import io.ebean.config.dbplatform.DatabasePlatform; import io.ebean.event.readaudit.ReadAuditLogger; import io.ebean.event.readaudit.ReadAuditPrepare; import io.ebeaninternal.dbmigration.ddlgeneration.DdlHandler; +import io.ebeaninternal.server.core.SpiResultSet; import io.ebeaninternal.server.core.timezone.DataTimeZone; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.query.CQuery; @@ -246,4 +248,13 @@ public interface SpiEbeanServer extends EbeanServer, BeanLoader, BeanCollectionL */ void findDtoEachWhile(SpiDtoQuery query, Predicate consumer); + /** + * Return / wrap the ORM query as a DTO query. + */ + DtoQuery findDto(Class dtoType, SpiQuery ormQuery); + + /** + * Execute the underlying ORM query returning as a JDBC ResultSet to map to DTO beans. + */ + SpiResultSet findResultSet(SpiQuery ormQuery, SpiTransaction transaction); } diff --git a/src/main/java/io/ebeaninternal/api/SpiQuery.java b/src/main/java/io/ebeaninternal/api/SpiQuery.java index 065d3c9a5..adaa9f422 100644 --- a/src/main/java/io/ebeaninternal/api/SpiQuery.java +++ b/src/main/java/io/ebeaninternal/api/SpiQuery.java @@ -215,6 +215,11 @@ public interface SpiQuery extends Query, TxnProfileEventCodes { */ BeanDescriptor getBeanDescriptor(); + /** + * Return the query plan key. + */ + Object getQueryPlanKey(); + /** * Return the RawSql that was set to use for this query. */ @@ -748,6 +753,16 @@ public interface SpiQuery extends Query, TxnProfileEventCodes { */ boolean isDistinct(); + /** + * Return true if the Id property is manually included in the query (DTO queries). + */ + boolean isManualId(); + + /** + * Set to true when we only include the Id property if it is explicitly included in the select(). + */ + void setManualId(boolean manualId); + /** * Set default select clauses where none have been explicitly defined. */ diff --git a/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java index 7726fae36..03feedaf4 100644 --- a/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/AbstractSqlQueryRequest.java @@ -5,6 +5,7 @@ import io.ebean.Transaction; import io.ebean.util.JdbcClose; import io.ebeaninternal.api.BindParams; import io.ebeaninternal.api.SpiEbeanServer; +import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.api.SpiSqlBinding; import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.server.lib.util.Str; @@ -25,7 +26,7 @@ public abstract class AbstractSqlQueryRequest { private final SpiSqlBinding query; - protected final SpiEbeanServer ebeanServer; + protected final SpiEbeanServer server; protected SpiTransaction trans; @@ -45,7 +46,7 @@ public abstract class AbstractSqlQueryRequest { * Create the BeanFindRequest. */ AbstractSqlQueryRequest(SpiEbeanServer server, SpiSqlBinding query, Transaction t) { - this.ebeanServer = server; + this.server = server; this.query = query; this.trans = (SpiTransaction) t; } @@ -55,10 +56,10 @@ public abstract class AbstractSqlQueryRequest { */ public void initTransIfRequired() { if (trans == null) { - trans = ebeanServer.currentServerTransaction(); + trans = server.currentServerTransaction(); if (trans == null || !trans.isActive()) { // create a local readOnly transaction - trans = ebeanServer.createQueryTransaction(null); + trans = server.createQueryTransaction(null); createdTransaction = true; } } @@ -73,8 +74,8 @@ public abstract class AbstractSqlQueryRequest { } } - public EbeanServer getEbeanServer() { - return ebeanServer; + public EbeanServer getServer() { + return server; } public SpiTransaction getTransaction() { @@ -85,7 +86,10 @@ public abstract class AbstractSqlQueryRequest { return trans.isLogSql(); } - abstract void setResultSet(ResultSet resultSet) throws SQLException; + /** + * Set the resultSet and associated query plan if known. + */ + abstract void setResultSet(ResultSet resultSet, Object queryPlanKey) throws SQLException; /** * Return the bindLog for this request. @@ -132,7 +136,7 @@ public abstract class AbstractSqlQueryRequest { int firstRow = query.getFirstRow(); int maxRows = query.getMaxRows(); if (firstRow > 0 || maxRows > 0) { - return ebeanServer.getDatabasePlatform().getBasicSqlLimiter().limit(sql, firstRow, maxRows); + return server.getDatabasePlatform().getBasicSqlLimiter().limit(sql, firstRow, maxRows); } return sql; } @@ -140,7 +144,11 @@ public abstract class AbstractSqlQueryRequest { /** * Prepare and execute the SQL using the Binder. */ - public void executeSql(Binder binder) throws SQLException { + public void executeSql(Binder binder, SpiQuery.Type type) throws SQLException { + executeAsSql(binder); + } + + protected void executeAsSql(Binder binder) throws SQLException { startNano = System.nanoTime(); @@ -169,7 +177,7 @@ public abstract class AbstractSqlQueryRequest { trans.logSql(logSql); } - setResultSet(pstmt.executeQuery()); + setResultSet(pstmt.executeQuery(), null); } /** diff --git a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java index e74e14e53..6629aee54 100644 --- a/src/main/java/io/ebeaninternal/server/core/DefaultServer.java +++ b/src/main/java/io/ebeaninternal/server/core/DefaultServer.java @@ -985,6 +985,21 @@ public final class DefaultServer implements SpiServer, SpiEbeanServer { return new DefaultDtoQuery<>(this, descriptor, sql.trim()); } + @Override + public DtoQuery findDto(Class dtoType, SpiQuery ormQuery) { + + DtoBeanDescriptor descriptor = dtoBeanManager.getDescriptor(dtoType); + return new DefaultDtoQuery<>(this, descriptor, ormQuery); + } + + @Override + public SpiResultSet findResultSet(SpiQuery ormQuery, SpiTransaction transaction) { + + SpiOrmQueryRequest request = createQueryRequest(ormQuery.getType(), ormQuery, transaction); + request.initTransIfRequired(); + return request.findResultSet(); + } + @Override public SqlQuery createSqlQuery(String sql) { return new DefaultRelationalQuery(this, sql.trim()); diff --git a/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java index b0801eb2e..99ba16058 100644 --- a/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/DtoQueryRequest.java @@ -2,9 +2,11 @@ package io.ebeaninternal.server.core; import io.ebeaninternal.api.SpiDtoQuery; import io.ebeaninternal.api.SpiEbeanServer; +import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.dto.DtoColumn; import io.ebeaninternal.server.dto.DtoMappingRequest; import io.ebeaninternal.server.dto.DtoQueryPlan; +import io.ebeaninternal.server.persist.Binder; import io.ebeaninternal.server.query.dto.DtoQueryEngine; import io.ebeaninternal.server.type.DataReader; import io.ebeaninternal.server.type.RsetDataReader; @@ -37,15 +39,39 @@ public final class DtoQueryRequest extends AbstractSqlQueryRequest { this.query = query; } + /** + * Prepare and execute the SQL using the Binder. + */ @Override - protected void setResultSet(ResultSet resultSet) throws SQLException { - this.resultSet = resultSet; - this.dataReader = new RsetDataReader(ebeanServer.getDataTimeZone(), resultSet); - obtainPlan(); + public void executeSql(Binder binder, SpiQuery.Type type) throws SQLException { + SpiQuery ormQuery = query.getOrmQuery(); + if (ormQuery != null) { + ormQuery.setType(type); + ormQuery.setManualId(true); + + // execute the underlying ORM query returning the ResultSet + SpiResultSet result = server.findResultSet(ormQuery, trans); + this.pstmt = result.getStatement(); + this.sql = ormQuery.getGeneratedSql(); + setResultSet(result.getResultSet(), ormQuery.getQueryPlanKey()); + + } else { + // native SQL query execution + executeAsSql(binder); + } } - private void obtainPlan() throws SQLException { - String planKey = query.planKey(); + @Override + protected void setResultSet(ResultSet resultSet, Object queryPlanKey) throws SQLException { + this.resultSet = resultSet; + this.dataReader = new RsetDataReader(server.getDataTimeZone(), resultSet); + obtainPlan(queryPlanKey); + } + + private void obtainPlan(Object planKey) throws SQLException { + if (planKey == null) { + planKey = query.planKey(); + } plan = query.getQueryPlan(planKey); if (plan == null) { plan = query.buildPlan(mappingRequest()); diff --git a/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java b/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java index aeda6a8ad..b080e4a29 100644 --- a/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java +++ b/src/main/java/io/ebeaninternal/server/core/OrmQueryEngine.java @@ -13,6 +13,11 @@ import java.util.List; */ public interface OrmQueryEngine { + /** + * Execute the ORM query returning the JDBC ResultSet (for DTO query processing). + */ + SpiResultSet findResultSet(OrmQueryRequest request); + /** * Execute the 'find by id' query returning a single bean. */ diff --git a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java index 490e53762..5a9e3f6a8 100644 --- a/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/OrmQueryRequest.java @@ -353,6 +353,13 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery return query.getType() == Type.BEAN; } + /** + * Return true if this is a findEach, findIterate type query where we expect many results. + */ + public boolean isFindIterate() { + return query.getType() == Type.ITERATE; + } + /** * Execute the query as a delete. */ @@ -376,6 +383,11 @@ public final class OrmQueryRequest extends BeanRequest implements SpiOrmQuery return rows; } + @Override + public SpiResultSet findResultSet() { + return queryEngine.findResultSet(this); + } + /** * Execute the query as findById. */ diff --git a/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java index 81ae0aad9..dace84109 100644 --- a/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/RelationalQueryRequest.java @@ -36,7 +36,7 @@ public final class RelationalQueryRequest extends AbstractSqlQueryRequest { } @Override - protected void setResultSet(ResultSet resultSet) throws SQLException { + protected void setResultSet(ResultSet resultSet, Object planKey) throws SQLException { this.resultSet = resultSet; this.propertyNames = getPropertyNames(); // calculate the initialCapacity of the Map to reduce rehashing diff --git a/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java b/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java index 32ab198ff..68895bb88 100644 --- a/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java +++ b/src/main/java/io/ebeaninternal/server/core/SpiOrmQueryRequest.java @@ -114,6 +114,11 @@ public interface SpiOrmQueryRequest extends BeanQueryRequest, DocQueryRequ */ List findSingleAttributeList(); + /** + * Execute returning the ResultSet. + */ + SpiResultSet findResultSet(); + /** * Try to get the query result from the query cache. */ diff --git a/src/main/java/io/ebeaninternal/server/core/SpiResultSet.java b/src/main/java/io/ebeaninternal/server/core/SpiResultSet.java new file mode 100644 index 000000000..6c539e564 --- /dev/null +++ b/src/main/java/io/ebeaninternal/server/core/SpiResultSet.java @@ -0,0 +1,29 @@ +package io.ebeaninternal.server.core; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; + +/** + * Hold the JDBC PreparedStatement and ResultSet. + * + * These both must be closed properly when done. + */ +public class SpiResultSet { + + private final PreparedStatement statement; + + private final ResultSet resultSet; + + public SpiResultSet(PreparedStatement statement, ResultSet resultSet) { + this.statement = statement; + this.resultSet = resultSet; + } + + public PreparedStatement getStatement() { + return statement; + } + + public ResultSet getResultSet() { + return resultSet; + } +} diff --git a/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java b/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java index 6d7698857..81920e858 100644 --- a/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java +++ b/src/main/java/io/ebeaninternal/server/dto/DtoBeanDescriptor.java @@ -10,7 +10,7 @@ import java.util.concurrent.ConcurrentHashMap; */ public class DtoBeanDescriptor { - private final Map plans = new ConcurrentHashMap<>(); + private final Map plans = new ConcurrentHashMap<>(); private final Class dtoType; @@ -25,7 +25,7 @@ public class DtoBeanDescriptor { return dtoType; } - public DtoQueryPlan getQueryPlan(String planKey) { + public DtoQueryPlan getQueryPlan(Object planKey) { return plans.get(planKey); } @@ -33,7 +33,7 @@ public class DtoBeanDescriptor { return meta.match(request); } - public void putQueryPlan(String planKey, DtoQueryPlan plan) { + public void putQueryPlan(Object planKey, DtoQueryPlan plan) { plans.put(planKey, plan); } diff --git a/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java b/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java index 272e962b5..bd26cfaee 100644 --- a/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java +++ b/src/main/java/io/ebeaninternal/server/dto/DtoMeta.java @@ -1,5 +1,7 @@ package io.ebeaninternal.server.dto; +import io.ebean.util.StringHelper; + import java.util.Arrays; import java.util.LinkedHashMap; import java.util.List; @@ -81,7 +83,7 @@ class DtoMeta { int pos = 0; for (int i = firstOnes; i < cols.length; i++) { String label = cols[i].getLabel(); - DtoReadSet property = propMap.get(label.toUpperCase()); + DtoReadSet property = findProperty(label); if (property == null || property.isReadOnly()) { if (request.isRelaxedMode()) { property = DtoReadSetColumnSkip.INSTANCE; @@ -103,7 +105,7 @@ class DtoMeta { for (int i = 0; i < cols.length; i++) { String label = cols[i].getLabel(); - DtoReadSet property = propMap.get(label.toUpperCase()); + DtoReadSet property = findProperty(label); if (property == null || property.isReadOnly()) { if (request.isRelaxedMode()) { property = DtoReadSetColumnSkip.INSTANCE; @@ -116,4 +118,15 @@ class DtoMeta { return new DtoQueryPlanConSetter(request, defaultConstructor, setterProps); } + + private DtoReadSet findProperty(String label) { + + String upperLabel = label.toUpperCase(); + DtoMetaProperty property = propMap.get(upperLabel); + if (property == null) { + upperLabel = StringHelper.replaceString(upperLabel, "_", ""); + property = propMap.get(upperLabel); + } + return property; + } } diff --git a/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java b/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java index 4ba29d8c3..b358a5584 100644 --- a/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java +++ b/src/main/java/io/ebeaninternal/server/profile/DQueryPlanMetric.java @@ -41,7 +41,7 @@ class DQueryPlanMetric implements QueryPlanMetric { @Override public String toString() { - return meta +" "+ stats; + return meta + " " + stats + " sql:" + getSql(); } @Override diff --git a/src/main/java/io/ebeaninternal/server/query/CQuery.java b/src/main/java/io/ebeaninternal/server/query/CQuery.java index 6ab29d742..da7bdd090 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQuery.java +++ b/src/main/java/io/ebeaninternal/server/query/CQuery.java @@ -310,11 +310,21 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran private boolean prepareBindExecuteQueryWithOption(boolean forwardOnlyHint) throws SQLException { + ResultSet resultSet = prepareResultSet(forwardOnlyHint); + if (resultSet == null) { + return false; + } + dataReader = queryPlan.createDataReader(resultSet); + return true; + } + + ResultSet prepareResultSet(boolean forwardOnlyHint) throws SQLException { + synchronized (this) { if (cancelled || query.isCancelled()) { // cancelled before we started cancelled = true; - return false; + return null; } startNano = System.nanoTime(); @@ -328,9 +338,8 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran ResultSet suppliedResultSet = query.getRawSql().getResultSet(); if (suppliedResultSet != null) { // this is a user supplied ResultSet so use that - dataReader = queryPlan.createDataReader(suppliedResultSet); bindLog = ""; - return true; + return suppliedResultSet; } } @@ -353,10 +362,7 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran bindLog = predicates.bind(dataBind); // executeQuery - ResultSet rset = pstmt.executeQuery(); - dataReader = queryPlan.createDataReader(rset); - - return true; + return pstmt.executeQuery(); } } @@ -793,4 +799,10 @@ public class CQuery implements DbReadContext, CancelableQuery, SpiProfileTran } } + /** + * Return the underlying PreparedStatement. + */ + PreparedStatement getPstmt() { + return pstmt; + } } diff --git a/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java b/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java index f03efc1a0..d4a3bd6ba 100644 --- a/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java +++ b/src/main/java/io/ebeaninternal/server/query/CQueryEngine.java @@ -8,12 +8,14 @@ import io.ebean.bean.EntityBean; import io.ebean.bean.ObjectGraphNode; import io.ebean.config.ServerConfig; import io.ebean.config.dbplatform.DatabasePlatform; +import io.ebean.util.JdbcClose; import io.ebean.util.StringHelper; import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.server.core.DiffHelp; import io.ebeaninternal.server.core.Message; import io.ebeaninternal.server.core.OrmQueryRequest; +import io.ebeaninternal.server.core.SpiResultSet; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.lib.util.Str; import io.ebeaninternal.server.persist.Binder; @@ -22,6 +24,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.persistence.PersistenceException; +import java.sql.ResultSet; import java.sql.SQLException; import java.util.LinkedHashMap; import java.util.List; @@ -325,6 +328,37 @@ public class CQueryEngine { return historySupport.getSysPeriodLower(rootTableAlias); } + /** + * Execute returning the ResultSet and PreparedStatement for processing (by DTO query usually). + */ + public SpiResultSet findResultSet(OrmQueryRequest request) { + CQuery cquery = queryBuilder.buildQuery(request); + try { + boolean fwdOnly; + if (request.isFindIterate()) { + // findEach ... + fwdOnly = forwardOnlyHintOnFindIterate; + if (defaultFetchSizeFindEach > 0) { + request.setDefaultFetchBuffer(defaultFetchSizeFindEach); + } + } else { + // findList - aggressive fetch + fwdOnly = false; + if (defaultFetchSizeFindList > 0) { + request.setDefaultFetchBuffer(defaultFetchSizeFindList); + } + } + ResultSet resultSet = cquery.prepareResultSet(fwdOnly); + if (request.isLogSql()) { + logSql(cquery); + } + return new SpiResultSet(cquery.getPstmt(), resultSet); + + } catch (SQLException e) { + JdbcClose.close(cquery.getPstmt()); + throw cquery.createPersistenceException(e); + } + } /** * Find a list/map/set of beans. diff --git a/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java b/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java index bed19babe..c6c042c92 100644 --- a/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java +++ b/src/main/java/io/ebeaninternal/server/query/DefaultOrmQueryEngine.java @@ -9,6 +9,7 @@ import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.api.SpiTransaction; import io.ebeaninternal.server.core.OrmQueryEngine; import io.ebeaninternal.server.core.OrmQueryRequest; +import io.ebeaninternal.server.core.SpiResultSet; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.persist.Binder; @@ -77,6 +78,12 @@ public class DefaultOrmQueryEngine implements OrmQueryEngine { return queryEngine.update(request); } + @Override + public SpiResultSet findResultSet(OrmQueryRequest request) { + flushJdbcBatchOnQuery(request); + return queryEngine.findResultSet(request); + } + @Override public int findCount(OrmQueryRequest request) { diff --git a/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java b/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java index f401863a2..4be7bec7b 100644 --- a/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java +++ b/src/main/java/io/ebeaninternal/server/query/DefaultRelationalQueryEngine.java @@ -1,6 +1,7 @@ package io.ebeaninternal.server.query; import io.ebean.SqlRow; +import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.core.Message; import io.ebeaninternal.server.core.RelationalQueryEngine; import io.ebeaninternal.server.core.RelationalQueryRequest; @@ -39,7 +40,7 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { public void findEach(RelationalQueryRequest request, Predicate consumer) { try { - request.executeSql(binder); + request.executeSql(binder, SpiQuery.Type.ITERATE); while (request.next()) { if (!consumer.test(readRow(request))) { break; @@ -59,7 +60,7 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { public void findEach(RelationalQueryRequest request, Consumer consumer) { try { - request.executeSql(binder); + request.executeSql(binder, SpiQuery.Type.ITERATE); while (request.next()) { consumer.accept(readRow(request)); } @@ -77,7 +78,7 @@ public class DefaultRelationalQueryEngine implements RelationalQueryEngine { public List findList(RelationalQueryRequest request) { try { - request.executeSql(binder); + request.executeSql(binder, SpiQuery.Type.LIST); List rows = new ArrayList<>(); while (request.next()) { rows.add(readRow(request)); diff --git a/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java b/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java index 1c572cf91..8811096eb 100644 --- a/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java +++ b/src/main/java/io/ebeaninternal/server/query/SqlTreeBuilder.java @@ -442,7 +442,7 @@ public final class SqlTreeBuilder { p = desc.findBeanProperty("id"); selectProps.add(p); - } else if (p.isId() && isNotSingleAttribute()) { + } else if (p.isId() && excludeIdProperty()) { // do not bother to include id for normal queries as the // id is always added (except for subQueries) @@ -722,6 +722,13 @@ public final class SqlTreeBuilder { } + /** + * Return true if the Id property should be excluded (as it is automatically included). + */ + private boolean excludeIdProperty() { + return query == null || !query.isSingleAttribute() && !query.isManualId(); + } + /** * Return true if the query is not a single attribute query. */ diff --git a/src/main/java/io/ebeaninternal/server/query/dto/DtoQueryEngine.java b/src/main/java/io/ebeaninternal/server/query/dto/DtoQueryEngine.java index 29944d117..fceed1465 100644 --- a/src/main/java/io/ebeaninternal/server/query/dto/DtoQueryEngine.java +++ b/src/main/java/io/ebeaninternal/server/query/dto/DtoQueryEngine.java @@ -1,5 +1,6 @@ package io.ebeaninternal.server.query.dto; +import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.core.DtoQueryRequest; import io.ebeaninternal.server.core.Message; import io.ebeaninternal.server.persist.Binder; @@ -20,7 +21,7 @@ public class DtoQueryEngine { public List findList(DtoQueryRequest request) { try { - request.executeSql(binder); + request.executeSql(binder, SpiQuery.Type.LIST); List rows = new ArrayList<>(); while (request.next()) { rows.add(request.readNextBean()); @@ -36,7 +37,7 @@ public class DtoQueryEngine { public void findEach(DtoQueryRequest request, Consumer consumer) { try { - request.executeSql(binder); + request.executeSql(binder, SpiQuery.Type.ITERATE); while (request.next()) { consumer.accept(request.readNextBean()); } @@ -50,7 +51,7 @@ public class DtoQueryEngine { public void findEachWhile(DtoQueryRequest request, Predicate consumer) { try { - request.executeSql(binder); + request.executeSql(binder, SpiQuery.Type.ITERATE); while (request.next()) { if (!consumer.test(request.readNextBean())) { break; diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java index a3def9baa..cf3158974 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultDtoQuery.java @@ -4,6 +4,7 @@ import io.ebean.DtoQuery; import io.ebeaninternal.api.BindParams; import io.ebeaninternal.api.SpiDtoQuery; import io.ebeaninternal.api.SpiEbeanServer; +import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.dto.DtoBeanDescriptor; import io.ebeaninternal.server.dto.DtoMappingRequest; import io.ebeaninternal.server.dto.DtoQueryPlan; @@ -22,6 +23,8 @@ public class DefaultDtoQuery implements SpiDtoQuery { private final DtoBeanDescriptor descriptor; + private final SpiQuery ormQuery; + private String sql; private int firstRow; @@ -42,11 +45,21 @@ public class DefaultDtoQuery implements SpiDtoQuery { private final BindParams bindParams = new BindParams(); /** - * Additional supply a query detail object. + * Create given an underlying ORM query. + */ + public DefaultDtoQuery(SpiEbeanServer server, DtoBeanDescriptor descriptor, SpiQuery ormQuery) { + this.server = server; + this.descriptor = descriptor; + this.ormQuery = ormQuery; + } + + /** + * Create given a native SQL query. */ public DefaultDtoQuery(SpiEbeanServer server, DtoBeanDescriptor descriptor, String sql) { this.server = server; this.descriptor = descriptor; + this.ormQuery = null; this.sql = sql; } @@ -56,7 +69,7 @@ public class DefaultDtoQuery implements SpiDtoQuery { } @Override - public DtoQueryPlan getQueryPlan(String planKey) { + public DtoQueryPlan getQueryPlan(Object planKey) { return descriptor.getQueryPlan(planKey); } @@ -66,7 +79,7 @@ public class DefaultDtoQuery implements SpiDtoQuery { } @Override - public void putQueryPlan(String planKey, DtoQueryPlan plan) { + public void putQueryPlan(Object planKey, DtoQueryPlan plan) { descriptor.putQueryPlan(planKey, plan); } @@ -97,13 +110,21 @@ public class DefaultDtoQuery implements SpiDtoQuery { @Override public DtoQuery setParameter(int position, Object value) { - bindParams.setParameter(position, value); + if (ormQuery != null) { + ormQuery.setParameter(position, value); + } else { + bindParams.setParameter(position, value); + } return this; } @Override public DtoQuery setParameter(String paramName, Object value) { - bindParams.setParameter(paramName, value); + if (ormQuery != null) { + ormQuery.setParameter(paramName, value); + } else { + bindParams.setParameter(paramName, value); + } return this; } @@ -117,6 +138,10 @@ public class DefaultDtoQuery implements SpiDtoQuery { return descriptor.getType(); } + public SpiQuery getOrmQuery() { + return ormQuery; + } + @Override public DtoQuery setRelaxedMode() { this.relaxedMode = true; @@ -147,6 +172,9 @@ public class DefaultDtoQuery implements SpiDtoQuery { @Override public DtoQuery setFirstRow(int firstRow) { this.firstRow = firstRow; + if (ormQuery != null) { + ormQuery.setFirstRow(firstRow); + } return this; } @@ -158,6 +186,9 @@ public class DefaultDtoQuery implements SpiDtoQuery { @Override public DtoQuery setMaxRows(int maxRows) { this.maxRows = maxRows; + if (ormQuery != null) { + ormQuery.setMaxRows(maxRows); + } return this; } diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index a66619796..7a908b410 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -2,6 +2,7 @@ package io.ebeaninternal.server.querydefn; import io.ebean.CacheMode; import io.ebean.CountDistinctOrder; +import io.ebean.DtoQuery; import io.ebean.Expression; import io.ebean.ExpressionFactory; import io.ebean.ExpressionList; @@ -130,6 +131,11 @@ public class DefaultOrmQuery implements SpiQuery { private String lazyLoadManyPath; + /** + * Flag set for report/DTO beans when we may choose to explicitly include the Id property. + */ + private boolean manualId; + /** * Set to true by a user wanting a DISTINCT query (id property must be excluded). */ @@ -280,6 +286,11 @@ public class DefaultOrmQuery implements SpiQuery { this.nativeSql = nativeSql; } + @Override + public DtoQuery asDto(Class dtoClass) { + return server.findDto(dtoClass, this); + } + @Override public BeanDescriptor getBeanDescriptor() { return beanDescriptor; @@ -668,7 +679,7 @@ public class DefaultOrmQuery implements SpiQuery { */ @Override public boolean isWithId() { - return !distinct && !singleAttribute; + return !manualId && !distinct && !singleAttribute; } @Override @@ -1027,7 +1038,7 @@ public class DefaultOrmQuery implements SpiQuery { queryPlanKey = new NativeSqlQueryPlanKey(nativeSql + "-" + firstRow + "-" + maxRows); } else { queryPlanKey = new OrmQueryPlanKey(beanDescriptor.getDiscValue(), m2mIncludeJoin, type, detail, maxRows, firstRow, - disableLazyLoading, orderBy, + disableLazyLoading, manualId, orderBy, distinct, sqlDistinct, mapKey, id, bindParams, whereExpressions, havingExpressions, temporalMode, forUpdate, rootTableAlias, rawSql, updateProperties, countDistinctOrder); } @@ -1044,6 +1055,11 @@ public class DefaultOrmQuery implements SpiQuery { return nativeSql; } + @Override + public Object getQueryPlanKey() { + return queryPlanKey; + } + /** * Prepare the query which prepares any expressions (sub-query expressions etc) and calculates the query plan key. */ @@ -1475,6 +1491,16 @@ public class DefaultOrmQuery implements SpiQuery { return this; } + @Override + public boolean isManualId() { + return manualId; + } + + @Override + public void setManualId(boolean manualId) { + this.manualId = manualId; + } + /** * return true if user specified to use SQL DISTINCT (effectively excludes id property). */ diff --git a/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java b/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java index eb7ca79c1..da91f6ea2 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java @@ -22,7 +22,7 @@ class OrmQueryPlanKey implements CQueryPlanKey { private final String description; OrmQueryPlanKey(String discValue, TableJoin m2mIncludeTable, SpiQuery.Type type, OrmQueryDetail detail, int maxRows, int firstRow, boolean disableLazyLoading, - OrderBy orderBy, boolean distinct, boolean sqlDistinct, String mapKey, Object id, BindParams bindParams, + boolean manualId, OrderBy orderBy, boolean distinct, boolean sqlDistinct, String mapKey, Object id, BindParams bindParams, SpiExpression whereExpressions, SpiExpression havingExpressions, SpiQuery.TemporalMode temporalMode, Query.ForUpdate forUpdate, String rootTableAlias, SpiRawSql rawSql, OrmUpdateProperties updateProperties, CountDistinctOrder countDistinctOrder) { @@ -42,6 +42,9 @@ class OrmQueryPlanKey implements CQueryPlanKey { if (id != null) { sb.append(",id:"); } + if (manualId) { + sb.append(",manId:"); + } if (distinct) { sb.append(",dist:"); } diff --git a/src/test/java/io/ebean/DtoQueryFromOrmTest.java b/src/test/java/io/ebean/DtoQueryFromOrmTest.java new file mode 100644 index 000000000..af22c17c6 --- /dev/null +++ b/src/test/java/io/ebean/DtoQueryFromOrmTest.java @@ -0,0 +1,297 @@ +package io.ebean; + +import io.ebean.meta.MetaQueryMetric; +import org.ebeantest.LoggedSqlCollector; +import org.junit.Ignore; +import org.junit.Test; +import org.tests.model.basic.Contact; +import org.tests.model.basic.ResetBasicData; + +import java.util.List; + +import static org.assertj.core.api.Assertions.assertThat; + +public class DtoQueryFromOrmTest extends BaseTestCase { + +// @BeforeClass +// public static void resetStats() { +// Ebean.getDefaultServer().getMetaInfoManager().collectQueryStatistics(true); +// } +// +// @AfterClass +// public static void reportStats() { +// List stats = Ebean.getDefaultServer().getMetaInfoManager().collectQueryStatistics(false); +// for (MetaQueryMetric stat : stats) { +// System.out.println(stat); +// } +// } + + @Ignore + @Test + public void testPlanHits() { + + ResetBasicData.reset(); + + Ebean.getDefaultServer().getMetaInfoManager().collectQueryStatistics(true); + + String[] prefix = {"Bl", "B", "Red"}; + + for (String val : prefix) { + List list = Ebean.find(Contact.class) + .select("email, concat(lastName,', ',firstName) as fullName") + .where().istartsWith("concat(lastName,', ',firstName)", val) + .orderBy().asc("lastName") + .setMaxRows(10) + .asDto(ContactDto.class) + .findList(); + + System.out.println("List:" + list); + } + + List stats = Ebean.getDefaultServer().getMetaInfoManager().collectQueryStatistics(true); + for (MetaQueryMetric stat : stats) { + System.out.println(stat); + } + + assertThat(stats).hasSize(1); + assertThat(stats.get(0).getCount()).isEqualTo(3); + + } + + @Test + public void asDto_withExplicitId() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + DtoQuery query = + Ebean.find(Contact.class) + // we must explicitly add the id property for DTO query (if we want it) + .select("id, email, concat(lastName,', ',firstName) as fullName") + .where().isNotNull("email").isNotNull("lastName") + .orderBy().asc("lastName") + .asDto(ContactDto.class) + .setRelaxedMode(); + + List dtos = query.findList(); + + assertThat(dtos).isNotEmpty(); + + for (ContactDto dto : dtos) { + assertThat(dto.getEmail()).isNotNull(); + assertThat(dto.getFullName()).isNotNull(); + System.out.println(dto); + } + + List sql = LoggedSqlCollector.stop(); + assertThat(sql.get(0)).contains("select t0.id, t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name"); + } + + @Test + public void asDto_withoutExplicitId() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + DtoQuery query = + Ebean.find(Contact.class) + .select("email, concat(lastName,', ',firstName) as fullName") + .where().isNotNull("email").isNotNull("lastName") + .orderBy().asc("lastName") + .asDto(ContactDto.class); + + List dtos = query.findList(); + + assertThat(dtos).isNotEmpty(); + + for (ContactDto dto : dtos) { + assertThat(dto.getEmail()).isNotNull(); + assertThat(dto.getFullName()).isNotNull(); + System.out.println(dto); + } + + List sql = LoggedSqlCollector.stop(); + assertThat(sql.get(0)).contains("select t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name"); + } + + + @Test + public void example() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + List contactDtos + = Ebean.find(Contact.class) + .select("email, concat(lastName,', ',firstName) as fullName") + .where().isNotNull("email").isNotNull("lastName") + .orderBy().asc("lastName") + .setMaxRows(10) + .asDto(ContactDto.class) + .findList(); + + assertThat(contactDtos).isNotEmpty(); + + for (ContactDto dto : contactDtos) { + assertThat(dto.getEmail()).isNotNull(); + assertThat(dto.getFullName()).isNotNull(); + System.out.println(dto); + } + + List sql = LoggedSqlCollector.stop(); + assertThat(sql.get(0)).contains("select t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name"); + } + + @Test + public void example_explicitId() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + List contactDtos + = Ebean.find(Contact.class) + .select("id, email, concat(lastName,', ',firstName) as fullName") + .where().isNotNull("email").isNotNull("lastName") + .orderBy().asc("lastName") + .setMaxRows(10) + .asDto(ContactDto.class) + .findList(); + + assertThat(contactDtos).isNotEmpty(); + + for (ContactDto dto : contactDtos) { + System.out.println(dto); + assertThat(dto.getId()).isNotNull(); + assertThat(dto.getFullName()).isNotNull(); + assertThat(dto.getEmail()).isNotNull(); + } + + List sql = LoggedSqlCollector.stop(); + assertThat(sql.get(0)).contains("select t0.id, t0.email, concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where t0.email is not null and t0.last_name is not null order by t0.last_name"); + } + + @Test + public void example_singleProperty() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + List contactDtos + = Ebean.find(Contact.class) + .select("concat(lastName,', ',firstName) as fullName") + .where().isNotNull("lastName") + .orderBy().asc("lastName") + .asDto(ContactDto.class) + .setFirstRow(2) + .setMaxRows(5) + .findList(); + + assertThat(contactDtos).isNotEmpty(); + + for (ContactDto dto : contactDtos) { + System.out.println(dto); + assertThat(dto.getFullName()).isNotNull(); + assertThat(dto.getId()).isNull(); + assertThat(dto.getEmail()).isNull(); + } + + List sql = LoggedSqlCollector.stop(); + assertThat(sql.get(0)).contains("select concat(t0.last_name,', ',t0.first_name) fullName from contact t0 where"); + } + + + @Test + public void example_aggregate() { + + ResetBasicData.reset(); + + LoggedSqlCollector.start(); + + List contactDtos + = Ebean.find(Contact.class) + .select("lastName, count(*) as totalCount") + .where().isNotNull("lastName") + .having().gt("count(*)", 1) + .orderBy().desc("count(*)") + .asDto(ContactTotals.class) + .findList(); + + assertThat(contactDtos).isNotEmpty(); + + for (ContactTotals dto : contactDtos) { + assertThat(dto.getLastName()).isNotNull(); + assertThat(dto.getTotalCount()).isNotNull(); + } + + List sql = LoggedSqlCollector.stop(); + assertThat(sql.get(0)).contains("select t0.last_name, count(*) totalCount from contact t0 where t0.last_name is not null group by t0.last_name having count(*) > ?"); + } + + public static class ContactTotals { + + String lastName; + Long totalCount; + + @Override + public String toString() { + return "lastName:" + lastName + " total:" + totalCount; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public Long getTotalCount() { + return totalCount; + } + + public void setTotalCount(Long totalCount) { + this.totalCount = totalCount; + } + } + + public static class ContactDto { + + String email; + String fullName; + Integer id; + + @Override + public String toString() { + return "id:" + id + " email:" + email + " fn:" + fullName; + } + + public String getEmail() { + return email; + } + + public String getFullName() { + return fullName; + } + + public void setEmail(String email) { + this.email = email; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + } +} diff --git a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java index 28bf61ec4..349767266 100644 --- a/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java +++ b/src/test/java/io/ebeaninternal/api/TDSpiEbeanServer.java @@ -41,6 +41,7 @@ import io.ebean.plugin.SpiServer; import io.ebean.text.csv.CsvReader; import io.ebean.text.json.JsonContext; import io.ebeaninternal.dbmigration.ddlgeneration.DdlHandler; +import io.ebeaninternal.server.core.SpiResultSet; import io.ebeaninternal.server.core.timezone.DataTimeZone; import io.ebeaninternal.server.deploy.BeanDescriptor; import io.ebeaninternal.server.query.CQuery; @@ -414,6 +415,16 @@ public class TDSpiEbeanServer implements SpiEbeanServer { return null; } + @Override + public DtoQuery findDto(Class dtoType, SpiQuery ormQuery) { + return null; + } + + @Override + public SpiResultSet findResultSet(SpiQuery ormQuery, SpiTransaction transaction) { + return null; + } + @Override public SqlQuery createSqlQuery(String sql) { return null; diff --git a/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java b/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java index 1ab27c6d0..7df67e9a7 100644 --- a/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java +++ b/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java @@ -10,8 +10,8 @@ import io.ebeaninternal.server.deploy.TableJoin; import io.ebeaninternal.server.deploy.meta.DeployTableJoin; import io.ebeaninternal.server.deploy.meta.DeployTableJoinColumn; import io.ebeaninternal.server.expression.BaseExpressionTest; -import org.tests.model.basic.Customer; import org.junit.Test; +import org.tests.model.basic.Customer; import static org.assertj.core.api.Assertions.assertThat; @@ -21,8 +21,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { @Test public void equals_when_defaults() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @@ -30,9 +30,9 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { @Test public void equals_when_diffDiscValue() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey("A", null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key3 = new OrmQueryPlanKey("B", null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey("A", null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key3 = new OrmQueryPlanKey("B", null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); assertDifferent(key2, key3); } @@ -42,8 +42,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { TableJoin tableJoin = tableJoin("table", "id", "customer_id"); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, tableJoin, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, tableJoin, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -54,8 +54,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { TableJoin tableJoin1 = tableJoin("one", "id", "customer_id"); TableJoin tableJoin2 = tableJoin("two", "id", "customer_id"); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, tableJoin1, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, tableJoin2, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, tableJoin1, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, tableJoin2, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -66,8 +66,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { TableJoin tableJoin1 = tableJoin("one", "id", "customer_id"); TableJoin tableJoin2 = tableJoin("one", "id", "customer_id"); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, tableJoin1, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, tableJoin2, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, tableJoin1, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, tableJoin2, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @@ -82,8 +82,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { @Test public void equals_when_diffQueryType() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.LIST, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.LIST, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -91,8 +91,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { @Test public void equals_when_firstRowsDifferent() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 10, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 10, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -100,8 +100,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { @Test public void equals_when_maxRowsDifferent() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 10, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 10, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -109,8 +109,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { @Test public void equals_when_firstRowsMaxRowsSame() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 10, 20, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 10, 20, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 10, 20, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 10, 20, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @@ -118,8 +118,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { @Test public void equals_when_diffDisableLazyLoading() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, true, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, true, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -128,8 +128,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { public void equals_when_diffOrderByNull() { OrderBy o1 = new OrderBy<>("id"); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, o1, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, o1, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -139,121 +139,121 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { OrderBy o1 = new OrderBy<>("id, name"); OrderBy o2 = new OrderBy<>("id, name"); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, o1, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, o2, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, o1, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, o2, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @Test public void equals_when_diffDistinct() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, true, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, true, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_sameDistinct() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, true, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, true, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, true, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, true, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @Test public void equals_when_diffSqlDistinct() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, true, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, true, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_sameSqlDistinct() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, true, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, true, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, true, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, true, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @Test public void equals_when_diffMapKeyNull() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, "mapKey", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, "mapKey", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_diffMapKey() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, "mapKey", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, "diff", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, "mapKey", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, "diff", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_sameMapKey() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, "mapKey", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, "mapKey", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, "mapKey", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, "mapKey", null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @Test public void equals_when_diffIdNull() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, 42, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, 42, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_idBothGiven() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, 42, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, 23, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, 42, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, 23, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @Test public void equals_when_diffTemporalMode() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.DRAFT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.DRAFT, null, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_diffForUpdate() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.BASE, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.BASE, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_diffForUpdate_NoWait() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.BASE, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.NOWAIT, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.BASE, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.NOWAIT, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_diffForUpdate_SkipLocked() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.BASE, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.SKIPLOCKED, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.BASE, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, Query.ForUpdate.SKIPLOCKED, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_diffRootAliasNull() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "rootAlias", null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "rootAlias", null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_diffRootAlias() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "rootAlias", null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "diff", null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "rootAlias", null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "diff", null, null, null); assertDifferent(key1, key2); } @Test public void equals_when_sameRootAlias() { - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "rootAlias", null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "rootAlias", null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "rootAlias", null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, "rootAlias", null, null, null); assertSame(key1, key2); } @@ -280,8 +280,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { SpiExpressionList list1 = list_id_eq_42(); SpiExpressionList list2 = list_id_eq_43(); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, list1, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, list2, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, list1, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, list2, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @@ -292,8 +292,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { SpiExpressionList where1 = list_id_eq_42(); SpiExpressionList where2 = list_id_eq_42_and_name_eq_rob(); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, where1, null, SpiQuery.TemporalMode.DRAFT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, where2, null, SpiQuery.TemporalMode.DRAFT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, where1, null, SpiQuery.TemporalMode.DRAFT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, where2, null, SpiQuery.TemporalMode.DRAFT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -302,8 +302,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { SpiExpressionList list1 = list_id_eq_42(); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, list1, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, list1, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -312,8 +312,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { SpiExpressionList list1 = list_id_eq_42(); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, list1, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, list1, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -323,8 +323,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { SpiExpression having1 = list_id_eq_42().copyForPlanKey(); SpiExpression having2 = list_id_eq_42_and_name_eq_rob().copyForPlanKey(); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, having1, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, having2, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, having1, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, having2, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -334,8 +334,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { SpiExpression having1 = list_id_eq_42().copyForPlanKey(); SpiExpression having2 = list_id_eq_42().copyForPlanKey(); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, having1, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, having2, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, having1, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, having2, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertSame(key1, key2); } @@ -344,8 +344,8 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { SpiExpression having1 = list_id_eq_42().copyForPlanKey(); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, having1, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, having1, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } @@ -354,8 +354,16 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { SpiExpression having1 = list_id_eq_42().copyForPlanKey(); - OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); - OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, null, false, false, null, null, null, null, having1, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, having1, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + assertDifferent(key1, key2); + } + + @Test + public void equals_when_manualId() { + + OrmQueryPlanKey key1 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, false, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); + OrmQueryPlanKey key2 = new OrmQueryPlanKey(null, null, SpiQuery.Type.BEAN, null, 0, 0, false, true, null, false, false, null, null, null, null, null, SpiQuery.TemporalMode.CURRENT, null, null, null, null, null); assertDifferent(key1, key2); } diff --git a/src/test/java/org/tests/query/aggregation/TestAggregationCount.java b/src/test/java/org/tests/query/aggregation/TestAggregationCount.java index 330e769f9..dcbdcdf1e 100644 --- a/src/test/java/org/tests/query/aggregation/TestAggregationCount.java +++ b/src/test/java/org/tests/query/aggregation/TestAggregationCount.java @@ -3,7 +3,6 @@ package org.tests.query.aggregation; import io.ebean.BaseTestCase; import io.ebean.Ebean; import io.ebean.Query; -import org.assertj.core.api.Assertions; import org.ebeantest.LoggedSqlCollector; import org.junit.BeforeClass; import org.junit.Test; @@ -40,7 +39,6 @@ public class TestAggregationCount extends BaseTestCase { Ebean.save(three); three.setName("third"); Ebean.save(three); - } @Test @@ -232,7 +230,6 @@ public class TestAggregationCount extends BaseTestCase { .query(); Timestamp maxUpdateTime = query0.findSingleAttribute(); - System.out.println(""+maxUpdateTime); assertThat(maxUpdateTime).isNotNull(); String sql = sqlOf(query0, 5); @@ -256,8 +253,7 @@ public class TestAggregationCount extends BaseTestCase { .select("max(orderQty)"); Integer maxOrderQty = query.findSingleAttribute(); - System.out.println(""+maxOrderQty); - Assertions.assertThat(maxOrderQty).isGreaterThan(20); + assertThat(maxOrderQty).isGreaterThan(20); String sql = sqlOf(query, 5); assertThat(sql).contains("select max(t0.order_qty) from o_order_detail t0"); @@ -272,7 +268,6 @@ public class TestAggregationCount extends BaseTestCase { .select("min(orderQty)"); Integer minOrderQty = query.findSingleAttribute(); - System.out.println(""+minOrderQty); assertThat(minOrderQty).isLessThan(10); String sql = sqlOf(query, 5); @@ -288,7 +283,7 @@ public class TestAggregationCount extends BaseTestCase { .select("max(lastName)"); String maxName = query.findSingleAttribute(); - System.out.println(""+maxName); + assertThat(maxName).isNotNull(); String sql = sqlOf(query, 5); assertThat(sql).contains("select max(t0.last_name) from contact t0"); @@ -303,7 +298,6 @@ public class TestAggregationCount extends BaseTestCase { .select("min(firstName)"); String minName = query.findSingleAttribute(); - System.out.println(""+minName); assertThat(minName).isNotNull(); String sql = sqlOf(query, 5); @@ -320,7 +314,6 @@ public class TestAggregationCount extends BaseTestCase { .select("count(lastName)"); Long count = query.findSingleAttribute(); - System.out.println(""+count); assertThat(count).isNotNull(); String sql = sqlOf(query, 5); @@ -336,7 +329,6 @@ public class TestAggregationCount extends BaseTestCase { .select("count(distinct lastName)"); Long count = query.findSingleAttribute(); - System.out.println(""+count); assertThat(count).isNotNull(); String sql = sqlOf(query, 5); @@ -352,9 +344,9 @@ public class TestAggregationCount extends BaseTestCase { String maxLastName = Ebean.find(Contact.class) - .select("max(lastName)") - .where().isNull("phone") - .findSingleAttribute(); + .select("max(lastName)") + .where().isNull("phone") + .findSingleAttribute(); assertThat(maxLastName).isNotNull(); @@ -371,11 +363,10 @@ public class TestAggregationCount extends BaseTestCase { Long count = Ebean.find(Contact.class) - .select("count(distinct lastName)") - .where().isEmpty("notes") - .findSingleAttribute(); + .select("count(distinct lastName)") + .where().isEmpty("notes") + .findSingleAttribute(); - System.out.println(""+count); assertThat(count).isNotNull(); List sql = LoggedSqlCollector.stop();