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();
}
/**