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
The following commit(s) were added to refs/heads/master by this push:
new e90c3c503 Getting rid of useless ParameterizedQuery interface
e90c3c503 is described below
commit e90c3c503769eee72b62bf271f2b188b1381d488
Author: Andrus Adamchik <[email protected]>
AuthorDate: Sun Aug 30 11:36:44 2026 -0400
Getting rid of useless ParameterizedQuery interface
---
UPGRADE.md | 5 ++++
.../apache/cayenne/map/EJBQLQueryDescriptor.java | 10 +++++++
.../cayenne/map/ProcedureQueryDescriptor.java | 10 +++++++
.../org/apache/cayenne/map/QueryDescriptor.java | 11 +++++++
.../apache/cayenne/map/SQLTemplateDescriptor.java | 10 +++++++
.../apache/cayenne/map/SelectQueryDescriptor.java | 15 +++++++++-
.../apache/cayenne/query/AbstractMappedQuery.java | 12 +-------
.../org/apache/cayenne/query/ObjectSelect.java | 20 +------------
.../org/apache/cayenne/query/ProcedureQuery.java | 26 +----------------
.../java/org/apache/cayenne/query/SQLTemplate.java | 28 +-----------------
.../cayenne/map/EJBQLQueryDescriptorTest.java} | 33 +++++++++++----------
.../cayenne/map/ProcedureQueryDescriptorTest.java} | 34 ++++++++++++----------
.../cayenne/map/SQLTemplateDescriptorTest.java | 13 +++++++++
.../cayenne/map/SelectQueryDescriptorTest.java | 22 ++++++++++++++
.../apache/cayenne/query/ProcedureQueryTest.java | 25 ----------------
15 files changed, 134 insertions(+), 140 deletions(-)
diff --git a/UPGRADE.md b/UPGRADE.md
index de9f9c480..89f1dae6b 100644
--- a/UPGRADE.md
+++ b/UPGRADE.md
@@ -55,6 +55,11 @@ Expression caseWhenExp = caseWhen(
## Upgrading to 5.0-M4
+* The `org.apache.cayenne.query.ParameterizedQuery` interface was removed,
together with the `createQuery(Map)`
+ methods of `SQLTemplate`, `ProcedureQuery` and `ObjectSelect` that
implemented it. Applying parameters to a mapped
+ query is now the job of the query descriptor - override
`QueryDescriptor.buildQuery(Map)` if you have a custom
+ `QueryDescriptor` that supports parameters. This does not affect the
user-facing `MappedSelect` / `MappedExec` API.
+
* The `groupId` of `cayenne-modeler` and `cayenne-wocompat` changed from
`org.apache.cayenne.modeler` to
`org.apache.cayenne`. Artifact ids and versions are unchanged. If you depend
on any of them directly, update the
coordinates:
diff --git
a/cayenne/src/main/java/org/apache/cayenne/map/EJBQLQueryDescriptor.java
b/cayenne/src/main/java/org/apache/cayenne/map/EJBQLQueryDescriptor.java
index 0e1000a10..d121039e3 100644
--- a/cayenne/src/main/java/org/apache/cayenne/map/EJBQLQueryDescriptor.java
+++ b/cayenne/src/main/java/org/apache/cayenne/map/EJBQLQueryDescriptor.java
@@ -57,6 +57,16 @@ public class EJBQLQueryDescriptor extends QueryDescriptor {
return ejbqlQuery;
}
+ /**
+ * @since 5.0
+ */
+ @Override
+ public EJBQLQuery buildQuery(Map<String, ?> parameters) {
+ EJBQLQuery ejbqlQuery = buildQuery();
+ parameters.forEach(ejbqlQuery::setParameter);
+ return ejbqlQuery;
+ }
+
@Override
public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor
delegate) {
encoder.start("query").attribute("name", getName()).attribute("type",
type);
diff --git
a/cayenne/src/main/java/org/apache/cayenne/map/ProcedureQueryDescriptor.java
b/cayenne/src/main/java/org/apache/cayenne/map/ProcedureQueryDescriptor.java
index f6490eec0..1082b3e13 100644
--- a/cayenne/src/main/java/org/apache/cayenne/map/ProcedureQueryDescriptor.java
+++ b/cayenne/src/main/java/org/apache/cayenne/map/ProcedureQueryDescriptor.java
@@ -63,6 +63,16 @@ public class ProcedureQueryDescriptor extends
QueryDescriptor {
return procedureQuery;
}
+ /**
+ * @since 5.0
+ */
+ @Override
+ public ProcedureQuery buildQuery(Map<String, ?> parameters) {
+ ProcedureQuery procedureQuery = buildQuery();
+ procedureQuery.setParameters(parameters);
+ return procedureQuery;
+ }
+
@Override
public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor
delegate) {
encoder.start("query")
diff --git a/cayenne/src/main/java/org/apache/cayenne/map/QueryDescriptor.java
b/cayenne/src/main/java/org/apache/cayenne/map/QueryDescriptor.java
index e640608d4..771245d6e 100644
--- a/cayenne/src/main/java/org/apache/cayenne/map/QueryDescriptor.java
+++ b/cayenne/src/main/java/org/apache/cayenne/map/QueryDescriptor.java
@@ -208,6 +208,17 @@ public class QueryDescriptor implements Serializable,
ConfigurationNode, XMLSeri
throw new CayenneRuntimeException("Unable to build query object of
this type.");
}
+ /**
+ * Assembles Cayenne query instance of appropriate type from this
descriptor, applying a map of named
+ * parameters to it. Subclasses that support parameters must override this
method. The default
+ * implementation ignores the parameters.
+ *
+ * @since 5.0
+ */
+ public Query buildQuery(Map<String, ?> parameters) {
+ return buildQuery();
+ }
+
@Override
public <T> T acceptVisitor(ConfigurationNodeVisitor<T> visitor) {
return visitor.visitQuery(this);
diff --git
a/cayenne/src/main/java/org/apache/cayenne/map/SQLTemplateDescriptor.java
b/cayenne/src/main/java/org/apache/cayenne/map/SQLTemplateDescriptor.java
index 4dc065a93..6c87ee55c 100644
--- a/cayenne/src/main/java/org/apache/cayenne/map/SQLTemplateDescriptor.java
+++ b/cayenne/src/main/java/org/apache/cayenne/map/SQLTemplateDescriptor.java
@@ -133,6 +133,16 @@ public class SQLTemplateDescriptor extends QueryDescriptor
{
return template;
}
+ /**
+ * @since 5.0
+ */
+ @Override
+ public SQLTemplate buildQuery(Map<String, ?> parameters) {
+ SQLTemplate template = buildQuery();
+ template.setParams(parameters);
+ return template;
+ }
+
@Override
public void encodeAsXML(XMLEncoder encoder, ConfigurationNodeVisitor
delegate) {
encoder.start("query")
diff --git
a/cayenne/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java
b/cayenne/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java
index ae6ac57f6..0c0ba5684 100644
--- a/cayenne/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java
+++ b/cayenne/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java
@@ -137,6 +137,19 @@ public class SelectQueryDescriptor extends QueryDescriptor
{
@Override
public ObjectSelect<?> buildQuery() {
+ return buildQuery(getQualifier());
+ }
+
+ /**
+ * @since 5.0
+ */
+ @Override
+ public ObjectSelect<?> buildQuery(Map<String, ?> parameters) {
+ Expression qualifier = getQualifier();
+ return buildQuery(qualifier != null ? qualifier.params(parameters,
true) : null);
+ }
+
+ private ObjectSelect<?> buildQuery(Expression qualifier) {
// resolve root
Object root = getRoot();
String rootEntityName;
@@ -148,7 +161,7 @@ public class SelectQueryDescriptor extends QueryDescriptor {
throw new CayenneRuntimeException("Unexpected root for the
SelectQueryDescriptor '%s'.", root);
}
- ObjectSelect<?> query = ObjectSelect.query(Object.class,
getQualifier());
+ ObjectSelect<?> query = ObjectSelect.query(Object.class, qualifier);
query.entityName(rootEntityName);
query.setRoot(root);
diff --git
a/cayenne/src/main/java/org/apache/cayenne/query/AbstractMappedQuery.java
b/cayenne/src/main/java/org/apache/cayenne/query/AbstractMappedQuery.java
index a6efb7e77..c2578d6e2 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/AbstractMappedQuery.java
+++ b/cayenne/src/main/java/org/apache/cayenne/query/AbstractMappedQuery.java
@@ -90,16 +90,6 @@ public abstract class AbstractMappedQuery extends
IndirectQuery {
@Override
protected Query createReplacementQuery(EntityResolver resolver) {
- Query query = resolver.getQueryDescriptor(queryName).buildQuery();
-
- if (query instanceof ParameterizedQuery) {
- query = ((ParameterizedQuery)
query).createQuery(normalizedParameters());
- } else if (query instanceof EJBQLQuery) {
- for (Map.Entry<String, ?> entry :
normalizedParameters().entrySet()) {
- ((EJBQLQuery) query).setParameter(entry.getKey(),
entry.getValue());
- }
- }
-
- return query;
+ return
resolver.getQueryDescriptor(queryName).buildQuery(normalizedParameters());
}
}
diff --git a/cayenne/src/main/java/org/apache/cayenne/query/ObjectSelect.java
b/cayenne/src/main/java/org/apache/cayenne/query/ObjectSelect.java
index 01fb96e30..5fae16704 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/ObjectSelect.java
+++ b/cayenne/src/main/java/org/apache/cayenne/query/ObjectSelect.java
@@ -19,7 +19,6 @@
package org.apache.cayenne.query;
import java.util.List;
-import java.util.Map;
import org.apache.cayenne.DataRow;
import org.apache.cayenne.ObjectContext;
@@ -49,7 +48,7 @@ import org.apache.cayenne.map.ObjEntity;
*
* @since 4.0
*/
-public class ObjectSelect<T> extends FluentSelect<T, ObjectSelect<T>>
implements ParameterizedQuery {
+public class ObjectSelect<T> extends FluentSelect<T, ObjectSelect<T>> {
private static final long serialVersionUID = -156124021150949227L;
@@ -350,21 +349,4 @@ public class ObjectSelect<T> extends FluentSelect<T,
ObjectSelect<T>> implements
protected ObjectSelectMetadata getBaseMetaData() {
return metaData;
}
-
- /**
- * This method is intended for internal use in a {@link MappedSelect}.
- *
- * @param parameters to apply
- * @return this query with parameters applied to the <b>where</b> qualifier
- *
- * @since 4.2
- */
- @Override
- public Query createQuery(Map<String, ?> parameters) {
- if(where == null) {
- return this;
- }
- where = where.params(parameters, true);
- return this;
- }
}
diff --git a/cayenne/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
b/cayenne/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
index d7643213c..5e07d4bee 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
+++ b/cayenne/src/main/java/org/apache/cayenne/query/ProcedureQuery.java
@@ -50,7 +50,7 @@ import java.util.Map;
* {@link org.apache.cayenne.access.DataContext#performGenericQuery(Query)}.
* </p>
*/
-public class ProcedureQuery extends AbstractQuery implements
ParameterizedQuery {
+public class ProcedureQuery extends AbstractQuery {
public static final String COLUMN_NAME_CAPITALIZATION_PROPERTY =
"cayenne.ProcedureQuery.columnNameCapitalization";
@@ -207,30 +207,6 @@ public class ProcedureQuery extends AbstractQuery
implements ParameterizedQuery
metaData.initWithProperties(properties);
}
- /**
- * Creates and returns a new ProcedureQuery built using this query as a
prototype and
- * substituting template parameters with the values from the map.
- *
- * @since 1.1
- */
- public Query createQuery(Map<String, ?> parameters) {
- // create a query replica
- ProcedureQuery query = new ProcedureQuery();
-
- if (root != null) {
- query.setRoot(root);
- }
-
- query.setResultEntityName(resultEntityName);
- query.metaData.copyFromInfo(this.metaData);
- query.setParameters(parameters);
-
- // TODO: implement algorithm for building the name based on the
original name and
- // the hashcode of the map of parameters. This way query clone can
take advantage
- // of caching.
- return query;
- }
-
@Override
protected BaseQueryMetadata getBaseMetaData() {
return metaData;
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 eeff19214..dadbeafca 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/SQLTemplate.java
+++ b/cayenne/src/main/java/org/apache/cayenne/query/SQLTemplate.java
@@ -65,7 +65,7 @@ import org.apache.cayenne.map.SQLResult;
*
* @since 1.1
*/
-public class SQLTemplate extends AbstractQuery implements ParameterizedQuery {
+public class SQLTemplate extends AbstractQuery {
private static final long serialVersionUID = -3073521388289663641L;
@@ -310,32 +310,6 @@ public class SQLTemplate extends AbstractQuery implements
ParameterizedQuery {
return query;
}
- /**
- * Creates and returns a new SQLTemplate built using this query as a
- * prototype and substituting template parameters with the values from
the
- * map.
- *
- * @since 1.1
- */
- @Override
- public Query createQuery(Map<String, ?> parameters) {
- // create a query replica
- SQLTemplate query = new SQLTemplate();
-
- query.setRoot(root);
- query.setDefaultTemplate(getDefaultTemplate());
-
- if (templates != null) {
- query.templates = new HashMap<>(templates);
- }
-
- query.metaData.copyFromInfo(this.metaData);
- query.setParams(parameters);
-
query.setColumnNamesCapitalization(this.getColumnNamesCapitalization());
-
- return query;
- }
-
@Override
protected BaseQueryMetadata getBaseMetaData() {
return metaData;
diff --git
a/cayenne/src/main/java/org/apache/cayenne/query/ParameterizedQuery.java
b/cayenne/src/test/java/org/apache/cayenne/map/EJBQLQueryDescriptorTest.java
similarity index 61%
copy from cayenne/src/main/java/org/apache/cayenne/query/ParameterizedQuery.java
copy to
cayenne/src/test/java/org/apache/cayenne/map/EJBQLQueryDescriptorTest.java
index 35399aa12..a878d02fe 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/ParameterizedQuery.java
+++ b/cayenne/src/test/java/org/apache/cayenne/map/EJBQLQueryDescriptorTest.java
@@ -17,23 +17,24 @@
* under the License.
****************************************************************/
-package org.apache.cayenne.query;
+package org.apache.cayenne.map;
import java.util.Map;
-/**
- * Defines a query that can serve as a template for other queries.
ParameterizedQuery
- * interface is used mainly in DataContext convenience methods, simplifying
execution of
- * the mapped queries.
- *
- * @since 1.1
- */
-public interface ParameterizedQuery extends Query {
-
- /**
- * Creates a new query based on current query as a template, and using a
Map of named
- * parameters. In case of select queries, it is up to the implementing
query to name
- * the new query to avoid cache key conflicts.
- */
- Query createQuery(Map<String, ?> parameters);
+import org.apache.cayenne.query.EJBQLQuery;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class EJBQLQueryDescriptorTest {
+
+ @Test
+ public void buildQueryWithParameters() {
+ EJBQLQueryDescriptor descriptor =
QueryDescriptor.ejbqlQueryDescriptor();
+ descriptor.setEjbql("select a from Artist a where a.name = :name");
+
+ EJBQLQuery query = descriptor.buildQuery(Map.of("name", "artist1"));
+
+ assertEquals(Map.of("name", "artist1"), query.getNamedParameters());
+ }
}
diff --git
a/cayenne/src/main/java/org/apache/cayenne/query/ParameterizedQuery.java
b/cayenne/src/test/java/org/apache/cayenne/map/ProcedureQueryDescriptorTest.java
similarity index 61%
rename from
cayenne/src/main/java/org/apache/cayenne/query/ParameterizedQuery.java
rename to
cayenne/src/test/java/org/apache/cayenne/map/ProcedureQueryDescriptorTest.java
index 35399aa12..f0dc3f611 100644
--- a/cayenne/src/main/java/org/apache/cayenne/query/ParameterizedQuery.java
+++
b/cayenne/src/test/java/org/apache/cayenne/map/ProcedureQueryDescriptorTest.java
@@ -17,23 +17,25 @@
* under the License.
****************************************************************/
-package org.apache.cayenne.query;
+package org.apache.cayenne.map;
import java.util.Map;
-/**
- * Defines a query that can serve as a template for other queries.
ParameterizedQuery
- * interface is used mainly in DataContext convenience methods, simplifying
execution of
- * the mapped queries.
- *
- * @since 1.1
- */
-public interface ParameterizedQuery extends Query {
-
- /**
- * Creates a new query based on current query as a template, and using a
Map of named
- * parameters. In case of select queries, it is up to the implementing
query to name
- * the new query to avoid cache key conflicts.
- */
- Query createQuery(Map<String, ?> parameters);
+import org.apache.cayenne.query.ProcedureQuery;
+import org.junit.jupiter.api.Test;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+
+public class ProcedureQueryDescriptorTest {
+
+ @Test
+ public void buildQueryWithParameters() {
+ ProcedureQueryDescriptor descriptor =
QueryDescriptor.procedureQueryDescriptor();
+ descriptor.setRoot("FakeRoot");
+
+ Map<String, Object> params = Map.of("a", "1", "b", "2");
+ ProcedureQuery query = descriptor.buildQuery(params);
+
+ assertEquals(params, query.getParameters());
+ }
}
diff --git
a/cayenne/src/test/java/org/apache/cayenne/map/SQLTemplateDescriptorTest.java
b/cayenne/src/test/java/org/apache/cayenne/map/SQLTemplateDescriptorTest.java
index 9cae9a257..9710442b5 100644
---
a/cayenne/src/test/java/org/apache/cayenne/map/SQLTemplateDescriptorTest.java
+++
b/cayenne/src/test/java/org/apache/cayenne/map/SQLTemplateDescriptorTest.java
@@ -19,6 +19,8 @@
package org.apache.cayenne.map;
+import java.util.Map;
+
import org.apache.cayenne.query.*;
import org.junit.jupiter.api.Test;
@@ -73,6 +75,17 @@ public class SQLTemplateDescriptorTest {
assertEquals("abc", query.getDefaultTemplate());
}
+ @Test
+ public void buildQueryWithParameters() {
+ SQLTemplateDescriptor builder =
QueryDescriptor.sqlTemplateDescriptor();
+ builder.setSql("SELECT * FROM ARTIST WHERE ARTIST_NAME =
#bind($name)");
+
+ Map<String, Object> params = Map.of("name", "artist1");
+ SQLTemplate query = builder.buildQuery(params);
+
+ assertEquals(params, query.getParams());
+ }
+
@Test
public void getQueryAdapterSql() throws Exception {
SQLTemplateDescriptor builder =
QueryDescriptor.sqlTemplateDescriptor();
diff --git
a/cayenne/src/test/java/org/apache/cayenne/map/SelectQueryDescriptorTest.java
b/cayenne/src/test/java/org/apache/cayenne/map/SelectQueryDescriptorTest.java
index bbfc331f5..92ba8fa45 100644
---
a/cayenne/src/test/java/org/apache/cayenne/map/SelectQueryDescriptorTest.java
+++
b/cayenne/src/test/java/org/apache/cayenne/map/SelectQueryDescriptorTest.java
@@ -19,6 +19,8 @@
package org.apache.cayenne.map;
+import java.util.Map;
+
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.ObjectSelect;
import org.apache.cayenne.query.QueryMetadata;
@@ -59,6 +61,26 @@ public class SelectQueryDescriptorTest {
assertEquals(ExpressionFactory.exp("abc = 5"), query.getWhere());
}
+ @Test
+ public void buildQueryWithParameters() {
+ SelectQueryDescriptor builder =
QueryDescriptor.selectQueryDescriptor();
+ builder.setRoot("FakeRoot");
+ builder.setQualifier(ExpressionFactory.exp("abc = $a and def = $b"));
+
+ ObjectSelect<?> query = builder.buildQuery(Map.of("a", 5));
+
+ // parameters with no matching value are pruned from the qualifier
+ assertEquals(ExpressionFactory.exp("abc = 5"), query.getWhere());
+ }
+
+ @Test
+ public void buildQueryWithoutParameters() {
+ SelectQueryDescriptor builder =
QueryDescriptor.selectQueryDescriptor();
+ builder.setRoot("FakeRoot");
+
+ assertNull(builder.buildQuery(Map.of("a", 5)).getWhere());
+ }
+
@Test
public void getQueryProperties() {
SelectQueryDescriptor builder =
QueryDescriptor.selectQueryDescriptor();
diff --git
a/cayenne/src/test/java/org/apache/cayenne/query/ProcedureQueryTest.java
b/cayenne/src/test/java/org/apache/cayenne/query/ProcedureQueryTest.java
index f6e9862b4..167e75895 100644
--- a/cayenne/src/test/java/org/apache/cayenne/query/ProcedureQueryTest.java
+++ b/cayenne/src/test/java/org/apache/cayenne/query/ProcedureQueryTest.java
@@ -21,27 +21,14 @@ package org.apache.cayenne.query;
import org.junit.jupiter.api.Test;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.assertNotSame;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertSame;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ProcedureQueryTest {
- @Test
- public void createQuery() {
- ProcedureQuery template = new ProcedureQuery();
- Query clone = template.createQuery(Collections.EMPTY_MAP);
- assertTrue(clone instanceof ProcedureQuery);
- assertNotSame(template, clone);
- }
-
@Test
public void columnNameCapitalization() {
ProcedureQuery q1 = new ProcedureQuery();
@@ -50,18 +37,6 @@ public class ProcedureQueryTest {
assertEquals(CapsStrategy.UPPER, q1.getColumnNamesCapitalization());
}
- @Test
- public void createQueryWithParameters() {
- Map params = new HashMap();
- params.put("a", "1");
- params.put("b", "2");
-
- ProcedureQuery template = new ProcedureQuery();
- ProcedureQuery clone = (ProcedureQuery) template.createQuery(params);
-
- assertEquals(params, clone.getParameters());
- }
-
@Test
public void resultEntityName() {
ProcedureQuery query = new ProcedureQuery();