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 <[email protected]> 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
