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;
+    }
 }

Reply via email to