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 ea1170aa EMPIREDB-402 Improved Join definition allowing the on(...) 
syntax
ea1170aa is described below

commit ea1170aac7eedb3d0c29302ff7fe8b63d9b6400d
Author: Rainer Döbele <[email protected]>
AuthorDate: Thu Mar 2 15:08:39 2023 +0100

    EMPIREDB-402
    Improved Join definition allowing the on(...) syntax
---
 .../empire/samples/db/advanced/SampleAdvApp.java   |  2 +-
 .../org/apache/empire/samples/db/SampleApp.java    | 14 +++----
 .../java/org/apache/empire/db/DBColumnExpr.java    | 17 +++++++++
 .../main/java/org/apache/empire/db/DBCommand.java  | 44 +++++++++++++---------
 .../empire/db/expr/join/DBColumnJoinExpr.java      | 31 +++++++++++++--
 .../empire/db/expr/join/DBCompareJoinExpr.java     | 10 +++++
 .../empire/db/expr/join/DBCrossJoinExpr.java       | 10 +++++
 .../org/apache/empire/db/expr/join/DBJoinExpr.java |  6 +++
 8 files changed, 105 insertions(+), 29 deletions(-)

diff --git 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
index 489a2822..10081ee8 100644
--- 
a/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
+++ 
b/empire-db-examples/empire-db-example-advanced/src/main/java/org/apache/empire/samples/db/advanced/SampleAdvApp.java
@@ -376,7 +376,7 @@ public class SampleAdvApp
            .select  (SALES.MODEL_ID.count(), SALES.PRICE.avg())
            .select  
(SALES.PRICE.avg().minus(MODEL.BASE_PRICE.avg()).round(2).as("DIFFERENCE"))
            .join    (MODEL.WMI, BRAND.WMI)
-           .joinLeft(MODEL.ID, SALES.MODEL_ID, SALES.YEAR.is(2021))  // only 
year 2021
+           .joinLeft(MODEL.ID.on(SALES.MODEL_ID).and(SALES.YEAR.is(2021)))  // 
only year 2021
            .where   (MODEL.ENGINE_TYPE.in(EngineType.P, EngineType.H, 
EngineType.E)) // Petrol, Hybrid, Electric
            .where   (MODEL.BASE_PRICE.isGreaterThan(30000))
            .groupBy (BRAND.NAME, MODEL.SPECIFICATION, MODEL.BASE_PRICE)
diff --git 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
index c7e6d88f..97cdee2c 100644
--- 
a/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
+++ 
b/empire-db-examples/empire-db-example-basic/src/main/java/org/apache/empire/samples/db/SampleApp.java
@@ -483,8 +483,8 @@ public class SampleApp
            .selectQualified(DEP.NAME) // "DEPARMENT_NAME"
            .select(DEP.BUSINESS_UNIT) // "BUSINESS_UNIT" 
            // Joins
-           .join(EMP.DEPARTMENT_ID, DEP.ID)
-           .joinLeft(EMP.ID, PAY.EMPLOYEE_ID, PAY.YEAR.is(lastYear))
+           .join(EMP.DEPARTMENT_ID.on(DEP.ID))
+           .joinLeft(EMP.ID.on(PAY.EMPLOYEE_ID).and(PAY.YEAR.is(lastYear)))
            // Where constraints
            .where(EMP.LAST_NAME.length().isGreaterThan(0))  // always true, 
just for show
            .where(EMP.GENDER.in(Gender.M, Gender.F))        // always true, 
just for show
@@ -609,7 +609,7 @@ public class SampleApp
         DBColumnExpr DEP_TOTAL = PAY.AMOUNT.sum().as("DEP_TOTAL");
         DBCommand cmdDepTotal  = context.createCommand()
            .select(EMP.DEPARTMENT_ID, DEP_TOTAL)
-           .join  (PAY.EMPLOYEE_ID, EMP.ID)
+           .join  (PAY.EMPLOYEE_ID.on(EMP.ID))
            .where (PAY.YEAR.is(lastYear))
            .groupBy(EMP.DEPARTMENT_ID);
         DBQuery Q_DEP_TOTAL = new DBQuery(cmdDepTotal, "qdt");
@@ -622,10 +622,10 @@ public class SampleApp
            .select(Q_EMP_TOTAL.column(EMP_TOTAL))
            .select(PCT_OF_DEP_COST.as("PCT_OF_DEPARTMENT_COST"))
            // join Employee with Department
