This is an automated email from the ASF dual-hosted git repository.
doebele pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/empire-db.git
The following commit(s) were added to refs/heads/master by this push:
new 1f0f5e16 EMPIREDB-393 merge subquery params from where constraints
1f0f5e16 is described below
commit 1f0f5e1661979ff93279d60a38d590fdd7d09232
Author: Rainer Döbele <[email protected]>
AuthorDate: Tue Aug 16 15:50:50 2022 +0200
EMPIREDB-393
merge subquery params from where constraints
---
.../java/org/apache/empire/commons/ObjectUtils.java | 19 +++++++++++++++++++
.../src/main/java/org/apache/empire/db/DBCommand.java | 14 +++++++++++++-
.../main/java/org/apache/empire/db/DBCommandExpr.java | 18 +++++++++++++++---
.../empire/db/expr/compare/DBCompareAndOrExpr.java | 12 ++++++++++++
.../empire/db/expr/compare/DBCompareColExpr.java | 14 ++++++++++++++
.../apache/empire/db/expr/compare/DBCompareExpr.java | 7 +++++++
.../empire/db/expr/compare/DBCompareNotExpr.java | 10 ++++++++++
.../db/expr/compare/DBCompareParenthesisExpr.java | 11 +++++++++++
.../apache/empire/db/expr/compare/DBExistsExpr.java | 13 ++++++++++++-
.../apache/empire/dbms/postgresql/PostgresAtAt.java | 6 ++++++
10 files changed, 119 insertions(+), 5 deletions(-)
diff --git a/empire-db/src/main/java/org/apache/empire/commons/ObjectUtils.java
b/empire-db/src/main/java/org/apache/empire/commons/ObjectUtils.java
index f871f819..93df3679 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/ObjectUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/ObjectUtils.java
@@ -27,6 +27,7 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeParseException;
import java.time.temporal.Temporal;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.List;
@@ -1079,4 +1080,22 @@ public final class ObjectUtils
{
return (indexOf(array, item)>=0);
}
+
+ /**
+ * combines two arrays
+ * @param left
+ * @param right
+ * @return the combined array
+ */
+ public static <T> T[] combine(T[] left, T[] right)
+ {
+ if (left==null || left.length==0)
+ return right;
+ if (right==null || right.length==0)
+ return left;
+ // combine both
+ T[] result = Arrays.copyOf(left, left.length + right.length);
+ System.arraycopy(right, 0, result, left.length, right.length);
+ return result;
+ }
}
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
index 9aebd367..7a9a405a 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
@@ -1761,7 +1761,7 @@ public abstract class DBCommand extends DBCommandExpr
resetParamUsage();
StringBuilder buf = new StringBuilder("DELETE ");
// joins or simple
- if (joins!=null && !joins.isEmpty())
+ if (joins!=null && !joins.isEmpty())
{ // delete with joins
addDeleteWithJoins(buf, table);
}
@@ -1923,6 +1923,18 @@ public abstract class DBCommand extends DBCommandExpr
{
addWhere(buf, CTX_DEFAULT);
}
+
+ @Override
+ protected void addSqlExpr(StringBuilder buf, DBExpr expr, long context)
+ {
+ // append
+ super.addSqlExpr(buf, expr, context);
+ // check for DBCompareExpr
+ if (expr instanceof DBCompareExpr)
+ { // merge
+ mergeSubqueryParams(((DBCompareExpr)expr).getSubqueryParams());
+ }
+ }
protected void addGrouping(StringBuilder buf)
{
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
b/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
index 9a8beb71..bb563738 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
@@ -614,7 +614,7 @@ public abstract class DBCommandExpr extends DBExpr
/**
* Internally used to build a string from a list of database expressions
* @param buf the sql target buffer
- * @param list list of database objects
+ * @param list the list of expressions to add to the sql
* @param context the sql command context
* @param separator string to use as separator between list items
*/
@@ -624,10 +624,22 @@ public abstract class DBCommandExpr extends DBExpr
{ // assemble select columns
if (i > 0)
buf.append(separator);
- list.get(i).addSQL(buf, context);
+ // append
+ addSqlExpr(buf, list.get(i), context);
}
}
-
+
+ /**
+ * Internally used to append a single DBExpr to a sql command builder
+ * @param buf the sql target buffer
+ * @param expr the expression to append
+ * @param context the sql command context
+ */
+ protected void addSqlExpr(StringBuilder buf, DBExpr expr, long context)
+ {
+ expr.addSQL(buf, context);
+ }
+
/**
* Create the insert into SQL-Command which copies data
* from a select statement to a destination table.
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
index 937103ad..dca8d567 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
@@ -159,6 +159,18 @@ public class DBCompareAndOrExpr extends DBCompareExpr
if (parenthesis)
buf.append(")");
}
+
+ /**
+ * Returns the subquery params if the two expressions to be combined
+ * @return the subquery params or null
+ */
+ @Override
+ public Object[] getSubqueryParams()
+ {
+ Object[] lParams = left.getSubqueryParams();
+ Object[] rParams = right.getSubqueryParams();
+ return ObjectUtils.combine(lParams, rParams);
+ }
/**
* Returns whether the constraint should replace another one or not.
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
index 77f12a34..3936dc99 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
@@ -27,6 +27,7 @@ import org.apache.empire.db.DBCmpType;
import org.apache.empire.db.DBColumn;
import org.apache.empire.db.DBColumnExpr;
import org.apache.empire.db.DBCommand;
+import org.apache.empire.db.DBCommandExpr;
import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBExpr;
import org.apache.empire.db.expr.column.DBAliasExpr;
@@ -291,6 +292,19 @@ public class DBCompareColExpr extends DBCompareExpr
addCompareExpr(buf, context);
}
+ /**
+ * Returns the subquery params if the comparison value is a DBCommand
expression
+ * @return the subquery params or null
+ */
+ @Override
+ public Object[] getSubqueryParams()
+ {
+ if (value instanceof DBCommandExpr)
+ return ((DBCommandExpr)value).getParamValues();
+ // nothing
+ return null;
+ }
+
/**
* Returns whether the constraint should replace another one or not.
*
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
index 40a33957..88a4dcf1 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
@@ -77,4 +77,11 @@ public abstract class DBCompareExpr extends DBExpr
*/
public abstract DBCompareExpr copy(DBCommand newCmd);
+ /**
+ * Returns the subquery Params
+ * Valid only directly after addSQL() has been called!
+ * @return the subquery params;
+ */
+ public abstract Object[] getSubqueryParams();
+
}
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
index f2fd63d1..87977a35 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
@@ -122,6 +122,16 @@ public class DBCompareNotExpr extends DBCompareExpr
expr.addSQL(buf, context);
buf .append(" )");
}
+
+ /**
+ * Returns the subquery params if the compare expression
+ * @return the subquery params or null
+ */
+ @Override
+ public Object[] getSubqueryParams()
+ {
+ return expr.getSubqueryParams();
+ }
/**
* Returns whether the constraint should replace another one or not.
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareParenthesisExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareParenthesisExpr.java
index f9645167..72156628 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareParenthesisExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareParenthesisExpr.java
@@ -89,4 +89,15 @@ public class DBCompareParenthesisExpr extends DBCompareExpr
implements Unwrappab
wrapped.addSQL(buf, context|CTX_NOPARENTHESES);
buf.append(")");
}
+
+ /**
+ * Returns the subquery params if the compare expression
+ * @return the subquery params or null
+ */
+ @Override
+ public Object[] getSubqueryParams()
+ {
+ return wrapped.getSubqueryParams();
+ }
+
}
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
index 9b9953d0..de033fec 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
@@ -148,7 +148,18 @@ public class DBExistsExpr extends DBCompareExpr
}
buf.append(") ");
}
-
+
+ /**
+ * Returns the subquery params if the compare expression
+ * @return the subquery params or null
+ */
+ @Override
+ public Object[] getSubqueryParams()
+ {
+ // none
+ return cmd.getParamValues();
+ }
+
/**
* Returns wheter the constraint should replace another one or not.
* @return true it the constraints are mutually exclusive or false
otherwise
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresAtAt.java
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresAtAt.java
index abd52765..0492d195 100644
---
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresAtAt.java
+++
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresAtAt.java
@@ -92,4 +92,10 @@ public class PostgresAtAt extends DBCompareExpr
buf.append(" @@ ");
this.right.addSQL(buf, context);
}
+
+ @Override
+ public Object[] getSubqueryParams()
+ {
+ return null;
+ }
}