diff --git a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java index c58c658db..9f52a6a33 100644 --- a/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java +++ b/src/main/java/io/ebeaninternal/server/deploy/BeanPropertyAssocMany.java @@ -335,6 +335,18 @@ public class BeanPropertyAssocMany extends BeanPropertyAssoc { return false; } + /** + * Add the loaded current bean to its associated parent. + * + * Helper method used by Elastic integration when loading with a persistence context. + */ + public void lazyLoadMany(EntityBean current) { + EntityBean parentBean = childMasterProperty.getValueAsEntityBean(current); + if (parentBean != null) { + addBeanToCollectionWithCreate(parentBean, current, true); + } + } + public void addWhereParentIdIn(SpiQuery query, List parentIds, boolean useDocStore) { if (useDocStore) { // assumes the ManyToOne property is included diff --git a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java index 0359e97c2..50683c1dc 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/DefaultOrmQuery.java @@ -359,7 +359,7 @@ public class DefaultOrmQuery implements SpiQuery { } @Override - public Query setUseDocStore(boolean useDocStore) { + public DefaultOrmQuery setUseDocStore(boolean useDocStore) { this.useDocStore = useDocStore; return this; } @@ -428,7 +428,7 @@ public class DefaultOrmQuery implements SpiQuery { } @Override - public Query setIncludeSoftDeletes() { + public DefaultOrmQuery setIncludeSoftDeletes() { this.temporalMode = TemporalMode.SOFT_DELETED; return this; } @@ -1050,14 +1050,87 @@ public class DefaultOrmQuery implements SpiQuery { if (isNativeSql()) { queryPlanKey = new NativeSqlQueryPlanKey(nativeSql + "-" + firstRow + "-" + maxRows); } else { - queryPlanKey = new OrmQueryPlanKey(beanDescriptor.getDiscValue(), m2mIncludeJoin, type, detail, maxRows, firstRow, - disableLazyLoading, manualId, orderBy, - distinct, sqlDistinct, mapKey, id, bindParams, whereExpressions, havingExpressions, - temporalMode, forUpdate, rootTableAlias, rawSql, updateProperties, countDistinctOrder); + queryPlanKey = new OrmQueryPlanKey(planDescription(), maxRows, firstRow, rawSql); } return queryPlanKey; } + private String planDescription() { + + StringBuilder sb = new StringBuilder(300); + if (type != null) { + sb.append("t:").append(type.ordinal()); + } + if (useDocStore) { + sb.append(",ds:"); + } + if (beanDescriptor.getDiscValue() != null) { + sb.append(",disc:").append(beanDescriptor.getDiscValue()); + } + if (temporalMode != SpiQuery.TemporalMode.CURRENT) { + sb.append(",temp:").append(temporalMode.ordinal()); + } + if (forUpdate != null) { + sb.append(",forUpd:").append(forUpdate.ordinal()); + } + if (id != null) { + sb.append(",id:"); + } + if (manualId) { + sb.append(",manId:"); + } + if (distinct) { + sb.append(",dist:"); + } + if (sqlDistinct) { + sb.append(",sqlD:"); + } + if (disableLazyLoading) { + sb.append(",disLazy:"); + } + if (rootTableAlias != null) { + sb.append(",root:").append(rootTableAlias); + } + if (orderBy != null) { + sb.append(",orderBy:").append(orderBy.toStringFormat()); + } + if (m2mIncludeJoin != null) { + sb.append(",m2m:").append(m2mIncludeJoin.getTable()); + } + if (mapKey != null) { + sb.append(",mapKey:").append(mapKey); + } + if (countDistinctOrder != null) { + sb.append(",countDistOrd:").append(countDistinctOrder.name()); + } + if (detail != null) { + sb.append(" detail["); + detail.queryPlanHash(sb); + sb.append("]"); + } + if (bindParams != null) { + sb.append(" bindParams["); + bindParams.buildQueryPlanHash(sb); + sb.append("]"); + } + if (whereExpressions != null) { + sb.append(" where["); + whereExpressions.queryPlanHash(sb); + sb.append("]"); + } + if (havingExpressions != null) { + sb.append(" having["); + havingExpressions.queryPlanHash(sb); + sb.append("]"); + } + if (updateProperties != null) { + sb.append(" update["); + updateProperties.buildQueryPlanHash(sb); + sb.append("]"); + } + return sb.toString(); + } + @Override public boolean isNativeSql() { return nativeSql != null; @@ -1449,7 +1522,7 @@ public class DefaultOrmQuery implements SpiQuery { @Override public boolean checkPagingOrderBy() { - return (maxRows > 1 || firstRow > 0) && !distinct && (orderByIsEmpty() || isOrderById()); + return !useDocStore && (maxRows > 1 || firstRow > 0) && !distinct && (orderByIsEmpty() || isOrderById()); } @Override @@ -1585,7 +1658,7 @@ public class DefaultOrmQuery implements SpiQuery { } @Override - public Query setDisableLazyLoading(boolean disableLazyLoading) { + public DefaultOrmQuery setDisableLazyLoading(boolean disableLazyLoading) { this.disableLazyLoading = disableLazyLoading; return this; } @@ -1793,7 +1866,7 @@ public class DefaultOrmQuery implements SpiQuery { } @Override - public Query alias(String alias) { + public DefaultOrmQuery alias(String alias) { this.rootTableAlias = alias; return this; } diff --git a/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java b/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java index da91f6ea2..2286f3ae2 100644 --- a/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java +++ b/src/main/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKey.java @@ -1,13 +1,6 @@ package io.ebeaninternal.server.querydefn; -import io.ebean.CountDistinctOrder; -import io.ebean.OrderBy; -import io.ebean.Query; -import io.ebeaninternal.api.BindParams; import io.ebeaninternal.api.CQueryPlanKey; -import io.ebeaninternal.api.SpiExpression; -import io.ebeaninternal.api.SpiQuery; -import io.ebeaninternal.server.deploy.TableJoin; import io.ebeaninternal.server.rawsql.SpiRawSql; /** @@ -21,85 +14,11 @@ class OrmQueryPlanKey implements CQueryPlanKey { private final int planHash; private final String description; - OrmQueryPlanKey(String discValue, TableJoin m2mIncludeTable, SpiQuery.Type type, OrmQueryDetail detail, int maxRows, int firstRow, boolean disableLazyLoading, - 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) { - - StringBuilder sb = new StringBuilder(300); - if (type != null) { - sb.append("t:").append(type.ordinal()); - } - if (discValue != null) { - sb.append("disc:").append(discValue); - } - if (temporalMode != SpiQuery.TemporalMode.CURRENT) { - sb.append(",temp:").append(temporalMode.ordinal()); - } - if (forUpdate != null) { - sb.append(",forUpd:").append(forUpdate.ordinal()); - } - if (id != null) { - sb.append(",id:"); - } - if (manualId) { - sb.append(",manId:"); - } - if (distinct) { - sb.append(",dist:"); - } - if (sqlDistinct) { - sb.append(",sqlD:"); - } - if (disableLazyLoading) { - sb.append(",disLazy:"); - } - if (rootTableAlias != null) { - sb.append(",root:").append(rootTableAlias); - } - if (orderBy != null) { - sb.append(",orderBy:").append(orderBy.toStringFormat()); - } - if (m2mIncludeTable != null) { - sb.append(",m2m:").append(m2mIncludeTable.getTable()); - } - if (mapKey != null) { - sb.append(",mapKey:").append(mapKey); - } - if (countDistinctOrder != null) { - sb.append(",countdistinctoder:").append(countDistinctOrder.name()); - } + OrmQueryPlanKey(String description, int maxRows, int firstRow, SpiRawSql rawSql) { + this.description = description; this.maxRows = maxRows; this.firstRow = firstRow; this.rawSqlKey = (rawSql == null) ? null : rawSql.getKey(); - - if (detail != null) { - sb.append(" detail["); - detail.queryPlanHash(sb); - sb.append("]"); - } - if (bindParams != null) { - sb.append(" bindParams["); - bindParams.buildQueryPlanHash(sb); - sb.append("]"); - } - if (whereExpressions != null) { - sb.append(" where["); - whereExpressions.queryPlanHash(sb); - sb.append("]"); - } - if (havingExpressions != null) { - sb.append(" having["); - havingExpressions.queryPlanHash(sb); - sb.append("]"); - } - if (updateProperties != null) { - sb.append(" update["); - updateProperties.buildQueryPlanHash(sb); - sb.append("]"); - } - - this.description = sb.toString(); int hc = description.hashCode(); hc = hc * 92821 + (maxRows); hc = hc * 92821 + (firstRow); diff --git a/src/test/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyTest.java b/src/test/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyTest.java index 881614304..162832e76 100644 --- a/src/test/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyTest.java +++ b/src/test/java/io/ebeaninternal/server/deploy/BeanPropertyAssocManyTest.java @@ -3,23 +3,27 @@ package io.ebeaninternal.server.deploy; import io.ebean.BaseTestCase; import io.ebean.bean.BeanCollection; import io.ebean.bean.EntityBean; +import io.ebean.common.BeanList; +import org.junit.Test; +import org.tests.model.basic.Contact; import org.tests.model.basic.Customer; import org.tests.model.basic.ResetBasicData; -import org.junit.Test; import java.util.ArrayList; import java.util.List; import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.Assert.*; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; public class BeanPropertyAssocManyTest extends BaseTestCase { - BeanDescriptor customerDesc = spiEbeanServer().getBeanDescriptor(Customer.class); + private BeanDescriptor customerDesc = spiEbeanServer().getBeanDescriptor(Customer.class); @SuppressWarnings("unchecked") - BeanPropertyAssocMany contacts() { + private BeanPropertyAssocMany contacts() { return (BeanPropertyAssocMany) customerDesc.getBeanProperty("contacts"); } @@ -44,6 +48,20 @@ public class BeanPropertyAssocManyTest extends BaseTestCase { assertTrue(ref.isReference()); } + @Test + public void lazyLoadMany_addsToParentCollection() { + + Customer customer = new Customer(); + customer.setContacts(new BeanList<>()); + + Contact contact = new Contact(); + contact.setCustomer(customer); + + contacts().lazyLoadMany((EntityBean) contact); + + assertThat(customer.getContacts()).hasSize(1); + assertThat(customer.getContacts().get(0)).isSameAs(contact); + } @Test public void findIdsByParentId() { diff --git a/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java b/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java index 7df67e9a7..043ecf6f0 100644 --- a/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java +++ b/src/test/java/io/ebeaninternal/server/querydefn/OrmQueryPlanKeyTest.java @@ -1,10 +1,9 @@ package io.ebeaninternal.server.querydefn; -import io.ebean.OrderBy; +import io.ebean.ExpressionList; import io.ebean.Query; -import io.ebeaninternal.api.SpiExpression; -import io.ebeaninternal.api.SpiExpressionList; +import io.ebeaninternal.api.CQueryPlanKey; import io.ebeaninternal.api.SpiQuery; import io.ebeaninternal.server.deploy.TableJoin; import io.ebeaninternal.server.deploy.meta.DeployTableJoin; @@ -13,63 +12,55 @@ import io.ebeaninternal.server.expression.BaseExpressionTest; import org.junit.Test; import org.tests.model.basic.Customer; +import java.sql.Timestamp; + import static org.assertj.core.api.Assertions.assertThat; public class OrmQueryPlanKeyTest extends BaseExpressionTest { - @Test - public void equals_when_defaults() { - - 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); + @SuppressWarnings("unchecked") + private DefaultOrmQuery query() { + return (DefaultOrmQuery) server().find(Customer.class); } @Test - public void equals_when_diffDiscValue() { + public void equals_when_defaults() { - 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); + assertSame(query().createQueryPlanKey(), query().createQueryPlanKey()); } @Test public void equals_when_diffTableJoinNull() { - TableJoin tableJoin = tableJoin("table", "id", "customer_id"); + DefaultOrmQuery q1 = query(); + q1.setM2MIncludeJoin(tableJoin("table", "id", "customer_id")); - 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); + assertDifferent(q1, query()); } @Test public void equals_when_diffTableJoin() { - TableJoin tableJoin1 = tableJoin("one", "id", "customer_id"); - TableJoin tableJoin2 = tableJoin("two", "id", "customer_id"); + DefaultOrmQuery q1 = query(); + q1.setM2MIncludeJoin(tableJoin("one", "cid", "customer_id")); - 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); + DefaultOrmQuery q2 = query(); + q2.setM2MIncludeJoin(tableJoin("two", "cid", "customer_id")); - assertDifferent(key1, key2); + assertDifferent(q1, q2); } @Test public void equals_when_sameTableJoin() { - TableJoin tableJoin1 = tableJoin("one", "id", "customer_id"); - TableJoin tableJoin2 = tableJoin("one", "id", "customer_id"); + DefaultOrmQuery q1 = query(); + q1.setM2MIncludeJoin(tableJoin("one", "id", "cust_id")); - 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); + DefaultOrmQuery q2 = query(); + q2.setM2MIncludeJoin(tableJoin("one", "id", "cust_id")); - assertSame(key1, key2); + assertSame(q1, q2); } private TableJoin tableJoin(String table, String col1, String col2) { @@ -82,297 +73,293 @@ public class OrmQueryPlanKeyTest extends BaseExpressionTest { @Test public void equals_when_diffQueryType() { - 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); + DefaultOrmQuery q1 = query(); + q1.setType(SpiQuery.Type.BEAN); - assertDifferent(key1, key2); + DefaultOrmQuery q2 = query(); + q2.setType(SpiQuery.Type.LIST); + + assertDifferent(q1, q2); } @Test public void equals_when_firstRowsDifferent() { - 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); + CQueryPlanKey key1 = query().setFirstRow(10).createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); + assertDifferent(key1, key2); + key1 = query().setFirstRow(10).createQueryPlanKey(); + key2 = query().setFirstRow(9).createQueryPlanKey(); + assertDifferent(key1, key2); + + key1 = query().createQueryPlanKey(); + key2 = query().setFirstRow(9).createQueryPlanKey(); assertDifferent(key1, key2); } @Test public void equals_when_maxRowsDifferent() { - 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); - + CQueryPlanKey key1 = query().setMaxRows(10).createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); assertDifferent(key1, key2); + + key1 = query().setMaxRows(10).createQueryPlanKey(); + key2 = query().setMaxRows(9).createQueryPlanKey(); + assertDifferent(key1, key2); + + key1 = query().createQueryPlanKey(); + key2 = query().setMaxRows(9).createQueryPlanKey(); + assertDifferent(key1, key2); + } @Test public void equals_when_firstRowsMaxRowsSame() { - 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); - + CQueryPlanKey key1 = query().setMaxRows(10).setFirstRow(20).createQueryPlanKey(); + CQueryPlanKey key2 = query().setFirstRow(20).setMaxRows(10).createQueryPlanKey(); assertSame(key1, key2); } @Test public void equals_when_diffDisableLazyLoading() { - 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); + assertDifferent(query().setDisableLazyLoading(true), query()); } @Test public void equals_when_diffOrderByNull() { - OrderBy o1 = new OrderBy<>("id"); - 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); + CQueryPlanKey key1 = query().order("id").createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); + assertDifferent(key1, key2); + key1 = ((DefaultOrmQuery) query().order().asc("id")).createQueryPlanKey(); + key2 = query().createQueryPlanKey(); assertDifferent(key1, key2); } @Test public void equals_when_orderBySame() { - 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, 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); - + CQueryPlanKey key1 = query().order("id, name").createQueryPlanKey(); + CQueryPlanKey key2 = query().order("id, name").createQueryPlanKey(); assertSame(key1, key2); } @Test public void equals_when_diffDistinct() { - 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); + + CQueryPlanKey key1 = query().setDistinct(true).createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); assertDifferent(key1, key2); } @Test public void equals_when_sameDistinct() { - 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); + + CQueryPlanKey key1 = query().setDistinct(true).createQueryPlanKey(); + CQueryPlanKey key2 = query().setDistinct(true).createQueryPlanKey(); assertSame(key1, key2); } @Test public void equals_when_diffSqlDistinct() { - 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); + DefaultOrmQuery q1 = query(); + q1.setSqlDistinct(true); + CQueryPlanKey key1 = q1.createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); + assertDifferent(key1, key2); } @Test public void equals_when_sameSqlDistinct() { - 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); + + DefaultOrmQuery q1 = query(); + q1.setSqlDistinct(true); + + DefaultOrmQuery q2 = query(); + q2.setSqlDistinct(true); + + assertSame(q1, q2); } @Test - public void equals_when_diffMapKeyNull() { - 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); + public void equals_when_useDocStore() { + CQueryPlanKey key1 = query().setUseDocStore(true).createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); + assertDifferent(key1, key2); } @Test public void equals_when_diffMapKey() { - 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, 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); + CQueryPlanKey key1 = query().setMapKey("name").createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); + assertDifferent(key1, key2); + + CQueryPlanKey key3 = query().setMapKey("email").createQueryPlanKey(); + assertDifferent(key1, key3); + + CQueryPlanKey key4 = query().setMapKey("name").createQueryPlanKey(); + assertSame(key1, key4); } @Test public void equals_when_diffIdNull() { - 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); + + CQueryPlanKey key1 = query().setId(42).createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); assertDifferent(key1, key2); } @Test public void equals_when_idBothGiven() { - 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); + + CQueryPlanKey key1 = query().setId(42).createQueryPlanKey(); + CQueryPlanKey key2 = query().setId(23).createQueryPlanKey(); assertSame(key1, key2); } @Test public void equals_when_diffTemporalMode() { - 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); + + CQueryPlanKey key1 = query().createQueryPlanKey(); + CQueryPlanKey key2 = query().asDraft().createQueryPlanKey(); assertDifferent(key1, key2); + + CQueryPlanKey key3 = query().asOf(new Timestamp(System.currentTimeMillis())).createQueryPlanKey(); + assertDifferent(key1, key3); + + CQueryPlanKey key4 = query().setIncludeSoftDeletes().createQueryPlanKey(); + assertDifferent(key1, key4); } @Test public void equals_when_diffForUpdate() { - 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, 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); + CQueryPlanKey key1 = query().forUpdate().createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); assertDifferent(key1, key2); - } - @Test - public void equals_when_diffForUpdate_SkipLocked() { - 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); + CQueryPlanKey key3 = query().forUpdateNoWait().createQueryPlanKey(); + assertDifferent(key1, key3); + + CQueryPlanKey key4 = query().forUpdateSkipLocked().createQueryPlanKey(); + assertDifferent(key1, key4); + + CQueryPlanKey key5 = query().forUpdate().createQueryPlanKey(); + assertSame(key1, key5); } @Test public void equals_when_diffRootAliasNull() { - 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); + + CQueryPlanKey key1 = query().alias("alias").createQueryPlanKey(); + CQueryPlanKey key2 = query().createQueryPlanKey(); assertDifferent(key1, key2); + + CQueryPlanKey key3 = query().alias("diff").createQueryPlanKey(); + assertDifferent(key1, key3); + + CQueryPlanKey key4 = query().alias("alias").createQueryPlanKey(); + assertSame(key1, key4); } - @Test - public void equals_when_diffRootAlias() { - 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); + + private DefaultOrmQuery list_id_eq_42() { + return (DefaultOrmQuery) server().find(Customer.class) + .where().eq("id", 42).query(); } - @Test - public void equals_when_sameRootAlias() { - 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); + private DefaultOrmQuery list_id_eq_43() { + return (DefaultOrmQuery) server().find(Customer.class) + .where().eq("id", 43).query(); } - SpiExpressionList list_id_eq_42() { - return (SpiExpressionList) server().find(Customer.class) - .where().eq("id", 42); - } - - SpiExpressionList list_id_eq_43() { - return (SpiExpressionList) server().find(Customer.class) - .where().eq("id", 43); - } - - SpiExpressionList list_id_eq_42_and_name_eq_rob() { - return (SpiExpressionList) server().find(Customer.class) - .where().eq("id", 43).eq("name", "rob"); + private DefaultOrmQuery list_id_eq_42_and_name_eq_rob() { + return (DefaultOrmQuery) server().find(Customer.class) + .where().eq("id", 43).eq("name", "rob").query(); } @Test public void equals_when_sameWhere() { - - 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, 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); + assertSame(list_id_eq_42(), list_id_eq_43()); } @Test public void equals_when_diffWhere() { - 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, 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); + assertDifferent(list_id_eq_42(), list_id_eq_42_and_name_eq_rob()); } @Test public void equals_when_diffWhereNullLast() { - SpiExpressionList list1 = list_id_eq_42(); - - 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); - } - - @Test - public void equals_when_diffWhereNullFirst() { - - SpiExpressionList list1 = list_id_eq_42(); - - 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); + assertDifferent(list_id_eq_42(), query()); } @Test public void equals_when_diffHaving() { - 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, 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); + CQueryPlanKey key1 = planKey(query().having().eq("id", 42)); + CQueryPlanKey key2 = planKey(query().having().eq("id", 42).eq("name", "Rob")); assertDifferent(key1, key2); + + CQueryPlanKey key3 = planKey(query().where().eq("id", 42)); + assertDifferent(key1, key3); + + CQueryPlanKey key4 = planKey(query().having().eq("name", "Rob")); + assertDifferent(key1, key4); } + @Test public void equals_when_sameHaving() { - 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, 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); + CQueryPlanKey key1 = planKey(query().having().eq("id", 42)); + CQueryPlanKey key2 = planKey(query().having().eq("id", 43)); assertSame(key1, key2); } - @Test - public void equals_when_havingNullLast() { - - SpiExpression having1 = list_id_eq_42().copyForPlanKey(); - - 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); - } - - @Test - public void equals_when_havingNullFirst() { - - SpiExpression having1 = list_id_eq_42().copyForPlanKey(); - - 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); + DefaultOrmQuery q1 = query(); + q1.setManualId(true); + + assertDifferent(q1, query()); } - private void assertDifferent(OrmQueryPlanKey key1, OrmQueryPlanKey key2) { + private CQueryPlanKey planKey(ExpressionList id) { + return planKey(id.query()); + } + + private CQueryPlanKey planKey(Query query) { + return ((DefaultOrmQuery) query).createQueryPlanKey(); + } + + private void assertDifferent(DefaultOrmQuery q1, DefaultOrmQuery q2) { + assertDifferent(q1.createQueryPlanKey(), q2.createQueryPlanKey()); + } + + private void assertSame(DefaultOrmQuery q1, DefaultOrmQuery q2) { + assertSame(q1.createQueryPlanKey(), q2.createQueryPlanKey()); + } + + private void assertDifferent(CQueryPlanKey key1, CQueryPlanKey key2) { assertThat(key1).isNotEqualTo(key2); assertThat(key1.hashCode()).isNotEqualTo(key2.hashCode()); } - private void assertSame(OrmQueryPlanKey key1, OrmQueryPlanKey key2) { + private void assertSame(CQueryPlanKey key1, CQueryPlanKey key2) { assertThat(key1).isEqualTo(key2); assertThat(key1.hashCode()).isEqualTo(key2.hashCode()); }