Skip to content

Commit bc1b18e

Browse files
committed
CAY-2955 Get rid of QueryEngine abstraction
1 parent 2535869 commit bc1b18e

19 files changed

Lines changed: 90 additions & 230 deletions

RELEASE-NOTES.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ CAY-2946 Claude Code "plugin" for agentic coding with Cayenne
4747
CAY-2947 Merge "cayenne-commitlog" into the core
4848
CAY-2948 Modeler: use native FileDialog on Mac
4949
CAY-2953 Upgrade Gradle to 9.4.0
50+
CAY-2955 Get rid of QueryEngine abstraction
5051

5152
Bug Fixes:
5253

UPGRADE.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,10 @@ Expression caseWhenExp = caseWhen(
105105
open CayenneModeler.app --args path/to/cayenne-project.xml
106106
```
107107
108+
* Per [CAY-2955](https://issues.apache.org/jira/browse/CAY-2955) the obsolete `QueryEngine` abstraction (`org.apache.cayenne.access.QueryEngine`) has been removed.
109+
`DataNode` is now used directly wherever `QueryEngine` was previously referenced. So you must subclass `DataNode`
110+
and override `performQueries()` if you previously implemented a custom `QueryEngine`.
111+
108112
## Upgrading to 5.0.M1
109113
110114
* 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

cayenne/src/main/java/org/apache/cayenne/access/DataDomain.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@
6262
* user. When a child DataContext sends a query to the DataDomain, it is
6363
* transparently routed to an appropriate DataNode.
6464
*/
65-
public class DataDomain implements QueryEngine, DataChannel {
65+
public class DataDomain implements DataChannel {
6666

6767
public static final String SHARED_CACHE_ENABLED_PROPERTY = "cayenne.DataDomain.sharedCache";
6868
public static final boolean SHARED_CACHE_ENABLED_DEFAULT = true;
@@ -529,18 +529,18 @@ public void shutdown() {
529529
}
530530

531531
/**
532-
* Routes queries to appropriate DataNodes for execution.
532+
* Routes queries to appropriate DataNodes for execution
533+
*
534+
* @deprecated use {@link #onQuery(ObjectContext, Query)} instead.
533535
*/
534-
@Override
536+
@Deprecated(since = "5.0", forRemoval = true)
535537
public void performQueries(Collection<? extends Query> queries, OperationObserver callback) {
536538
transactionManager.performInTransaction(() -> {
537539
new DataDomainLegacyQueryAction(DataDomain.this, new QueryChain(queries), callback).execute();
538540
return null;
539541
});
540542
}
541543

542-
// ****** DataChannel methods:
543-
544544
/**
545545
* Runs query returning generic QueryResponse.
546546
*

cayenne/src/main/java/org/apache/cayenne/access/DataDomainLegacyQueryAction.java

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -33,20 +33,15 @@
3333
import java.util.List;
3434
import java.util.Map;
3535

36-
/**
37-
* DataDomain query action that relies on externally provided OperationObserver to process
38-
* the results.
39-
*
40-
* @since 1.2
41-
*/
36+
@Deprecated
4237
class DataDomainLegacyQueryAction implements QueryRouter, OperationObserver {
4338

4439
DataDomain domain;
4540
OperationObserver callback;
4641
Query query;
4742
QueryMetadata metadata;
4843

49-
Map<QueryEngine, List<Query>> queriesByNode;
44+
Map<DataNode, List<Query>> queriesByNode;
5045
Map<Query, Query> queriesByExecutedQueries;
5146

5247
DataDomainLegacyQueryAction(DataDomain domain, Query query, OperationObserver callback) {
@@ -70,29 +65,29 @@ final void execute() {
7065

7166
// run categorized queries
7267
if (queriesByNode != null) {
73-
for (final Map.Entry<QueryEngine, List<Query>> entry : queriesByNode
68+
for (final Map.Entry<DataNode, List<Query>> entry : queriesByNode
7469
.entrySet()) {
75-
QueryEngine nextNode = entry.getKey();
70+
DataNode nextNode = entry.getKey();
7671
Collection<Query> nodeQueries = entry.getValue();
7772
nextNode.performQueries(nodeQueries, this);
7873
}
7974
}
8075
}
8176

8277
@Override
83-
public void route(QueryEngine engine, Query query, Query substitutedQuery) {
78+
public void route(DataNode node, Query query, Query substitutedQuery) {
8479

8580
List<Query> queries = null;
8681
if (queriesByNode == null) {
8782
queriesByNode = new HashMap<>();
8883
}
8984
else {
90-
queries = queriesByNode.get(engine);
85+
queries = queriesByNode.get(node);
9186
}
9287

9388
if (queries == null) {
9489
queries = new ArrayList<>(5);
95-
queriesByNode.put(engine, queries);
90+
queriesByNode.put(node, queries);
9691
}
9792

9893
queries.add(query);
@@ -110,12 +105,12 @@ public void route(QueryEngine engine, Query query, Query substitutedQuery) {
110105
}
111106

112107
@Override
113-
public QueryEngine engineForDataMap(DataMap map) {
108+
public DataNode nodeForDataMap(DataMap map) {
114109
if (map == null) {
115110
throw new NullPointerException("Null DataMap, can't determine DataNode.");
116111
}
117112

118-
QueryEngine node = domain.lookupDataNode(map);
113+
DataNode node = domain.lookupDataNode(map);
119114

120115
if (node == null) {
121116
throw new CayenneRuntimeException("No DataNode exists for DataMap %s", map);
@@ -125,12 +120,12 @@ public QueryEngine engineForDataMap(DataMap map) {
125120
}
126121

127122
/**
128-
* @since 4.0
123+
* @since 5.0
129124
*/
130125
@Override
131-
public QueryEngine engineForName(String name) {
126+
public DataNode nodeForName(String name) {
132127

133-
QueryEngine node;
128+
DataNode node;
134129

135130
if (name != null) {
136131
node = domain.getDataNode(name);

cayenne/src/main/java/org/apache/cayenne/access/DataDomainQueryAction.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ class DataDomainQueryAction implements QueryRouter, OperationObserver {
9696
private QueryResponse response;
9797
private GenericResponse fullResponse;
9898
private Map<CayennePath, List<?>> prefetchResultsByPath;
99-
private Map<QueryEngine, Collection<Query>> queriesByNode;
99+
private Map<DataNode, Collection<Query>> queriesByNode;
100100
private boolean noObjectConversion;
101101
// True when using a caching strategy (shared or local cache), indicating lists are immutable and need copying
102102
private boolean cachedResult;
@@ -518,8 +518,8 @@ private void runQuery() {
518518

519519
// run categorized queries
520520
if (queriesByNode != null) {
521-
for (Map.Entry<QueryEngine, Collection<Query>> entry : queriesByNode.entrySet()) {
522-
QueryEngine nextNode = entry.getKey();
521+
for (Map.Entry<DataNode, Collection<Query>> entry : queriesByNode.entrySet()) {
522+
DataNode nextNode = entry.getKey();
523523
Collection<Query> nodeQueries = entry.getValue();
524524
nextNode.performQueries(nodeQueries, this);
525525
}
@@ -600,29 +600,29 @@ private boolean noObjectConversion() {
600600
}
601601

602602
@Override
603-
public void route(QueryEngine engine, Query query, Query substitutedQuery) {
603+
public void route(DataNode node, Query query, Query substitutedQuery) {
604604
Collection<Query> queries = null;
605605
if (queriesByNode == null) {
606606
queriesByNode = new HashMap<>();
607607
} else {
608-
queries = queriesByNode.get(engine);
608+
queries = queriesByNode.get(node);
609609
}
610610

611611
if (queries == null) {
612612
queries = new ArrayList<>(5);
613-
queriesByNode.put(engine, queries);
613+
queriesByNode.put(node, queries);
614614
}
615615

616616
queries.add(query);
617617
}
618618

619619
@Override
620-
public QueryEngine engineForDataMap(DataMap map) {
620+
public DataNode nodeForDataMap(DataMap map) {
621621
if (map == null) {
622622
throw new NullPointerException("Null DataMap, can't determine DataNode.");
623623
}
624624

625-
QueryEngine node = domain.lookupDataNode(map);
625+
DataNode node = domain.lookupDataNode(map);
626626

627627
if (node == null) {
628628
throw new CayenneRuntimeException("No DataNode exists for DataMap %s", map);
@@ -632,12 +632,12 @@ public QueryEngine engineForDataMap(DataMap map) {
632632
}
633633

634634
/**
635-
* @since 4.0
635+
* @since 5.0
636636
*/
637637
@Override
638-
public QueryEngine engineForName(String name) {
638+
public DataNode nodeForName(String name) {
639639

640-
QueryEngine node;
640+
DataNode node;
641641

642642
if (name != null) {
643643
node = domain.getDataNode(name);

cayenne/src/main/java/org/apache/cayenne/access/DataNode.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@
6060
* server, but can potentially be some other storage type like an LDAP server,
6161
* etc.
6262
*/
63-
public class DataNode implements QueryEngine {
63+
public class DataNode {
6464

6565
protected String name;
6666
protected DataSource dataSource;
@@ -228,7 +228,6 @@ public DataNode lookupDataNode(DataMap dataMap) {
228228
*
229229
* @since 1.1
230230
*/
231-
@Override
232231
public void performQueries(Collection<? extends Query> queries, OperationObserver callback) {
233232

234233
int listSize = queries.size();
@@ -297,7 +296,6 @@ public void performQueries(Collection<? extends Query> queries, OperationObserve
297296
/**
298297
* Returns EntityResolver that handles DataMaps of this node.
299298
*/
300-
@Override
301299
public EntityResolver getEntityResolver() {
302300
return entityResolver;
303301
}

cayenne/src/main/java/org/apache/cayenne/access/ObjectStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ public DataRow getCachedSnapshot(ObjectId oid) {
460460

461461
/**
462462
* Returns a snapshot for ObjectId from the underlying snapshot cache. If cache
463-
* contains no snapshot, it will attempt fetching it using provided QueryEngine. If
463+
* contains no snapshot, it will attempt fetching it using provided DataNode. If
464464
* fetch attempt fails or inconsistent data is returned, underlying cache will throw a
465465
* CayenneRuntimeException.
466466
*

cayenne/src/main/java/org/apache/cayenne/access/OperationHints.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
package org.apache.cayenne.access;
2121

2222
/**
23-
* Defines API that allows QueryEngine to obtain information about query execution strategy.
23+
* Defines API that allows a DataNode to obtain information about query execution strategy.
2424
*
2525
*/
2626
public interface OperationHints {

cayenne/src/main/java/org/apache/cayenne/access/OperationObserver.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
import java.util.List;
2727

2828
/**
29-
* Defines a set of callback methods that allow {@link QueryEngine} to pass back query
29+
* Defines a set of callback methods that allow {@link DataNode} to pass back query
3030
* results and notify caller about exceptions.
3131
*/
3232
public interface OperationObserver extends OperationHints {

cayenne/src/main/java/org/apache/cayenne/access/QueryEngine.java

Lines changed: 0 additions & 45 deletions
This file was deleted.

0 commit comments

Comments
 (0)