You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by nt...@apache.org on 2022/07/01 16:20:04 UTC

[cayenne] 03/06: CAY-2737 Cayenne 4.3: cleanup deprecated code - remove SelectQuery and all related code

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 e752587f3e7eb5b3afcc1ddbf665a109e5ab0c41
Author: Nikita Timofeev <st...@gmail.com>
AuthorDate: Fri Jul 1 17:54:46 2022 +0300

    CAY-2737 Cayenne 4.3: cleanup deprecated code
     - remove SelectQuery and all related code
---
 .../translator/select/DefaultSelectTranslator.java |  11 +-
 .../select/DefaultSelectTranslatorFactory.java     |   5 +-
 .../translator/select/SelectQueryWrapper.java      |  78 --
 .../access/translator/select/SelectTranslator.java |   4 +-
 .../java/org/apache/cayenne/dba/AutoAdapter.java   |  10 -
 .../java/org/apache/cayenne/dba/DbAdapter.java     |  11 -
 .../org/apache/cayenne/dba/JdbcActionBuilder.java  |   6 -
 .../java/org/apache/cayenne/dba/JdbcAdapter.java   |   7 -
 .../apache/cayenne/dba/db2/DB2ActionBuilder.java   |   6 -
 .../cayenne/dba/derby/DerbyActionBuilder.java      |   6 -
 .../dba/firebird/FirebirdActionBuilder.java        |   7 -
 .../org/apache/cayenne/dba/h2/H2ActionBuilder.java |   6 -
 .../cayenne/dba/hsqldb/HSQLActionBuilder.java      |   6 -
 .../cayenne/dba/ingres/IngresActionBuilder.java    |   6 -
 .../cayenne/dba/mysql/MySQLActionBuilder.java      |   6 -
 .../cayenne/dba/oracle/OracleActionBuilder.java    |   6 -
 .../dba/postgres/PostgresActionBuilder.java        |   6 -
 .../cayenne/dba/sqlite/SQLiteActionBuilder.java    |   9 -
 .../dba/sqlserver/SQLServerActionBuilder.java      |  18 +-
 .../query/FluentSelectPrefetchRouterAction.java    |   1 -
 .../org/apache/cayenne/query/ObjectSelect.java     |   6 +-
 .../apache/cayenne/query/PrefetchSelectQuery.java  |   2 +-
 .../org/apache/cayenne/query/SQLActionVisitor.java |   5 -
 .../java/org/apache/cayenne/query/SelectQuery.java | 838 -------------------
 .../apache/cayenne/query/SelectQueryMetadata.java  | 305 -------
 .../query/SelectQueryPrefetchRouterAction.java     | 142 ----
 .../DataContextSelectQuerySplitAliasesIT.java      | 105 ---
 .../java/org/apache/cayenne/access/EnumIT.java     |  14 -
 .../select/DefaultSelectTranslatorIT.java          |   6 +-
 .../cayenne/query/SelectQueryCacheKeyIT.java       | 222 -----
 .../query/SelectQueryFetchLimitOrderingIT.java     |  82 --
 .../org/apache/cayenne/query/SelectQueryIT.java    | 903 ---------------------
 .../query/SelectQueryPrefetchRouterActionIT.java   |  98 ---
 ...QueryPrefetchRouterActionQualifiedEntityIT.java |  79 --
 .../org/apache/cayenne/query/SelectQueryTest.java  | 180 ----
 .../apache/cayenne/query/StatementFetchSizeIT.java |  12 -
 .../org/apache/cayenne/unit/jira/CAY_115IT.java    |  12 +-
 .../_cayenne-guide/part2/queries/custom.adoc       |   2 +-
 .../_cayenne-guide/part2/queries/objectselect.adoc |   2 +-
 39 files changed, 21 insertions(+), 3209 deletions(-)

diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
index faa7fb465..203d1c1af 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslator.java
@@ -29,10 +29,9 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjAttribute;
 import org.apache.cayenne.query.FluentSelect;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
- * Default translator of select queries ({@link SelectQuery} or {@link FluentSelect}).
+ * Default translator of select queries {@link FluentSelect}.
  *
  * @since 4.2
  */
@@ -77,14 +76,6 @@ public class DefaultSelectTranslator implements SelectTranslator {
         this.context = new TranslatorContext(query, adapter, entityResolver, null);
     }
 
-    /**
-     * @deprecated since 4.2 as {@link SelectQuery} is deprecated.
-     */
-    @Deprecated
-    public DefaultSelectTranslator(SelectQuery<?> query, DbAdapter adapter, EntityResolver entityResolver) {
-        this(new SelectQueryWrapper(query), adapter, entityResolver);
-    }
-
     public DefaultSelectTranslator(FluentSelect<?> query, DbAdapter adapter, EntityResolver entityResolver) {
         this(new FluentSelectWrapper(query), adapter, entityResolver);
     }
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorFactory.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorFactory.java
index 941be10a5..e429b27f0 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorFactory.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorFactory.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.dba.DbAdapter;
 import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Select;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * A {@link SelectTranslator} factory that delegates translator creation to
