This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit 0daf3cc6c6495794ca273cbce58a8b33f5f28f0e Author: Andrus Adamchik <[email protected]> AuthorDate: Sun Aug 30 14:33:45 2026 -0400 Cleanup: getting rid of obsolete TranslatableQueryWrapper --- .../translator/select/DefaultSelectTranslator.java | 5 +- .../select/DescriptorColumnExtractor.java | 8 +- .../translator/select/FluentSelectWrapper.java | 77 ----------- .../translator/select/HavingTranslationStage.java | 2 +- .../translator/select/IdColumnExtractor.java | 2 +- .../translator/select/PrefetchNodeStage.java | 5 +- .../select/QualifierTranslationStage.java | 2 +- .../access/translator/select/SQLResultStage.java | 2 +- .../translator/select/SelectTranslatorContext.java | 22 +++- .../select/TranslatableQueryWrapper.java | 56 -------- .../org/apache/cayenne/exp/parser/ASTSubquery.java | 18 +-- .../select/ColumnDescriptorStageTest.java | 5 +- .../select/CustomColumnSetExtractorTest.java | 14 +- .../DbAdapterDelegatedSelectTranslatorIT.java | 8 +- .../select/DbEntityColumnExtractorTest.java | 9 +- .../select/DescriptorColumnExtractorIT.java | 4 +- .../select/DescriptorColumnExtractorTest.java | 5 +- .../translator/select/DistinctStageTest.java | 13 +- .../access/translator/select/GroupByStageTest.java | 5 +- .../select/HavingTranslationStageTest.java | 7 +- .../translator/select/IdColumnExtractorTest.java | 9 +- .../translator/select/LimitOffsetStageTest.java | 5 +- .../translator/select/MockFluentSelectBuilder.java | 101 +++++++++++++++ .../translator/select/MockQueryWrapperBuilder.java | 141 --------------------- .../select/MockSelectTranslatorContext.java | 5 +- .../translator/select/ObjPathProcessorIT.java | 2 +- .../translator/select/OrderingStageTest.java | 5 +- .../select/QualifierTranslationStageTest.java | 7 +- .../QualifierTranslatorExistExpressionIT.java | 24 ++-- .../translator/select/QualifierTranslatorIT.java | 6 +- .../translator/select/QualifierTranslatorTest.java | 5 +- .../cayenne/exp/property/SelfPropertyTest.java | 8 +- 32 files changed, 215 insertions(+), 372 deletions(-) diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java index 932aae46a..567e71b97 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java @@ -38,11 +38,10 @@ public class DefaultSelectTranslator implements SelectTranslator { @Override public TranslatedSelect translate(Select<?> query, DbAdapter adapter, EntityResolver resolver) { - if (!(query instanceof FluentSelect)) { + if (!(query instanceof FluentSelect<?, ?> fluentSelect)) { throw new CayenneRuntimeException("Unsupported type of Select query %s", query); } - SelectTranslatorContext context = new SelectTranslatorContext( - new FluentSelectWrapper((FluentSelect<?, ?>) query), adapter, resolver, null); + SelectTranslatorContext context = new SelectTranslatorContext(fluentSelect, adapter, resolver, null); context.translate(); return context.getTranslation(); } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java index 173f78a49..86094a32a 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractor.java @@ -66,14 +66,14 @@ class DescriptorColumnExtractor extends BaseColumnExtractor implements PropertyV if(prefix != null && prefix.hasMarker(CayennePath.PREFETCH_MARKER)) { type = SelectTranslatorContext.DescriptorType.PREFETCH; labelPrefix = prefix; - if(context.getQuery().needsResultSetMapping()) { + if(context.needsResultSetMapping()) { entityResult = context.getRootEntityResult(); if (entityResult == null) { throw new CayenneRuntimeException("Can't process prefetch descriptor without root."); } } } else { - if(context.getQuery().needsResultSetMapping()) { + if(context.needsResultSetMapping()) { entityResult = new EntityResult(descriptor.getObjectClass()); newEntityResult = true; } @@ -175,13 +175,13 @@ class DescriptorColumnExtractor extends BaseColumnExtractor implements PropertyV private void addEntityResultField(DbAttribute attribute) { String name = labelPrefix.dot(attribute.getName()).value(); - if(context.getQuery().needsResultSetMapping()) { + if(context.needsResultSetMapping()) { entityResult.addDbField(name, name); } } private void addEntityResultField(CayennePath pathForFlattenedAttribute) { - if (context.getQuery().needsResultSetMapping()) { + if (context.needsResultSetMapping()) { String nameForFlattenedAttribute = pathForFlattenedAttribute.value(); entityResult.addDbField(nameForFlattenedAttribute, nameForFlattenedAttribute); } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/FluentSelectWrapper.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/FluentSelectWrapper.java deleted file mode 100644 index 8eb442d9b..000000000 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/FluentSelectWrapper.java +++ /dev/null @@ -1,77 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.access.translator.select; - -import java.util.Collection; -import java.util.Objects; - -import org.apache.cayenne.exp.Expression; -import org.apache.cayenne.exp.property.Property; -import org.apache.cayenne.map.EntityResolver; -import org.apache.cayenne.query.FluentSelect; -import org.apache.cayenne.query.Ordering; -import org.apache.cayenne.query.QueryMetadata; - -/** - * @since 4.2 - */ -public class FluentSelectWrapper implements TranslatableQueryWrapper { - - private final FluentSelect<?, ?> select; - - public FluentSelectWrapper(FluentSelect<?, ?> select) { - this.select = Objects.requireNonNull(select); - } - - @Override - public boolean isDistinct() { - return select.isDistinct(); - } - - @Override - public QueryMetadata getMetaData(EntityResolver resolver) { - return select.getMetaData(resolver); - } - - @Override - public Expression getQualifier() { - return select.getWhere(); - } - - @Override - public Collection<Ordering> getOrderings() { - return select.getOrderings(); - } - - @Override - public Collection<Property<?>> getColumns() { - return select.getColumns(); - } - - @Override - public Expression getHavingQualifier() { - return select.getHaving(); - } - - @Override - public FluentSelect<?, ?> unwrap() { - return select; - } -} diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/HavingTranslationStage.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/HavingTranslationStage.java index bda51f784..637816796 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/HavingTranslationStage.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/HavingTranslationStage.java @@ -29,7 +29,7 @@ class HavingTranslationStage implements TranslationStage { @Override public void perform(SelectTranslatorContext context) { - Expression expression = context.getQuery().getHavingQualifier(); + Expression expression = context.getQuery().getHaving(); QualifierTranslator translator = context.getQualifierTranslator(); Node qualifier = translator.translate(expression); if(qualifier != null) { diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/IdColumnExtractor.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/IdColumnExtractor.java index 8bc9cea29..d38b2bffe 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/IdColumnExtractor.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/IdColumnExtractor.java @@ -44,7 +44,7 @@ class IdColumnExtractor extends BaseColumnExtractor { IdColumnExtractor(SelectTranslatorContext context, ObjEntity objEntity) { this(context, objEntity.getDbEntity()); this.objEntity = objEntity; - if(context.getQuery().needsResultSetMapping()) { + if(context.needsResultSetMapping()) { this.result = new EntityResult(objEntity.getName()); } } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java index 3717d68ae..0f263aaff 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/PrefetchNodeStage.java @@ -37,7 +37,6 @@ import org.apache.cayenne.map.ObjRelationship; import org.apache.cayenne.query.PrefetchSelectQuery; import org.apache.cayenne.query.PrefetchTreeNode; import org.apache.cayenne.query.QueryMetadata; -import org.apache.cayenne.query.Select; import org.apache.cayenne.reflect.ClassDescriptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -131,13 +130,11 @@ class PrefetchNodeStage implements TranslationStage { } private void processPrefetchQuery(SelectTranslatorContext context) { - Select<?> select = context.getQuery().unwrap(); - if(!(select instanceof PrefetchSelectQuery)) { + if(!(context.getQuery() instanceof PrefetchSelectQuery<?> prefetchSelectQuery)) { return; } PathTranslator pathTranslator = context.getPathTranslator(); - PrefetchSelectQuery<?> prefetchSelectQuery = (PrefetchSelectQuery<?>) select; for(ASTPath prefetchPath: prefetchSelectQuery.getResultPaths()) { ASTDbPath pathExp = (ASTDbPath) context.getMetadata() .getClassDescriptor().getEntity().translateToDbPath(prefetchPath); diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslationStage.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslationStage.java index 59082d996..c94e99700 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslationStage.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/QualifierTranslationStage.java @@ -33,7 +33,7 @@ class QualifierTranslationStage implements TranslationStage { public void perform(SelectTranslatorContext context) { QualifierTranslator translator = context.getQualifierTranslator(); - Expression expression = context.getQuery().getQualifier(); + Expression expression = context.getQuery().getWhere(); // Attaching Obj entity's qualifier ObjEntity entity = context.getMetadata().getObjEntity(); diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SQLResultStage.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SQLResultStage.java index 8a1dc9a27..1250bd2a2 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SQLResultStage.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SQLResultStage.java @@ -28,7 +28,7 @@ public class SQLResultStage implements TranslationStage { @Override public void perform(SelectTranslatorContext context) { - if(context.getParentContext() != null || !context.getQuery().needsResultSetMapping()) { + if(context.getParentContext() != null || !context.needsResultSetMapping()) { return; } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslatorContext.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslatorContext.java index a13d605d7..46f917b41 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslatorContext.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslatorContext.java @@ -34,6 +34,7 @@ import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.EntityResolver; import org.apache.cayenne.map.EntityResult; import org.apache.cayenne.map.SQLResult; +import org.apache.cayenne.query.FluentSelect; import org.apache.cayenne.query.Ordering; import org.apache.cayenne.query.QueryMetadata; @@ -95,8 +96,10 @@ class SelectTranslatorContext implements SQLGenerationContext { private final List<PSParameter<?>> bindings; // Translated query - private final TranslatableQueryWrapper query; + private final FluentSelect<?, ?> query; private final QueryMetadata metadata; + // whether the query result must be mapped explicitly, i.e. it selects a custom set of columns + private final boolean needsResultSetMapping; private final EntityResolver resolver; private final DbAdapter adapter; @@ -131,7 +134,7 @@ class SelectTranslatorContext implements SQLGenerationContext { private SQLResult sqlResult; private EntityResult rootEntityResult; - SelectTranslatorContext(TranslatableQueryWrapper query, DbAdapter adapter, EntityResolver resolver, SelectTranslatorContext parentContext) { + SelectTranslatorContext(FluentSelect<?, ?> query, DbAdapter adapter, EntityResolver resolver, SelectTranslatorContext parentContext) { this.query = query; this.adapter = adapter; this.resolver = resolver; @@ -144,7 +147,9 @@ class SelectTranslatorContext implements SQLGenerationContext { this.pathTranslator = new PathTranslator(this); this.qualifierTranslator = new QualifierTranslator(this); this.resultNodeList = new LinkedList<>(); - if (query.needsResultSetMapping()) { + Collection<Property<?>> queryColumns = query.getColumns(); + this.needsResultSetMapping = queryColumns != null && !queryColumns.isEmpty(); + if (needsResultSetMapping) { this.sqlResult = new SQLResult(); } } @@ -211,10 +216,17 @@ class SelectTranslatorContext implements SQLGenerationContext { return tableTree.getNodeCount(); } - TranslatableQueryWrapper getQuery() { + FluentSelect<?, ?> getQuery() { return query; } + /** + * @return whether the query selects a custom set of columns and thus needs an explicit result set mapping + */ + boolean needsResultSetMapping() { + return needsResultSetMapping; + } + QueryMetadata getMetadata() { return metadata; } @@ -243,7 +255,7 @@ class SelectTranslatorContext implements SQLGenerationContext { return hasAggregate; } - if (getQuery().getHavingQualifier() != null) { + if (getQuery().getHaving() != null) { return (hasAggregate = true); } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/TranslatableQueryWrapper.java b/cayenne/src/main/java/org/apache/cayenne/access/translator/select/TranslatableQueryWrapper.java deleted file mode 100644 index 2c9697827..000000000 --- a/cayenne/src/main/java/org/apache/cayenne/access/translator/select/TranslatableQueryWrapper.java +++ /dev/null @@ -1,56 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.access.translator.select; - -import java.util.Collection; - -import org.apache.cayenne.exp.Expression; -import org.apache.cayenne.exp.property.Property; -import org.apache.cayenne.map.EntityResolver; -import org.apache.cayenne.query.Ordering; -import org.apache.cayenne.query.QueryMetadata; -import org.apache.cayenne.query.Select; - -/** - * This interface allows transparently use different queries (namely SelectQuery, ObjectSelect and ColumnSelect) - * in translator and as subqueries. - * - * @since 4.2 - */ -public interface TranslatableQueryWrapper { - - boolean isDistinct(); - - QueryMetadata getMetaData(EntityResolver resolver); - - Expression getQualifier(); - - Collection<Ordering> getOrderings(); - - Collection<Property<?>> getColumns(); - - Expression getHavingQualifier(); - - Select<?> unwrap(); - - default boolean needsResultSetMapping() { - return getColumns() != null && !getColumns().isEmpty(); - } -} diff --git a/cayenne/src/main/java/org/apache/cayenne/exp/parser/ASTSubquery.java b/cayenne/src/main/java/org/apache/cayenne/exp/parser/ASTSubquery.java index a736c5625..94f28f526 100644 --- a/cayenne/src/main/java/org/apache/cayenne/exp/parser/ASTSubquery.java +++ b/cayenne/src/main/java/org/apache/cayenne/exp/parser/ASTSubquery.java @@ -23,8 +23,6 @@ import java.io.IOException; import org.apache.cayenne.ObjectContext; import org.apache.cayenne.Persistent; -import org.apache.cayenne.access.translator.select.FluentSelectWrapper; -import org.apache.cayenne.access.translator.select.TranslatableQueryWrapper; import org.apache.cayenne.exp.Expression; import org.apache.cayenne.exp.TraversalHandler; import org.apache.cayenne.query.FluentSelect; @@ -46,13 +44,9 @@ public class ASTSubquery extends SimpleNode { } }; - private final TranslatableQueryWrapper query; + private final FluentSelect<?, ?> query; public ASTSubquery(FluentSelect<?, ?> query) { - this(new FluentSelectWrapper(query)); - } - - public ASTSubquery(TranslatableQueryWrapper query) { super(0); this.query = query; } @@ -71,15 +65,15 @@ public class ASTSubquery extends SimpleNode { throw new UnsupportedOperationException("Can't evaluate subquery expression against non-persistent object"); } validateForInmemory(query); - return context.select(query.unwrap()); + return context.select(query); } /** * Check that we can execute this subquery directly */ - private void validateForInmemory(TranslatableQueryWrapper query) { - query.getQualifier().traverse(IN_MEMORY_VALIDATOR); - query.getHavingQualifier().traverse(IN_MEMORY_VALIDATOR); + private void validateForInmemory(FluentSelect<?, ?> query) { + query.getWhere().traverse(IN_MEMORY_VALIDATOR); + query.getHaving().traverse(IN_MEMORY_VALIDATOR); for(Ordering ordering : query.getOrderings()) { ordering.getSortSpec().traverse(IN_MEMORY_VALIDATOR); } @@ -100,7 +94,7 @@ public class ASTSubquery extends SimpleNode { out.append("EXISTS"); } - public TranslatableQueryWrapper getQuery() { + public FluentSelect<?, ?> getQuery() { return query; } diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStageTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStageTest.java index 42bde85de..f5b611a30 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStageTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ColumnDescriptorStageTest.java @@ -23,6 +23,7 @@ import org.apache.cayenne.access.jdbc.RSColumn; import org.apache.cayenne.access.sqlbuilder.sqltree.EmptyNode; import org.apache.cayenne.exp.path.CayennePath; import org.apache.cayenne.exp.property.PropertyFactory; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -31,13 +32,13 @@ public class ColumnDescriptorStageTest { @Test public void perform() { - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withDistinct(true) .withMetaData(new MockQueryMetadataBuilder() .withSuppressDistinct() .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); context.addResultNode(new EmptyNode()); context.addResultNode(new EmptyNode(), CayennePath.of("key")); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractorTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractorTest.java index a8bc03019..5ff0c641b 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractorTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/CustomColumnSetExtractorTest.java @@ -33,6 +33,7 @@ import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.EntityResolver; import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -42,13 +43,17 @@ public class CustomColumnSetExtractorTest extends BaseColumnExtractorTest { @Test public void extractWithoutPrefix() { DbEntity mockDbEntity = createMockDbEntity("mock"); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() - .withNeedsResultSetMapping(true) + BaseProperty<?> property0 = PropertyFactory.createBase(ExpressionFactory.dbPathExp("name"), String.class); + Collection<Property<?>> properties = Collections.singleton(property0); + + // a query with an explicit column set is what triggers the result set mapping + FluentSelect<?, ?> query = new MockFluentSelectBuilder() + .withColumns(properties) .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(mockDbEntity) .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); DataMap dataMap = new DataMap(); dataMap.addDbEntity(mockDbEntity); @@ -69,9 +74,6 @@ public class CustomColumnSetExtractorTest extends BaseColumnExtractorTest { EntityResolver resolver = new EntityResolver(); resolver.addDataMap(dataMap); - BaseProperty<?> property0 = PropertyFactory.createBase(ExpressionFactory.dbPathExp("name"), String.class); - Collection<Property<?>> properties = Collections.singleton(property0); - CustomColumnSetExtractor extractor = new CustomColumnSetExtractor(context, properties); extractor.extract(); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbAdapterDelegatedSelectTranslatorIT.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbAdapterDelegatedSelectTranslatorIT.java index f9bb44035..98e17375d 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbAdapterDelegatedSelectTranslatorIT.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbAdapterDelegatedSelectTranslatorIT.java @@ -781,7 +781,7 @@ public class DbAdapterDelegatedSelectTranslatorIT { )); query.select(env.context()); - SelectTranslatorContext context = new SelectTranslatorContext(new FluentSelectWrapper(query), env.dataNode().getAdapter(), + SelectTranslatorContext context = new SelectTranslatorContext(query, env.dataNode().getAdapter(), env.context().getEntityResolver(), null); context.translate(); @@ -798,7 +798,7 @@ public class DbAdapterDelegatedSelectTranslatorIT { )); query.select(env.context()); - SelectTranslatorContext context = new SelectTranslatorContext(new FluentSelectWrapper(query), env.dataNode().getAdapter(), + SelectTranslatorContext context = new SelectTranslatorContext(query, env.dataNode().getAdapter(), env.context().getEntityResolver(), null); context.translate(); @@ -815,7 +815,7 @@ public class DbAdapterDelegatedSelectTranslatorIT { )); query.select(env.context()); - SelectTranslatorContext context = new SelectTranslatorContext(new FluentSelectWrapper(query), env.dataNode().getAdapter(), + SelectTranslatorContext context = new SelectTranslatorContext(query, env.dataNode().getAdapter(), env.context().getEntityResolver(), null); context.translate(); @@ -831,7 +831,7 @@ public class DbAdapterDelegatedSelectTranslatorIT { )); query.select(env.context()); - SelectTranslatorContext context = new SelectTranslatorContext(new FluentSelectWrapper(query), env.dataNode().getAdapter(), + SelectTranslatorContext context = new SelectTranslatorContext(query, env.dataNode().getAdapter(), env.context().getEntityResolver(), null); context.translate(); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbEntityColumnExtractorTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbEntityColumnExtractorTest.java index 8d589c69d..b7dda3819 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbEntityColumnExtractorTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DbEntityColumnExtractorTest.java @@ -25,6 +25,7 @@ import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.DbRelationship; import org.apache.cayenne.map.JoinType; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.Test; import java.sql.Types; @@ -35,12 +36,12 @@ public class DbEntityColumnExtractorTest extends BaseColumnExtractorTest { @Test public void extractNoPrefix() { - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(createMockDbEntity("mock")) .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); DbEntityColumnExtractor extractor = new DbEntityColumnExtractor(context); extractor.extract(CayennePath.EMPTY_PATH); @@ -79,12 +80,12 @@ public class DbEntityColumnExtractorTest extends BaseColumnExtractorTest { dataMap.addDbEntity(mock2DbEntity); mockDbEntity.setDataMap(dataMap); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(mockDbEntity) .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); DbRelationship relationship = new DbRelationship(); relationship.setSourceEntity(mockDbEntity); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java index 32909592a..f77fb71a4 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorIT.java @@ -54,8 +54,8 @@ public class DescriptorColumnExtractorIT { ClassDescriptor classDescriptor = resolver.getClassDescriptor("CompoundPaintingLongNames"); SelectTranslatorContext translatorContext = new SelectTranslatorContext( - new FluentSelectWrapper(ObjectSelect.query(CompoundPaintingLongNames.class) - .column(CompoundPaintingLongNames.SELF)), + ObjectSelect.query(CompoundPaintingLongNames.class) + .column(CompoundPaintingLongNames.SELF), Mockito.mock(DbAdapter.class), resolver, null); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorTest.java index b3b1b7ca4..93253d43e 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DescriptorColumnExtractorTest.java @@ -30,6 +30,7 @@ import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.EntityResolver; import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.query.FluentSelect; import org.apache.cayenne.reflect.generic.DefaultValueComparisonStrategyFactory; import org.junit.jupiter.api.Test; @@ -41,13 +42,13 @@ public class DescriptorColumnExtractorTest extends BaseColumnExtractorTest { @Test public void extractNoPrefix() { DbEntity mockDbEntity = createMockDbEntity("mock"); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(mockDbEntity) .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); DataMap dataMap = new DataMap(); dataMap.addDbEntity(mockDbEntity); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DistinctStageTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DistinctStageTest.java index 985b7e51b..3cb0ff952 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DistinctStageTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/DistinctStageTest.java @@ -24,6 +24,7 @@ import java.sql.Types; import org.apache.cayenne.access.sqlbuilder.sqltree.ColumnNode; import org.apache.cayenne.access.sqlbuilder.sqltree.Node; import org.apache.cayenne.map.DbAttribute; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; @@ -48,8 +49,8 @@ public class DistinctStageTest { @Test public void noSuppression() { - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder().withDistinct(true).build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + FluentSelect<?, ?> query = new MockFluentSelectBuilder().withDistinct(true).build(); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); assertFalse(context.isDistinctSuppression()); @@ -61,13 +62,13 @@ public class DistinctStageTest { @Test public void explicitSuppression() { - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withDistinct(true) .withMetaData(new MockQueryMetadataBuilder() .withSuppressDistinct() .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); assertFalse(context.isDistinctSuppression()); @@ -79,11 +80,11 @@ public class DistinctStageTest { @Test public void suppressionByType() { - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withDistinct(true) .withMetaData(new MockQueryMetadataBuilder().build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); DbAttribute attribute = new DbAttribute(); attribute.setType(Types.LONGVARBINARY); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/GroupByStageTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/GroupByStageTest.java index d70822834..bdffc29d8 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/GroupByStageTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/GroupByStageTest.java @@ -25,6 +25,7 @@ import org.apache.cayenne.access.sqlbuilder.sqltree.GroupByNode; import org.apache.cayenne.access.sqlbuilder.sqltree.Node; import org.apache.cayenne.exp.path.CayennePath; import org.apache.cayenne.exp.property.PropertyFactory; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -36,8 +37,8 @@ public class GroupByStageTest { @BeforeEach public void prepareContext() { - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder().build(); - context = new MockSelectTranslatorContext(wrapper); + FluentSelect<?, ?> query = new MockFluentSelectBuilder().build(); + context = new MockSelectTranslatorContext(query); } // no result columns diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/HavingTranslationStageTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/HavingTranslationStageTest.java index f6fde0f94..048a13e11 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/HavingTranslationStageTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/HavingTranslationStageTest.java @@ -27,6 +27,7 @@ import org.apache.cayenne.access.sqlbuilder.sqltree.ValueNode; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -44,13 +45,13 @@ public class HavingTranslationStageTest { dbAttribute.setName("path"); dbEntity.addAttribute(dbAttribute); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() - .withHavingQualifier(ExpressionFactory.greaterOrEqualDbExp("path", 10)) + FluentSelect<?, ?> query = new MockFluentSelectBuilder() + .withHaving(ExpressionFactory.greaterOrEqualDbExp("path", 10)) .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(dbEntity) .build()) .build(); - context = new MockSelectTranslatorContext(wrapper); + context = new MockSelectTranslatorContext(query); } @Test diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/IdColumnExtractorTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/IdColumnExtractorTest.java index f1a166d25..388037faf 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/IdColumnExtractorTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/IdColumnExtractorTest.java @@ -26,6 +26,7 @@ import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.DbRelationship; import org.apache.cayenne.map.JoinType; import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.Test; import java.sql.Types; @@ -37,12 +38,12 @@ public class IdColumnExtractorTest extends BaseColumnExtractorTest { @Test public void extractNoPrefix() { DbEntity mockDbEntity = createMockDbEntity("mock"); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(mockDbEntity) .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); DataMap dataMap = new DataMap(); dataMap.addDbEntity(mockDbEntity); @@ -73,12 +74,12 @@ public class IdColumnExtractorTest extends BaseColumnExtractorTest { DbEntity mockDbEntity = createMockDbEntity("mock1"); DbEntity mock2DbEntity = createMockDbEntity("mock2"); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(mockDbEntity) .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper); + SelectTranslatorContext context = new MockSelectTranslatorContext(query); ObjEntity entity = new ObjEntity(); entity.setDbEntity(mockDbEntity); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/LimitOffsetStageTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/LimitOffsetStageTest.java index addb4f7bc..4f0407fb1 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/LimitOffsetStageTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/LimitOffsetStageTest.java @@ -22,6 +22,7 @@ package org.apache.cayenne.access.translator.select; import org.apache.cayenne.access.sqlbuilder.sqltree.LimitOffsetNode; import org.apache.cayenne.access.sqlbuilder.sqltree.Node; import org.apache.cayenne.map.DbEntity; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -36,13 +37,13 @@ public class LimitOffsetStageTest { DbEntity entity = new DbEntity(); entity.setName("mock"); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(entity) .withLimitOffset(123, 321) .build()) .build(); - context = new MockSelectTranslatorContext(wrapper); + context = new MockSelectTranslatorContext(query); } @Test diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockFluentSelectBuilder.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockFluentSelectBuilder.java new file mode 100644 index 000000000..608cc5363 --- /dev/null +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockFluentSelectBuilder.java @@ -0,0 +1,101 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +package org.apache.cayenne.access.translator.select; + +import java.util.Collection; + +import org.apache.cayenne.exp.Expression; +import org.apache.cayenne.exp.property.Property; +import org.apache.cayenne.map.EntityResolver; +import org.apache.cayenne.query.FluentSelect; +import org.apache.cayenne.query.MockQueryMetadata; +import org.apache.cayenne.query.ObjectSelect; +import org.apache.cayenne.query.Ordering; +import org.apache.cayenne.query.QueryMetadata; + +/** + * Builds a {@link FluentSelect} whose metadata is supplied directly, so that translation stages can be unit-tested + * without a real {@link EntityResolver} behind the query. + */ +class MockFluentSelectBuilder { + + private boolean distinct; + + private QueryMetadata queryMetadata; + + private Expression where; + + private Collection<Ordering> orderings; + + private Collection<Property<?>> queryColumns; + + private Expression having; + + MockFluentSelectBuilder withDistinct(boolean distinct) { + this.distinct = distinct; + return this; + } + + MockFluentSelectBuilder withMetaData(QueryMetadata metaData) { + this.queryMetadata = metaData; + return this; + } + + MockFluentSelectBuilder withWhere(Expression where) { + this.where = where; + return this; + } + + MockFluentSelectBuilder withOrderings(Collection<Ordering> orderings) { + this.orderings = orderings; + return this; + } + + MockFluentSelectBuilder withColumns(Collection<Property<?>> columns) { + this.queryColumns = columns; + return this; + } + + MockFluentSelectBuilder withHaving(Expression having) { + this.having = having; + return this; + } + + FluentSelect<?, ?> build() { + return new ObjectSelect<>() { + { + this.distinct = MockFluentSelectBuilder.this.distinct; + this.where = MockFluentSelectBuilder.this.where; + this.having = MockFluentSelectBuilder.this.having; + this.orderings = MockFluentSelectBuilder.this.orderings; + } + + @Override + public QueryMetadata getMetaData(EntityResolver resolver) { + return queryMetadata != null ? queryMetadata : new MockQueryMetadata(); + } + + @Override + public Collection<Property<?>> getColumns() { + return queryColumns; + } + }; + } +} diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockQueryWrapperBuilder.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockQueryWrapperBuilder.java deleted file mode 100644 index d39f42709..000000000 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockQueryWrapperBuilder.java +++ /dev/null @@ -1,141 +0,0 @@ -/***************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - ****************************************************************/ - -package org.apache.cayenne.access.translator.select; - -import java.util.Collection; - -import org.apache.cayenne.exp.Expression; -import org.apache.cayenne.exp.property.BaseProperty; -import org.apache.cayenne.exp.property.Property; -import org.apache.cayenne.map.EntityResolver; -import org.apache.cayenne.query.MockQueryMetadata; -import org.apache.cayenne.query.Ordering; -import org.apache.cayenne.query.PrefetchTreeNode; -import org.apache.cayenne.query.QueryMetadata; -import org.apache.cayenne.query.Select; - -class MockQueryWrapperBuilder { - - private boolean distinct; - - private QueryMetadata metaData; - - private PrefetchTreeNode prefetchTreeNode; - - private Expression qualifier; - - private Collection<Ordering> orderings; - - private Collection<Property<?>> columns; - - private Expression havingQualifier; - - private Select<?> mockSelect; - private boolean needsResultSetMapping; - - MockQueryWrapperBuilder withDistinct(boolean distinct) { - this.distinct = distinct; - return this; - } - - MockQueryWrapperBuilder withMetaData(QueryMetadata metaData) { - this.metaData = metaData; - return this; - } - - MockQueryWrapperBuilder withPrefetchTreeNode(PrefetchTreeNode prefetchTreeNode) { - this.prefetchTreeNode = prefetchTreeNode; - return this; - } - - MockQueryWrapperBuilder withQualifier(Expression qualifier) { - this.qualifier = qualifier; - return this; - } - - MockQueryWrapperBuilder withOrderings(Collection<Ordering> orderings) { - this.orderings = orderings; - return this; - } - - MockQueryWrapperBuilder withColumns(Collection<Property<?>> columns) { - this.columns = columns; - return this; - } - - MockQueryWrapperBuilder withHavingQualifier(Expression havingQualifier) { - this.havingQualifier = havingQualifier; - return this; - } - - MockQueryWrapperBuilder withSelect(Select<?> select) { - this.mockSelect = select; - return this; - } - - MockQueryWrapperBuilder withNeedsResultSetMapping(boolean needsResultSetMapping) { - this.needsResultSetMapping = needsResultSetMapping; - return this; - } - - TranslatableQueryWrapper build() { - return new TranslatableQueryWrapper() { - @Override - public boolean isDistinct() { - return distinct; - } - - @Override - public QueryMetadata getMetaData(EntityResolver resolver) { - return metaData != null ? metaData : new MockQueryMetadata(); - } - - @Override - public Expression getQualifier() { - return qualifier; - } - - @Override - public Collection<Ordering> getOrderings() { - return orderings; - } - - @Override - public Collection<Property<?>> getColumns() { - return columns; - } - - @Override - public Expression getHavingQualifier() { - return havingQualifier; - } - - @Override - public Select<?> unwrap() { - return mockSelect; - } - - @Override - public boolean needsResultSetMapping() { - return needsResultSetMapping; - } - }; - } -} diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockSelectTranslatorContext.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockSelectTranslatorContext.java index e7cb994bf..66793b2a7 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockSelectTranslatorContext.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/MockSelectTranslatorContext.java @@ -22,16 +22,17 @@ package org.apache.cayenne.access.translator.select; import org.apache.cayenne.access.types.ExtendedTypeMap; import org.apache.cayenne.dba.DbAdapter; import org.apache.cayenne.map.EntityResolver; +import org.apache.cayenne.query.FluentSelect; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; public class MockSelectTranslatorContext extends SelectTranslatorContext { - MockSelectTranslatorContext(TranslatableQueryWrapper query) { + MockSelectTranslatorContext(FluentSelect<?, ?> query) { super(query, mockAdapter(), null, null); } - MockSelectTranslatorContext(TranslatableQueryWrapper query, EntityResolver resolver) { + MockSelectTranslatorContext(FluentSelect<?, ?> query, EntityResolver resolver) { super(query, mockAdapter(), resolver, null); } diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ObjPathProcessorIT.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ObjPathProcessorIT.java index eaf8ae1fc..f644990a2 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ObjPathProcessorIT.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/ObjPathProcessorIT.java @@ -41,7 +41,7 @@ public class ObjPathProcessorIT { @BeforeEach public void prepareTranslationContext() { SelectTranslatorContext translatorContext = new SelectTranslatorContext( - new FluentSelectWrapper(ObjectSelect.query(Object.class)), + ObjectSelect.query(Object.class), Mockito.mock(DbAdapter.class), env.context().getEntityResolver(), null diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/OrderingStageTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/OrderingStageTest.java index 17280fbdb..a16516d7f 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/OrderingStageTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/OrderingStageTest.java @@ -31,6 +31,7 @@ import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.ObjAttribute; import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.query.FluentSelect; import org.apache.cayenne.query.Ordering; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -65,7 +66,7 @@ public class OrderingStageTest { Ordering ordering = new Ordering("path"); ordering.setDescending(); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withOrderings(Collections.singleton(ordering)) .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(dbEntity) @@ -73,7 +74,7 @@ public class OrderingStageTest { .build()) .withDistinct( true ) .build(); - context = new MockSelectTranslatorContext(wrapper); + context = new MockSelectTranslatorContext(query); } @Test diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslationStageTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslationStageTest.java index ccaa3a98c..6201825b4 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslationStageTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslationStageTest.java @@ -26,6 +26,7 @@ import org.apache.cayenne.access.sqlbuilder.sqltree.ValueNode; import org.apache.cayenne.exp.ExpressionFactory; import org.apache.cayenne.map.DbAttribute; import org.apache.cayenne.map.DbEntity; +import org.apache.cayenne.query.FluentSelect; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -43,13 +44,13 @@ public class QualifierTranslationStageTest { dbAttribute.setName("path"); dbEntity.addAttribute(dbAttribute); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() - .withQualifier(ExpressionFactory.greaterOrEqualDbExp("path", 10)) + FluentSelect<?, ?> query = new MockFluentSelectBuilder() + .withWhere(ExpressionFactory.greaterOrEqualDbExp("path", 10)) .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(dbEntity) .build()) .build(); - context = new MockSelectTranslatorContext(wrapper); + context = new MockSelectTranslatorContext(query); } @Test diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorExistExpressionIT.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorExistExpressionIT.java index fd9501537..45531b527 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorExistExpressionIT.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorExistExpressionIT.java @@ -47,7 +47,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -66,7 +66,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -87,7 +87,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -105,7 +105,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -126,7 +126,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -147,7 +147,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -170,7 +170,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -192,7 +192,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -214,7 +214,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -237,7 +237,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -264,7 +264,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -297,7 +297,7 @@ public class QualifierTranslatorExistExpressionIT { ObjectSelect<Artist> query = ObjectSelect.query(Artist.class, exp); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, env.runtime().getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java index 8c2c51ec1..9191ab9bb 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorIT.java @@ -64,7 +64,7 @@ public class QualifierTranslatorIT { .and(CompoundFkTestEntity.NAME.contains("a")); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), runtime.getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, runtime.getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -89,7 +89,7 @@ public class QualifierTranslatorIT { .or(CompoundFkTestEntity.TO_COMPOUND_PK.eq(testEntity.get(1))); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), runtime.getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, runtime.getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); @@ -107,7 +107,7 @@ public class QualifierTranslatorIT { .where(ExpressionFactory.exp("name = -1")); SelectTranslatorContext context - = new SelectTranslatorContext(new FluentSelectWrapper(query), runtime.getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); + = new SelectTranslatorContext(query, runtime.getDataDomain().getDefaultNode().getAdapter(), env.context().getEntityResolver(), null); QualifierTranslator qualifierTranslator = context.getQualifierTranslator(); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java index f3b74a989..eef9a80bd 100644 --- a/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/access/translator/select/QualifierTranslatorTest.java @@ -29,6 +29,7 @@ import org.apache.cayenne.exp.parser.ASTAsterisk; import org.apache.cayenne.exp.parser.ASTScalar; import org.apache.cayenne.exp.property.BaseProperty; import org.apache.cayenne.map.*; +import org.apache.cayenne.query.FluentSelect; import org.apache.cayenne.query.ObjectSelect; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -78,13 +79,13 @@ public class QualifierTranslatorTest { EntityResolver resolver = new EntityResolver(); resolver.addDataMap(dataMap); - TranslatableQueryWrapper wrapper = new MockQueryWrapperBuilder() + FluentSelect<?, ?> query = new MockFluentSelectBuilder() .withMetaData(new MockQueryMetadataBuilder() .withDbEntity(dbEntity) .withObjEntity(entity) .build()) .build(); - SelectTranslatorContext context = new MockSelectTranslatorContext(wrapper, resolver); + SelectTranslatorContext context = new MockSelectTranslatorContext(query, resolver); translator = new QualifierTranslator(context); } diff --git a/cayenne/src/test/java/org/apache/cayenne/exp/property/SelfPropertyTest.java b/cayenne/src/test/java/org/apache/cayenne/exp/property/SelfPropertyTest.java index 0cdedb94e..9518b70b6 100644 --- a/cayenne/src/test/java/org/apache/cayenne/exp/property/SelfPropertyTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/exp/property/SelfPropertyTest.java @@ -99,9 +99,9 @@ public class SelfPropertyTest { assertTrue(node instanceof ASTSubquery); ASTSubquery subquery = (ASTSubquery) node; - assertTrue(subquery.getQuery().unwrap() instanceof ObjectSelect); + assertTrue(subquery.getQuery() instanceof ObjectSelect); - ObjectSelect<?> subSelect = (ObjectSelect<?>) subquery.getQuery().unwrap(); + ObjectSelect<?> subSelect = (ObjectSelect<?>) subquery.getQuery(); assertEquals(Artist.class, subSelect.getEntityType()); assertEquals(ExpressionFactory.exp("artistName = 'test'"), subSelect.getWhere()); } @@ -118,9 +118,9 @@ public class SelfPropertyTest { assertTrue(node instanceof ASTSubquery); ASTSubquery subquery = (ASTSubquery) node; - assertTrue(subquery.getQuery().unwrap() instanceof ObjectSelect); + assertTrue(subquery.getQuery() instanceof ObjectSelect); - ObjectSelect<?> subSelect = (ObjectSelect<?>) subquery.getQuery().unwrap(); + ObjectSelect<?> subSelect = (ObjectSelect<?>) subquery.getQuery(); assertEquals(Artist.class, subSelect.getEntityType()); assertEquals(ExpressionFactory.exp("artistName = 'test'"), subSelect.getWhere()); }
