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 70a193d  EMPIREDB-362 API cleanup and beautification
70a193d is described below

commit 70a193d4f782db541cc2b71ad243332038c75ce3
Author: Rainer Döbele <[email protected]>
AuthorDate: Sun Mar 6 18:29:18 2022 +0100

    EMPIREDB-362 API cleanup and beautification
---
 .../org/apache/empire/commons/ObjectUtils.java     |  28 +++-
 .../main/java/org/apache/empire/db/DBCommand.java  | 157 ++++++++++++++++++---
 .../empire/db/expr/compare/DBCompareAndOrExpr.java |   7 +-
 .../empire/db/expr/compare/DBCompareColExpr.java   |   5 +
 .../empire/db/expr/compare/DBCompareNotExpr.java   |   7 +-
 .../empire/dbms/postgresql/PostgresAtAt.java       |   7 +-
 .../dbms/postgresql/PostgresBoolAndOrExpr.java     |   7 +-
 7 files changed, 178 insertions(+), 40 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 68589ab..8e13af1 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
@@ -993,6 +993,33 @@ public final class ObjectUtils
         }
         return strArray;
     }
+
+    /**
+     * Checks whether a object implements the Unwrappable interface and is 
also a wrapper
+     * If the object does not Implement the Interface or is not a wrapper then 
false is returned 
+     * @param object the object to check
+     * @return true if the object is a wrapper or false otherwise
+     */
+    public static boolean isWrapper(Object object)
+    {
+        return ((object instanceof Unwrappable<?>)) && 
((Unwrappable<?>)object).isWrapper();
+    }
+
+    /**
+     * Unwraps an object implementing the Unwrappable interface
+     * If the object does not Implement the Interface or is not a wrapper then 
the object itself is returned 
+     * @param object the object to unwrap
+     * @return the unwrapped object or the object itself
+     */
+    @SuppressWarnings("unchecked")
+    public static <T> T unwrap(T object)
+    {
+        if ((object instanceof Unwrappable<?>) && 
((Unwrappable<?>)object).isWrapper())
+        {   // recursive
+            return unwrap(((Unwrappable<T>)object).unwrap());
+        }
+        return object;
+    }
     
     /**
      * returns whether or not a array contains a certain item
@@ -1052,5 +1079,4 @@ public final class ObjectUtils
     {
         return (indexOf(array, item)>=0);
     }
-    
 }
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 a8927db..71c6080 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
@@ -28,8 +28,8 @@ import java.util.Set;
 
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
-import org.apache.empire.commons.Unwrappable;
 import org.apache.empire.data.DataType;
+import org.apache.empire.db.expr.column.DBAliasExpr;
 import org.apache.empire.db.expr.compare.DBCompareAndOrExpr;
 import org.apache.empire.db.expr.compare.DBCompareColExpr;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
@@ -255,9 +255,9 @@ public abstract class DBCommand extends DBCommandExpr
         {   // DBCompareNotExpr
             removeCommandParams(((DBCompareNotExpr)cmpExpr).getExpr());
         }
-        else if ((cmpExpr instanceof Unwrappable<?>) && 
((Unwrappable<?>)cmpExpr).isWrapper())
+        else if (ObjectUtils.isWrapper(cmpExpr))
         {   // unwrap
-            
removeCommandParams((DBCompareExpr)((Unwrappable<?>)cmpExpr).unwrap());
+            removeCommandParams(ObjectUtils.unwrap(cmpExpr));
         }
        }
 
@@ -409,6 +409,28 @@ public abstract class DBCommand extends DBCommandExpr
         }
         return this;
     }
+
+    /**
+     * Makes sure all selected columns are identified by their proper names 
(qualified)
+     * @return itself (this)
+     */
+    public DBCommand qualifyAll()
+    {
+        if (select == null)
+            return this;
+        // check select expression
+        for (int i=0; i<select.size(); i++)
+        {
+            DBColumnExpr expr = select.get(i);
+            if (expr instanceof DBColumn)
+                continue; // No need to qualify
+            if (expr instanceof DBAliasExpr)
+                continue; // Already qualified
+            // qualify now
+            select.set(i, expr.qualified());
+        }
+        return this;
+    }
     
     /**
      * Returns an array of all select expressions
@@ -885,10 +907,6 @@ public abstract class DBCommand extends DBCommandExpr
         Set<DBColumn> columns = new HashSet<DBColumn>();
         for (i = 0; where != null && i < where.size(); i++)
             ((DBExpr) where.get(i)).addReferencedColumns(columns);
-        /*
-        for (i = 0; groupBy != null && i < groupBy.size(); i++)
-            ((DBExpr) groupBy.get(i)).addReferencedColumns(columns);
-        */
         for (i = 0; having != null && i < having.size(); i++)
             ((DBExpr) having.get(i)).addReferencedColumns(columns);
         // now we have all columns
