This is an automated email from the ASF dual-hosted git repository. asf-gitbox-commits pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/cayenne.git
commit bc1b18ebe6f083de681cd360e478b897864df6df Author: Andrus Adamchik <[email protected]> AuthorDate: Sat May 30 18:56:31 2026 -0400 CAY-2955 Get rid of QueryEngine abstraction --- RELEASE-NOTES.txt | 1 + UPGRADE.md | 4 + .../java/org/apache/cayenne/access/DataDomain.java | 10 +- .../access/DataDomainLegacyQueryAction.java | 29 +++--- .../cayenne/access/DataDomainQueryAction.java | 22 ++--- .../java/org/apache/cayenne/access/DataNode.java | 4 +- .../org/apache/cayenne/access/ObjectStore.java | 2 +- .../org/apache/cayenne/access/OperationHints.java | 2 +- .../apache/cayenne/access/OperationObserver.java | 2 +- .../org/apache/cayenne/access/QueryEngine.java | 45 --------- .../org/apache/cayenne/query/AbstractQuery.java | 2 +- .../java/org/apache/cayenne/query/BatchQuery.java | 2 +- .../java/org/apache/cayenne/query/EJBQLQuery.java | 2 +- .../main/java/org/apache/cayenne/query/Query.java | 6 +- .../org/apache/cayenne/query/QueryMetadata.java | 2 +- .../java/org/apache/cayenne/query/QueryRouter.java | 54 +++++++---- .../java/org/apache/cayenne/query/SQLTemplate.java | 8 +- .../org/apache/cayenne/access/MockQueryEngine.java | 108 --------------------- .../org/apache/cayenne/query/MockQueryRouter.java | 15 ++- 19 files changed, 90 insertions(+), 230 deletions(-) diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt index c0714ef48..5462d7e07 100644 --- a/RELEASE-NOTES.txt +++ b/RELEASE-NOTES.txt @@ -47,6 +47,7 @@ CAY-2946 Claude Code "plugin" for agentic coding with Cayenne CAY-2947 Merge "cayenne-commitlog" into the core CAY-2948 Modeler: use native FileDialog on Mac CAY-2953 Upgrade Gradle to 9.4.0 +CAY-2955 Get rid of QueryEngine abstraction Bug Fixes: diff --git a/UPGRADE.md b/UPGRADE.md index 9494f770c..7554218f5 100644 --- a/UPGRADE.md +++ b/UPGRADE.md @@ -105,6 +105,10 @@ Expression caseWhenExp = caseWhen( open CayenneModeler.app --args path/to/cayenne-project.xml ``` +* Per [CAY-2955](https://issues.apache.org/jira/browse/CAY-2955) the obsolete `QueryEngine` abstraction (`org.apache.cayenne.access.QueryEngine`) has been removed. + `DataNode` is now used directly wherever `QueryEngine` was previously referenced. So you must subclass `DataNode` + and override `performQueries()` if you previously implemented a custom `QueryEngine`. + ## Upgrading to 5.0.M1 * Per [CAY-2737](https://issues.apache.org/jira/browse/CAY-2737) All code deprecated in Cayenne 4.1 and 4.2 was deleted — please review your code before diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java b/cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java index 440d626c9..4fe3fc292 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java @@ -62,7 +62,7 @@ import java.util.concurrent.CopyOnWriteArrayList; * user. When a child DataContext sends a query to the DataDomain, it is * transparently routed to an appropriate DataNode. */ -public class DataDomain implements QueryEngine, DataChannel { +public class DataDomain implements DataChannel { public static final String SHARED_CACHE_ENABLED_PROPERTY = "cayenne.DataDomain.sharedCache"; public static final boolean SHARED_CACHE_ENABLED_DEFAULT = true; @@ -529,9 +529,11 @@ public class DataDomain implements QueryEngine, DataChannel { } /** - * Routes queries to appropriate DataNodes for execution. + * Routes queries to appropriate DataNodes for execution + * + * @deprecated use {@link #onQuery(ObjectContext, Query)} instead. */ - @Override + @Deprecated(since = "5.0", forRemoval = true) public void performQueries(Collection<? extends Query> queries, OperationObserver callback) { transactionManager.performInTransaction(() -> { new DataDomainLegacyQueryAction(DataDomain.this, new QueryChain(queries), callback).execute(); @@ -539,8 +541,6 @@ public class DataDomain implements QueryEngine, DataChannel { }); } - // ****** DataChannel methods: - /** * Runs query returning generic QueryResponse. * diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java index acefda9e7..f8cd0d290 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java @@ -33,12 +33,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -/** - * DataDomain query action that relies on externally provided OperationObserver to process - * the results. - * - * @since 1.2 - */ +@Deprecated class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver { DataDomain domain; @@ -46,7 +41,7 @@ class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver { Query query; QueryMetadata metadata; - Map<QueryEngine, List<Query>> queriesByNode; + Map<DataNode, List<Query>> queriesByNode; Map<Query, Query> queriesByExecutedQueries; DataDomainLegacyQueryAction(DataDomain domain, Query query, OperationObserver callback) { @@ -70,9 +65,9 @@ class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver { // run categorized queries if (queriesByNode != null) { - for (final Map.Entry<QueryEngine, List<Query>> entry : queriesByNode + for (final Map.Entry<DataNode, List<Query>> entry : queriesByNode .entrySet()) { - QueryEngine nextNode = entry.getKey(); + DataNode nextNode = entry.getKey(); Collection<Query> nodeQueries = entry.getValue(); nextNode.performQueries(nodeQueries, this); } @@ -80,19 +75,19 @@ class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver { } @Override - public void route(QueryEngine engine, Query query, Query substitutedQuery) { + public void route(DataNode node, Query query, Query substitutedQuery) { List<Query> queries = null; if (queriesByNode == null) { queriesByNode = new HashMap<>(); } else { - queries = queriesByNode.get(engine); + queries = queriesByNode.get(node); } if (queries == null) { queries = new ArrayList<>(5); - queriesByNode.put(engine, queries); + queriesByNode.put(node, queries); } queries.add(query); @@ -110,12 +105,12 @@ class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver { } @Override - public QueryEngine engineForDataMap(DataMap map) { + public DataNode nodeForDataMap(DataMap map) { if (map == null) { throw new NullPointerException("Null DataMap, can't determine DataNode."); } - QueryEngine node = domain.lookupDataNode(map); + DataNode node = domain.lookupDataNode(map); if (node == null) { throw new CayenneRuntimeException("No DataNode exists for DataMap %s", map); @@ -125,12 +120,12 @@ class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver { } /** - * @since 4.0 + * @since 5.0 */ @Override - public QueryEngine engineForName(String name) { + public DataNode nodeForName(String name) { - QueryEngine node; + DataNode node; if (name != null) { node = domain.getDataNode(name); diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java index 0978c1a73..6858c3f63 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java @@ -96,7 +96,7 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver { private QueryResponse response; private GenericResponse fullResponse; private Map<CayennePath, List<?>> prefetchResultsByPath; - private Map<QueryEngine, Collection<Query>> queriesByNode; + private Map<DataNode, Collection<Query>> queriesByNode; private boolean noObjectConversion; // True when using a caching strategy (shared or local cache), indicating lists are immutable and need copying private boolean cachedResult; @@ -518,8 +518,8 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver { // run categorized queries if (queriesByNode != null) { - for (Map.Entry<QueryEngine, Collection<Query>> entry : queriesByNode.entrySet()) { - QueryEngine nextNode = entry.getKey(); + for (Map.Entry<DataNode, Collection<Query>> entry : queriesByNode.entrySet()) { + DataNode nextNode = entry.getKey(); Collection<Query> nodeQueries = entry.getValue(); nextNode.performQueries(nodeQueries, this); } @@ -600,29 +600,29 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver { } @Override - public void route(QueryEngine engine, Query query, Query substitutedQuery) { + public void route(DataNode node, Query query, Query substitutedQuery) { Collection<Query> queries = null; if (queriesByNode == null) { queriesByNode = new HashMap<>(); } else { - queries = queriesByNode.get(engine); + queries = queriesByNode.get(node); } if (queries == null) { queries = new ArrayList<>(5); - queriesByNode.put(engine, queries); + queriesByNode.put(node, queries); } queries.add(query); } @Override - public QueryEngine engineForDataMap(DataMap map) { + public DataNode nodeForDataMap(DataMap map) { if (map == null) { throw new NullPointerException("Null DataMap, can't determine DataNode."); } - QueryEngine node = domain.lookupDataNode(map); + DataNode node = domain.lookupDataNode(map); if (node == null) { throw new CayenneRuntimeException("No DataNode exists for DataMap %s", map); @@ -632,12 +632,12 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver { } /** - * @since 4.0 + * @since 5.0 */ @Override - public QueryEngine engineForName(String name) { + public DataNode nodeForName(String name) { - QueryEngine node; + DataNode node; if (name != null) { node = domain.getDataNode(name); diff --git a/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java b/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java index fbffa6f23..c00633270 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/DataNode.java @@ -60,7 +60,7 @@ import java.util.logging.Logger; * server, but can potentially be some other storage type like an LDAP server, * etc. */ -public class DataNode implements QueryEngine { +public class DataNode { protected String name; protected DataSource dataSource; @@ -228,7 +228,6 @@ public class DataNode implements QueryEngine { * * @since 1.1 */ - @Override public void performQueries(Collection<? extends Query> queries, OperationObserver callback) { int listSize = queries.size(); @@ -297,7 +296,6 @@ public class DataNode implements QueryEngine { /** * Returns EntityResolver that handles DataMaps of this node. */ - @Override public EntityResolver getEntityResolver() { return entityResolver; } diff --git a/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java b/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java index e181f9ec7..955036dc8 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java @@ -460,7 +460,7 @@ public class ObjectStore implements Serializable, SnapshotEventListener, GraphMa /** * Returns a snapshot for ObjectId from the underlying snapshot cache. If cache - * contains no snapshot, it will attempt fetching it using provided QueryEngine. If + * contains no snapshot, it will attempt fetching it using provided DataNode. If * fetch attempt fails or inconsistent data is returned, underlying cache will throw a * CayenneRuntimeException. * diff --git a/cayenne/src/main/java/org/apache/cayenne/access/OperationHints.java b/cayenne/src/main/java/org/apache/cayenne/access/OperationHints.java index 8d8003a6e..e2f0d3b6c 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/OperationHints.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/OperationHints.java @@ -20,7 +20,7 @@ package org.apache.cayenne.access; /** - * Defines API that allows QueryEngine to obtain information about query execution strategy. + * Defines API that allows a DataNode to obtain information about query execution strategy. * */ public interface OperationHints { diff --git a/cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java b/cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java index 036f3aaa8..dfd70cac6 100644 --- a/cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java +++ b/cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java @@ -26,7 +26,7 @@ import org.apache.cayenne.query.Query; import java.util.List; /** - * Defines a set of callback methods that allow {@link QueryEngine} to pass back query + * Defines a set of callback methods that allow {@link DataNode} to pass back query * results and notify caller about exceptions. */ public interface OperationObserver extends OperationHints { diff --git a/cayenne/src/main/java/org/apache/cayenne/access/QueryEngine.java b/cayenne/src/main/java/org/apache/cayenne/access/QueryEngine.java deleted file mode 100644 index dbc9deaab..000000000 --- a/cayenne/src/main/java/org/apache/cayenne/access/QueryEngine.java +++ /dev/null @@ -1,45 +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.map.EntityResolver; -import org.apache.cayenne.query.Query; - -import java.util.Collection; - -/** - * Defines methods used to run Cayenne queries. - */ -public interface QueryEngine { - - /** - * Executes a list of queries wrapping them in its own transaction. Results of - * execution are passed to {@link OperationObserver}object via its callback methods. - * - * @since 1.1 - */ - void performQueries(Collection<? extends Query> queries, OperationObserver resultConsumer); - - /** - * Returns a resolver for this query engine that is capable of resolving between - * classes, entity names, and obj/db entities - */ - EntityResolver getEntityResolver(); -} diff --git a/cayenne/src/main/java/org/apache/cayenne/query/AbstractQuery.java b/cayenne/src/main/java/org/apache/cayenne/query/AbstractQuery.java index feee8496d..71d5401cc 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/AbstractQuery.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/AbstractQuery.java @@ -113,6 +113,6 @@ public abstract class AbstractQuery extends CacheableQuery { throw new CayenneRuntimeException("No DataMap found, can't route query %s", this); } - router.route(router.engineForDataMap(map), this, substitutedQuery); + router.route(router.nodeForDataMap(map), this, substitutedQuery); } } diff --git a/cayenne/src/main/java/org/apache/cayenne/query/BatchQuery.java b/cayenne/src/main/java/org/apache/cayenne/query/BatchQuery.java index 874311e92..b7c96ba4f 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/BatchQuery.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/BatchQuery.java @@ -84,7 +84,7 @@ public abstract class BatchQuery implements Query { */ @Override public void route(QueryRouter router, EntityResolver resolver, Query substitutedQuery) { - router.route(router.engineForDataMap(dbEntity.getDataMap()), this, substitutedQuery); + router.route(router.nodeForDataMap(dbEntity.getDataMap()), this, substitutedQuery); } /** diff --git a/cayenne/src/main/java/org/apache/cayenne/query/EJBQLQuery.java b/cayenne/src/main/java/org/apache/cayenne/query/EJBQLQuery.java index 5bf95064f..dd5a06dcb 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/EJBQLQuery.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/EJBQLQuery.java @@ -85,7 +85,7 @@ public class EJBQLQuery extends CacheableQuery { throw new CayenneRuntimeException("No DataMap found, can't route query %s", this); } - router.route(router.engineForDataMap(map), this, substitutedQuery); + router.route(router.nodeForDataMap(map), this, substitutedQuery); } public SQLAction createSQLAction(SQLActionVisitor visitor) { diff --git a/cayenne/src/main/java/org/apache/cayenne/query/Query.java b/cayenne/src/main/java/org/apache/cayenne/query/Query.java index 5a60aa21f..423f83319 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/Query.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/Query.java @@ -19,7 +19,7 @@ package org.apache.cayenne.query; -import org.apache.cayenne.access.QueryEngine; +import org.apache.cayenne.access.DataNode; import org.apache.cayenne.map.EntityResolver; import java.io.Serializable; @@ -42,9 +42,9 @@ public interface Query extends Serializable { /** * A callback method invoked by Cayenne during the routing phase of the query * execution. Mapping of DataNodes is provided by QueryRouter. Query should use a - * {@link QueryRouter#route(QueryEngine, Query, Query)} callback method to route + * {@link QueryRouter#route(DataNode, Query, Query)} callback method to route * itself. Query can create one or more substitute queries or even provide its own - * QueryEngine to execute itself. + * DataNode to execute itself. * * @since 1.2 */ diff --git a/cayenne/src/main/java/org/apache/cayenne/query/QueryMetadata.java b/cayenne/src/main/java/org/apache/cayenne/query/QueryMetadata.java index 49dae73a5..412a104ac 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/QueryMetadata.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/QueryMetadata.java @@ -156,7 +156,7 @@ public interface QueryMetadata { /** * Returns <code>true</code> if this query should produce a list of data rows as * opposed to Persistent objects, <code>false</code> for Persistent objects. This is a hint to - * QueryEngine executing this query. + * the DataNode executing this query. */ boolean isFetchingDataRows(); diff --git a/cayenne/src/main/java/org/apache/cayenne/query/QueryRouter.java b/cayenne/src/main/java/org/apache/cayenne/query/QueryRouter.java index 73a3da9ac..80390a57d 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/QueryRouter.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/QueryRouter.java @@ -19,43 +19,59 @@ package org.apache.cayenne.query; -import org.apache.cayenne.access.QueryEngine; +import org.apache.cayenne.access.DataNode; import org.apache.cayenne.map.DataMap; /** - * An interface used by Queries to route themselves to an appropriate QueryEngine. As of + * An interface used by Queries to route themselves to an appropriate DataNode. As of * 1.2 QueryRouter only supports routing by DataMap. - * + * * @since 1.2 */ public interface QueryRouter { /** - * A callback method that allows a query to set its preferred engine during the + * A callback method that allows a query to set its preferred node during the * routing phase. It allows query to further customize its routing, e.g. it is * possible to implement query chains that pass multiple queries for execution. - * - * @param engine engine to use for query execution - * @param query A query to execute. + * + * @param node node to use for query execution + * @param query A query to execute. * @param substitutedQuery a query that was substituted for "query". Results must be - * mapped back to substituted query. + * mapped back to substituted query. */ - void route(QueryEngine engine, Query query, Query substitutedQuery); - + void route(DataNode node, Query query, Query substitutedQuery); + /** - * Returns a QueryEngine for a given name. If the name is null, a default - * QueryEngine is returned. If there's no default engine, an exception is + * Returns a DataNode for a given name. If the name is null, a default + * DataNode is returned. If there's no default node, an exception is * thrown. - * + * + * @since 5.0 + */ + DataNode nodeForName(String name); + + /** + * Returns a DataNode that is configured to handle a given DataMap. + * + * @since 5.0 + */ + DataNode nodeForDataMap(DataMap map); + + /** * @since 4.0 + * @deprecated renamed to {@link #nodeForName(String)}. */ - QueryEngine engineForName(String name); + @Deprecated(since = "5.0", forRemoval = true) + default DataNode engineForName(String name) { + return nodeForName(name); + } /** - * Returns a QueryEngine that is configured to handle a given DataMap. - * - * @throws org.apache.cayenne.CayenneRuntimeException if an engine can't be found. - * @throws NullPointerException if a map parameter is null. + * @deprecated renamed to {@link #nodeForDataMap(DataMap)}. */ - QueryEngine engineForDataMap(DataMap map); + @Deprecated(since = "5.0", forRemoval = true) + default DataNode engineForDataMap(DataMap map) { + return nodeForDataMap(map); + } } diff --git a/cayenne/src/main/java/org/apache/cayenne/query/SQLTemplate.java b/cayenne/src/main/java/org/apache/cayenne/query/SQLTemplate.java index 19b1968dd..eeff19214 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/SQLTemplate.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/SQLTemplate.java @@ -31,7 +31,7 @@ import java.util.function.Function; import java.util.stream.Stream; import org.apache.cayenne.CayenneRuntimeException; -import org.apache.cayenne.access.QueryEngine; +import org.apache.cayenne.access.DataNode; import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.EntityResolver; @@ -130,11 +130,11 @@ public class SQLTemplate extends AbstractQuery implements ParameterizedQuery { public void route(QueryRouter router, EntityResolver resolver, Query substitutedQuery) { DataMap map = getMetaData(resolver).getDataMap(); - QueryEngine engine; + DataNode engine; if (map != null) { - engine = router.engineForDataMap(map); + engine = router.nodeForDataMap(map); } else { - engine = router.engineForName(getDataNodeName()); + engine = router.nodeForName(getDataNodeName()); } router.route(engine, this, substitutedQuery); diff --git a/cayenne/src/test/java/org/apache/cayenne/access/MockQueryEngine.java b/cayenne/src/test/java/org/apache/cayenne/access/MockQueryEngine.java deleted file mode 100644 index 478c789ac..000000000 --- a/cayenne/src/test/java/org/apache/cayenne/access/MockQueryEngine.java +++ /dev/null @@ -1,108 +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 java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.cayenne.map.DataMap; -import org.apache.cayenne.map.EntityResolver; -import org.apache.cayenne.query.Query; -import org.apache.cayenne.tx.BaseTransaction; - -/** - * A query engine used for unit testing. Returns canned results instead of doing the - * actual query. - * - */ -public class MockQueryEngine implements QueryEngine { - - // mockup the actual results - protected Map results = new HashMap(); - protected EntityResolver entityResolver; - protected int runCount; - - public MockQueryEngine() { - } - - public MockQueryEngine(QueryEngine engine) { - this(engine.getEntityResolver()); - } - - public MockQueryEngine(EntityResolver resolver) { - this.entityResolver = resolver; - } - - public void reset() { - runCount = 0; - results.clear(); - } - - public int getRunCount() { - return runCount; - } - - public void addExpectedResult(Query query, List result) { - results.put(query, result); - } - - public void performQueries( - Collection queries, - OperationObserver resultConsumer, - BaseTransaction transaction) { - initWithPresetResults(queries, resultConsumer); - } - - public void performQueries(Collection queries, OperationObserver resultConsumer) { - initWithPresetResults(queries, resultConsumer); - } - - private void initWithPresetResults( - Collection queries, - OperationObserver resultConsumer) { - - runCount++; - - // stick preset results to the consumer - Iterator it = queries.iterator(); - while (it.hasNext()) { - Query query = (Query) it.next(); - resultConsumer.nextRows(query, (List) results.get(query)); - } - } - - public DataNode lookupDataNode(DataMap dataMap) { - return null; - } - - public EntityResolver getEntityResolver() { - return entityResolver; - } - - public Collection getDataMaps() { - return (entityResolver != null) - ? entityResolver.getDataMaps() - : Collections.EMPTY_LIST; - } -} diff --git a/cayenne/src/test/java/org/apache/cayenne/query/MockQueryRouter.java b/cayenne/src/test/java/org/apache/cayenne/query/MockQueryRouter.java index fd0164be3..c11d8ff07 100644 --- a/cayenne/src/test/java/org/apache/cayenne/query/MockQueryRouter.java +++ b/cayenne/src/test/java/org/apache/cayenne/query/MockQueryRouter.java @@ -23,8 +23,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; -import org.apache.cayenne.access.MockQueryEngine; -import org.apache.cayenne.access.QueryEngine; +import org.apache.cayenne.access.DataNode; import org.apache.cayenne.map.DataMap; public class MockQueryRouter implements QueryRouter { @@ -43,16 +42,16 @@ public class MockQueryRouter implements QueryRouter { return queries.size(); } - public void route(QueryEngine engine, Query query, Query substitutedQuery) { + public void route(DataNode node, Query query, Query substitutedQuery) { queries.add(query); } - public QueryEngine engineForDataMap(DataMap map) { - return new MockQueryEngine(); + public DataNode nodeForDataMap(DataMap map) { + return new DataNode(); } - + @Override - public QueryEngine engineForName(String name) { - return new MockQueryEngine(); + public DataNode nodeForName(String name) { + return new DataNode(); } }
