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();

Reply via email to