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());
     }

Reply via email to