This is an automated email from the ASF dual-hosted git repository.

ntimofeev 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 21e628fc0 Add generics to FluentSelect to merge identical code in 
ObjectSelect and ColumnSelect
21e628fc0 is described below

commit 21e628fc08833c04bb8e6720e26e623cbd5592f5
Author: Nikita Timofeev <[email protected]>
AuthorDate: Mon Jul 18 14:45:34 2022 +0300

    Add generics to FluentSelect to merge identical code in ObjectSelect and 
ColumnSelect
---
 .../org/apache/cayenne/query/ColumnSelect.java     | 12 ++--
 .../org/apache/cayenne/query/FluentSelect.java     | 65 +++++++++++-----------
 .../org/apache/cayenne/query/ObjectSelect.java     |  3 +-
 3 files changed, 36 insertions(+), 44 deletions(-)

diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelect.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelect.java
index 8af55e47d..c444c2783 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ColumnSelect.java
@@ -104,7 +104,6 @@ public class ColumnSelect<T> extends FluentSelect<T, 
ColumnSelect<T>> {
      * @see ColumnSelect#column(Property)
      * @see ColumnSelect#columns(Collection)
      */
-    @SuppressWarnings("unchecked")
     public ColumnSelect<Object[]> columns(Property<?>... properties) {
         if (properties.length == 0) {
             throw new IllegalArgumentException("properties must contain at 
least one element");
@@ -114,7 +113,7 @@ public class ColumnSelect<T> extends FluentSelect<T, 
ColumnSelect<T>> {
         }
         Collections.addAll(columns, properties);
         singleColumn = false;
-        return (ColumnSelect<Object[]>)this;
+        return castSelf();
     }
 
     /**
@@ -125,7 +124,6 @@ public class ColumnSelect<T> extends FluentSelect<T, 
ColumnSelect<T>> {
      * @param properties collection of properties, <b>must</b> contain at 
least one element
      * @see ColumnSelect#columns(Property[])
      */
-    @SuppressWarnings("unchecked")
     public ColumnSelect<Object[]> columns(Collection<Property<?>> properties) {
         if (properties == null){
             throw new NullPointerException("properties is null");
@@ -140,10 +138,9 @@ public class ColumnSelect<T> extends FluentSelect<T, 
ColumnSelect<T>> {
 
         columns.addAll(properties);
         singleColumn = false;
-        return (ColumnSelect<Object[]>)this;
+        return castSelf();
     }
 
-    @SuppressWarnings("unchecked")
     protected <E> ColumnSelect<E> column(Property<E> property) {
         if (this.columns == null) {
             this.columns = new ArrayList<>(1);
@@ -151,7 +148,7 @@ public class ColumnSelect<T> extends FluentSelect<T, 
ColumnSelect<T>> {
             this.columns.clear(); // if we don't clear then return type will 
be incorrect
         }
         this.columns.add(property);
-        return (ColumnSelect<E>) this;
+        return castSelf();
     }
 
     /**
@@ -281,9 +278,8 @@ public class ColumnSelect<T> extends FluentSelect<T, 
ColumnSelect<T>> {
      *
      * @since 4.2
      */
-    @SuppressWarnings("unchecked")
     public <E> ColumnSelect<E> map(Function<T, E> mapper) {
         getBaseMetaData().setResultMapper(mapper);
-        return (ColumnSelect<E>)this;
+        return castSelf();
     }
 }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
index cf024f309..8d82b3185 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/FluentSelect.java
@@ -125,12 +125,11 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
         return resetEntity(null, null, dbEntityName);
     }
 
-    @SuppressWarnings("unchecked")
     private S resetEntity(Class<?> entityType, String entityName, String 
dbEntityName) {
         this.entityType = entityType;
         this.entityName = entityName;
         this.dbEntityName = dbEntityName;
-        return (S)this;
+        return castSelf();
     }
 
     /**
@@ -159,10 +158,9 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
      *
      * @return this object
      */
-    @SuppressWarnings("unchecked")
     public S and(Expression... expressions) {
         if (expressions == null || expressions.length == 0) {
-            return (S)this;
+            return castSelf();
         }
         return and(Arrays.asList(expressions));
     }
@@ -177,10 +175,9 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
         return joinExpression(expressions, ExpressionFactory::and);
     }
 
-    @SuppressWarnings("unchecked")
     protected S joinExpression(Collection<Expression> expressions, 
Function<Collection<Expression>, Expression> joiner) {
         if (expressions == null || expressions.isEmpty()) {
-            return (S)this;
+            return castSelf();
         }
 
         Collection<Expression> all;
@@ -194,7 +191,7 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
         }
 
         setActiveExpression(joiner.apply(all));
-        return (S)this;
+        return castSelf();
     }
 
     /**
@@ -202,10 +199,9 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
      *
      * @return this object
      */
-    @SuppressWarnings("unchecked")
     public S or(Expression... expressions) {
         if (expressions == null || expressions.length == 0) {
-            return (S)this;
+            return castSelf();
         }
         return or(Arrays.asList(expressions));
     }
@@ -247,11 +243,10 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
      *
      * @return this object
      */
-    @SuppressWarnings("unchecked")
     public S orderBy(Ordering... orderings) {
 
         if (orderings == null) {
-            return (S)this;
+            return castSelf();
         }
 
         if (this.orderings == null) {
@@ -260,7 +255,7 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
 
         Collections.addAll(this.orderings, orderings);
 
-        return (S)this;
+        return castSelf();
     }
 
     /**
@@ -268,11 +263,10 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
      *
      * @return this object
      */
-    @SuppressWarnings("unchecked")
     public S orderBy(Collection<Ordering> orderings) {
 
         if (orderings == null) {
-            return (S)this;
+            return castSelf();
         }
 
         if (this.orderings == null) {
@@ -281,7 +275,7 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
 
         this.orderings.addAll(orderings);
 
-        return (S)this;
+        return castSelf();
     }
 
     /**
@@ -289,10 +283,9 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
      *
      * @return this object
      */
-    @SuppressWarnings("unchecked")
     public S prefetch(PrefetchTreeNode prefetch) {
         getBaseMetaData().mergePrefetch(prefetch);
-        return (S)this;
+        return castSelf();
     }
 
     /**
@@ -300,33 +293,30 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
      *
      * @return this object
      */
-    @SuppressWarnings("unchecked")
     public S prefetch(String path, int semantics) {
         if (path == null) {
-            return (S)this;
+            return castSelf();
         }
         getBaseMetaData().addPrefetch(path, semantics);
-        return (S)this;
+        return castSelf();
     }
 
     /**
      * Resets query fetch limit - a parameter that defines max number of 
objects
      * that should be ever be fetched from the database.
      */
-    @SuppressWarnings("unchecked")
     public S limit(int fetchLimit) {
         this.getBaseMetaData().setFetchLimit(fetchLimit);
-        return (S)this;
+        return castSelf();
     }
 
     /**
      * Resets query fetch offset - a parameter that defines how many objects
      * should be skipped when reading data from the database.
      */
-    @SuppressWarnings("unchecked")
     public S offset(int fetchOffset) {
         this.getBaseMetaData().setFetchOffset(fetchOffset);
-        return (S)this;
+        return castSelf();
     }
 
     /**
@@ -334,10 +324,9 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
      * pagination that saves memory and processing time for large lists if only
      * parts of the result are ever going to be accessed.
      */
-    @SuppressWarnings("unchecked")
     public S pageSize(int pageSize) {
         this.getBaseMetaData().setPageSize(pageSize);
-        return (S)this;
+        return castSelf();
     }
 
     /**
@@ -346,37 +335,33 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
      *
      * @see Statement#setFetchSize(int)
      */
-    @SuppressWarnings("unchecked")
     public S statementFetchSize(int size) {
         this.getBaseMetaData().setStatementFetchSize(size);
-        return (S)this;
+        return castSelf();
     }
 
     /**
      * Sets query timeout of PreparedStatement generated for this query.
      * @see Statement#setQueryTimeout(int)
      */
-    @SuppressWarnings("unchecked")
     public S queryTimeout(int timeout) {
         this.getBaseMetaData().setQueryTimeout(timeout);
-        return (S)this;
+        return castSelf();
     }
 
-    @SuppressWarnings("unchecked")
     public S cacheStrategy(QueryCacheStrategy strategy) {
         setCacheStrategy(strategy);
         setCacheGroup(null);
-        return (S)this;
+        return castSelf();
     }
 
     public S cacheStrategy(QueryCacheStrategy strategy, String cacheGroup) {
         return cacheStrategy(strategy).cacheGroup(cacheGroup);
     }
 
-    @SuppressWarnings("unchecked")
     public S cacheGroup(String cacheGroup) {
         setCacheGroup(cacheGroup);
-        return (S)this;
+        return castSelf();
     }
 
     /**
@@ -568,4 +553,16 @@ public abstract class FluentSelect<T, S extends 
FluentSelect<T, S>> extends Abst
     public void initWithProperties(Map<String, String> properties) {
         getBaseMetaData().initWithProperties(properties);
     }
+
+    /**
+     * Utility method to perform (re)cast this type, doesn't perform any 
checks, so use with caution.
+     *
+     * @return <code>this</code> casted to the type E
+     * @param <E> type to cast to
+     * @since 4.3
+     */
+    @SuppressWarnings("unchecked")
+    protected <E> E castSelf() {
+        return (E)this;
+    }
 }
diff --git 
a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java 
b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
index bea18d1f3..2e35c9593 100644
--- a/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
+++ b/cayenne-server/src/main/java/org/apache/cayenne/query/ObjectSelect.java
@@ -182,10 +182,9 @@ public class ObjectSelect<T> extends FluentSelect<T, 
ObjectSelect<T>> implements
      *
      * @return this object
      */
-    @SuppressWarnings("unchecked")
     public ObjectSelect<DataRow> fetchDataRows() {
         metaData.setFetchingDataRows(true);
-        return (ObjectSelect<DataRow>) this;
+        return castSelf();
     }
 
     /**

Reply via email to