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 6c6b966b EMPIREDB-412 DBColumnJoinExpr copy and concat
6c6b966b is described below

commit 6c6b966b23b9f9fb5bc77975ae352710e8796b0b
Author: Rainer Döbele <[email protected]>
AuthorDate: Mon May 15 15:24:50 2023 +0200

    EMPIREDB-412
    DBColumnJoinExpr copy and concat
---
 .../main/java/org/apache/empire/db/DBCmpType.java  | 41 +++++++++++++++
 .../main/java/org/apache/empire/db/DBCommand.java  | 13 ++---
 .../empire/db/expr/column/DBParenthesisExpr.java   | 12 +++++
 .../empire/db/expr/compare/DBCompareAndOrExpr.java | 12 +++++
 .../empire/db/expr/compare/DBCompareColExpr.java   | 12 +++++
 .../empire/db/expr/join/DBColumnJoinExpr.java      | 58 ++++++++++++++++------
 6 files changed, 125 insertions(+), 23 deletions(-)

diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCmpType.java 
b/empire-db/src/main/java/org/apache/empire/db/DBCmpType.java
index bb1121c1..cfa6fe2f 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCmpType.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCmpType.java
@@ -58,4 +58,45 @@ public enum DBCmpType
             default: return DBCmpType.NULL;
         }
     }
+    
+    /**
+     * For Debugging only
+     */
+    @Override
+    public String toString()
+    {
+        switch (this)
+        {
+            case EQUAL:
+                return "=";
+            case NOTEQUAL:
+                return "<>";
+            case LESSTHAN:
+                return "<";
+            case MOREOREQUAL:
+                return ">=";
+            case GREATERTHAN:
+                return ">";
+            case LESSOREQUAL:
+                return "<=";
+            case LIKE:
+                return " LIKE ";
+            case NOTLIKE:
+                return " NOT LIKE ";
+            case NULL:
+                return " IS NULL";
+            case NOTNULL:
+                return " IS NOT NULL";
+            case BETWEEN:
+                return " BETWEEN ";
+            case NOTBETWEEN:
+                return " NOT BETWEEN ";
+            case IN:
+                return " IN ";
+            case NOTIN:
+                return " NOT IN ";
+            default:
+                return " ";
+        }
+    }
 }
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 5540fae6..27ed8ab2 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
@@ -800,8 +800,6 @@ public abstract class DBCommand extends DBCommandExpr
             throw new InvalidArgumentException("left|right", left);
         if (left.getSourceColumn().getRowSet()==right.getRowSet())
             throw new InvalidArgumentException("rowset", 
left.getSourceColumn().getRowSet().getName()+"|"+right.getRowSet().getName());
-        // create the expression
-        DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, joinType);
         // additional constraints
         DBCompareExpr where = null;
         for (int i=0; i<addlConstraints.length; i++)
@@ -812,9 +810,8 @@ public abstract class DBCommand extends DBCommandExpr
             // Chain with previouss
             where = (where!=null ? where.and(cmpExpr) : cmpExpr);
         }
-        if (where!=null)
-            join.where(where);
-        // done
+        // create the expression
+        DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, joinType, 
where);
         join(join);
         return this;
     }
@@ -837,7 +834,6 @@ public abstract class DBCommand extends DBCommandExpr
         /*
          * TODO: Find a better solution / Make DBColumnJoinExpr multi-column
          */
-        DBColumnJoinExpr join = new DBColumnJoinExpr(left[0], right[0], 
joinType);
         // compare the columns except the first
         DBCompareExpr where = null;
         for (int i=1; i<left.length; i++)
@@ -851,9 +847,8 @@ public abstract class DBCommand extends DBCommandExpr
             DBCompareExpr cmpExpr = addlConstraints[i];
             where = (where!=null ? where.and(cmpExpr) : cmpExpr);
         }
-        if (where!=null)
-            join.where(where);
-        // done
+        // create the expression
+        DBColumnJoinExpr join = new DBColumnJoinExpr(left[0], right[0], 
joinType, where);
         join(join);
         return this;
     }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBParenthesisExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBParenthesisExpr.java
index 796fb66d..5aec9d3c 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBParenthesisExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBParenthesisExpr.java
@@ -189,6 +189,18 @@ public class DBParenthesisExpr extends DBColumnExpr 
implements Unwrappable<DBCol
         wrapped.addSQL(sql, context); // |CTX_NOPARENTHESES
         sql.append(")");
     }