@@ -1039,6 +1057,17 @@ public abstract class DBCommand extends DBCommandExpr
     }
     
     /**
+     * Checks whether the command has a constraint on a particular column 
expression
+     * @param col the column expression which to check
+     */
+    public boolean hasWhereConstraintOn(DBColumnExpr col)
+    {
+        if (where == null)
+            return false;
+        return hasConstraintOn(where, col);
+    }
+    
+    /**
      * Returns a copy of the defined joins.
      * 
      * @return the list of joins
@@ -1117,6 +1146,17 @@ public abstract class DBCommand extends DBCommandExpr
     }
     
     /**
+     * Checks whether the command has a constraint on a particular column 
expression
+     * @param col the column expression which to check
+     */
+    public boolean hasHavingConstraintOn(DBColumnExpr col)
+    {
+        if (where == null)
+            return false;
+        return hasConstraintOn(having, col);
+    }
+    
+    /**
      * Returns whether or not the command has group by set
      */
     public boolean hasGroupBy()
@@ -1133,28 +1173,49 @@ public abstract class DBCommand extends DBCommandExpr
     {
         return (this.groupBy!=null ? 
Collections.unmodifiableList(this.groupBy) : null);
     }
-
+    
     /**
-     * Adds a list of columns to the group by phrase of an sql statement.
+     * Adds a column expression to the Group By clause of an sql statement.
      * 
-     * @param exprs vararg of columns by which to group the rows
+     * @param columnExpr the column expression
      * @return itself (this)
      */
-    public DBCommand groupBy(DBColumnExpr...exprs)
+    public DBCommand groupBy(DBColumnExpr columnExpr)
     {
         if (groupBy == null)
             groupBy = new ArrayList<DBColumnExpr>();
         // Add all
+        if (columnExpr.isAggregate())
+            return this;
+        // Unwrap DBAliasExpr only
+        if (columnExpr instanceof DBAliasExpr)
+            columnExpr = ((DBAliasExpr)columnExpr).unwrap();
+        // Already present?
+        if (groupBy.contains(columnExpr))
+            return this;
+        // add
+        groupBy.add(columnExpr);
+        // done
+        return this;
+    }
+    
+    /**
+     * Adds a list of columns to the Group By clause of an sql statement.
+     * 
+     * @param exprs vararg of columns by which to group the rows
+     * @return itself (this)
+     */
+    public final DBCommand groupBy(DBColumnExpr...exprs)
+    {
         for(DBColumnExpr expr : exprs)
         {
-            if (expr.isAggregate()==false && groupBy.contains(expr)==false)
-                groupBy.add(expr);
+            groupBy(expr);
         }
         return this;
     }
 
     /**
-     * Adds a collection of columns to the group by phrase of an sql statement.
+     * Adds a collection of columns to the Group By clause of an sql statement.
      * 
      * @param columns the column expressions to add
      * @return itself (this)
@@ -1169,6 +1230,27 @@ public abstract class DBCommand extends DBCommandExpr
     }
 
     /**
+     * Adds all select expressions which are not aggregates to the Group By 
clause
+     * @return itself (this)
+     */
+    public final DBCommand groupAll()
+    {
+        clearGroupBy();
+        // check select expression
+        if (select == null)
+            return this;
+        // make a group by array
+        for (DBColumnExpr expr : select)
+        {
+            if (expr.isAggregate())
+                continue; // ignore aggregates
+            // append
+            groupBy(expr);
+        }
+        return this;
+    }
+
+    /**
      * Clears the select distinct option.
      */
     public void clearSelectDistinct()