-           .join(EMP.DEPARTMENT_ID, DEP.ID)
+           .join(EMP.DEPARTMENT_ID.on(DEP.ID))
            // Join with Subqueries
-           .joinLeft(EMP.ID, Q_EMP_TOTAL.column(PAY.EMPLOYEE_ID))
-           .joinLeft(DEP.ID, Q_DEP_TOTAL.column(EMP.DEPARTMENT_ID))
+           .joinLeft(EMP.ID.on(Q_EMP_TOTAL.column(PAY.EMPLOYEE_ID)))
+           .joinLeft(DEP.ID.on(Q_DEP_TOTAL.column(EMP.DEPARTMENT_ID)))
            // Order by
            .orderBy(DEP.NAME.desc())
            .orderBy(EMP.LAST_NAME);
@@ -671,7 +671,7 @@ public class SampleApp
          * Test RecordList
          */
         DBCommand cmd = context.createCommand();
-        cmd.join(EMP.DEPARTMENT_ID, DEP.ID);
+        cmd.join(EMP.DEPARTMENT_ID.on(DEP.ID));
         cmd.where(DEP.NAME.is("Development"));
         // query now
         List<DBRecordBean> list = context.getUtils().queryRecordList(cmd, EMP, 
DBRecordBean.class);
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java
index 201b50ed..f9bd0428 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBColumnExpr.java
@@ -44,9 +44,11 @@ import org.apache.empire.db.expr.column.DBParenthesisExpr;
 import org.apache.empire.db.expr.column.DBValueExpr;
 import org.apache.empire.db.expr.compare.DBCompareColExpr;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
+import org.apache.empire.db.expr.join.DBColumnJoinExpr;
 import org.apache.empire.db.expr.order.DBOrderByExpr;
 import org.apache.empire.dbms.DBSqlPhrase;
 import org.apache.empire.exceptions.InvalidArgumentException;
+import org.apache.empire.exceptions.NotSupportedException;
 import org.w3c.dom.Element;
 
 /**
@@ -1400,6 +1402,21 @@ public abstract class DBColumnExpr extends DBExpr
         return new DBOrderByExpr(this, true);
     }
     
+    /*
+     * Joins
+     */
+    public DBColumnJoinExpr on(DBColumnExpr joinWith)
+    {
+        // Must have source column
+        if (getSourceColumn()==null)
+            throw new NotSupportedException(this, "join");
+        if (joinWith.getSourceColumn()==null)
+            throw new NotSupportedException(joinWith, "join");
+        // create the expression
+        DBColumnJoinExpr join = new DBColumnJoinExpr(this, joinWith, 
DBJoinType.INNER);
+        return join;
+    }
+    
     /*
      * Other
      */
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 7e23997b..d15ed678 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
@@ -677,14 +677,19 @@ public abstract class DBCommand extends DBCommandExpr
         // create list
         if (joins == null)
             joins = new ArrayList<DBJoinExpr>();
-        // Create a new join
+        // check join list
         for (int i = 0; i < joins.size(); i++)
-        { // Check whether join exists
+        { // Check whether join already exists
             DBJoinExpr item = joins.get(i);
             if (item.equals(join))
                 return this;
         }
         joins.add(join);
+        // Check if prepared statements are enabled
+        if (isPreparedStatementsEnabled())
+        {   // use command params
+            join.prepareCommand(this);
+        }
         return this;
     }
 
@@ -700,6 +705,16 @@ public abstract class DBCommand extends DBCommandExpr
         return join(left, right, DBJoinType.INNER, addlConstraints);
     }
 