@@ -35,9 +34,7 @@ public class DefaultSelectTranslatorFactory implements SelectTranslatorFactory {
 
 	@Override
 	public SelectTranslator translator(Select<?> query, DbAdapter adapter, EntityResolver entityResolver) {
-		if(query instanceof SelectQuery) {
-			return adapter.getSelectTranslator((SelectQuery<?>)query, entityResolver);
-		} else if(query instanceof FluentSelect) {
+		if(query instanceof FluentSelect) {
 			return adapter.getSelectTranslator((FluentSelect<?>)query, entityResolver);
 		}
 		throw new CayenneRuntimeException("Unsupported type of Select query %s", query);
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
deleted file mode 100644
index 3d4ca1e95..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectQueryWrapper.java
+++ /dev/null
@@ -1,78 +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.Ordering;
-import org.apache.cayenne.query.QueryMetadata;
-import org.apache.cayenne.query.SelectQuery;
-
-/**
- * @since 4.2
- * @deprecated this class should gone with the {@link SelectQuery}
- */
-public class SelectQueryWrapper implements TranslatableQueryWrapper {
-
-    private final SelectQuery<?> selectQuery;
-
-    public SelectQueryWrapper(SelectQuery<?> selectQuery) {
-        this.selectQuery = Objects.requireNonNull(selectQuery);
-    }
-
-    @Override
-    public boolean isDistinct() {
-        return selectQuery.isDistinct();
-    }
-
-    @Override
-    public QueryMetadata getMetaData(EntityResolver resolver) {
-        return selectQuery.getMetaData(resolver);
-    }
-
-    @Override
-    public Expression getQualifier() {
-        return selectQuery.getQualifier();
-    }
-
-    @Override
-    public Collection<Ordering> getOrderings() {
-        return selectQuery.getOrderings();
-    }
-
-    @Override
-    public Collection<Property<?>> getColumns() {
-        return selectQuery.getColumns();
-    }
-
-    @Override
-    public Expression getHavingQualifier() {
-        return selectQuery.getHavingQualifier();
-    }
-
-    @Override
-    public SelectQuery<?> unwrap() {
-        return selectQuery;
-    }
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
index 2eb745bf3..2090a959c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/access/translator/select/SelectTranslator.java
@@ -24,10 +24,10 @@ import java.util.Map;
 import org.apache.cayenne.access.jdbc.ColumnDescriptor;
 import org.apache.cayenne.access.translator.DbAttributeBinding;
 import org.apache.cayenne.map.ObjAttribute;
-import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.ObjectSelect;
 
 /**
- * An abstraction of {@link SelectQuery} translator.
+ * An abstraction of {@link ObjectSelect} translator.
  * 
  * @since 4.0 this is an interface.
  */
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 87d097237..45a374ce4 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
@@ -40,7 +40,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * A DbAdapter that automatically detects the kind of database it is running on
@@ -98,15 +97,6 @@ public class AutoAdapter implements DbAdapter {
 		return adapterProvider.get();
 	}
 
-	/**
-	 * @since 4.0
-	 */
-	@Override
-	@Deprecated
-	public SelectTranslator getSelectTranslator(SelectQuery<?> query, EntityResolver entityResolver) {
-		return getAdapter().getSelectTranslator(query, entityResolver);
-	}
-
 	/**
 	 * @since 4.2
 	 */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
index 54e858092..c6bc77394 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/DbAdapter.java
@@ -36,7 +36,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * A Cayenne extension point that abstracts the differences between specifics of
@@ -54,16 +53,6 @@ public interface DbAdapter {
 	 */
 	String getBatchTerminator();
 
-    /**
-     * Returns a SelectTranslator that works with the adapter target database.
-     *
-     * @since 4.0
-     * @deprecated since 4.2 as {@link SelectQuery} is deprecated.
-     * {@link #getSelectTranslator(FluentSelect, EntityResolver)} replaces this method.
-     */
-    @Deprecated
-    SelectTranslator getSelectTranslator(SelectQuery<?> query, EntityResolver entityResolver);
-
 	/**
 	 * @since 4.2
 	 */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcActionBuilder.java
index 35a3b8123..8433e6cd6 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/JdbcActionBuilder.java
@@ -32,7 +32,6 @@ import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLActionVisitor;
 import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * A factory of default SQLActions. Adapters usually subclass JdbcActionBuilder to provide
@@ -67,11 +66,6 @@ public class JdbcActionBuilder implements SQLActionVisitor {
         return new ProcedureAction(query, dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new SelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
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 4a2359656..5dfc160d4 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
@@ -54,7 +54,6 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.Query;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.resource.Resource;
 import org.apache.cayenne.resource.ResourceLocator;
 import org.apache.cayenne.util.Util;
@@ -540,12 +539,6 @@ public class JdbcAdapter implements DbAdapter {
         return query.createSQLAction(new JdbcActionBuilder(node));
     }
 
-    @Override
-    @Deprecated
-    public SelectTranslator getSelectTranslator(SelectQuery<?> query, EntityResolver entityResolver) {
-        return new DefaultSelectTranslator(query, this, entityResolver);
-    }
-
     @Override
     public SelectTranslator getSelectTranslator(FluentSelect<?> query, EntityResolver entityResolver) {
         return new DefaultSelectTranslator(query, this, entityResolver);
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java
index dd0ce9bd0..5ef0f5216 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/db2/DB2ActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 3.1
@@ -39,11 +38,6 @@ public class DB2ActionBuilder extends JdbcActionBuilder {
         return new DB2ProcedureAction(query, dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new DB2SelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyActionBuilder.java
index 277190829..46ea873a5 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/derby/DerbyActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 4.1
@@ -34,11 +33,6 @@ public class DerbyActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new DerbySelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdActionBuilder.java
index a1d021b54..eca046e53 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/firebird/FirebirdActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 4.1
@@ -34,12 +33,6 @@ public class FirebirdActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new FirebirdSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2ActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2ActionBuilder.java
index a93ba6f7a..37c0a2187 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2ActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/h2/H2ActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 4.1
@@ -33,11 +32,6 @@ public class H2ActionBuilder extends JdbcActionBuilder {
         super(node);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new H2SelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java
index b361b8031..75aea976f 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/hsqldb/HSQLActionBuilder.java
@@ -28,7 +28,6 @@ import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 class HSQLActionBuilder extends JdbcActionBuilder {
 
@@ -36,11 +35,6 @@ class HSQLActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new HSQLSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresActionBuilder.java
index bd6d61408..76b874121 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/ingres/IngresActionBuilder.java
@@ -22,7 +22,6 @@ import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 public class IngresActionBuilder extends JdbcActionBuilder {
 
@@ -33,11 +32,6 @@ public class IngresActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new IngresSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java
index bb3fcc643..d446ce35b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/mysql/MySQLActionBuilder.java
@@ -24,7 +24,6 @@ import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 1.2
@@ -35,11 +34,6 @@ class MySQLActionBuilder extends JdbcActionBuilder {
         super(dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new MySQLSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
index 6bd040106..bb033f973 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/oracle/OracleActionBuilder.java
@@ -26,7 +26,6 @@ import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 1.2
@@ -59,11 +58,6 @@ class OracleActionBuilder extends JdbcActionBuilder {
         return new OracleProcedureAction(query, dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new OracleSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
index 062b88614..3051c0eb1 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/postgres/PostgresActionBuilder.java
@@ -25,7 +25,6 @@ import org.apache.cayenne.query.BatchQuery;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.ProcedureQuery;
 import org.apache.cayenne.query.SQLAction;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 1.2
@@ -52,11 +51,6 @@ class PostgresActionBuilder extends JdbcActionBuilder {
         return new PostgresProcedureAction(query, dataNode);
     }
 
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new PostgresSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteActionBuilder.java
index d9f611c42..c2be85d8b 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlite/SQLiteActionBuilder.java
@@ -23,7 +23,6 @@ import org.apache.cayenne.dba.JdbcActionBuilder;
 import org.apache.cayenne.query.FluentSelect;
 import org.apache.cayenne.query.SQLAction;
 import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.query.SelectQuery;
 
 /**
  * @since 3.0
@@ -39,14 +38,6 @@ class SQLiteActionBuilder extends JdbcActionBuilder {
         return new SQLiteSQLTemplateAction(query, dataNode);
     }
 
-    /**
-     * @since 4.1
-     */
-    @Override
-    public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-        return new SQLiteSelectAction(query, dataNode);
-    }
-
     /**
      * @since 4.2
      */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerActionBuilder.java b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerActionBuilder.java
index bb82143c4..f7d78452a 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerActionBuilder.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/dba/sqlserver/SQLServerActionBuilder.java
@@ -21,7 +21,10 @@ package org.apache.cayenne.dba.sqlserver;
 
 import org.apache.cayenne.access.DataNode;
 import org.apache.cayenne.dba.JdbcActionBuilder;
-import org.apache.cayenne.query.*;
+import org.apache.cayenne.query.BatchQuery;
+import org.apache.cayenne.query.FluentSelect;
+import org.apache.cayenne.query.ProcedureQuery;
+import org.apache.cayenne.query.SQLAction;
 
 /**
  * @since 1.2
@@ -68,14 +71,6 @@ public class SQLServerActionBuilder extends JdbcActionBuilder {
 		return new SQLServerProcedureAction(query, dataNode);
 	}
 
-	/**
-	 * @since 4.2
-	 */
-	@Override
-	public <T> SQLAction objectSelectAction(SelectQuery<T> query) {
-		return new SQLServerSelectAction(query, dataNode, needInMemoryOffset(query));
-	}
-
 	/**
 	 * @since 4.2
 	 */
@@ -84,11 +79,6 @@ public class SQLServerActionBuilder extends JdbcActionBuilder {
 		return new SQLServerSelectAction(query, dataNode, needInMemoryOffset(query));
 	}
 
-	private boolean needInMemoryOffset(SelectQuery<?> query) {
-		return query.getOrderings() == null || query.getOrderings().size() == 0
-				|| version == null || version < 12;
-	}
-
 	private boolean needInMemoryOffset(FluentSelect<?> query) {
 		return query.getOrderings() == null || query.getOrderings().size() == 0
 				|| version == null || version < 12;
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 2256e25bf..f72895ac6 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
@@ -30,7 +30,6 @@ import org.apache.cayenne.util.CayenneMapEntry;
 
 /**
  * Preprocessor and router of SelectQuery prefetches.
- * Copy of {@link SelectQueryPrefetchRouterAction}.
  *
  * @since 4.2
  */
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
index aa2b22c45..58f65624c 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
@@ -40,9 +40,9 @@ import org.apache.cayenne.map.EntityResolver;
 import org.apache.cayenne.map.ObjEntity;
 
 /**
- * A selecting query providing chainable API. This is an alternative to
- * {@link SelectQuery} when you want to use a fluent API. For example, the following
- * is a convenient way to return a record:
+ * A selecting query providing chainable API.
+ * <p>
+ * For example, the following is a convenient way to return a record:
  * <pre>
  * {@code
  * Artist a = ObjectSelect
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 08e98f70c..93588f87c 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
@@ -31,7 +31,7 @@ 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}
+ * @since 4.2 this query extends {@link ObjectSelect}
  */
 public class PrefetchSelectQuery<T> extends ObjectSelect<T> {
 
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLActionVisitor.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLActionVisitor.java
index c3dd24039..02c586b13 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SQLActionVisitor.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/SQLActionVisitor.java
@@ -37,11 +37,6 @@ public interface SQLActionVisitor {
      */
     SQLAction batchAction(BatchQuery query);
 
-    /**
-     * Creates an action to execute a SelectQuery.
-     */
-    <T> SQLAction objectSelectAction(SelectQuery<T> query);
-
     /**
      * Creates an action to execute a FluentSelect.
      * @since 4.2
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java
deleted file mode 100644
index 189cb3047..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQuery.java
+++ /dev/null
@@ -1,838 +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.query;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.ResultBatchIterator;
-import org.apache.cayenne.ResultIterator;
-import org.apache.cayenne.ResultIteratorCallback;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.property.Property;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-
-/**
- * A query that selects persistent objects of a certain type or "raw data" (aka
- * DataRows). Supports expression qualifier, multiple orderings and a number of
- * other parameters that serve as runtime hints to Cayenne on how to optimize
- * the fetch and result processing.
- *
- * @deprecated since 4.2, use {@link org.apache.cayenne.query.ObjectSelect}
- */
-@Deprecated
-public class SelectQuery<T> extends AbstractQuery implements ParameterizedQuery, Select<T> {
-
-	private static final long serialVersionUID = 5486418811888197559L;
-
-	public static final String DISTINCT_PROPERTY = "cayenne.SelectQuery.distinct";
-	public static final boolean DISTINCT_DEFAULT = false;
-
-	protected Expression qualifier;
-	protected List<Ordering> orderings;
-	protected boolean distinct;
-
-	/**
-	 * @since 4.0
-	 */
-	protected Collection<Property<?>> columns;
-
-	/**
-	 * @since 4.0
-	 */
-	protected Expression havingQualifier;
-
-	/**
-	 * <p>Flag that indicates whether this query can return single value or
-	 * it should always return some complex data (Object[] for now)</p>
-	 * <p>Default value is <b>true</b></p>
-	 * @since 4.0
-	 */
-	protected boolean canReturnScalarValue = true;
-
-	SelectQueryMetadata metaData = new SelectQueryMetadata();
-
-	/**
-	 * Creates a SelectQuery that selects objects of a given persistent class.
-	 * 
-	 * @param rootClass
-	 *            the Class of objects fetched by this query.
-	 * 
-	 * @since 4.0
-	 */
-	public static <T> SelectQuery<T> query(Class<T> rootClass) {
-		return new SelectQuery<>(rootClass);
-	}
-
-	/**
-	 * Creates a SelectQuery that selects objects of a given persistent class
-	 * that match supplied qualifier.
-	 * 
-	 * @param rootClass
-	 *            the Class of objects fetched by this query.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 * 
-	 * @since 4.0
-	 */
-	public static <T> SelectQuery<T> query(Class<T> rootClass, Expression qualifier) {
-		return new SelectQuery<>(rootClass, qualifier);
-	}
-
-	/**
-	 * Creates a SelectQuery that selects objects of a given persistent class
-	 * that match supplied qualifier.
-	 * 
-	 * @param rootClass
-	 *            the Class of objects fetched by this query.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 * @param orderings
-	 *            defines how to order the results, may be null.
-	 * 
-	 * @since 4.0
-	 */
-	public static <T> SelectQuery<T> query(Class<T> rootClass, Expression qualifier, List<? extends Ordering> orderings) {
-		return new SelectQuery<>(rootClass, qualifier, orderings);
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	public static SelectQuery<DataRow> dataRowQuery(Class<?> rootClass) {
-		// create a query replica that would fetch DataRows
-		SelectQuery<DataRow> query = new SelectQuery<>();
-
-		query.setRoot(rootClass);
-		query.metaData.setFetchingDataRows(true);
-
-		return query;
-	}
-
-	/**
-	 * Creates a SelectQuery that selects DataRows that correspond to a given
-	 * persistent class that match supplied qualifier.
-	 * 
-	 * @param rootClass
-	 *            the Class of objects that correspond to DataRows entity.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 * 
-	 * @since 4.0
-	 */
-	public static SelectQuery<DataRow> dataRowQuery(Class<?> rootClass, Expression qualifier) {
-		SelectQuery<DataRow> query = dataRowQuery(rootClass);
-		query.setQualifier(qualifier);
-		return query;
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	public static SelectQuery<DataRow> dataRowQuery(Class<?> rootClass, Expression qualifier, List<Ordering> orderings) {
-		SelectQuery<DataRow> query = dataRowQuery(rootClass, qualifier);
-		query.addOrderings(orderings);
-		return query;
-	}
-
-	/** Creates an empty SelectQuery. */
-	public SelectQuery() {
-	}
-
-	/**
-	 * Creates a SelectQuery with null qualifier, for the specifed ObjEntity
-	 * 
-	 * @param root
-	 *            the ObjEntity this SelectQuery is for.
-	 */
-	public SelectQuery(ObjEntity root) {
-		this(root, null);
-	}
-
-	/**
-	 * Creates a SelectQuery for the specified ObjEntity with the given
-	 * qualifier.
-	 * 
-	 * @param root
-	 *            the ObjEntity this SelectQuery is for.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched
-	 */
-	public SelectQuery(ObjEntity root, Expression qualifier) {
-		this(root, qualifier, null);
-	}
-
-	/**
-	 * Creates a SelectQuery for the specified ObjEntity with the given
-	 * qualifier and orderings.
-	 * 
-	 * @param root
-	 *            the ObjEntity this SelectQuery is for.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 * @param orderings
-	 *            defines how to order the results, may be null.
-	 * @since 3.1
-	 */
-	public SelectQuery(ObjEntity root, Expression qualifier, List<? extends Ordering> orderings) {
-		this();
-		this.init(root, qualifier);
-		addOrderings(orderings);
-	}
-
-	/**
-	 * Creates a SelectQuery that selects all objects of a given persistent
-	 * class.
-	 * 
-	 * @param rootClass
-	 *            the Class of objects fetched by this query.
-	 */
-	public SelectQuery(Class<T> rootClass) {
-		this(rootClass, null);
-	}
-
-	/**
-	 * Creates a SelectQuery that selects objects of a given persistent class
-	 * that match supplied qualifier.
-	 * 
-	 * @param rootClass
-	 *            the Class of objects fetched by this query.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 */
-	public SelectQuery(Class<T> rootClass, Expression qualifier) {
-		this(rootClass, qualifier, null);
-	}
-
-	/**
-	 * Creates a SelectQuery that selects objects of a given persistent class
-	 * that match supplied qualifier.
-	 * 
-	 * @param rootClass
-	 *            the Class of objects fetched by this query.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 * @param orderings
-	 *            defines how to order the results, may be null.
-	 * @since 3.1
-	 */
-	public SelectQuery(Class<T> rootClass, Expression qualifier, List<? extends Ordering> orderings) {
-		init(rootClass, qualifier);
-		addOrderings(orderings);
-	}
-
-	/**
-	 * Creates a SelectQuery for the specified DbEntity.
-	 * 
-	 * @param root
-	 *            the DbEntity this SelectQuery is for.
-	 * @since 1.1
-	 */
-	public SelectQuery(DbEntity root) {
-		this(root, null);
-	}
-
-	/**
-	 * Creates a SelectQuery for the specified DbEntity with the given
-	 * qualifier.
-	 * 
-	 * @param root
-	 *            the DbEntity this SelectQuery is for.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 * @since 1.1
-	 */
-	public SelectQuery(DbEntity root, Expression qualifier) {
-		this(root, qualifier, null);
-	}
-
-	/**
-	 * Creates a SelectQuery for the specified DbEntity with the given qualifier
-	 * and orderings.
-	 * 
-	 * @param root
-	 *            the DbEntity this SelectQuery is for.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 * @param orderings
-	 *            defines how to order the results, may be null.
-	 * @since 3.1
-	 */
-	public SelectQuery(DbEntity root, Expression qualifier, List<? extends Ordering> orderings) {
-		this();
-		this.init(root, qualifier);
-		addOrderings(orderings);
-	}
-
-	/**
-	 * Creates SelectQuery with <code>objEntityName</code> parameter.
-	 */
-	public SelectQuery(String objEntityName) {
-		this(objEntityName, null);
-	}
-
-	/**
-	 * Creates SelectQuery with <code>objEntityName</code> and
-	 * <code>qualifier</code> parameters.
-	 */
-	public SelectQuery(String objEntityName, Expression qualifier) {
-		this(objEntityName, qualifier, null);
-	}
-
-	/**
-	 * Creates a SelectQuery that selects objects of a given persistent class
-	 * that match supplied qualifier.
-	 * 
-	 * @param objEntityName
-	 *            the name of the ObjEntity to fetch from.
-	 * @param qualifier
-	 *            an Expression indicating which objects should be fetched.
-	 * @param orderings
-	 *            defines how to order the results, may be null.
-	 * @since 3.1
-	 */
-	public SelectQuery(String objEntityName, Expression qualifier, List<? extends Ordering> orderings) {
-		init(objEntityName, qualifier);
-		addOrderings(orderings);
-	}
-
-	private void init(Object root, Expression qualifier) {
-		this.setRoot(root);
-		this.setQualifier(qualifier);
-	}
-
-	@Override
-	public List<T> select(ObjectContext context) {
-		return context.select(this);
-	}
-
-	@Override
-	public T selectOne(ObjectContext context) {
-		return context.selectOne(this);
-	}
-
-	@Override
-	public T selectFirst(ObjectContext context) {
-		setFetchLimit(1);
-		return context.selectFirst(this);
-	}
-
-	@Override
-	public void iterate(ObjectContext context, ResultIteratorCallback<T> callback) {
-		context.iterate(this, callback);
-	}
-
-	@Override
-	public ResultIterator<T> iterator(ObjectContext context) {
-		return context.iterator(this);
-	}
-
-	@Override
-	public ResultBatchIterator<T> batchIterator(ObjectContext context, int size) {
-		return context.batchIterator(this, size);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	@Override
-	public QueryMetadata getMetaData(EntityResolver resolver) {
-		metaData.resolve(root, resolver, this);
-
-		// must force DataRows if DbEntity is fetched
-		if (root instanceof DbEntity) {
-			QueryMetadataWrapper wrapper = new QueryMetadataWrapper(metaData);
-			wrapper.override(QueryMetadata.FETCHING_DATA_ROWS_PROPERTY, Boolean.TRUE);
-			return wrapper;
-		} else {
-			return metaData;
-		}
-	}
-
-	/**
-	 * Routes itself and if there are any prefetches configured, creates
-	 * prefetch queries and routes them as well.
-	 * 
-	 * @since 1.2
-	 */
-	@Override
-	public void route(QueryRouter router, EntityResolver resolver, Query substitutedQuery) {
-		super.route(router, resolver, substitutedQuery);
-
-		// suppress prefetches for paginated queries.. instead prefetches will
-		// be resolved
-		// per row...
-		if (metaData.getPageSize() <= 0) {
-			routePrefetches(router, resolver);
-		}
-	}
-
-	/**
-	 * Creates and routes extra disjoint prefetch queries.
-	 * 
-	 * @since 1.2
-	 */
-	void routePrefetches(QueryRouter router, EntityResolver resolver) {
-		new SelectQueryPrefetchRouterAction().route(this, router, resolver);
-	}
-
-	/**
-	 * Calls "makeSelect" on the visitor.
-	 * 
-	 * @since 1.2
-	 */
-	@Override
-	public SQLAction createSQLAction(SQLActionVisitor visitor) {
-		return visitor.objectSelectAction(this);
-	}
-
-	/**
-	 * Initializes query parameters using a set of properties.
-	 * 
-	 * @since 1.1
-	 */
-	public void initWithProperties(Map<String, ?> properties) {
-
-		// must init defaults even if properties are empty
-		if (properties == null) {
-			properties = Collections.emptyMap();
-		}
-
-		Object distinct = properties.get(DISTINCT_PROPERTY);
-
-		// init ivars from properties
-		this.distinct = (distinct != null) ? "true".equalsIgnoreCase(distinct.toString()) : DISTINCT_DEFAULT;
-
-		metaData.initWithProperties(properties);
-	}
-
-	/**
-	 * A shortcut for {@link #queryWithParameters(Map, boolean)}that prunes
-	 * parts of qualifier that have no parameter value set.
-	 */
-	public SelectQuery<T> queryWithParameters(Map<String, ?> parameters) {
-		return queryWithParameters(parameters, true);
-	}
-
-	/**
-	 * Returns a query built using this query as a prototype, using a set of
-	 * parameters to build the qualifier.
-	 * 
-	 * @see org.apache.cayenne.exp.Expression#params(java.util.Map,
-	 *      boolean) parameter substitution.
-	 */
-	public SelectQuery<T> queryWithParameters(Map<String, ?> parameters, boolean pruneMissing) {
-		// create a query replica
-		SelectQuery<T> query = new SelectQuery<>();
-		query.setDistinct(distinct);
-
-		query.metaData.copyFromInfo(this.metaData);
-		query.setRoot(root);
-
-		if (orderings != null) {
-			query.addOrderings(orderings);
-		}
-
-		// substitute qualifier parameters
-		if (qualifier != null) {
-			query.setQualifier(qualifier.params(parameters, pruneMissing));
-		}
-
-		return query;
-	}
-
-	/**
-	 * Creates and returns a new SelectQuery built using this query as a
-	 * prototype and substituting qualifier parameters with the values from the
-	 * map.
-	 * 
-	 * @since 1.1
-	 */
-	public SelectQuery<T> createQuery(Map<String, ?> parameters) {
-		return queryWithParameters(parameters);
-	}
-
-	/**
-	 * Adds ordering specification to this query orderings.
-	 */
-	public void addOrdering(Ordering ordering) {
-		nonNullOrderings().add(ordering);
-	}
-
-	/**
-	 * Adds a list of orderings.
-	 */
-	public void addOrderings(Collection<? extends Ordering> orderings) {
-		// If the supplied list of orderings is null, do not attempt to add
-		// to the collection (addAll() will NPE otherwise).
-		if (orderings != null) {
-			nonNullOrderings().addAll(orderings);
-		}
-	}
-
-	/**
-	 * Adds ordering specification to this query orderings.
-	 * 
-	 * @since 3.0
-	 */
-	public void addOrdering(String sortPathSpec, SortOrder order) {
-		addOrdering(new Ordering(sortPathSpec, order));
-	}
-
-	/**
-	 * Removes ordering.
-	 * 
-	 * @since 1.1
-	 */
-	public void removeOrdering(Ordering ordering) {
-		if (orderings != null) {
-			orderings.remove(ordering);
-		}
-	}
-
-	/**
-	 * Returns a list of orderings used by this query.
-	 */
-	public List<Ordering> getOrderings() {
-		return (orderings != null) ? orderings : Collections.emptyList();
-	}
-
-	/**
-	 * Clears all configured orderings.
-	 */
-	public void clearOrderings() {
-		orderings = null;
-	}
-
-	/**
-	 * Returns true if this query returns distinct rows.
-	 */
-	public boolean isDistinct() {
-		return distinct;
-	}
-
-	/**
-	 * Sets <code>distinct</code> property that determines whether this query
-	 * returns distinct row.
-	 */
-	public void setDistinct(boolean distinct) {
-		this.distinct = distinct;
-	}
-
-	/**
-	 * Sets <code>distinct</code> property that determines whether this query
-	 * returns distinct row.
-	 */
-	public void setSuppressDistinct(boolean suppressDistinct) {
-		this.metaData.setSuppressingDistinct(suppressDistinct);
-	}
-
-	/**
-	 * Adds one or more aliases for the qualifier expression path. Aliases serve
-	 * to instruct Cayenne to generate separate sets of joins for overlapping
-	 * paths, that maybe needed for complex conditions. An example of an
-	 * <i>implicit</i> splits is this method:
-	 * {@link ExpressionFactory#matchAllExp(String, Object...)}.
-	 * 
-	 * @since 3.0
-	 */
-	public void aliasPathSplits(String path, String... aliases) {
-		metaData.addPathSplitAliases(path, aliases);
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public PrefetchTreeNode getPrefetchTree() {
-		return metaData.getPrefetchTree();
-	}
-
-	/**
-	 * @since 1.2
-	 */
-	public void setPrefetchTree(PrefetchTreeNode prefetchTree) {
-		metaData.setPrefetchTree(prefetchTree);
-	}
-
-	/**
-	 * Adds a prefetch with specified relationship path to the query.
-	 * 
-	 * @since 4.0
-	 */
-	public void addPrefetch(PrefetchTreeNode prefetchElement) {
-		metaData.mergePrefetch(prefetchElement);
-	}
-
-	/**
-	 * Adds a prefetch with specified relationship path to the query.
-	 * 
-	 * @since 1.2 signature changed to return created PrefetchTreeNode.
-	 */
-	public PrefetchTreeNode addPrefetch(String prefetchPath) {
-		return metaData.addPrefetch(prefetchPath, PrefetchTreeNode.UNDEFINED_SEMANTICS);
-	}
-
-	/**
-	 * Clears all stored prefetch paths.
-	 */
-	public void clearPrefetches() {
-		metaData.clearPrefetches();
-	}
-
-	/**
-	 * Removes prefetch.
-	 * 
-	 * @since 1.1
-	 */
-	public void removePrefetch(String prefetchPath) {
-		metaData.removePrefetch(prefetchPath);
-	}
-
-	/**
-	 * Returns <code>true</code> if this query should produce a list of data
-	 * rows as opposed to DataObjects, <code>false</code> for DataObjects. This
-	 * is a hint to QueryEngine executing this query.
-	 */
-	public boolean isFetchingDataRows() {
-		return (root instanceof DbEntity) || metaData.isFetchingDataRows();
-	}
-
-	/**
-	 * Sets query result type. If <code>flag</code> parameter is
-	 * <code>true</code>, then results will be in the form of data rows.
-	 * <p>
-	 * <i>Note that if the root of this query is a {@link DbEntity}, this
-	 * setting has no effect, and data rows are always fetched. </i>
-	 * </p>
-	 * 
-	 * @deprecated since 4.0, use {@link #dataRowQuery(Class, Expression)} to
-	 *             create DataRow query instead.
-	 */
-	public void setFetchingDataRows(boolean flag) {
-		metaData.setFetchingDataRows(flag);
-	}
-
-	/**
-	 * Returns the fetchOffset.
-	 * 
-	 * @since 3.0
-	 */
-	public int getFetchOffset() {
-		return metaData.getFetchOffset();
-	}
-
-	/**
-	 * Returns the fetchLimit.
-	 */
-	public int getFetchLimit() {
-		return metaData.getFetchLimit();
-	}
-
-	/**
-	 * Sets the fetchLimit.
-	 */
-	public void setFetchLimit(int fetchLimit) {
-		this.metaData.setFetchLimit(fetchLimit);
-	}
-
-	/**
-	 * @since 3.0
-	 */
-	public void setFetchOffset(int fetchOffset) {
-		this.metaData.setFetchOffset(fetchOffset);
-	}
-
-	/**
-	 * Returns <code>pageSize</code> property. See setPageSize for more details.
-	 */
-	public int getPageSize() {
-		return metaData.getPageSize();
-	}
-
-	/**
-	 * Sets <code>pageSize</code> property.
-	 * 
-	 * By setting a page size, the Collection returned by performing a query
-	 * will return <i>hollow</i> DataObjects. This is considerably faster and
-	 * uses a tiny fraction of the memory compared to a non-paged query when
-	 * large numbers of objects are returned in the result. When a hollow
-	 * DataObject is accessed all DataObjects on the same page will be faulted
-	 * into memory. There will be a small delay when faulting objects while the
-	 * data is fetched from the data source, but otherwise you do not need to do
-	 * anything special to access data in hollow objects. The first page is
-	 * always faulted into memory immediately.
-	 * 
-	 * @param pageSize
-	 *            The pageSize to set
-	 */
-	public void setPageSize(int pageSize) {
-		metaData.setPageSize(pageSize);
-	}
-
-	/**
-	 * Returns a list that internally stores orderings, creating it on demand.
-	 * 
-	 * @since 1.2
-	 */
-	List<Ordering> nonNullOrderings() {
-		if (orderings == null) {
-			orderings = new ArrayList<>(3);
-		}
-
-		return orderings;
-	}
-
-	/**
-	 * Sets statement's fetch size (0 for default size)
-	 * 
-	 * @since 3.0
-	 */
-	public void setStatementFetchSize(int size) {
-		metaData.setStatementFetchSize(size);
-	}
-
-	/**
-	 * @return statement's fetch size
-	 * @since 3.0
-	 */
-	public int getStatementFetchSize() {
-		return metaData.getStatementFetchSize();
-	}
-
-	/**
-	 * Sets new query qualifier.
-	 */
-	public void setQualifier(Expression qualifier) {
-		this.qualifier = qualifier;
-	}
-
-	/**
-	 * Returns query qualifier.
-	 */
-	public Expression getQualifier() {
-		return qualifier;
-	}
-
-	/**
-	 * Adds specified qualifier to the existing qualifier joining it using
-	 * "AND".
-	 */
-	public void andQualifier(Expression e) {
-		qualifier = (qualifier != null) ? qualifier.andExp(e) : e;
-	}
-
-	/**
-	 * Adds specified qualifier to the existing qualifier joining it using "OR".
-	 */
-	public void orQualifier(Expression e) {
-		qualifier = (qualifier != null) ? qualifier.orExp(e) : e;
-	}
-
-	/**
-	 * @since 4.0
-	 * @see SelectQuery#setCanReturnScalarValue(boolean)
-	 */
-	public void setColumns(Collection<Property<?>> columns) {
-		this.columns = columns;
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	public void setColumns(Property<?>... columns) {
-		if(columns == null || columns.length == 0) {
-			return;
-		}
-		setColumns(Arrays.asList(columns));
-	}
-
-	/**
-	 * <p>Flag that indicates whether this query can return single  value or
-	 * it should always return some complex data (Object[] for now)</p>
-	 * <p>Default value is <b>true</b></p>
-	 * @param canReturnScalarValue can this query return single value
-	 * @since 4.0
-	 * @see SelectQuery#setColumns
-	 */
-	public void setCanReturnScalarValue(boolean canReturnScalarValue) {
-		this.canReturnScalarValue = canReturnScalarValue;
-	}
-
-	/**
-	 * @return can this query return single value
-	 * @since 4.0
-	 */
-	public boolean canReturnScalarValue() {
-		return canReturnScalarValue;
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	public Collection<Property<?>> getColumns() {
-		return columns;
-	}
-
-	/**
-	 * Sets new query HAVING qualifier.
-	 * @since 4.0
-	 */
-	public void setHavingQualifier(Expression qualifier) {
-		this.havingQualifier = qualifier;
-	}
-
-	/**
-	 * Returns query HAVING qualifier.
-	 * @since 4.0
-	 */
-	public Expression getHavingQualifier() {
-		return havingQualifier;
-	}
-
-	/**
-	 * Adds specified HAVING qualifier to the existing HAVING qualifier joining it using "AND".
-	 * @since 4.0
-	 */
-	public void andHavingQualifier(Expression e) {
-		havingQualifier = (havingQualifier != null) ? havingQualifier.andExp(e) : e;
-	}
-
-	/**
-	 * Adds specified HAVING qualifier to the existing HAVING qualifier joining it using "OR".
-	 * @since 4.0
-	 */
-	public void orHavingQualifier(Expression e) {
-		havingQualifier = (havingQualifier != null) ? havingQualifier.orExp(e) : e;
-	}
-
-	@Override
-	protected BaseQueryMetadata getBaseMetaData() {
-		return metaData;
-	}
-}
diff --git a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java b/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
deleted file mode 100644
index 30b135eec..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryMetadata.java
+++ /dev/null
@@ -1,305 +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.query;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.TraversalHandler;
-import org.apache.cayenne.exp.property.Property;
-import org.apache.cayenne.map.DefaultEntityResultSegment;
-import org.apache.cayenne.map.DefaultScalarResultSegment;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @since 3.0
- * @deprecated since 4.2
- */
-@Deprecated
-class SelectQueryMetadata extends BaseQueryMetadata {
-
-	private static final long serialVersionUID = 7465922769303943945L;
-
-	private static final ScalarResultSegment SCALAR_RESULT_SEGMENT
-			= new DefaultScalarResultSegment(null, -1);
-	private static final EntityResultSegment ENTITY_RESULT_SEGMENT
-			= new DefaultEntityResultSegment(null, null, -1);
-	
-	private Map<String, String> pathSplitAliases;
-	private boolean isSingleResultSetMapping;
-	private boolean suppressingDistinct;
-
-	@Override
-	void copyFromInfo(QueryMetadata info) {
-		super.copyFromInfo(info);
-		this.pathSplitAliases = new HashMap<>(info.getPathSplitAliases());
-	}
-
-	boolean resolve(Object root, EntityResolver resolver, SelectQuery<?> query) {
-
-		if (super.resolve(root, resolver)) {
-			// generate unique cache key, but only if we are caching..
-			if (cacheStrategy != null && cacheStrategy != QueryCacheStrategy.NO_CACHE) {
-				this.cacheKey = makeCacheKey(query, resolver);
-			}
-
-			resolveAutoAliases(query);
-			buildResultSetMappingForColumns(query, resolver);
-			isSingleResultSetMapping = query.canReturnScalarValue() && super.isSingleResultSetMapping();
-
-			return true;
-		}
-
-		return false;
-	}
-
-	private String makeCacheKey(SelectQuery<?> query, EntityResolver resolver) {
-
-		// create a unique key based on entity or columns, qualifier, ordering, fetch offset and limit
-
-		StringBuilder key = new StringBuilder();
-		// handler to create string out of expressions, created lazily
-		TraversalHandler traversalHandler = null;
-
-		ObjEntity entity = getObjEntity();
-		if (entity != null) {
-			key.append(entity.getName());
-		} else if (dbEntity != null) {
-			key.append("db:").append(dbEntity.getName());
-		}
-
-		if(query.getColumns() != null && !query.getColumns().isEmpty()) {
-			traversalHandler = new ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
-			for(Property<?> property : query.getColumns()) {
-				key.append("/c:");
-				property.getExpression().traverse(traversalHandler);
-			}
-		}
-
-		if (query.getQualifier() != null) {
-			key.append('/');
-			if(traversalHandler == null) {
-				traversalHandler = new ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
-			}
-			query.getQualifier().traverse(traversalHandler);
-		}
-
-		if (!query.getOrderings().isEmpty()) {
-			for (Ordering o : query.getOrderings()) {
-				key.append('/').append(o.getSortSpecString());
-				if (!o.isAscending()) {
-					key.append(":d");
-				}
-
-				if (o.isCaseInsensitive()) {
-					key.append(":i");
-				}
-			}
-		}
-
-		if (query.getHavingQualifier() != null) {
-			key.append('/');
-			if(traversalHandler == null) {
-				traversalHandler = new ToCacheKeyTraversalHandler(resolver.getValueObjectTypeRegistry(), key);
-			}
-			query.getHavingQualifier().traverse(traversalHandler);
-		}
-
-		if (query.getFetchOffset() > 0 || query.getFetchLimit() > 0) {
-			key.append('/');
-			if (query.getFetchOffset() > 0) {
-				key.append('o').append(query.getFetchOffset());
-			}
-			if (query.getFetchLimit() > 0) {
-				key.append('l').append(query.getFetchLimit());
-			}
-		}
-
-		// add prefetch to cache key per CAY-2349
-		if(query.getPrefetchTree() != null) {
-			query.getPrefetchTree().traverse(new ToCacheKeyPrefetchProcessor(key));
-		}
-
-		return key.toString();
-	}
-
-	private void resolveAutoAliases(SelectQuery<?> query) {
-		resolveQualifierAliases(query);
-		resolveColumnsAliases(query);
-        resolveOrderingAliases(query);
-		resolveHavingQualifierAliases(query);
-		// TODO: include aliases in prefetches? flattened attributes?
-	}
-
-	private void resolveQualifierAliases(SelectQuery<?> query) {
-		Expression qualifier = query.getQualifier();
-		if (qualifier != null) {
-			resolveAutoAliases(qualifier);
-		}
-	}
-
-	private void resolveColumnsAliases(SelectQuery<?> query) {
-        Collection<Property<?>> columns = query.getColumns();
-        if(columns != null) {
-            for(Property<?> property : columns) {
-                Expression propertyExpression = property.getExpression();
-                if(propertyExpression != null) {
-                    resolveAutoAliases(propertyExpression);
-                }
-            }
-        }
-    }
-
-    private void resolveOrderingAliases(SelectQuery<?> query) {
-        List<Ordering> orderings = query.getOrderings();
-        if(orderings != null) {
-            for(Ordering ordering : orderings) {
-                Expression sortSpec = ordering.getSortSpec();
-                if(sortSpec != null) {
-                    resolveAutoAliases(sortSpec);
-                }
-            }
-        }
-    }
-
-    private void resolveHavingQualifierAliases(SelectQuery<?> query) {
-        Expression havingQualifier = query.getHavingQualifier();
-        if(havingQualifier != null) {
-            resolveAutoAliases(havingQualifier);
-        }
-    }
-
-	private void resolveAutoAliases(Expression expression) {
-		Map<String, String> aliases = expression.getPathAliases();
-		if (!aliases.isEmpty()) {
-			if (pathSplitAliases == null) {
-				pathSplitAliases = new HashMap<>();
-			}
-
-			for(Map.Entry<String, String> entry : aliases.entrySet()) {
-				pathSplitAliases.compute(entry.getKey(), (key, value) -> {
-					if(value != null && !value.equals(entry.getValue())){
-						throw new CayenneRuntimeException("Can't add the same alias to different path segments.");
-					} else {
-						return entry.getValue();
-					}
-				});
-			}
-		}
-
-		int len = expression.getOperandCount();
-		for (int i = 0; i < len; i++) {
-			Object operand = expression.getOperand(i);
-			if (operand instanceof Expression) {
-				resolveAutoAliases((Expression) operand);
-			}
-		}
-	}
-
-	/**
-	 * @since 3.0
-	 */
-	@Override
-	public Map<String, String> getPathSplitAliases() {
-		return pathSplitAliases != null ? pathSplitAliases : Collections.emptyMap();
-	}
-
-	/**
-	 * @since 3.0
-	 */
-	public void addPathSplitAliases(String path, String... aliases) {
-		if (aliases == null) {
-			throw new NullPointerException("Null aliases");
-		}
-
-		if (aliases.length == 0) {
-			throw new IllegalArgumentException("No aliases specified");
-		}
-
-		if (pathSplitAliases == null) {
-			pathSplitAliases = new HashMap<>();
-		}
-
-		for (String alias : aliases) {
-			pathSplitAliases.put(alias, path);
-		}
-	}
-
-	/**
-	 * Build DB result descriptor, that will be used to read and convert raw result of ColumnSelect
-	 * @since 4.0
-	 */
-	private void buildResultSetMappingForColumns(SelectQuery<?> query, EntityResolver resolver) {
-		if(query.getColumns() == null || query.getColumns().isEmpty()) {
-			return;
-		}
-
-		resultSetMapping = new ArrayList<>(query.getColumns().size());
-		for(Property<?> column : query.getColumns()) {
-			// for each column we need only to know if it's entity or scalar
-			Expression exp = column.getExpression();
-			boolean fullObject = false;
-			if(exp.getType() == Expression.OBJ_PATH) {
-				// check if this is toOne relation
-				Object rel = exp.evaluate(getObjEntity());
-				// it this path is toOne relation, than select full object for it
-				fullObject = rel instanceof ObjRelationship && !((ObjRelationship) rel).isToMany();
-			} else if(exp.getType() == Expression.FULL_OBJECT) {
-				fullObject = true;
-			}
-
-			if(fullObject) {
-				resultSetMapping.add(ENTITY_RESULT_SEGMENT);
-			} else {
-				resultSetMapping.add(SCALAR_RESULT_SEGMENT);
-			}
-		}
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	@Override
-	public boolean isSingleResultSetMapping() {
-		return isSingleResultSetMapping;
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	@Override
-	public boolean isSuppressingDistinct() {
-		return suppressingDistinct;
-	}
-
-	/**
-	 * @since 4.0
-	 */
-	public void setSuppressingDistinct(boolean suppressingDistinct) {
-		this.suppressingDistinct = suppressingDistinct;
-	}
-}
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
deleted file mode 100644
index 032a5b19d..000000000
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/SelectQueryPrefetchRouterAction.java
+++ /dev/null
@@ -1,142 +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.query;
-
-import java.util.Iterator;
-
-import org.apache.cayenne.CayenneRuntimeException;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.reflect.ClassDescriptor;
-import org.apache.cayenne.util.CayenneMapEntry;
-
-/**
- * Preprocessor and router of SelectQuery prefetches.
- * 
- * @since 1.2
- * @deprecated since 4.2 as part of deprecation of SelectQuery
- */
-@Deprecated
-class SelectQueryPrefetchRouterAction implements PrefetchProcessor {
-
-    SelectQuery<?> query;
-    QueryRouter router;
-    EntityResolver resolver;
-    ClassDescriptor classDescriptor;
-
-    /**
-     * Routes query prefetches, but not the query itself.
-     */
-    void route(SelectQuery query, QueryRouter router, EntityResolver resolver) {
-        if (!query.isFetchingDataRows() && query.getPrefetchTree() != null) {
-
-            this.query = query;
-            this.router = router;
-            this.resolver = resolver;
-            this.classDescriptor = query.getMetaData(resolver).getClassDescriptor();
-
-            query.getPrefetchTree().traverse(this);
-        }
-    }
-
-    public boolean startPhantomPrefetch(PrefetchTreeNode node) {
-        return true;
-    }
-
-    public boolean startDisjointPrefetch(PrefetchTreeNode node) {
-        // don't do anything to root
-        if (node == query.getPrefetchTree()) {
-            return true;
-        }
-
-        String prefetchPath = node.getPath();
-
-        // find last relationship
-        Iterator<CayenneMapEntry> it = classDescriptor.getEntity().resolvePathComponents(
-                prefetchPath);
-
-        ObjRelationship relationship = null;
-        while (it.hasNext()) {
-            relationship = (ObjRelationship) it.next();
-        }
-
-        if (relationship == null) {
-            throw new CayenneRuntimeException("Invalid prefetch '%s' for entity '%s'"
-                    , prefetchPath, classDescriptor.getEntity().getName());
-        }
-
-        // chain query and entity qualifiers
-        Expression queryQualifier = query.getQualifier();
-
-        Expression entityQualifier = classDescriptor
-                .getEntityInheritanceTree()
-                .qualifierForEntityAndSubclasses();
-
-        if (entityQualifier != null) {
-            queryQualifier = (queryQualifier != null)
-                    ? queryQualifier.andExp(entityQualifier)
-                    : entityQualifier;
-        }
-
-        // create and configure PrefetchSelectQuery
-        PrefetchSelectQuery<?> prefetchQuery = new PrefetchSelectQuery<>(prefetchPath, relationship);
-        prefetchQuery.statementFetchSize(query.getStatementFetchSize());
-
-        prefetchQuery.where(classDescriptor.getEntity()
-                .translateToRelatedEntity(queryQualifier, prefetchPath));
-
-        if (relationship.isSourceIndependentFromTargetChange()) {
-            // setup extra result columns to be able to relate result rows to the parent
-            // result objects.
-            prefetchQuery.addResultPath("db:" + relationship.getReverseDbRelationshipPath());
-        }
-
-        // pass prefetch subtree to enable joint prefetches...
-        prefetchQuery.setPrefetchTree(node);
-
-        // route...
-        prefetchQuery.route(router, resolver, null);
-        return true;
-    }
-
-    public boolean startDisjointByIdPrefetch(PrefetchTreeNode prefetchTreeNode) {
-        // simply pass through
-        return true;
-    }
-
-    public boolean startJointPrefetch(PrefetchTreeNode node) {
-        // simply pass through
-        return true;
-    }
-
-    public boolean startUnknownPrefetch(PrefetchTreeNode node) {
-        // don't do anything to root
-        if (node == query.getPrefetchTree()) {
-            return true;
-        }
-
-        // route unknown as disjoint...
-        return startDisjointPrefetch(node);
-    }
-
-    public void finishPrefetch(PrefetchTreeNode node) {
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSelectQuerySplitAliasesIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSelectQuerySplitAliasesIT.java
deleted file mode 100644
index 51c0d1ad1..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextSelectQuerySplitAliasesIT.java
+++ /dev/null
@@ -1,105 +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;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-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.testmap.Artist;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-/**
- * @deprecated as part of deprecation of SelectQuery
- */
-@Deprecated
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class DataContextSelectQuerySplitAliasesIT extends ServerCase {
-
-    @Inject
-    private DataContext context;
-
-    @Inject
-    private DBHelper dbHelper;
-
-    private TableHelper tArtist;
-    private TableHelper tPainting;
-
-    @Before
-    public void setUp() throws Exception {
-        tArtist = new TableHelper(dbHelper, "ARTIST");
-        tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
-
-        tPainting = new TableHelper(dbHelper, "PAINTING");
-        tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE");
-    }
-
-    private void createTwoArtistsTwoPaintingsDataSet() throws Exception {
-
-        tArtist.insert(1, "AA");
-        tArtist.insert(2, "BB");
-
-        tPainting.insert(1, 1, "X");
-        tPainting.insert(2, 2, "Y");
-    }
-
-    private void createTwoArtistsThreePaintingsDataSet() throws Exception {
-
-        createTwoArtistsTwoPaintingsDataSet();
-        tPainting.insert(3, 2, "X");
-    }
-
-    @Test
-    public void testAliasPathSplits_SinglePath() throws Exception {
-        createTwoArtistsTwoPaintingsDataSet();
-
-        SelectQuery<Artist> query = SelectQuery.query(Artist.class);
-        query.andQualifier(ExpressionFactory.matchExp("p.paintingTitle", "X"));
-
-        query.aliasPathSplits("paintingArray", "p");
-
-        List<Artist> artists = query.select(context);
-        assertEquals(1, artists.size());
-        assertEquals("AA", artists.get(0).getArtistName());
-    }
-
-    @Test
-    public void testAliasPathSplits_SplitJoin() throws Exception {
-        createTwoArtistsThreePaintingsDataSet();
-
-        SelectQuery<Artist> query = SelectQuery.query(Artist.class);
-        query.andQualifier(ExpressionFactory.matchExp("p1.paintingTitle", "X"));
-        query.andQualifier(ExpressionFactory.matchExp("p2.paintingTitle", "Y"));
-
-        query.aliasPathSplits("paintingArray", "p1", "p2");
-
-        List<Artist> artists = query.select(context);
-        assertEquals(1, artists.size());
-        assertEquals("BB", artists.get(0).getArtistName());
-    }
-}
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 09b1227e5..86b720d62 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
@@ -26,7 +26,6 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.query.CapsStrategy;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.SQLTemplate;
-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.enum_test.Enum1;
@@ -66,19 +65,6 @@ public class EnumIT extends ServerCase {
         context.commitChanges();
     }
 
-    @Test
-    @Deprecated
-    public void testSelectQuery() throws Exception {
-        createDataSet();
-
-        SelectQuery<EnumEntity> q = new SelectQuery<>(EnumEntity.class);
-        q.andQualifier(EnumEntity.ENUM_ATTRIBUTE.eq(Enum1.one));
-
-        EnumEntity e = (EnumEntity) Cayenne.objectForQuery(context, q);
-        assertNotNull(e);
-        assertSame(Enum1.one, e.getEnumAttribute());
-    }
-
     @Test
     public void testObjectSelect() throws Exception {
         createDataSet();
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
index d4f54b24f..0c5b3f693 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/translator/select/DefaultSelectTranslatorIT.java
@@ -30,7 +30,6 @@ import org.apache.cayenne.map.DbAttribute;
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.query.ObjectSelect;
 import org.apache.cayenne.query.PrefetchTreeNode;
-import org.apache.cayenne.query.SelectQuery;
 import org.apache.cayenne.test.jdbc.DBHelper;
 import org.apache.cayenne.testdo.testmap.ArtGroup;
 import org.apache.cayenne.testdo.testmap.Artist;
@@ -237,11 +236,10 @@ public class DefaultSelectTranslatorIT extends ServerCase {
 	 * Tests query creation with "distinct" specified.
 	 */
 	@Test
-	@Deprecated
 	public void testCreateSqlString2() throws Exception {
 		// query with "distinct" set
-		SelectQuery<Artist> q = new SelectQuery<>(Artist.class);
-		q.setDistinct(true);
+		ObjectSelect<Artist> q = ObjectSelect.query(Artist.class);
+		q.distinct();
 
 		String generatedSql = new DefaultSelectTranslator(q, dataNode.getAdapter(), dataNode.getEntityResolver()).getSql();
 
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
deleted file mode 100644
index 84e4e88ed..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryCacheKeyIT.java
+++ /dev/null
@@ -1,222 +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.query;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-
-@Deprecated
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class SelectQueryCacheKeyIT extends ServerCase {
-
-    @Inject
-    private EntityResolver resolver;
-
-    @Test
-    public void testNoCache() {
-
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-
-        QueryMetadata md1 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.NO_CACHE, md1.getCacheStrategy());
-        assertNull(md1.getCacheKey());
-
-        QueryMetadata md2 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.NO_CACHE, md2.getCacheStrategy());
-        assertNull(md2.getCacheKey());
-    }
-
-    @Test
-    public void testLocalCache() {
-
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-
-        query.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        QueryMetadata md1 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.LOCAL_CACHE, md1.getCacheStrategy());
-        assertNotNull(md1.getCacheKey());
-    }
-
-    @Test
-    public void testUseLocalCache() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.useLocalCache();
-
-        QueryMetadata md1 = q1.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.LOCAL_CACHE, md1.getCacheStrategy());
-        assertNotNull(md1.getCacheKey());
-        assertNull(md1.getCacheGroup());
-        
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.useLocalCache("g1");
-
-        QueryMetadata md2 = q2.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.LOCAL_CACHE, md2.getCacheStrategy());
-        assertNotNull(md2.getCacheKey());
-        assertEquals("g1", md2.getCacheGroup());
-    }
-
-    @Test
-    public void testSharedCache() {
-
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-
-        query.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-
-        QueryMetadata md1 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.SHARED_CACHE, md1.getCacheStrategy());
-        assertNotNull(md1.getCacheKey());
-    }
-
-    @Test
-    public void testUseSharedCache() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.useSharedCache();
-
-        QueryMetadata md1 = q1.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.SHARED_CACHE, md1.getCacheStrategy());
-        assertNotNull(md1.getCacheKey());
-        assertNull(md1.getCacheGroup());
-        
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.useSharedCache("g1");
-
-        QueryMetadata md2 = q2.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.SHARED_CACHE, md2.getCacheStrategy());
-        assertNotNull(md2.getCacheKey());
-        assertEquals("g1", md2.getCacheGroup());
-    }
-
-    @Test
-    public void testNamedQuery() {
-
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-
-        query.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-
-        QueryMetadata md1 = query.getMetaData(resolver);
-        assertEquals(QueryCacheStrategy.SHARED_CACHE, md1.getCacheStrategy());
-        assertFalse("XYZ".equals(md1.getCacheKey()));
-    }
-
-    @Test
-    public void testUniqueKeyEntity() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        SelectQuery<Painting> q3 = new SelectQuery<>(Painting.class);
-        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        assertNotNull(q1.getMetaData(resolver).getCacheKey());
-        assertEquals(q1.getMetaData(resolver).getCacheKey(), q2.getMetaData(resolver).getCacheKey());
-
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), q3.getMetaData(resolver).getCacheKey());
-    }
-
-    @Test
-    public void testUniqueKeyQualifier() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q1.setQualifier(ExpressionFactory.matchExp("a", "b"));
-
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q2.setQualifier(ExpressionFactory.matchExp("a", "b"));
-
-        SelectQuery<Artist> q3 = new SelectQuery<>(Artist.class);
-        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q3.setQualifier(ExpressionFactory.matchExp("a", "c"));
-
-        assertNotNull(q1.getMetaData(resolver).getCacheKey());
-        assertEquals(q1.getMetaData(resolver).getCacheKey(), q2.getMetaData(resolver).getCacheKey());
-
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), q3.getMetaData(resolver).getCacheKey());
-    }
-
-    @Test
-    public void testUniqueKeyFetchLimit() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q1.setFetchLimit(5);
-
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q2.setFetchLimit(5);
-
-        SelectQuery<Artist> q3 = new SelectQuery<>(Artist.class);
-        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q3.setFetchLimit(6);
-
-        SelectQuery<Artist> q4 = new SelectQuery<>(Artist.class);
-        q4.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        assertNotNull(q1.getMetaData(resolver).getCacheKey());
-        assertEquals(q1.getMetaData(resolver).getCacheKey(), q2.getMetaData(resolver).getCacheKey());
-
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), q3.getMetaData(resolver).getCacheKey());
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), q4.getMetaData(resolver).getCacheKey());
-    }
-
-    @Test
-    public void testUniqueKeyHaving() {
-
-        SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-        q1.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q1.setHavingQualifier(ExpressionFactory.expFalse());
-
-        SelectQuery<Artist> q2 = new SelectQuery<>(Artist.class);
-        q2.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q2.setHavingQualifier(ExpressionFactory.expFalse());
-
-        SelectQuery<Artist> q3 = new SelectQuery<>(Artist.class);
-        q3.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-        q3.setHavingQualifier(ExpressionFactory.expTrue());
-
-        SelectQuery<Artist> q4 = new SelectQuery<>(Artist.class);
-        q4.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
-
-        assertNotNull(q1.getMetaData(resolver).getCacheKey());
-        assertEquals(q1.getMetaData(resolver).getCacheKey(), q2.getMetaData(resolver).getCacheKey());
-
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), q3.getMetaData(resolver).getCacheKey());
-        assertNotEquals(q1.getMetaData(resolver).getCacheKey(), q4.getMetaData(resolver).getCacheKey());
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
deleted file mode 100644
index cf086d929..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryFetchLimitOrderingIT.java
+++ /dev/null
@@ -1,82 +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.query;
-
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.junit.Assert.assertEquals;
-
-@Deprecated
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class SelectQueryFetchLimitOrderingIT extends ServerCase {
-
-    @Inject
-    protected ObjectContext context;
-
-    @Inject
-    protected DBHelper dbHelper;
-
-    protected TableHelper tArtist;
-
-    @Before
-    public void setUp() throws Exception {
-        tArtist = new TableHelper(dbHelper, "ARTIST");
-        tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
-    }
-
-    protected void creatArtistsDataSet() throws Exception {
-        tArtist.insert(33001, "c");
-        tArtist.insert(33002, "b");
-        tArtist.insert(33003, "f");
-        tArtist.insert(33004, "d");
-        tArtist.insert(33005, "a");
-        tArtist.insert(33006, "e");
-    }
-
-    @Test
-    public void testOrdering() throws Exception {
-
-        creatArtistsDataSet();
-
-        SelectQuery query = new SelectQuery("Artist");
-        query.addOrdering(Artist.ARTIST_NAME.asc());
-
-        query.setFetchLimit(4);
-
-        List<?> results = context.performQuery(query);
-        assertEquals(4, results.size());
-
-        assertEquals("a", ((Artist) results.get(0)).getArtistName());
-        assertEquals("b", ((Artist) results.get(1)).getArtistName());
-        assertEquals("c", ((Artist) results.get(2)).getArtistName());
-        assertEquals("d", ((Artist) results.get(3)).getArtistName());
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryIT.java
deleted file mode 100644
index 4d6f4f313..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryIT.java
+++ /dev/null
@@ -1,903 +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.query;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.sql.Types;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.DataRow;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.ResultBatchIterator;
-import org.apache.cayenne.ResultIterator;
-import org.apache.cayenne.ResultIteratorCallback;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.DbEntity;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.map.ObjRelationship;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.ArtistExhibit;
-import org.apache.cayenne.testdo.testmap.Exhibit;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.UnitDbAdapter;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Before;
-import org.junit.Test;
-
-@Deprecated
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-public class SelectQueryIT extends ServerCase {
-
-	@Inject
-	private ObjectContext context;
-
-	@Inject
-	private DBHelper dbHelper;
-
-	@Inject
-	private UnitDbAdapter accessStackAdapter;
-
-	private TableHelper tArtist;
-	private TableHelper tPainting;
-
-	@Before
-	public void before() {
-		this.tArtist = new TableHelper(dbHelper, "ARTIST").setColumns("ARTIST_ID", "ARTIST_NAME", "DATE_OF_BIRTH")
-				.setColumnTypes(Types.BIGINT, Types.CHAR, Types.DATE);
-		tPainting = new TableHelper(dbHelper, "PAINTING").setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE")
-				.setColumnTypes(Types.INTEGER, Types.BIGINT, Types.VARCHAR);
-	}
-
-	protected void createArtistsDataSet() throws Exception {
-
-		long dateBase = System.currentTimeMillis();
-
-		for (int i = 1; i <= 20; i++) {
-			tArtist.insert(i, "artist" + i, new java.sql.Date(dateBase + 10000 * i));
-		}
-	}
-
-	protected void createArtistsWildcardDataSet() throws Exception {
-		tArtist.insert(1, "_X", null);
-		tArtist.insert(2, "Y_", null);
-	}
-
-	@Test
-	public void testSelect_QualfierOnToMany() throws Exception {
-
-		tArtist.insert(1, "A1", new java.sql.Date(System.currentTimeMillis()));
-		tPainting.insert(4, 1, "P1");
-		tPainting.insert(5, 1, "P2");
-		tPainting.insert(6, null, "P3");
-
-		List<Artist> objects = SelectQuery.query(Artist.class,
-				Artist.PAINTING_ARRAY.dot(Painting.PAINTING_TITLE).like("P%")).select(context);
-
-		// make sure no duplicate objects are returned when matching on a
-		// to-many relationship
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testFetchLimit() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.setFetchLimit(7);
-
-		List<?> objects = context.performQuery(query);
-		assertNotNull(objects);
-		assertEquals(7, objects.size());
-	}
-
-	@Test
-	public void testFetchOffset() throws Exception {
-
-		createArtistsDataSet();
-
-		long totalRows = ObjectSelect.query(Artist.class).selectCount(context);
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.addOrdering("db:" + Artist.ARTIST_ID_PK_COLUMN, SortOrder.ASCENDING);
-		query.setFetchOffset(5);
-		List<Artist> results = context.select(query);
-
-		assertEquals(totalRows - 5, results.size());
-		assertEquals("artist6", results.get(0).getArtistName());
-	}
-
-	@Test
-	public void testDbEntityRoot() throws Exception {
-
-		createArtistsDataSet();
-		DbEntity artistDbEntity = context.getEntityResolver().getDbEntity("ARTIST");
-
-		SelectQuery<DataRow> query = new SelectQuery<>(artistDbEntity);
-		List<DataRow> results = context.select(query);
-
-		assertEquals(20, results.size());
-		assertTrue(results.get(0) instanceof DataRow);
-	}
-
-	@Test
-	public void testFetchLimitWithOffset() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.addOrdering("db:" + Artist.ARTIST_ID_PK_COLUMN, SortOrder.ASCENDING);
-		query.setFetchOffset(15);
-		query.setFetchLimit(4);
-		List<Artist> results = context.select(query);
-
-		assertEquals(4, results.size());
-		assertEquals("artist16", results.get(0).getArtistName());
-	}
-
-	@Test
-	public void testFetchOffsetWithQualifier() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.setQualifier(ExpressionFactory.exp("db:ARTIST_ID > 3"));
-		query.setFetchOffset(5);
-
-		List<Artist> objects = query.select(context);
-		int size = objects.size();
-
-		SelectQuery<Artist> sizeQ = new SelectQuery<>(Artist.class);
-		sizeQ.setQualifier(ExpressionFactory.exp("db:ARTIST_ID > 3"));
-		List<Artist> objects1 = sizeQ.select(context);
-		int sizeAll = objects1.size();
-		assertEquals(size, sizeAll - 5);
-	}
-
-	@Test
-	public void testFetchLimitWithQualifier() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.setQualifier(ExpressionFactory.exp("db:ARTIST_ID > 3"));
-		query.setFetchLimit(7);
-		List<Artist> objects = query.select(context);
-		assertEquals(7, objects.size());
-	}
-
-	@Test
-	public void testSelectAllObjectsRootEntityName() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>("Artist");
-		List<?> objects = context.performQuery(query);
-		assertEquals(20, objects.size());
-	}
-
-	@Test
-	public void testSelectAllObjectsRootClass() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		List<?> objects = context.performQuery(query);
-		assertEquals(20, objects.size());
-	}
-
-	@Test
-	public void testSelectAllObjectsRootObjEntity() throws Exception {
-		createArtistsDataSet();
-		ObjEntity artistEntity = context.getEntityResolver().getObjEntity(Artist.class);
-		SelectQuery<Artist> query = new SelectQuery<>(artistEntity);
-
-		List<?> objects = context.performQuery(query);
-		assertEquals(20, objects.size());
-	}
-
-	@Test
-	public void testSelectLikeExactMatch() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.likeExp("artistName", "artist1");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelectNotLikeSingleWildcardMatch() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.notLikeExp("artistName", "artist11%");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(19, objects.size());
-	}
-
-	@Test
-	public void testSelectNotLikeIgnoreCaseSingleWildcardMatch() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.notLikeIgnoreCaseExp("artistName", "aRtIsT11%");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(19, objects.size());
-	}
-
-	/**
-	 * SQL Server failure:
-	 * http://stackoverflow.com/questions/14962419/is-the-like-operator-case-sensitive-with-ms-sql-server
-	 */
-	@Test
-	public void testSelectLikeCaseSensitive() throws Exception {
-		if (!accessStackAdapter.supportsCaseSensitiveLike()) {
-			return;
-		}
-
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.likeExp("artistName", "aRtIsT%");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(0, objects.size());
-	}
-
-	@Test
-	public void testSelectLikeSingle_WildcardMatch() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.likeExp("artistName", "artist11%");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelectLikeSingle_WildcardMatchAndEscape() throws Exception {
-
-		if(!accessStackAdapter.supportsEscapeInLike()) {
-			return;
-		}
-
-		createArtistsWildcardDataSet();
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.andQualifier(ExpressionFactory.likeExp("artistName", "=_%", '='));
-
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelectLike_WildcardMatchAndEscape_AndOtherCriteria() throws Exception {
-
-		if(!accessStackAdapter.supportsEscapeInLike()) {
-			return;
-		}
-
-		createArtistsWildcardDataSet();
-
-		// CAY-1978 - combining LIKE..ESCAPE with another clause generated bad
-		// syntax
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.andQualifier(ExpressionFactory.likeExp("artistName", "=_%", '='));
-		query.andQualifier(Artist.ARTIST_NAME.eq("_X"));
-
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelectLike_WildcardMatchIgnoreCaseAndEscape_AndOtherCriteria() throws Exception {
-
-		if(!accessStackAdapter.supportsEscapeInLike()) {
-			return;
-		}
-
-		createArtistsWildcardDataSet();
-
-		// CAY-1978 - combining LIKE..ESCAPE with another clause generated bad SQL
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.andQualifier(ExpressionFactory.likeIgnoreCaseExp("artistName", "=_%", '='));
-		query.andQualifier(Artist.ARTIST_NAME.eq("_X"));
-
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelectLike_WildcardMatchAndEscapeMulti_AndOtherCriteria() throws Exception {
-
-		if(!accessStackAdapter.supportsEscapeInLike()) {
-			return;
-		}
-
-		tArtist.insert(1, "_X_", null);
-		tArtist.insert(2, "_X", null);
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.andQualifier(ExpressionFactory.likeExp("artistName", "#_%#_", '#'));
-		query.andQualifier(Artist.ARTIST_NAME.eq("_X_"));
-
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelectLikeMultiple_WildcardMatch() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.likeExp("artistName", "artist1%");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(11, objects.size());
-	}
-
-	/**
-	 * Test how "like ignore case" works when using uppercase parameter.
-	 */
-	@Test
-	public void testSelectLikeIgnoreCaseObjects1() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.likeIgnoreCaseExp("artistName", "ARTIST%");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(20, objects.size());
-	}
-
-	/** Test how "like ignore case" works when using lowercase parameter. */
-	@Test
-	public void testSelectLikeIgnoreCaseObjects2() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.likeIgnoreCaseExp("artistName", "artist%");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(20, objects.size());
-	}
-
-	@Test
-	public void testSelectIn() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.exp("artistName in ('artist1', 'artist2')");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(2, objects.size());
-	}
-
-	@Test
-	public void testSelectParameterizedIn() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.exp("artistName in $list");
-		query.setQualifier(qual);
-		query = query.queryWithParameters(Collections.singletonMap("list", new Object[] { "artist1", "artist2" }));
-		List<?> objects = context.performQuery(query);
-		assertEquals(2, objects.size());
-	}
-
-	@Test
-	public void testSelectParameterizedEmptyIn() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.exp("artistName in $list");
-		query.setQualifier(qual);
-		query = query.queryWithParameters(Collections.singletonMap("list", new Object[] {}));
-		List<?> objects = context.performQuery(query);
-		assertEquals(0, objects.size());
-	}
-
-	@Test
-	public void testSelectParameterizedEmptyNotIn() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.exp("artistName not in $list");
-		query.setQualifier(qual);
-		query = query.queryWithParameters(Collections.singletonMap("list", new Object[] {}));
-		List<?> objects = context.performQuery(query);
-		assertEquals(20, objects.size());
-	}
-
-	@Test
-	public void testSelectEmptyIn() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.inExp("artistName");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(0, objects.size());
-	}
-
-	@Test
-	public void testSelectEmptyNotIn() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.notInExp("artistName");
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(20, objects.size());
-	}
-
-	@Test
-	public void testSelectBooleanTrue() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.expTrue();
-		qual = qual.andExp(ExpressionFactory.matchExp("artistName", "artist1"));
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelectBooleanNotTrueOr() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.expTrue();
-		qual = qual.notExp();
-		qual = qual.orExp(ExpressionFactory.matchExp("artistName", "artist1"));
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelectBooleanFalse() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.expFalse();
-		qual = qual.andExp(ExpressionFactory.matchExp("artistName", "artist1"));
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(0, objects.size());
-	}
-
-	@Test
-	public void testSelectBooleanFalseOr() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.expFalse();
-		qual = qual.orExp(ExpressionFactory.matchExp("artistName", "artist1"));
-		query.setQualifier(qual);
-		List<?> objects = context.performQuery(query);
-		assertEquals(1, objects.size());
-	}
-
-	@Test
-	public void testSelect() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		List<?> objects = query.select(context);
-		assertEquals(20, objects.size());
-	}
-
-	@Test
-	public void testSelectOne() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		Expression qual = ExpressionFactory.matchExp("artistName", "artist1");
-		query.setQualifier(qual);
-
-		Artist artist = query.selectOne(context);
-		assertEquals("artist1", artist.getArtistName());
-	}
-
-	@Test
-	public void testSelectFirst() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.addOrdering(new Ordering(Artist.ARTIST_NAME.getName()));
-		Artist artist = query.selectFirst(context);
-
-		assertNotNull(artist);
-		assertEquals("artist1", artist.getArtistName());
-	}
-
-	@Test
-	public void testSelectFirstByContext() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.addOrdering(new Ordering(Artist.ARTIST_NAME.getName()));
-		Artist artist = context.selectFirst(query);
-
-		assertNotNull(artist);
-		assertEquals("artist1", artist.getArtistName());
-	}
-
-	@Test
-	public void testIterate() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-		final int[] count = new int[1];
-		q1.iterate(context, new ResultIteratorCallback<Artist>() {
-
-			@Override
-			public void next(Artist object) {
-				assertNotNull(object.getArtistName());
-				count[0]++;
-			}
-		});
-
-		assertEquals(20, count[0]);
-	}
-
-	@Test
-	public void testIterator() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-
-		try (ResultIterator<Artist> it = q1.iterator(context);) {
-			int count = 0;
-
-			for (@SuppressWarnings("unused")
-			Artist a : it) {
-				count++;
-			}
-
-			assertEquals(20, count);
-		}
-	}
-
-	@Test
-	public void testBatchIterator() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> q1 = new SelectQuery<>(Artist.class);
-
-		try (ResultBatchIterator<Artist> it = q1.batchIterator(context, 5);) {
-			int count = 0;
-
-			for (List<Artist> artistList : it) {
-				count++;
-				assertEquals(5, artistList.size());
-			}
-
-			assertEquals(4, count);
-		}
-	}
-
-	/**
-	 * Tests that all queries specified in prefetch are executed in a more
-	 * complex prefetch scenario.
-	 */
-	@Test
-	public void testRouteWithPrefetches() {
-		EntityResolver resolver = context.getEntityResolver();
-		MockQueryRouter router = new MockQueryRouter();
-
-		SelectQuery<Artist> q = new SelectQuery<>(Artist.class, ExpressionFactory.matchExp("artistName", "a"));
-
-		q.route(router, resolver, null);
-		assertEquals(1, router.getQueryCount());
-
-		q.addPrefetch("paintingArray");
-		router.reset();
-		q.route(router, resolver, null);
-		assertEquals(2, router.getQueryCount());
-
-		q.addPrefetch("paintingArray.toGallery");
-		router.reset();
-		q.route(router, resolver, null);
-		assertEquals(3, router.getQueryCount());
-
-		q.addPrefetch("artistExhibitArray.toExhibit");
-		router.reset();
-		q.route(router, resolver, null);
-		assertEquals(4, router.getQueryCount());
-
-		q.removePrefetch("paintingArray");
-		router.reset();
-		q.route(router, resolver, null);
-		assertEquals(3, router.getQueryCount());
-	}
-
-	/**
-	 * Tests that all queries specified in prefetch are executed in a more
-	 * complex prefetch scenario with no reverse obj relationships.
-	 */
-	@Test
-	public void testRouteQueryWithPrefetchesNoReverse() {
-
-		EntityResolver resolver = context.getEntityResolver();
-		ObjEntity paintingEntity = resolver.getObjEntity(Painting.class);
-		ObjEntity galleryEntity = resolver.getObjEntity(Gallery.class);
-		ObjEntity artistExhibitEntity = resolver.getObjEntity(ArtistExhibit.class);
-		ObjEntity exhibitEntity = resolver.getObjEntity(Exhibit.class);
-		ObjRelationship paintingToArtistRel = paintingEntity.getRelationship("toArtist");
-		paintingEntity.removeRelationship("toArtist");
-
-		ObjRelationship galleryToPaintingRel = galleryEntity.getRelationship("paintingArray");
-		galleryEntity.removeRelationship("paintingArray");
-
-		ObjRelationship artistExhibitToArtistRel = artistExhibitEntity.getRelationship("toArtist");
-		artistExhibitEntity.removeRelationship("toArtist");
-
-		ObjRelationship exhibitToArtistExhibitRel = exhibitEntity.getRelationship("artistExhibitArray");
-		exhibitEntity.removeRelationship("artistExhibitArray");
-
-		Expression e = ExpressionFactory.matchExp("artistName", "artist1");
-		SelectQuery<Artist> q = new SelectQuery<>(Artist.class, e);
-		q.addPrefetch("paintingArray");
-		q.addPrefetch("paintingArray.toGallery");
-		q.addPrefetch("artistExhibitArray.toExhibit");
-
-		try {
-			MockQueryRouter router = new MockQueryRouter();
-			q.route(router, resolver, null);
-			assertEquals(4, router.getQueryCount());
-		} finally {
-			paintingEntity.addRelationship(paintingToArtistRel);
-			galleryEntity.addRelationship(galleryToPaintingRel);
-			artistExhibitEntity.addRelationship(artistExhibitToArtistRel);
-			exhibitEntity.addRelationship(exhibitToArtistExhibitRel);
-		}
-	}
-
-	/**
-	 * Test prefetching with qualifier on the root query being the path to the
-	 * prefetch.
-	 */
-	@Test
-	public void testRouteQueryWithPrefetchesPrefetchExpressionPath() {
-
-		// find the painting not matching the artist (this is the case where
-		// such prefetch
-		// at least makes sense)
-		Expression exp = ExpressionFactory.noMatchExp("toArtist", new Object());
-
-		SelectQuery<Painting> q = new SelectQuery<>(Painting.class, exp);
-		q.addPrefetch("toArtist");
-
-		// test how prefetches are resolved in this case - this was a stumbling
-		// block for
-		// a while
-		EntityResolver resolver = context.getEntityResolver();
-		MockQueryRouter router = new MockQueryRouter();
-		q.route(router, resolver, null);
-		assertEquals(2, router.getQueryCount());
-	}
-
-	@Test
-	public void testLeftJoinAndPrefetchToMany() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class, ExpressionFactory.matchExp(
-				"paintingArray+.toGallery", null));
-		query.addPrefetch("artistExhibitArray");
-		context.select(query);
-
-		// TODO: assertions?
-	}
-
-	@Test
-	public void testLeftJoinAndPrefetchToOne() throws Exception {
-		createArtistsDataSet();
-		SelectQuery<Painting> query = new SelectQuery<>(Painting.class, ExpressionFactory.matchExp(
-				"toArtist+.artistName", null));
-		query.addPrefetch("toGallery");
-		context.select(query);
-
-		// TODO: assertions?
-	}
-
-	@Test
-	public void testMatchObject() {
-
-		Artist a1 = context.newObject(Artist.class);
-		a1.setArtistName("a1");
-		Artist a2 = context.newObject(Artist.class);
-		a2.setArtistName("a2");
-		Artist a3 = context.newObject(Artist.class);
-		a3.setArtistName("a3");
-		context.commitChanges();
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.setQualifier(ExpressionFactory.matchExp(a2));
-		Artist result = query.selectOne(context);
-
-		assertSame(a2, result);
-	}
-
-	@Test
-	public void testMatchObjects() {
-
-		Artist a1 = context.newObject(Artist.class);
-		a1.setArtistName("a1");
-		Artist a2 = context.newObject(Artist.class);
-		a2.setArtistName("a2");
-		Artist a3 = context.newObject(Artist.class);
-		a3.setArtistName("a3");
-		context.commitChanges();
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-		query.setQualifier(ExpressionFactory.matchAnyExp(a1, a3));
-		query.addOrdering(Artist.ARTIST_NAME.asc());
-		List<Artist> list = query.select(context);
-
-		assertEquals(list.size(), 2);
-		assertSame(a1, list.get(0));
-		assertSame(a3, list.get(1));
-	}
-
-	@Test
-	public void testMatchByRelatedObject() {
-
-		Artist a1 = context.newObject(Artist.class);
-		a1.setArtistName("a1");
-		Artist a2 = context.newObject(Artist.class);
-		a2.setArtistName("a2");
-		Painting p1 = context.newObject(Painting.class);
-		p1.setPaintingTitle("p1");
-		p1.setToArtist(a1);
-		Painting p2 = context.newObject(Painting.class);
-		p2.setPaintingTitle("p2");
-		p2.setToArtist(a2);
-		context.commitChanges();
-
-		SelectQuery<Painting> query = new SelectQuery<>(Painting.class);
-		query.setQualifier(ExpressionFactory.matchExp("toArtist", a1));
-		assertSame(p1, query.selectOne(context));
-	}
-
-	@Test
-	public void testMatchByRelatedObjectId() {
-
-		Artist a1 = context.newObject(Artist.class);
-		a1.setArtistName("a1");
-		Artist a2 = context.newObject(Artist.class);
-		a2.setArtistName("a2");
-		Painting p1 = context.newObject(Painting.class);
-		p1.setPaintingTitle("p1");
-		p1.setToArtist(a1);
-		Painting p2 = context.newObject(Painting.class);
-		p2.setPaintingTitle("p2");
-		p2.setToArtist(a2);
-		context.commitChanges();
-
-		SelectQuery<Painting> query = new SelectQuery<>(Painting.class);
-		query.setQualifier(ExpressionFactory.matchExp("toArtist", a1.getObjectId()));
-		assertSame(p1, query.selectOne(context));
-	}
-
-	@Test
-	public void testMatchByRelatedObjectIdValue() {
-
-		Artist a1 = context.newObject(Artist.class);
-		a1.setArtistName("a1");
-		Artist a2 = context.newObject(Artist.class);
-		a2.setArtistName("a2");
-		Painting p1 = context.newObject(Painting.class);
-		p1.setPaintingTitle("p1");
-		p1.setToArtist(a1);
-		Painting p2 = context.newObject(Painting.class);
-		p2.setPaintingTitle("p2");
-		p2.setToArtist(a2);
-		context.commitChanges();
-
-		SelectQuery<Painting> query = new SelectQuery<>(Painting.class);
-		query.setQualifier(ExpressionFactory.matchExp("toArtist", Cayenne.longPKForObject(a1)));
-		assertSame(p1, query.selectOne(context));
-	}
-
-	@Test
-	public void testSelect_WithOrdering() {
-
-		Artist a1 = context.newObject(Artist.class);
-		a1.setArtistName("a1");
-		Artist a2 = context.newObject(Artist.class);
-		a2.setArtistName("a2");
-		Artist a3 = context.newObject(Artist.class);
-		a3.setArtistName("a3");
-		context.commitChanges();
-
-		List<Ordering> orderings = Arrays.asList(new Ordering("artistName", SortOrder.ASCENDING));
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class, null, orderings);
-
-		List<Artist> list = context.select(query);
-		assertEquals(list.size(), 3);
-		assertSame(list.get(0), a1);
-		assertSame(list.get(1), a2);
-		assertSame(list.get(2), a3);
-	}
-
-	/**
-	 * Tests INs with more than 1000 elements
-	 */
-	@Test
-	public void testSelectLongIn() throws Exception {
-		createArtistsDataSet();
-
-		// not all adapters strip INs, so we just make sure query with such qualifier fires OK
-		Object[] names = new String[2009];
-		for (int i = 0; i < names.length; i++) {
-			names[i] = "artist" + (i + 2);
-		}
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class,
-				ExpressionFactory.inExp("artistName", names));
-		List<Artist> artists = query.select(context);
-		assertEquals(19, artists.size());
-	}
-
-	/**
-	 * Tests NOT INs with more than 1000 elements
-	 */
-	@Test
-	public void testSelectLongNotIn() throws Exception {
-		// Derby tries to compile SQL into Java bytecode and
-		// fails with max code length limit ...
-		if(!accessStackAdapter.supportsLongIn()) {
-			return;
-		}
-
-		createArtistsDataSet();
-
-		// not all adapters strip INs, so we just make sure query with such qualifier fires OK
-		Object[] names = new String[1001];
-		for (int i = 0; i < names.length; i++) {
-			names[i] = "artist" + (i + 2);
-		}
-
-		SelectQuery<Artist> query = new SelectQuery<>(Artist.class,
-				ExpressionFactory.notInExp("artistName", names));
-		List<Artist> artists = query.select(context);
-		assertEquals(1, artists.size());
-	}
-
-	@Test
-	public void testCacheOffsetAndLimit() throws Exception {
-		createArtistsDataSet();
-
-		SelectQuery<Artist> query1 = new SelectQuery<>(Artist.class);
-		query1.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-		query1.setFetchOffset(0);
-		query1.setFetchLimit(10);
-		context.performQuery(query1);
-
-		SelectQuery<Artist> query2 = new SelectQuery<>(Artist.class);
-		query2.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-		query2.setFetchOffset(10);
-		query2.setFetchLimit(10);
-		context.performQuery(query2);
-
-		SelectQuery<Artist> query3 = new SelectQuery<>(Artist.class);
-		query3.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
-		query3.setFetchOffset(10);
-		query3.setFetchLimit(10);
-		context.performQuery(query3);
-
-		assertFalse(query1.metaData.getCacheKey().equals(query2.metaData.cacheKey));
-		assertEquals(query2.metaData.getCacheKey(), query3.metaData.getCacheKey());
-	}
-}
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
deleted file mode 100644
index addd8ff06..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionIT.java
+++ /dev/null
@@ -1,98 +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.query;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.CayenneProjects;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-
-@UseServerRuntime(CayenneProjects.TESTMAP_PROJECT)
-@Deprecated
-public class SelectQueryPrefetchRouterActionIT extends ServerCase {
-
-    @Inject
-    private EntityResolver resolver;
-
-    @Test
-    public void testPaintings1() {
-        ObjEntity paintingEntity = resolver.getObjEntity(Painting.class);
-        SelectQuery q = new SelectQuery(Artist.class, ExpressionFactory.matchExp("artistName", "abc"));
-        q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
-
-        SelectQueryPrefetchRouterAction action = new SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) router.getQueries().get(0);
-
-        assertEquals(paintingEntity.getName(), prefetch.entityName);
-        assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc'"), prefetch.getWhere());
-    }
-
-    @Test
-    public void testPrefetchPaintings2() {
-        ObjEntity paintingEntity = resolver.getObjEntity(Painting.class);
-
-        SelectQuery<Artist> q = new SelectQuery<>(Artist.class, ExpressionFactory.exp("artistName = 'abc' or artistName = 'xyz'"));
-        q.addPrefetch(Artist.PAINTING_ARRAY.disjoint());
-
-        SelectQueryPrefetchRouterAction action = new SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) router.getQueries().get(0);
-        assertEquals(paintingEntity.getName(), prefetch.entityName);
-        assertEquals(ExpressionFactory.exp("db:toArtist.ARTIST_NAME = 'abc' or db:toArtist.ARTIST_NAME = 'xyz'"),
-                prefetch.getWhere());
-    }
-
-    @Test
-    public void testGalleries() {
-        ObjEntity galleryEntity = resolver.getObjEntity(Gallery.class);
-        SelectQuery q = new SelectQuery(Artist.class, ExpressionFactory.matchExp("artistName", "abc"));
-        q.addPrefetch("paintingArray.toGallery");
-
-        SelectQueryPrefetchRouterAction action = new SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) router.getQueries().get(0);
-
-        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
deleted file mode 100644
index 88fb72646..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryPrefetchRouterActionQualifiedEntityIT.java
+++ /dev/null
@@ -1,79 +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.query;
-
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.map.EntityResolver;
-import org.apache.cayenne.map.ObjEntity;
-import org.apache.cayenne.testdo.inheritance_people.Department;
-import org.apache.cayenne.testdo.inheritance_people.Employee;
-import org.apache.cayenne.testdo.inheritance_people.Manager;
-import org.apache.cayenne.unit.di.server.PeopleProjectCase;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertSame;
-
-@Deprecated
-public class SelectQueryPrefetchRouterActionQualifiedEntityIT extends PeopleProjectCase {
-
-    @Inject
-    private EntityResolver resolver;
-
-    @Test
-    public void testPrefetchEmployee() throws Exception {
-        ObjEntity departmentEntity = resolver.getObjEntity(Department.class);
-        SelectQuery q = new SelectQuery(Employee.class, ExpressionFactory.matchExp("name", "abc"));
-
-        q.addPrefetch(Employee.TO_DEPARTMENT.disjoint());
-
-        SelectQueryPrefetchRouterAction action = new SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) router.getQueries().get(0);
-
-        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.getWhere());
-    }
-
-    @Test
-    public void testPrefetchManager() throws Exception {
-        ObjEntity departmentEntity = resolver.getObjEntity(Department.class);
-        SelectQuery q = new SelectQuery(Manager.class, ExpressionFactory.matchExp("name", "abc"));
-
-        q.addPrefetch(Employee.TO_DEPARTMENT.disjoint());
-
-        SelectQueryPrefetchRouterAction action = new SelectQueryPrefetchRouterAction();
-
-        MockQueryRouter router = new MockQueryRouter();
-        action.route(q, router, resolver);
-        assertEquals(1, router.getQueryCount());
-
-        PrefetchSelectQuery prefetch = (PrefetchSelectQuery) router.getQueries().get(0);
-        assertEquals(departmentEntity.getName(), prefetch.getEntityName());
-        assertEquals(ExpressionFactory.exp("db:employees.NAME = 'abc' and db:employees.PERSON_TYPE = 'EM'"),
-                prefetch.getWhere());
-    }
-}
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryTest.java b/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
deleted file mode 100644
index 8d04906a3..000000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/query/SelectQueryTest.java
+++ /dev/null
@@ -1,180 +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.query;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.exp.ExpressionParameter;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.junit.Before;
-import org.junit.Test;
-
-@Deprecated
-public class SelectQueryTest {
-
-	private SelectQuery<?> query;
-
-	@Before
-	public void before() {
-		this.query = new SelectQuery<Object>();
-	}
-
-	@Test
-	public void testAddPrefetch() {
-
-		assertNull(query.getPrefetchTree());
-		query.addPrefetch("a.b.c");
-		assertNotNull(query.getPrefetchTree());
-		assertEquals(1, query.getPrefetchTree().nonPhantomNodes().size());
-		assertNotNull(query.getPrefetchTree().getNode("a.b.c"));
-	}
-
-	@Test
-	public void testAddPrefetchDuplicates() {
-
-		query.addPrefetch("a.b.c");
-		query.addPrefetch("a.b.c");
-
-		assertEquals(1, query.getPrefetchTree().nonPhantomNodes().size());
-	}
-
-	@Test
-	public void testClearPrefetches() {
-
-		query.addPrefetch("abc");
-		query.addPrefetch("xyz");
-		assertNotNull(query.getPrefetchTree());
-
-		query.clearPrefetches();
-		assertNull(query.getPrefetchTree());
-	}
-
-	@Test
-	public void testPageSize() throws Exception {
-		query.setPageSize(10);
-		assertEquals(10, query.getPageSize());
-	}
-
-	@Test
-	public void testAddOrdering1() throws Exception {
-		Ordering ord = new Ordering();
-		query.addOrdering(ord);
-		assertEquals(1, query.getOrderings().size());
-		assertSame(ord, query.getOrderings().get(0));
-	}
-
-	@Test
-	public void testAddOrdering2() throws Exception {
-		String path = "a.b.c";
-		query.addOrdering(path, SortOrder.DESCENDING);
-		assertEquals(1, query.getOrderings().size());
-
-		Ordering ord = query.getOrderings().get(0);
-		assertEquals(path, ord.getSortSpec().getOperand(0));
-		assertEquals(false, ord.isAscending());
-	}
-
-	@Test
-	public void testDistinct() throws Exception {
-		assertFalse(query.isDistinct());
-		query.setDistinct(true);
-		assertTrue(query.isDistinct());
-	}
-
-	@Test
-	public void testQueryWithParams1() {
-		query.setRoot(Artist.class);
-		query.setDistinct(true);
-
-		SelectQuery<?> q1 = query.queryWithParameters(new HashMap<String, Object>(), true);
-		assertSame(query.getRoot(), q1.getRoot());
-		assertEquals(query.isDistinct(), q1.isDistinct());
-		assertNull(q1.getQualifier());
-	}
-
-	@Test
-	public void testQueryWithParams2() throws Exception {
-		query.setRoot(Artist.class);
-
-		List<Expression> list = new ArrayList<Expression>();
-		list.add(ExpressionFactory.matchExp("k1", new ExpressionParameter("test1")));
-		list.add(ExpressionFactory.matchExp("k2", new ExpressionParameter("test2")));
-		list.add(ExpressionFactory.matchExp("k3", new ExpressionParameter("test3")));
-		list.add(ExpressionFactory.matchExp("k4", new ExpressionParameter("test4")));
-		query.setQualifier(ExpressionFactory.joinExp(Expression.OR, list));
-
-		Map<String, Object> params = new HashMap<String, Object>();
-		params.put("test2", "abc");
-		params.put("test3", "xyz");
-		SelectQuery<?> q1 = query.queryWithParameters(params, true);
-		assertSame(query.getRoot(), q1.getRoot());
-		assertNotNull(q1.getQualifier());
-		assertTrue(q1.getQualifier() != query.getQualifier());
-	}
-	
-	@Test
-	public void testAndQualifier() {
-		assertNull(query.getQualifier());
-
-		Expression e1 = ExpressionFactory.expressionOfType(Expression.EQUAL_TO);
-		query.andQualifier(e1);
-		assertSame(e1, query.getQualifier());
-
-		Expression e2 = ExpressionFactory.expressionOfType(Expression.NOT_EQUAL_TO);
-		query.andQualifier(e2);
-		assertEquals(Expression.AND, query.getQualifier().getType());
-	}
-
-	@Test
-	public void testOrQualifier() {
-		assertNull(query.getQualifier());
-
-		Expression e1 = ExpressionFactory.expressionOfType(Expression.EQUAL_TO);
-		query.orQualifier(e1);
-		assertSame(e1, query.getQualifier());
-
-		Expression e2 = ExpressionFactory.expressionOfType(Expression.NOT_EQUAL_TO);
-		query.orQualifier(e2);
-		assertEquals(Expression.OR, query.getQualifier().getType());
-	}
-	
-	@Test
-	public void testSetQualifier() {
-		assertNull(query.getQualifier());
-
-		Expression qual = ExpressionFactory.expressionOfType(Expression.AND);
-		query.setQualifier(qual);
-		assertNotNull(query.getQualifier());
-		assertSame(qual, query.getQualifier());
-	}
-}
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 e51448a51..ee9207a93 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
@@ -35,18 +35,6 @@ public class StatementFetchSizeIT extends ServerCase {
     @Inject
     private ObjectContext context;
 
-    @Deprecated
-    @Test
-    public void testSelectQuery() {
-        SelectQuery<Artist> query = new SelectQuery<>(Artist.class);
-        query.setStatementFetchSize(10);
-
-        assertEquals(10, query
-                .getMetaData(context.getEntityResolver())
-                .getStatementFetchSize());
-        context.performQuery(query);
-    }
-
     @Test
     public void testObjectSelect() {
         ObjectSelect<Artist> query = ObjectSelect.query(Artist.class).statementFetchSize(10);
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_115IT.java b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_115IT.java
index 6acdf4d2a..82e8b9d09 100644
--- a/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_115IT.java
+++ b/cayenne-server/src/test/java/org/apache/cayenne/unit/jira/CAY_115IT.java
@@ -24,7 +24,6 @@ import org.apache.cayenne.di.Inject;
 import org.apache.cayenne.exp.Expression;
 import org.apache.cayenne.exp.ExpressionFactory;
 import org.apache.cayenne.query.ObjectSelect;
-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.relationships_clob.ClobMaster;
@@ -82,7 +81,6 @@ public class CAY_115IT extends ServerCase {
     }
 
     @Test
-    @Deprecated
     public void testDistinctClobFetch() throws Exception {
         if (!accessStackAdapter.supportsLobInsertsAsStrings()) {
             return;
@@ -90,12 +88,12 @@ public class CAY_115IT extends ServerCase {
 
         createDistinctClobFetchDataSet();
 
-        SelectQuery<ClobMaster> noDistinct = SelectQuery.query(ClobMaster.class);
-        noDistinct.addOrdering(ClobMaster.NAME.asc());
+        ObjectSelect<ClobMaster> noDistinct = ObjectSelect.query(ClobMaster.class);
+        noDistinct.orderBy(ClobMaster.NAME.asc());
 
-        SelectQuery<ClobMaster> distinct = SelectQuery.query(ClobMaster.class);
-        distinct.setDistinct(true);
-        distinct.addOrdering(ClobMaster.NAME.asc());
+        ObjectSelect<ClobMaster> distinct = ObjectSelect.query(ClobMaster.class);
+        distinct.distinct();
+        distinct.orderBy(ClobMaster.NAME.asc());
 
         List<?> noDistinctResult = context.performQuery(noDistinct);
         List<?> distinctResult = context.performQuery(distinct);
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/custom.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/custom.adoc
index 01cb75b12..192a10d49 100644
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/custom.adoc
+++ b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/custom.adoc
@@ -57,5 +57,5 @@ public class MyDelegatingQuery extends IndirectQuery {
 }
 ----
 
-In fact many internal Cayenne queries are `IndirectQueries`, delegating to `SelectQuery` or `SQLTemplate`
+In fact many internal Cayenne queries are `IndirectQueries`, delegating to `ObjectSelect` or `SQLTemplate`
 after some preprocessing.
\ No newline at end of file
diff --git a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/objectselect.adoc b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/objectselect.adoc
index d60aff319..02eb53268 100644
--- a/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/objectselect.adoc
+++ b/docs/asciidoc/cayenne-guide/src/docs/asciidoc/_cayenne-guide/part2/queries/objectselect.adoc
@@ -14,7 +14,7 @@
 [[select]]
 ==== ObjectSelect
 
-NOTE: `ObjectSelect` supersedes older `SelectQuery`. `SelectQuery` is deprecated since 4.2.
+NOTE: `ObjectSelect` supersedes older `SelectQuery`. `SelectQuery` is deprecated since 4.2 and removed in 4.3.
 
 ===== Selecting objects