@@ -1185,7 +1267,7 @@ public abstract class DBCommand extends DBCommandExpr
     }
 
     /**
-     * Clears the list of set expressions.
+     * Clears the Set clause
      */
     public void clearSet()
     {
@@ -1202,7 +1284,7 @@ public abstract class DBCommand extends DBCommandExpr
     }
 
     /**
-     * Clears the list of join expressions.
+     * Clears the From / Join clause
      */
     public void clearJoin()
     {
@@ -1210,7 +1292,7 @@ public abstract class DBCommand extends DBCommandExpr
     }
 
     /**
-     * Clears the list of where constraints.
+     * Removes all constraints from the Where clause
      */
     public void clearWhere()
     {
@@ -1219,7 +1301,7 @@ public abstract class DBCommand extends DBCommandExpr
     }
 
     /**
-     * Clears the list of having constraints.
+     * Removes all constraints from the Having clause
      */
     public void clearHaving()
     {
@@ -1228,7 +1310,7 @@ public abstract class DBCommand extends DBCommandExpr
     }
 
     /**
-     * Clears the list of group by constraints.
+     * Clears the Group By clause
      */
     public void clearGroupBy()
     {
@@ -1376,6 +1458,30 @@ public abstract class DBCommand extends DBCommandExpr
      * @param list the 'where' or 'having' list
      * @param col the column expression for which to remove the constraint
      */
+    protected boolean hasConstraintOn(List<DBCompareExpr> list, DBColumnExpr 
colExpr)
+    {
+        if (list == null)
+            return false;
+        for (DBCompareExpr cmp : list)
+        {   // Check whether it is a compare column expr.
+            if (!(cmp instanceof DBCompareColExpr))
+                continue;
+            // Compare columns
+            DBColumnExpr cmpCol = ((DBCompareColExpr)cmp).getColumnExpr();
+            if (ObjectUtils.compareEqual(cmpCol, colExpr))
+                return true;
+            // Update column
+            if ((colExpr instanceof DBColumn) && !(cmpCol instanceof DBColumn) 
&& colExpr.equals(colExpr.getUpdateColumn()))
+                return true;
+        }
+        return false;
+    }
+    
+    /**
+     * removes a constraint on a particular column to the 'where' or 'having' 
collections 
+     * @param list the 'where' or 'having' list
+     * @param col the column expression for which to remove the constraint
+     */
     protected void removeConstraintOn(List<DBCompareExpr> list, DBColumnExpr 
colExpr)
     {
         if (list == null)
@@ -1560,7 +1666,12 @@ public abstract class DBCommand extends DBCommandExpr
         return buf.toString();
     }
     
-    @SuppressWarnings("unchecked")
+    /**
+     * Appends all nested DBCompareColExpr for a particular RowSet to a list
+     * @param table the rowset for which to collect the DBCompareColExpr 
+     * @param expr a compare expression
+     * @param list
+     */
     protected void appendCompareColExprs(DBRowSet table, DBCompareExpr expr, 
List<DBCompareColExpr> list)
     {
         if (expr instanceof DBCompareColExpr)
@@ -1578,9 +1689,9 @@ public abstract class DBCommand extends DBCommandExpr
         {   // DBCompareNotExpr
             appendCompareColExprs(table, ((DBCompareNotExpr)expr).getExpr(),  
list);
         }
-        else if ((expr instanceof Unwrappable<?>) && 
((Unwrappable<?>)expr).isWrapper())
+        else if (ObjectUtils.isWrapper(expr))
         {   // unwrap
-            appendCompareColExprs(table, 
((Unwrappable<DBCompareExpr>)expr).unwrap(), list);
+            appendCompareColExprs(table, ObjectUtils.unwrap(expr), list);
         }
     }
 
@@ -1811,7 +1922,7 @@ public abstract class DBCommand extends DBCommandExpr
     protected void addGrouping(StringBuilder buf)
     {
         if (groupBy!=null && !groupBy.isEmpty())
-        { // Having
+        { // Group by
             buf.append("\r\nGROUP BY ");
             addListExpr(buf, groupBy, CTX_DEFAULT, ", ");
         }
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 e052054..937103a 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
@@ -20,7 +20,7 @@ package org.apache.empire.db.expr.compare;
 
 import java.util.Set;
 
-import org.apache.empire.commons.Unwrappable;
+import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
@@ -165,13 +165,12 @@ public class DBCompareAndOrExpr extends DBCompareExpr
      * 
      * @return true it the constraints are mutually exclusive or false 
otherwise
      */
-    @SuppressWarnings("unchecked")
     @Override
     public boolean isMutuallyExclusive(DBCompareExpr other)
     {
-        if ((other instanceof Unwrappable<?>) && 
((Unwrappable<?>)other).isWrapper())
+        if (ObjectUtils.isWrapper(other))
         {   // unwrap
-            other = ((Unwrappable<DBCompareExpr>)other).unwrap();
+            other = ObjectUtils.unwrap(other);
         }
        if (other instanceof DBCompareAndOrExpr)
        {   // check other
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 39c5ccf..6d38d99 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
@@ -28,6 +28,7 @@ import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBExpr;
+import org.apache.empire.db.expr.column.DBAliasExpr;
 
 
 /**
@@ -59,6 +60,10 @@ public class DBCompareColExpr extends DBCompareExpr
      */
     public DBCompareColExpr(DBColumnExpr expr, DBCmpType op, Object value)
     {
+        // unwrap DBAliasExpr only
+        if (expr instanceof DBAliasExpr)
+            expr = ((DBAliasExpr)expr).unwrap();
+        // set
         this.expr = expr;
         this.cmpop = op;
         this.value = value;
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 04ddfed..f2fd63d 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
@@ -20,7 +20,7 @@ package org.apache.empire.db.expr.compare;
 
 import java.util.Set;
 
-import org.apache.empire.commons.Unwrappable;
+import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
@@ -128,13 +128,12 @@ public class DBCompareNotExpr extends DBCompareExpr
      * 
      * @return true it the constraints are mutually exclusive or false 
otherwise
      */
-    @SuppressWarnings("unchecked")
     @Override
     public boolean isMutuallyExclusive(DBCompareExpr other)
     {
-        if ((other instanceof Unwrappable<?>) && 
((Unwrappable<?>)other).isWrapper())
+        if (ObjectUtils.isWrapper(expr))
         {   // unwrap
-            other = ((Unwrappable<DBCompareExpr>)other).unwrap();
+            other = ObjectUtils.unwrap(other);
         }
         if (other instanceof DBCompareNotExpr)
         {   // compare
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 b61317f..abd5276 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
@@ -20,7 +20,7 @@ package org.apache.empire.dbms.postgresql;
 
 import java.util.Set;
 
-import org.apache.empire.commons.Unwrappable;
+import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBCommand;
@@ -61,13 +61,12 @@ public class PostgresAtAt extends DBCompareExpr
         return new PostgresAtAt(this.left, this.right);
     }
 
-    @SuppressWarnings("unchecked")
     @Override
     public boolean isMutuallyExclusive(DBCompareExpr other)
     {
-        if ((other instanceof Unwrappable<?>) && 
((Unwrappable<?>)other).isWrapper())
+        if (ObjectUtils.isWrapper(other))
         {   // unwrap
-            other = ((Unwrappable<DBCompareExpr>)other).unwrap();
+            other = ObjectUtils.unwrap(other);
         }
         if (other instanceof PostgresAtAt)
         {   // compare
diff --git 
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresBoolAndOrExpr.java
 
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresBoolAndOrExpr.java
index db59da9..6b79033 100644
--- 
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresBoolAndOrExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/PostgresBoolAndOrExpr.java
@@ -20,7 +20,7 @@ package org.apache.empire.dbms.postgresql;
 
 import java.util.Set;
 
-import org.apache.empire.commons.Unwrappable;
+import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
@@ -126,11 +126,10 @@ public class PostgresBoolAndOrExpr extends DBColumnExpr
         return elem;
     }
     
-    @SuppressWarnings("unchecked")
     protected void appendName(StringBuilder buf, DBCompareExpr expr)
     {
-        if ((expr instanceof Unwrappable<?>) && 
((Unwrappable<?>)expr).isWrapper())
-            appendName(buf, ((Unwrappable<DBCompareExpr>)expr).unwrap());
+        if (ObjectUtils.isWrapper(expr))
+            appendName(buf, ObjectUtils.unwrap(expr));
         else if (expr instanceof DBCompareNotExpr)
             appendName(buf, ((DBCompareNotExpr)expr).getExpr());
         else if (expr instanceof DBCompareAndOrExpr) {

Reply via email to