+    /**
+     * Adds a left join to the list of join expressions.
+     * @return itself (this) 
+     */
+    public final DBCommand joinLeft(DBJoinExpr join)
+    {
+        join.setType(DBJoinType.LEFT);
+        return join(join);
+    }
+
     /**
      * Adds a left join based on two columns to the list of join expressions.
      * Added for convenience
@@ -714,6 +729,16 @@ public abstract class DBCommand extends DBCommandExpr
         return join(left, right, DBJoinType.LEFT, addlConstraints);
     }
 
+    /**
+     * Adds a left join to the list of join expressions.
+     * @return itself (this) 
+     */
+    public final DBCommand joinRight(DBJoinExpr join)
+    {
+        join.setType(DBJoinType.RIGHT);
+        return join(join);
+    }
+
     /**
      * Adds a right join based on two columns to the list of join expressions.
      * Added for convenience
@@ -753,11 +778,6 @@ public abstract class DBCommand extends DBCommandExpr
             DBCompareExpr cmpExpr = addlConstraints[i];
             if (cmpExpr==null)
                 continue;
-            // Check if prepared statements are enabled
-            if (isPreparedStatementsEnabled())
-            {   // use command params
-                cmpExpr.prepareCommand(this);
-            }
             // Chain with previouss
             where = (where!=null ? where.and(cmpExpr) : cmpExpr);
         }
@@ -792,22 +812,12 @@ public abstract class DBCommand extends DBCommandExpr
         for (int i=1; i<left.length; i++)
         {   // add to where list
             DBCompareExpr cmpExpr = right[i].is(left[i]);
-            // Check if prepared statements are enabled
-            if (isPreparedStatementsEnabled())
-            {   // use command params
-                cmpExpr.prepareCommand(this);
-            }
             where = (where!=null ? where.and(cmpExpr) : cmpExpr);
         }
         // additional constraints
         for (int i=0; i<addlConstraints.length; i++)
         {
             DBCompareExpr cmpExpr = addlConstraints[i];
-            // Check if prepared statements are enabled
-            if (isPreparedStatementsEnabled())
-            {   // use command params
-                cmpExpr.prepareCommand(this);
-            }
             where = (where!=null ? where.and(cmpExpr) : cmpExpr);
         }
         if (where!=null)
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 e48fe4c1..df04a790 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
@@ -169,6 +169,16 @@ public class DBColumnJoinExpr extends DBJoinExpr
         right = swap;
         type = DBJoinType.reversed(type); // (type * -1);
     }
+    
+    /**
+     * prepareCommand
+     */
+    @Override
+    public void prepareCommand(DBCommand cmd)
+    {
+        if (compExpr!=null)
+            compExpr.prepareCommand(cmd);
+    }
 
     /**
      * Copy Command
@@ -212,15 +222,28 @@ public class DBColumnJoinExpr extends DBJoinExpr
      * 
      * @return the object itself
      */
-    public DBJoinExpr and(DBColumnExpr c1, DBColumnExpr c2)
-    {   // Set Compare Expression
+    public DBColumnJoinExpr and(DBCompareExpr expr)
+    {   // Add Compare Expression
         if (compExpr==null)
-            compExpr = c1.is(c2);
+            compExpr = expr;
         else
-            compExpr = compExpr.and(c1.is(c2));
+            compExpr = compExpr.and(expr);
         return this;
     }
 
+    /**
+     * This function adds an additional constraint to the join.
+     * 
+     * @param c1 the first column
+     * @param c2 the second column
+     * 
+     * @return the object itself
+     */
+    public DBColumnJoinExpr and(DBColumnExpr c1, DBColumnExpr c2)
+    {   // Add Compare Expression
+        return and(c1.is(c2));
+    }
+
     /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
      */
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
index 2779ee17..93149b9b 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
@@ -87,6 +87,16 @@ public class DBCompareJoinExpr extends DBColumnJoinExpr
         this.cmp = cmp;
     }
     
+    /**
+     * prepareCommand
+     */
+    @Override
+    public void prepareCommand(DBCommand cmd)
+    {
+        cmp.prepareCommand(cmd);
+        super.prepareCommand(cmd);
+    }
+    
     /**
      * Copy Command
      * @param cmd
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCrossJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCrossJoinExpr.java
index 8e7095da..25c3f4c8 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCrossJoinExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCrossJoinExpr.java
@@ -133,6 +133,16 @@ public class DBCrossJoinExpr extends DBJoinExpr
         right = swap;
     }
     
+    /**
+     * prepareCommand
+     * Nothing to do here
+     */
+    @Override
+    public void prepareCommand(DBCommand cmd)
+    {
+        // not applicable
+    }
+
     /**
      * Copy Command
      * @param cmd
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBJoinExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBJoinExpr.java
index eb47bb02..6111935b 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBJoinExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBJoinExpr.java
@@ -102,6 +102,12 @@ public abstract class DBJoinExpr extends DBExpr
      * This function swaps the left and the right statements of the join 
expression.
      */
     public abstract void reverse();
+    
+    /**
+     * internally used for preapred statement generation
+     * @param cmd
+     */
+    public abstract void prepareCommand(DBCommand cmd); 
 
     /**
      * Copy Command

Reply via email to