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