+    
+    /**
+     * For Debugging
+     */
+    @Override
+    public String toString()
+    {
+        StringBuilder b = new StringBuilder("(");
+        b.append(wrapped.toString());
+        b.append(")");
+        return b.toString();
+    }
 
     /**
      * This function set the alias name to the XML tag.
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 b293b3b3..5fb9ce78 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
@@ -161,6 +161,18 @@ public class DBCompareAndOrExpr extends DBCompareExpr
             sql.append(")");
     }
     
+    /**
+     * For Debugging
+     */
+    @Override
+    public String toString()
+    {
+        StringBuilder b = new StringBuilder(left.toString());
+        b.append((or ? " OR " : " AND "));
+        b.append(right.toString());
+        return b.toString();
+    }
+   
     /**
      * 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 eac1cd65..855e1419 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
@@ -293,6 +293,18 @@ public class DBCompareColExpr extends DBCompareExpr
         // Add Comparison Value
         addCompareExpr(sql, context);
     }
+    
+    /**
+     * For Debugging
+     */
+    @Override
+    public String toString()
+    {
+        StringBuilder b = new StringBuilder(expr.toString());
+        b.append(cmpop.toString());
+        b.append(value.toString());
+        return b.toString();
+    }
 
     /**
      * Returns whether the constraint should replace another one or not.
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
index b5ffc51c..c2536b94 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
@@ -39,22 +39,38 @@ public class DBColumnJoinExpr extends DBJoinExpr
     protected DBColumnExpr  right;
 
     // Additional
-    public DBCompareExpr compExpr = null;
+    public DBCompareExpr compExpr; // should be final but still used by where()
 
     /**
-     * Constructs a new DBJoinExpr object initialize this object with
-     * the left and right column and the data type of the join
-     * expression.
+     * Constructs a join expression based on two columns or column expressions
      * 
      * @param left left value
      * @param right right value
      * @param type data type (JOIN_INNER, JOIN_LEFT or JOIN_RIGHT)
+     * @param addlConstraint additional constraint
      */
-    public DBColumnJoinExpr(DBColumnExpr left, DBColumnExpr right, DBJoinType 
type)
+    public DBColumnJoinExpr(DBColumnExpr left, DBColumnExpr right, DBJoinType 
type, DBCompareExpr addlConstraint)
     {
         super(type);
         this.left = left;
         this.right = right;
+        this.compExpr = addlConstraint;
+    }
+
+    public DBColumnJoinExpr(DBColumnExpr left, DBColumnExpr right, DBJoinType 
type)
+    {
+        this(left, right, type, null);
+    }
+    
+    /**
+     * Copy and concat constructor
+     * 
+     * @param joinExpr the original joinExpr
+     * @param addlContraint additional constraint
+     */
+    public DBColumnJoinExpr(DBColumnJoinExpr joinExpr, DBCompareExpr 
addlConstraint)
+    {
+        this(joinExpr.left, joinExpr.right, joinExpr.type, 
(joinExpr.compExpr!=null ? joinExpr.compExpr.and(addlConstraint) : 
addlConstraint));
     }
 
     /**
@@ -190,8 +206,7 @@ public class DBColumnJoinExpr extends DBJoinExpr
         if (this.compExpr==null)
             return this; // not necessary
         // Copy compareExpr 
-        DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, type);       
-        join.compExpr = compExpr.copy(newCmd);
+        DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, type, 
compExpr.copy(newCmd));       
         return join;
     }
 
@@ -210,8 +225,8 @@ public class DBColumnJoinExpr extends DBJoinExpr
      * @param expr the compare expression
      */
     public void where(DBCompareExpr expr)
-    { // Set Compare Expression
-        compExpr = expr;
+    {   // Set Compare Expression
+        this.compExpr = expr;
     }
 
     /**
@@ -222,11 +237,9 @@ public class DBColumnJoinExpr extends DBJoinExpr
      */
     public DBColumnJoinExpr and(DBCompareExpr expr)
     {   // Add Compare Expression
-        if (compExpr==null)
-            compExpr = expr;
-        else
-            compExpr = compExpr.and(expr);
-        return this;
+        if (expr==null || expr.equals(this.compExpr))
+            return this; // no change
+        return new DBColumnJoinExpr(this, expr);
     }
 
     /**
@@ -285,6 +298,23 @@ public class DBColumnJoinExpr extends DBJoinExpr
             }
         }
     }
+    
+    /**
+     * For Debugging
+     */
+    @Override
+    public String toString()
+    {
+        StringBuilder b = new StringBuilder(left.toString());
+        b.append("=");
+        b.append(right.toString());
+        if (this.compExpr!=null)
+        {
+            b.append(" AND ");
+            b.append(this.compExpr.toString());
+        }
+        return b.toString();
+    }
 
     /**
      * Compares two DBJoinExpr objects.

Reply via email to