This is an automated email from the ASF dual-hosted git repository.

ntimofeev pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/cayenne.git

commit 281f674f34a15558cb908e7e8225027531032aa2
Author: Nikita Timofeev <stari...@gmail.com>
AuthorDate: Tue Sep 29 12:22:36 2020 +0300

    CAY-2378 Switch usage of SelectQuery to ObjectSelect internally
---
 .../cayenne/access/HierarchicalObjectResolver.java |  6 ++--
 .../cayenne/access/IncrementalFaultList.java       | 36 ++++++++--------------
 .../access/MixedResultIncrementalFaultList.java    | 25 ++++++++-------
 .../cayenne/access/OptimisticLockException.java    | 10 +++---
 .../translator/select/SelectQueryWrapper.java      |  2 +-
 .../java/org/apache/cayenne/dba/AutoAdapter.java   |  1 +
 .../java/org/apache/cayenne/dba/JdbcAdapter.java   |  1 +
 .../org/apache/cayenne/query/CacheableQuery.java   |  2 +-
 .../org/apache/cayenne/query/FluentSelect.java     |  2 +-
 .../query/FluentSelectPrefetchRouterAction.java    |  4 +--
 .../org/apache/cayenne/query/ObjectIdQuery.java    | 11 ++++---
 .../apache/cayenne/query/PrefetchSelectQuery.java  | 24 +++++++++------
 .../apache/cayenne/query/RelationshipQuery.java    | 16 +++++-----
 .../query/SelectQueryPrefetchRouterAction.java     |  4 +--
 .../access/DataContextPrefetchMultistepIT.java     |  6 ++--
 .../cayenne/access/DataContextQueryChainIT.java    |  6 ++--
 .../java/org/apache/cayenne/access/EnumIT.java     | 14 ++++++++-
 .../cayenne/access/VerticalInheritanceIT.java      | 12 +++-----
 .../query/FluentSelectPrefetchRouterActionIT.java  | 12 ++++----
 ...electPrefetchRouterActionQualifiedEntityIT.java |  8 ++---
 .../query/SelectQueryPrefetchRouterActionIT.java   | 12 ++++----
 ...QueryPrefetchRouterActionQualifiedEntityIT.java |  8 ++---
 .../apache/cayenne/query/StatementFetchSizeIT.java |  2 +-
 23 files changed, 114 insertions(+), 110 deletions(-)

diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
index 9060c91..66ecfe3 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/HierarchicalObjectResolver.java
@@ -158,7 +158,7 @@ class HierarchicalObjectResolver {
                     createDisjointByIdPrefetchQualifier(pathPrefix, 
currentQuery, joins, values);
 
                     currentQuery = new PrefetchSelectQuery<>(node.getPath(), 
relationship);
-                    currentQuery.setFetchingDataRows(true);
+                    currentQuery.fetchDataRows();
                     queries.add(currentQuery);
                     qualifiersCount = 0;
                     values = new HashSet<>();
@@ -203,7 +203,7 @@ class HierarchicalObjectResolver {
             return true;
         }
 
-        private void createDisjointByIdPrefetchQualifier(String pathPrefix, 
PrefetchSelectQuery currentQuery,
+        private void createDisjointByIdPrefetchQualifier(String pathPrefix, 
PrefetchSelectQuery<?> currentQuery,
                                                          List<DbJoin> joins, 
Set<List<Object>> values) {
             Expression allJoinsQualifier;
             if(currentQuery != null) {
@@ -223,7 +223,7 @@ class HierarchicalObjectResolver {
                     qualifiers[i++] = allJoinsQualifier;
                 }
 
-                
currentQuery.orQualifier(ExpressionFactory.joinExp(Expression.OR, qualifiers));
+                currentQuery.or(ExpressionFactory.joinExp(Expression.OR, 
qualifiers));
             }
         }
 
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
index b1bbb01..43f64ba 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
@@ -25,9 +25,9 @@ import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.ObjEntity;
+import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.util.Util;
 
 import java.io.Serializable;
@@ -62,7 +62,6 @@ public class IncrementalFaultList<E> implements List<E>, 
Serializable {
        protected final List elements;
        protected DataContext dataContext;
        protected ObjEntity rootEntity;
-       protected SelectQuery<?> internalQuery;
        protected int unfetchedObjects;
 
        /**
@@ -116,13 +115,6 @@ public class IncrementalFaultList<E> implements List<E>, 
Serializable {
                        throw new CayenneRuntimeException("Pagination is not 
supported for queries not rooted in an ObjEntity");
                }
 
-               // create an internal query, it is a partial replica of
-               // the original query and will serve as a value holder for
-               // various parameters
-               this.internalQuery = new SelectQuery<>(rootEntity);
-               
this.internalQuery.setFetchingDataRows(metadata.isFetchingDataRows());
-               this.internalQuery.setPrefetchTree(metadata.getPrefetchTree());
-
                this.idWidth = metadata.getDbEntity().getPrimaryKeys().size();
 
                List<Object> elementsUnsynced = new ArrayList<>();
@@ -151,13 +143,6 @@ public class IncrementalFaultList<E> implements List<E>, 
Serializable {
        }
 
        /**
-        * @since 1.2
-        */
-       SelectQuery getInternalQuery() {
-               return internalQuery;
-       }
-
-       /**
         * Performs initialization of the list of objects. Only the first page 
is
         * fully resolved. For the rest of the list, only ObjectIds are read.
         * 
@@ -167,7 +152,7 @@ public class IncrementalFaultList<E> implements List<E>, 
Serializable {
 
                elementsList.clear();
 
-               try (ResultIterator it = 
dataContext.performIteratedQuery(query)) {
+               try (ResultIterator<?> it = 
dataContext.performIteratedQuery(query)) {
                        while (it.hasNextRow()) {
                                elementsList.add(it.nextRow());
                        }
@@ -191,7 +176,7 @@ public class IncrementalFaultList<E> implements List<E>, 
Serializable {
 
                // I am not sure if such a check makes sense???
 
-               if (internalQuery.isFetchingDataRows()) {
+               if (metadata.isFetchingDataRows()) {
                        if (!(object instanceof Map)) {
                                throw new IllegalArgumentException("Only Map 
objects can be stored in this list.");
                        }
@@ -249,7 +234,7 @@ public class IncrementalFaultList<E> implements List<E>, 
Serializable {
                        int fetchEnd = Math.min(qualsSize, fetchSize);
                        int fetchBegin = 0;
                        while (fetchBegin < qualsSize) {
-                               SelectQuery<Object> query = 
createSelectQuery(quals.subList(fetchBegin, fetchEnd));
+                               ObjectSelect<Persistent> query = 
createSelectQuery(quals.subList(fetchBegin, fetchEnd));
                                objects.addAll(dataContext.performQuery(query));
                                fetchBegin = fetchEnd;
                                fetchEnd += Math.min(fetchSize, qualsSize - 
fetchEnd);
@@ -271,12 +256,15 @@ public class IncrementalFaultList<E> implements List<E>, 
Serializable {
                unfetchedObjects -= objects.size();
        }
 
-       SelectQuery<Object> createSelectQuery(List<Expression> expressions) {
-               SelectQuery<Object> query = new SelectQuery<>(rootEntity, 
ExpressionFactory.joinExp(Expression.OR, expressions));
+       ObjectSelect<Persistent> createSelectQuery(List<Expression> 
expressions) {
+               ObjectSelect<Persistent> query = 
ObjectSelect.query(Persistent.class)
+                               .entityName(rootEntity.getName())
+                               .where(ExpressionFactory.joinExp(Expression.OR, 
expressions));
 
-               query.setFetchingDataRows(internalQuery.isFetchingDataRows());
-               if (!query.isFetchingDataRows()) {
-                       query.setPrefetchTree(internalQuery.getPrefetchTree());
+               if(metadata.isFetchingDataRows()) {
+                       query.fetchDataRows();
+               } else if (metadata.getPrefetchTree() != null) {
+                       query.prefetch(metadata.getPrefetchTree());
                }
 
                return query;
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/MixedResultIncrementalFaultList.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/MixedResultIncrementalFaultList.java
index df145cb..65bcb30 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/MixedResultIncrementalFaultList.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/MixedResultIncrementalFaultList.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.access;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -29,13 +30,14 @@ import org.apache.cayenne.Persistent;
 import org.apache.cayenne.ResultIterator;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
+import org.apache.cayenne.exp.property.Property;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.map.ObjEntity;
 import org.apache.cayenne.query.ColumnSelect;
 import org.apache.cayenne.query.EntityResultSegment;
+import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.util.Util;
 
 /**
@@ -46,7 +48,7 @@ import org.apache.cayenne.util.Util;
  * if there is no Persistent objects in the result Collection it will be 
iterated as is, without faulting anything.
  *
  * @see QueryMetadata#getPageSize()
- * @see org.apache.cayenne.query.SelectQueryMetadata
+ * @see org.apache.cayenne.query.QueryMetadata
  *
  * @since 4.0
  */
@@ -72,11 +74,6 @@ class MixedResultIncrementalFaultList<E> extends 
IncrementalFaultList<E> {
      */
     MixedResultIncrementalFaultList(DataContext dataContext, Query query, int 
maxFetchSize) {
         super(dataContext, query, maxFetchSize);
-
-        // this should generally be true, and may be it worth to do something 
if it's not
-        if(query instanceof ColumnSelect) {
-            this.internalQuery.setColumns(((ColumnSelect<?>) 
query).getColumns());
-        }
     }
 
     @Override
@@ -160,8 +157,8 @@ class MixedResultIncrementalFaultList<E> extends 
IncrementalFaultList<E> {
                 int fetchEnd = Math.min(qualsSize, fetchSize);
                 int fetchBegin = 0;
                 while (fetchBegin < qualsSize) {
-                    SelectQuery<Persistent> query = 
createSelectQuery(entry.getValue(), quals.subList(fetchBegin, fetchEnd));
-                    objects.addAll(dataContext.performQuery(query));
+                    ObjectSelect<Persistent> query = 
createSelectQuery(entry.getValue(), quals.subList(fetchBegin, fetchEnd));
+                    objects.addAll(query.select(dataContext));
                     fetchBegin = fetchEnd;
                     fetchEnd += Math.min(fetchSize, qualsSize - fetchEnd);
                 }
@@ -179,10 +176,12 @@ class MixedResultIncrementalFaultList<E> extends 
IncrementalFaultList<E> {
         }
     }
 
-    SelectQuery<Persistent> createSelectQuery(ObjEntity entity, 
List<Expression> expressions) {
-        SelectQuery<Persistent> query = new SelectQuery<>(entity, 
ExpressionFactory.joinExp(Expression.OR, expressions));
-        if (entity.equals(rootEntity)) {
-            query.setPrefetchTree(internalQuery.getPrefetchTree());
+    ObjectSelect<Persistent> createSelectQuery(ObjEntity entity, 
List<Expression> expressions) {
+        ObjectSelect<Persistent> query = ObjectSelect.query(Persistent.class)
+                .entityName(entity.getName())
+                .where(ExpressionFactory.joinExp(Expression.OR, expressions));
+        if (entity.equals(rootEntity) && metadata.getPrefetchTree() != null) {
+            query.prefetch(metadata.getPrefetchTree());
         }
         return query;
     }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/OptimisticLockException.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/OptimisticLockException.java
index 842dafb..5d39ec9 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/OptimisticLockException.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/OptimisticLockException.java
@@ -23,16 +23,14 @@ import java.util.Collections;
 import java.util.Iterator;
 import java.util.Map;
 
-import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.DataRow;
 import org.apache.cayenne.ObjectContext;
 import org.apache.cayenne.ObjectId;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.ObjectSelect;
 
 /**
  * An exception thrown on optimistic lock failure.
@@ -85,9 +83,9 @@ public class OptimisticLockException extends 
CayenneRuntimeException {
                     : attributeQualifier;
         }
 
-        SelectQuery<DataRow> query = new SelectQuery<DataRow>(rootEntity, 
qualifier);
-        query.setFetchingDataRows(true);
-        return (Map<?, ?>) Cayenne.objectForQuery(context, query);
+        return ObjectSelect.dbQuery(rootEntity.getName(), qualifier)
+                .fetchDataRows()
+                .selectFirst(context);
     }
 
     /**
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
index 5c95718..3d4ca1e 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
@@ -23,7 +23,6 @@ import java.util.Collection;
 import java.util.Objects;
 
 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.Ordering;
@@ -32,6 +31,7 @@ import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 4.2
+ * @deprecated this class should gone with the {@link SelectQuery}
  */
 public class SelectQueryWrapper implements TranslatableQueryWrapper {
 
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
index 9109288..54baa19 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/AutoAdapter.java
@@ -102,6 +102,7 @@ public class AutoAdapter implements DbAdapter {
         * @since 4.0
         */
        @Override
+       @Deprecated
        public SelectTranslator getSelectTranslator(SelectQuery<?> query, 
EntityResolver entityResolver) {
                return getAdapter().getSelectTranslator(query, entityResolver);
        }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java 
b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
index c71e063..4a23596 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcAdapter.java
@@ -541,6 +541,7 @@ public class JdbcAdapter implements DbAdapter {
     }
 
     @Override
+    @Deprecated
     public SelectTranslator getSelectTranslator(SelectQuery<?> query, 
EntityResolver entityResolver) {
         return new DefaultSelectTranslator(query, this, entityResolver);
     }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/CacheableQuery.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/CacheableQuery.java
index 71a39af..ca643cb 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/CacheableQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/CacheableQuery.java
@@ -29,7 +29,7 @@ import org.slf4j.LoggerFactory;
  */
 public abstract class CacheableQuery implements Query {
 
-    protected static final Logger logger = 
LoggerFactory.getLogger(SelectQuery.class);
+    protected static final Logger logger = 
LoggerFactory.getLogger(CacheableQuery.class);
 
     abstract protected BaseQueryMetadata getBaseMetaData();
 
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
index 58201c0..8dad2de 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
@@ -199,7 +199,7 @@ public abstract class FluentSelect<T> extends AbstractQuery 
implements Select<T>
         return false;
     }
 
-    private void routePrefetches(QueryRouter router, EntityResolver resolver) {
+    protected void routePrefetches(QueryRouter router, EntityResolver 
resolver) {
         new FluentSelectPrefetchRouterAction().route(this, router, resolver);
     }
 
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelectPrefetchRouterAction.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelectPrefetchRouterAction.java
index 572d82a..2256e25 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelectPrefetchRouterAction.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelectPrefetchRouterAction.java
@@ -97,9 +97,9 @@ class FluentSelectPrefetchRouterAction implements 
PrefetchProcessor {
 
         // create and configure PrefetchSelectQuery
         PrefetchSelectQuery<?> prefetchQuery = new 
PrefetchSelectQuery<>(prefetchPath, relationship);
-        prefetchQuery.setStatementFetchSize(query.getStatementFetchSize());
+        prefetchQuery.statementFetchSize(query.getStatementFetchSize());
 
-        prefetchQuery.setQualifier(classDescriptor.getEntity()
+        prefetchQuery.where(classDescriptor.getEntity()
                 .translateToRelatedEntity(queryQualifier, prefetchPath));
 
         if (relationship.isSourceIndependentFromTargetChange()) {
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java
index 94e9c23..d78d58c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectIdQuery.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.query;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.Persistent;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.EntityResolver;
@@ -124,11 +125,13 @@ public class ObjectIdQuery extends IndirectQuery {
             throw new CayenneRuntimeException("Can't build a query for 
temporary id: %s", objectId);
         }
 
-        SelectQuery<Object> query = new 
SelectQuery<>(objectId.getEntityName(), ExpressionFactory
-                .matchAllDbExp(objectId.getIdSnapshot(), Expression.EQUAL_TO));
-
+        ObjectSelect<Persistent> query = ObjectSelect.query(Persistent.class)
+                .entityName(objectId.getEntityName())
+                
.where(ExpressionFactory.matchAllDbExp(objectId.getIdSnapshot(), 
Expression.EQUAL_TO));
         // if we got to the point of fetch, always force refresh....
-        query.setFetchingDataRows(fetchingDataRows);
+        if(fetchingDataRows) {
+            query.fetchDataRows();
+        }
         return query;
     }
 
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/PrefetchSelectQuery.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/query/PrefetchSelectQuery.java
index 7efb1a3..08e98f7 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/PrefetchSelectQuery.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/query/PrefetchSelectQuery.java
@@ -30,8 +30,10 @@ import org.apache.cayenne.util.Util;
 /**
  * A SelectQuery to perform a prefetch based on another query. Used internally 
by Cayenne
  * and is normally never used directly.
+ *
+ * @since 4.2 this query extends {@link ObjectSelect} as part of the 
deprecation of the {@link SelectQuery}
  */
-public class PrefetchSelectQuery<T> extends SelectQuery<T> {
+public class PrefetchSelectQuery<T> extends ObjectSelect<T> {
 
     /**
      * The relationship path from root objects to the objects being prefetched.
@@ -53,19 +55,13 @@ public class PrefetchSelectQuery<T> extends SelectQuery<T> {
      * @since 3.1
      */
     public PrefetchSelectQuery(String prefetchPath, ObjRelationship 
lastPrefetchHint) {
-        setRoot(lastPrefetchHint.getTargetEntity());
+        entityName(lastPrefetchHint.getTargetEntityName());
         this.prefetchPath = prefetchPath;
         this.lastPrefetchHint = lastPrefetchHint;
     }
 
-    /**
-     * Overrides super implementation to suppress disjoint prefetch routing, 
as the parent
-     * query should take care of that.
-     * 
-     * @since 1.2
-     */
     @Override
-    void routePrefetches(QueryRouter router, EntityResolver resolver) {
+    protected void routePrefetches(QueryRouter router, EntityResolver 
resolver) {
         // noop - intentional.
     }
 
@@ -86,6 +82,16 @@ public class PrefetchSelectQuery<T> extends SelectQuery<T> {
     }
 
     /**
+     * Clean set of the prefetch tree without any merge with existing nodes.
+     *
+     * @param prefetch prefetch tree
+     * @since 4.2
+     */
+    public void setPrefetchTree(PrefetchTreeNode prefetch) {
+        getBaseMetaData().setPrefetchTree(prefetch);
+    }
+
+    /**
      * Returns last incoming ObjRelationship in the prefetch relationship 
chain.
      * 
      * @since 1.1
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java
index 96c25bf..e43d632 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/query/RelationshipQuery.java
@@ -21,6 +21,7 @@ package org.apache.cayenne.query;
 
 import org.apache.cayenne.CayenneRuntimeException;
 import org.apache.cayenne.ObjectId;
+import org.apache.cayenne.Persistent;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.map.EntityResolver;
@@ -117,14 +118,13 @@ public class RelationshipQuery extends IndirectQuery {
         ObjRelationship relationship = getRelationship(resolver);
 
         // build executable select...
-        Expression qualifier = ExpressionFactory.matchDbExp(relationship
-                .getReverseDbRelationshipPath(), objectId);
-
-        SelectQuery<Object> query = new SelectQuery<Object>(
-                (ObjEntity) relationship.getTargetEntity(),
-                qualifier);
-        query.setStatementFetchSize(statementFetchSize);
-        return query;
+        Expression qualifier = ExpressionFactory
+                .matchDbExp(relationship.getReverseDbRelationshipPath(), 
objectId);
+
+        return ObjectSelect.query(Persistent.class)
+                .entityName(relationship.getTargetEntityName())
+                .where(qualifier)
+                .statementFetchSize(statementFetchSize);
     }
 
     /**
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
index a25d49b..032a5b1 100644
--- 
a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
+++ 
b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
@@ -98,9 +98,9 @@ class SelectQueryPrefetchRouterAction implements 
PrefetchProcessor {
 
         // create and configure PrefetchSelectQuery
         PrefetchSelectQuery<?> prefetchQuery = new 
PrefetchSelectQuery<>(prefetchPath, relationship);
-        prefetchQuery.setStatementFetchSize(query.getStatementFetchSize());
+        prefetchQuery.statementFetchSize(query.getStatementFetchSize());
 
-        prefetchQuery.setQualifier(classDescriptor.getEntity()
+        prefetchQuery.where(classDescriptor.getEntity()
                 .translateToRelatedEntity(queryQualifier, prefetchPath));
 
         if (relationship.isSourceIndependentFromTargetChange()) {
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchMultistepIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchMultistepIT.java
index 465b6c1..d312f10 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchMultistepIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextPrefetchMultistepIT.java
@@ -220,11 +220,11 @@ public class DataContextPrefetchMultistepIT extends 
ServerCase {
     public void testMixedPrefetch2() throws Exception {
         createTwoArtistsWithExhibitsDataSet();
 
-        List<Gallery> galleries = ObjectSelect.query(Gallery.class)
+        ObjectSelect<Gallery> gallerySelect = ObjectSelect.query(Gallery.class)
                 .where(Gallery.GALLERY_NAME.eq("gallery2"))
                 .prefetch(Gallery.EXHIBIT_ARRAY.disjoint())
-                
.prefetch(Gallery.EXHIBIT_ARRAY.dot(Exhibit.ARTIST_EXHIBIT_ARRAY).joint())
-                .select(context);
+                
.prefetch(Gallery.EXHIBIT_ARRAY.dot(Exhibit.ARTIST_EXHIBIT_ARRAY).joint());
+        List<Gallery> galleries = gallerySelect.select(context);
         assertEquals(1, galleries.size());
 
         Gallery g2 = galleries.get(0);
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextQueryChainIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextQueryChainIT.java
index 01acd47..51a2362 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextQueryChainIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextQueryChainIT.java
@@ -23,8 +23,8 @@ import java.util.List;
 import org.apache.cayenne.DataRow;
 import org.apache.cayenne.QueryResponse;
 import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.QueryChain;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.testdo.testmap.Artist;
 import org.apache.cayenne.unit.di.server.CayenneProjects;
 import org.apache.cayenne.unit.di.server.ServerCase;
@@ -48,8 +48,8 @@ public class DataContextQueryChainIT extends ServerCase {
         context.commitChanges();
 
         QueryChain chain = new QueryChain();
-        chain.addQuery(new SelectQuery(Artist.class));
-        chain.addQuery(new SelectQuery(Artist.class));
+        chain.addQuery(ObjectSelect.query(Artist.class));
+        chain.addQuery(ObjectSelect.query(Artist.class));
 
         QueryResponse r = context.performGenericQuery(chain);
 
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java 
b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
index f25d704..09b1227 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java
@@ -71,7 +71,7 @@ public class EnumIT extends ServerCase {
     public void testSelectQuery() throws Exception {
         createDataSet();
 
-        SelectQuery q = new SelectQuery(EnumEntity.class);
+        SelectQuery<EnumEntity> q = new SelectQuery<>(EnumEntity.class);
         q.andQualifier(EnumEntity.ENUM_ATTRIBUTE.eq(Enum1.one));
 
         EnumEntity e = (EnumEntity) Cayenne.objectForQuery(context, q);
@@ -80,6 +80,18 @@ public class EnumIT extends ServerCase {
     }
 
     @Test
+    public void testObjectSelect() throws Exception {
+        createDataSet();
+
+        EnumEntity e = ObjectSelect.query(EnumEntity.class)
+                .where(EnumEntity.ENUM_ATTRIBUTE.eq(Enum1.one))
+                .selectOne(context);
+
+        assertNotNull(e);
+        assertSame(Enum1.one, e.getEnumAttribute());
+    }
+
+    @Test
     public void testSQLTemplate() throws Exception {
         createDataSet();
 
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
index 1b49875..4e7645e 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/access/VerticalInheritanceIT.java
@@ -31,7 +31,6 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.SelectById;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.test.jdbc.TableHelper;
 import org.apache.cayenne.testdo.inheritance_vertical.Iv1Root;
@@ -308,7 +307,6 @@ public class VerticalInheritanceIT extends ServerCase {
        }
 
     @Test
-       @Deprecated
        public void testSelectQuery_SuperSub() throws Exception {
 
                TableHelper ivRootTable = new TableHelper(dbHelper, "IV_ROOT");
@@ -323,7 +321,7 @@ public class VerticalInheritanceIT extends ServerCase {
                ivRootTable.insert(2, "xSUB1_ROOT", "IvSub1");
                ivSub1Table.insert(2, "xSUB1");
 
-               SelectQuery<IvRoot> query = new SelectQuery<>(IvRoot.class);
+               ObjectSelect<IvRoot> query = ObjectSelect.query(IvRoot.class);
                List<IvRoot> results = context.select(query);
 
                assertEquals(2, results.size());
@@ -351,7 +349,6 @@ public class VerticalInheritanceIT extends ServerCase {
        }
 
     @Test
-       @Deprecated
        public void testSelectQuery_DeepAndWide() throws Exception {
 
                TableHelper ivRootTable = new TableHelper(dbHelper, "IV_ROOT");
@@ -380,7 +377,7 @@ public class VerticalInheritanceIT extends ServerCase {
                ivRootTable.insert(4, "xROOT_SUB2", "IvSub2");
                ivSub2Table.insert(4, "xSUB2");
 
-               SelectQuery<IvRoot> query = new SelectQuery<>(IvRoot.class);
+               ObjectSelect<IvRoot> query = ObjectSelect.query(IvRoot.class);
                List<IvRoot> results = context.select(query);
 
                assertEquals(4, results.size());
@@ -422,7 +419,6 @@ public class VerticalInheritanceIT extends ServerCase {
        }
 
     @Test
-       @Deprecated
        public void testSelectQuery_MiddleLeaf() throws Exception {
 
                TableHelper ivRootTable = new TableHelper(dbHelper, "IV_ROOT");
@@ -451,7 +447,7 @@ public class VerticalInheritanceIT extends ServerCase {
                ivRootTable.insert(4, "xROOT_SUB2", "IvSub2");
                ivSub2Table.insert(4, "xSUB2");
 
-               SelectQuery<IvSub1> query = new SelectQuery<>(IvSub1.class);
+               ObjectSelect<IvSub1> query = ObjectSelect.query(IvSub1.class);
                List<IvSub1> results = context.select(query);
 
                assertEquals(2, results.size());
@@ -556,7 +552,7 @@ public class VerticalInheritanceIT extends ServerCase {
                iv1RootTable.insert(2, "xSUB1_ROOT", "Iv1Sub1");
                iv1Sub1Table.insert(2, "xSUB1");
 
-               SelectQuery<Iv1Root> query = new SelectQuery<>(Iv1Root.class);
+               ObjectSelect<Iv1Root> query = ObjectSelect.query(Iv1Root.class);
                List<Iv1Root> results = context.select(query);
 
                assertEquals(2, results.size());
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/FluentSelectPrefetchRouterActionIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/FluentSelectPrefetchRouterActionIT.java
index 29807b4..9b1a0ff 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/FluentSelectPrefetchRouterActionIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/FluentSelectPrefetchRouterActionIT.java
@@ -55,8 +55,8 @@ public class FluentSelectPrefetchRouterActionIT extends 
ServerCase {
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
 
-        assertSame(paintingEntity, prefetch.getRoot());
-        assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc'"), 
prefetch.getQualifier());
+        assertEquals(paintingEntity.getName(), prefetch.entityName);
+        assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc'"), 
prefetch.getWhere());
     }
 
     @Test
@@ -75,9 +75,9 @@ public class FluentSelectPrefetchRouterActionIT extends 
ServerCase {
         assertEquals(1, router.getQueryCount());
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-        assertSame(paintingEntity, prefetch.getRoot());
+        assertEquals(paintingEntity.getName(), prefetch.entityName);
         assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc' or 
db:toArtist.ARTIST_NAME = 'xyz'"),
-                prefetch.getQualifier());
+                prefetch.getWhere());
     }
 
     @Test
@@ -94,7 +94,7 @@ public class FluentSelectPrefetchRouterActionIT extends 
ServerCase {
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
 
-        assertSame(galleryEntity, prefetch.getRoot());
-        
assertEquals(ExpressionFactory.exp("db:paintingArray.toArtist.ARTIST_NAME = 
'abc'"), prefetch.getQualifier());
+        assertEquals(galleryEntity.getName(), prefetch.entityName);
+        
assertEquals(ExpressionFactory.exp("db:paintingArray.toArtist.ARTIST_NAME = 
'abc'"), prefetch.getWhere());
     }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/FluentSelectPrefetchRouterActionQualifiedEntityIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/FluentSelectPrefetchRouterActionQualifiedEntityIT.java
index 5361701..7e4a692 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/FluentSelectPrefetchRouterActionQualifiedEntityIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/FluentSelectPrefetchRouterActionQualifiedEntityIT.java
@@ -51,9 +51,9 @@ public class 
FluentSelectPrefetchRouterActionQualifiedEntityIT extends PeoplePro
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
 
-        assertSame(departmentEntity, prefetch.getRoot());
+        assertEquals(departmentEntity.getName(), prefetch.getEntityName());
         assertEquals(ExpressionFactory.exp("db:employees.NAME = 'abc' and 
(db:employees.PERSON_TYPE = 'EE' "
-                + "or db:employees.PERSON_TYPE = 'EM')"), 
prefetch.getQualifier());
+                + "or db:employees.PERSON_TYPE = 'EM')"), prefetch.getWhere());
     }
 
     @Test
@@ -70,8 +70,8 @@ public class 
FluentSelectPrefetchRouterActionQualifiedEntityIT extends PeoplePro
         assertEquals(1, router.getQueryCount());
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-        assertSame(departmentEntity, prefetch.getRoot());
+        assertEquals(departmentEntity.getName(), prefetch.getEntityName());
         assertEquals(ExpressionFactory.exp("db:employees.NAME = 'abc' and 
db:employees.PERSON_TYPE = 'EM'"),
-                prefetch.getQualifier());
+                prefetch.getWhere());
     }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
index 0d08af8..addd8ff 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
@@ -55,8 +55,8 @@ public class SelectQueryPrefetchRouterActionIT extends 
ServerCase {
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
 
-        assertSame(paintingEntity, prefetch.getRoot());
-        assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc'"), 
prefetch.getQualifier());
+        assertEquals(paintingEntity.getName(), prefetch.entityName);
+        assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc'"), 
prefetch.getWhere());
     }
 
     @Test
@@ -73,9 +73,9 @@ public class SelectQueryPrefetchRouterActionIT extends 
ServerCase {
         assertEquals(1, router.getQueryCount());
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-        assertSame(paintingEntity, prefetch.getRoot());
+        assertEquals(paintingEntity.getName(), prefetch.entityName);
         assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc' or 
db:toArtist.ARTIST_NAME = 'xyz'"),
-                prefetch.getQualifier());
+                prefetch.getWhere());
     }
 
     @Test
@@ -92,7 +92,7 @@ public class SelectQueryPrefetchRouterActionIT extends 
ServerCase {
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
 
-        assertSame(galleryEntity, prefetch.getRoot());
-        
assertEquals(ExpressionFactory.exp("db:paintingArray.toArtist.ARTIST_NAME = 
'abc'"), prefetch.getQualifier());
+        assertEquals(galleryEntity.getName(), prefetch.entityName);
+        
assertEquals(ExpressionFactory.exp("db:paintingArray.toArtist.ARTIST_NAME = 
'abc'"), prefetch.getWhere());
     }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionQualifiedEntityIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionQualifiedEntityIT.java
index 694f284..88fb726 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionQualifiedEntityIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionQualifiedEntityIT.java
@@ -53,9 +53,9 @@ public class SelectQueryPrefetchRouterActionQualifiedEntityIT 
extends PeopleProj
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
 
-        assertSame(departmentEntity, prefetch.getRoot());
+        assertEquals(departmentEntity.getName(), prefetch.getEntityName());
         assertEquals(ExpressionFactory.exp("db:employees.NAME = 'abc' and 
(db:employees.PERSON_TYPE = 'EE' "
-                + "or db:employees.PERSON_TYPE = 'EM')"), 
prefetch.getQualifier());
+                + "or db:employees.PERSON_TYPE = 'EM')"), prefetch.getWhere());
     }
 
     @Test
@@ -72,8 +72,8 @@ public class SelectQueryPrefetchRouterActionQualifiedEntityIT 
extends PeopleProj
         assertEquals(1, router.getQueryCount());
 
         PrefetchSelectQuery prefetch = (PrefetchSelectQuery) 
router.getQueries().get(0);
-        assertSame(departmentEntity, prefetch.getRoot());
+        assertEquals(departmentEntity.getName(), prefetch.getEntityName());
         assertEquals(ExpressionFactory.exp("db:employees.NAME = 'abc' and 
db:employees.PERSON_TYPE = 'EM'"),
-                prefetch.getQualifier());
+                prefetch.getWhere());
     }
 }
diff --git 
a/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
 
b/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
index 2e66130..e51448a 100644
--- 
a/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
+++ 
b/cayenne-server/src/test/java/org/apache/cayenne/query/StatementFetchSizeIT.java
@@ -49,7 +49,7 @@ public class StatementFetchSizeIT extends ServerCase {
 
     @Test
     public void testObjectSelect() {
-        ObjectSelect query = 
ObjectSelect.query(Artist.class).statementFetchSize(10);
+        ObjectSelect<Artist> query = 
ObjectSelect.query(Artist.class).statementFetchSize(10);
 
         assertEquals(10, query
                 .getMetaData(context.getEntityResolver())

Reply via email to