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 d86f8be720b2eefc018ea256204c2c90358e96a9 Author: Andrus Adamchik <[email protected]> AuthorDate: Sun Aug 30 13:44:28 2026 -0400 Query cleanup... AbstractQuery is uneeded --- .../apache/cayenne/map/SelectQueryDescriptor.java | 1 - .../org/apache/cayenne/query/AbstractQuery.java | 100 --------------------- .../org/apache/cayenne/query/FluentSelect.java | 2 +- .../org/apache/cayenne/query/ProcedureQuery.java | 49 +++++++++- .../java/org/apache/cayenne/query/SQLTemplate.java | 49 ++++++++-- .../cayenne/map/SelectQueryDescriptorTest.java | 2 +- .../apache/cayenne/query/AbstractQueryTest.java | 65 -------------- .../apache/cayenne/query/MockAbstractQuery.java | 38 -------- .../apache/cayenne/query/ProcedureQueryTest.java | 22 +++++ .../org/apache/cayenne/query/SQLTemplateTest.java | 46 ++++++++++ 10 files changed, 160 insertions(+), 214 deletions(-) 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 0c0ba5684..1422c418e 100644 --- a/cayenne/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java +++ b/cayenne/src/main/java/org/apache/cayenne/map/SelectQueryDescriptor.java @@ -163,7 +163,6 @@ public class SelectQueryDescriptor extends QueryDescriptor { ObjectSelect<?> query = ObjectSelect.query(Object.class, qualifier); query.entityName(rootEntityName); - query.setRoot(root); List<Ordering> orderings = this.getOrderings(); if (orderings != null && !orderings.isEmpty()) { diff --git a/cayenne/src/main/java/org/apache/cayenne/query/AbstractQuery.java b/cayenne/src/main/java/org/apache/cayenne/query/AbstractQuery.java deleted file mode 100644 index f3dfa8fa5..000000000 --- a/cayenne/src/main/java/org/apache/cayenne/query/AbstractQuery.java +++ /dev/null @@ -1,100 +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.map.DataMap; -import org.apache.cayenne.map.DbEntity; -import org.apache.cayenne.map.EntityResolver; -import org.apache.cayenne.map.ObjEntity; -import org.apache.cayenne.map.Procedure; -import org.apache.cayenne.util.ToStringBuilder; - -/** - * A common superclass of Cayenne queries. - */ -public abstract class AbstractQuery extends CacheableQuery { - - /** - * The root object this query. May be an entity name, Java class, ObjEntity or - * DbEntity, depending on the specific query and how it was constructed. - */ - protected Object root; - - /** - * Returns default select parameters. - * - * @since 1.2 - */ - public QueryMetadata getMetaData(EntityResolver resolver) { - BaseQueryMetadata md = new BaseQueryMetadata(); - md.resolve(getRoot(), resolver); - return md; - } - - /** - * Returns the root of this query. - */ - public Object getRoot() { - return root; - } - - /** - * Sets the root of the query - * - * @param value The new root - * @throws IllegalArgumentException if value is not a String, ObjEntity, DbEntity, - * Procedure, DataMap, Class or null. - */ - public void setRoot(Object value) { - if (value == null) { - this.root = null; - } - - // sanity check - if (!((value instanceof String) - || (value instanceof ObjEntity) - || (value instanceof DbEntity) - || (value instanceof Class) - || (value instanceof Procedure) || (value instanceof DataMap))) { - - String rootClass = (value != null) ? value.getClass().getName() : "null"; - - throw new IllegalArgumentException( - getClass().getName() - + ": \"setRoot(..)\" takes a DataMap, String, ObjEntity, DbEntity, Procedure, " - + "or Class. It was passed a " - + rootClass); - } - - this.root = value; - } - - @Override - public String toString() { - return new ToStringBuilder(this) - .append("root", root) - .toString(); - } - - /** - * @since 1.2 - */ - public abstract SQLAction createSQLAction(SQLActionVisitor visitor); -} diff --git a/cayenne/src/main/java/org/apache/cayenne/query/FluentSelect.java b/cayenne/src/main/java/org/apache/cayenne/query/FluentSelect.java index e7cfb1512..73d2517d7 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/FluentSelect.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/FluentSelect.java @@ -41,7 +41,7 @@ import org.apache.cayenne.map.ObjEntity; * * @since 4.0 */ -public abstract class FluentSelect<T, S extends FluentSelect<T, S>> extends AbstractQuery implements Select<T> { +public abstract class FluentSelect<T, S extends FluentSelect<T, S>> extends CacheableQuery implements Select<T> { // root protected Class<?> entityType; 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 5e07d4bee..3d30c1358 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/ProcedureQuery.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/ProcedureQuery.java @@ -19,8 +19,12 @@ package org.apache.cayenne.query; +import org.apache.cayenne.map.DataMap; +import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.EntityResolver; +import org.apache.cayenne.map.ObjEntity; import org.apache.cayenne.map.Procedure; +import org.apache.cayenne.util.ToStringBuilder; import java.util.ArrayList; import java.util.Collection; @@ -50,7 +54,7 @@ import java.util.Map; * {@link org.apache.cayenne.access.DataContext#performGenericQuery(Query)}. * </p> */ -public class ProcedureQuery extends AbstractQuery { +public class ProcedureQuery extends CacheableQuery { public static final String COLUMN_NAME_CAPITALIZATION_PROPERTY = "cayenne.ProcedureQuery.columnNameCapitalization"; @@ -61,6 +65,49 @@ public class ProcedureQuery extends AbstractQuery { ProcedureQueryMetadata metaData = new ProcedureQueryMetadata(); protected List<ProcedureColumn[]> resultDescriptors; + /** + * The root object of this query. May be an entity name, Java class, ObjEntity or + * DbEntity, depending on the specific query and how it was constructed. + */ + protected Object root; + + /** + * Returns the root of this query. + */ + public Object getRoot() { + return root; + } + + /** + * Sets the root of the query. + * + * @param value The new root + * @throws IllegalArgumentException if value is not a String, ObjEntity, DbEntity, + * Procedure, DataMap, Class or null. + */ + public void setRoot(Object value) { + if (value != null && !(value instanceof String + || value instanceof ObjEntity + || value instanceof DbEntity + || value instanceof Class + || value instanceof Procedure + || value instanceof DataMap)) { + + throw new IllegalArgumentException(("%s: \"setRoot(..)\" takes a DataMap, String, ObjEntity, DbEntity, " + + "Procedure, or Class. It was passed a %s") + .formatted(getClass().getName(), value.getClass().getName())); + } + + this.root = value; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("root", root) + .toString(); + } + /** * Creates an empty procedure query. The query would fetch DataRows. Fetching * Persistent objects can be achieved either by using 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 157541adb..980bcd34f 100644 --- a/cayenne/src/main/java/org/apache/cayenne/query/SQLTemplate.java +++ b/cayenne/src/main/java/org/apache/cayenne/query/SQLTemplate.java @@ -25,7 +25,9 @@ import org.apache.cayenne.map.DataMap; import org.apache.cayenne.map.DbEntity; import org.apache.cayenne.map.EntityResolver; import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.map.Procedure; import org.apache.cayenne.map.SQLResult; +import org.apache.cayenne.util.ToStringBuilder; import java.util.ArrayList; import java.util.Arrays; @@ -65,7 +67,7 @@ import java.util.stream.Stream; * * @since 1.1 */ -public class SQLTemplate extends AbstractQuery { +public class SQLTemplate extends CacheableQuery { private static final long serialVersionUID = -3073521388289663641L; @@ -116,14 +118,47 @@ public class SQLTemplate extends AbstractQuery { Collections.addAll(resultColumnsTypes, types); } - @Override + /** + * The root object of this query. May be an entity name, Java class, ObjEntity or + * DbEntity, depending on how the query was constructed. Null root is allowed. + */ + protected Object root; + + /** + * Returns the root of this query. + */ + public Object getRoot() { + return root; + } + + /** + * Sets the root of the query. + * + * @param value The new root + * @throws IllegalArgumentException if value is not a String, ObjEntity, DbEntity, + * Procedure, DataMap, Class or null. + */ public void setRoot(Object value) { - // allow null root... - if (value == null) { - this.root = null; - } else { - super.setRoot(value); + if (value != null && !(value instanceof String + || value instanceof ObjEntity + || value instanceof DbEntity + || value instanceof Class + || value instanceof Procedure + || value instanceof DataMap)) { + + throw new IllegalArgumentException(("%s: \"setRoot(..)\" takes a DataMap, String, ObjEntity, DbEntity, " + + "Procedure, or Class. It was passed a %s") + .formatted(getClass().getName(), value.getClass().getName())); } + + this.root = value; + } + + @Override + public String toString() { + return new ToStringBuilder(this) + .append("root", root) + .toString(); } @Override 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 92ba8fa45..69815aac9 100644 --- a/cayenne/src/test/java/org/apache/cayenne/map/SelectQueryDescriptorTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/map/SelectQueryDescriptorTest.java @@ -47,7 +47,7 @@ public class SelectQueryDescriptorTest { builder.setRoot(entity); assertTrue(builder.buildQuery() instanceof ObjectSelect); - assertSame(entity, builder.buildQuery().getRoot()); + assertEquals(entity.getName(), builder.buildQuery().getEntityName()); } @Test diff --git a/cayenne/src/test/java/org/apache/cayenne/query/AbstractQueryTest.java b/cayenne/src/test/java/org/apache/cayenne/query/AbstractQueryTest.java deleted file mode 100644 index e260d91df..000000000 --- a/cayenne/src/test/java/org/apache/cayenne/query/AbstractQueryTest.java +++ /dev/null @@ -1,65 +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.map.ObjEntity; -import org.apache.cayenne.testdo.testmap.Artist; -import org.junit.jupiter.api.Test; - -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertSame; -import static org.junit.jupiter.api.Assertions.assertThrows; - -public class AbstractQueryTest { - - @Test - public void setRootEntityName() { - AbstractQuery query = new MockAbstractQuery(); - assertNull(query.getRoot()); - query.setRoot("SomeEntity"); - assertSame("SomeEntity", query.getRoot()); - } - - @Test - public void setRootObjEntity() { - AbstractQuery query = new MockAbstractQuery(); - - assertNull(query.getRoot()); - ObjEntity e = new ObjEntity("ABC"); - query.setRoot(e); - assertSame(e, query.getRoot()); - } - - @Test - public void setRootClass() { - AbstractQuery query = new MockAbstractQuery(); - assertNull(query.getRoot()); - query.setRoot(Artist.class); - assertSame(Artist.class, query.getRoot()); - } - - @Test - public void setInvalidRoot() { - AbstractQuery query = new MockAbstractQuery(); - assertNull(query.getRoot()); - assertThrows(IllegalArgumentException.class, () -> query.setRoot(1)); - } -} diff --git a/cayenne/src/test/java/org/apache/cayenne/query/MockAbstractQuery.java b/cayenne/src/test/java/org/apache/cayenne/query/MockAbstractQuery.java deleted file mode 100644 index c56510665..000000000 --- a/cayenne/src/test/java/org/apache/cayenne/query/MockAbstractQuery.java +++ /dev/null @@ -1,38 +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; - - -public class MockAbstractQuery extends AbstractQuery { - - public MockAbstractQuery() { - - } - - @Override - public SQLAction createSQLAction(SQLActionVisitor visitor) { - return null; - } - - @Override - protected BaseQueryMetadata getBaseMetaData() { - return null; - } -} 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 167e75895..e37b3a26b 100644 --- a/cayenne/src/test/java/org/apache/cayenne/query/ProcedureQueryTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/query/ProcedureQueryTest.java @@ -19,16 +19,38 @@ package org.apache.cayenne.query; +import org.apache.cayenne.map.Procedure; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertSame; +import static org.junit.jupiter.api.Assertions.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; public class ProcedureQueryTest { + @Test + public void setRootProcedureName() { + ProcedureQuery query = new ProcedureQuery("SomeProcedure"); + assertSame("SomeProcedure", query.getRoot()); + } + + @Test + public void setRootProcedure() { + Procedure procedure = new Procedure("ABC"); + ProcedureQuery query = new ProcedureQuery(procedure); + assertSame(procedure, query.getRoot()); + } + + @Test + public void setInvalidRoot() { + ProcedureQuery query = new ProcedureQuery(); + assertNull(query.getRoot()); + assertThrows(IllegalArgumentException.class, () -> query.setRoot(1)); + } + @Test public void columnNameCapitalization() { ProcedureQuery q1 = new ProcedureQuery(); diff --git a/cayenne/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java b/cayenne/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java index 95d1212e7..0cdbd4c83 100644 --- a/cayenne/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java +++ b/cayenne/src/test/java/org/apache/cayenne/query/SQLTemplateTest.java @@ -23,6 +23,7 @@ import static org.junit.jupiter.api.Assertions.assertFalse; 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.assertThrows; import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.Mockito.mock; @@ -32,11 +33,56 @@ import java.util.HashMap; import java.util.Map; import org.apache.cayenne.map.EntityResolver; +import org.apache.cayenne.map.ObjEntity; +import org.apache.cayenne.testdo.testmap.Artist; import org.apache.cayenne.util.Util; import org.junit.jupiter.api.Test; public class SQLTemplateTest { + @Test + public void setRootEntityName() { + SQLTemplate query = new SQLTemplate(); + assertNull(query.getRoot()); + + query.setRoot("SomeEntity"); + assertSame("SomeEntity", query.getRoot()); + } + + @Test + public void setRootObjEntity() { + SQLTemplate query = new SQLTemplate(); + assertNull(query.getRoot()); + + ObjEntity e = new ObjEntity("ABC"); + query.setRoot(e); + assertSame(e, query.getRoot()); + } + + @Test + public void setRootClass() { + SQLTemplate query = new SQLTemplate(); + assertNull(query.getRoot()); + + query.setRoot(Artist.class); + assertSame(Artist.class, query.getRoot()); + } + + @Test + public void setRootNull() { + SQLTemplate query = new SQLTemplate(); + query.setRoot("SomeEntity"); + + query.setRoot(null); + assertNull(query.getRoot()); + } + + @Test + public void setInvalidRoot() { + SQLTemplate query = new SQLTemplate(); + assertThrows(IllegalArgumentException.class, () -> query.setRoot(1)); + } + @Test public void setParams() throws Exception { SQLTemplate query = new SQLTemplate();
