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 4d05a79  EMPIREDB-362 implemened equals() for all DBColumnExpr and 
added FunctionExpression UnitTest
4d05a79 is described below

commit 4d05a799fa3ca3b729813ecb74dfbbbb26755783
Author: Rainer Döbele <[email protected]>
AuthorDate: Wed Feb 23 13:50:12 2022 +0100

    EMPIREDB-362 implemened equals() for all DBColumnExpr and added 
FunctionExpression UnitTest
---
 .../org/apache/empire/data/list/DataListHead.java  |   4 +-
 .../java/org/apache/empire/db/DBRecordData.java    |   4 +-
 .../empire/db/expr/column/DBAbstractFuncExpr.java  |  32 ++--
 .../apache/empire/db/expr/column/DBAliasExpr.java  |  39 +++--
 .../apache/empire/db/expr/column/DBCalcExpr.java   |  25 +++
 .../apache/empire/db/expr/column/DBCaseExpr.java   |  29 +++-
 .../empire/db/expr/column/DBCoalesceExpr.java      |  23 +--
 .../apache/empire/db/expr/column/DBConcatExpr.java |  25 +--
 .../empire/db/expr/column/DBConcatFuncExpr.java    |  25 +++
 .../empire/db/expr/column/DBConvertExpr.java       |   2 +-
 .../apache/empire/db/expr/column/DBCountExpr.java  |  22 +++
 .../apache/empire/db/expr/column/DBScalarExpr.java |  21 +++
 .../apache/empire/db/expr/column/DBValueExpr.java  |  69 ++++----
 .../empire/db/expr/column/DBVarArgsFuncExpr.java   |  32 +++-
 .../empire/db/expr/compare/DBCompareAndOrExpr.java |  15 +-
 .../empire/db/expr/compare/DBCompareColExpr.java   |  46 ++---
 .../empire/db/expr/compare/DBCompareNotExpr.java   |  15 +-
 .../empire/db/expr/compare/DBExistsExpr.java       |   2 +-
 .../org/apache/empire/db/AliasExpressionTest.java  |  13 +-
 .../apache/empire/db/CoalesceExpressionTest.java   |  14 +-
 .../apache/empire/db/FunctionExpressionTest.java   | 189 +++++++++++++++++++++
 21 files changed, 502 insertions(+), 144 deletions(-)

diff --git 
a/empire-db/src/main/java/org/apache/empire/data/list/DataListHead.java 
b/empire-db/src/main/java/org/apache/empire/data/list/DataListHead.java
index 2e31f23..d486b83 100644
--- a/empire-db/src/main/java/org/apache/empire/data/list/DataListHead.java
+++ b/empire-db/src/main/java/org/apache/empire/data/list/DataListHead.java
@@ -126,7 +126,7 @@ public class DataListHead implements Serializable
         }
         else
         {   // convert to String
-            text = convertToString(column, value);
+            text = formatValue(column, value);
         }
         // Done
         return text;
@@ -138,7 +138,7 @@ public class DataListHead implements Serializable
      * @param value the value to format
      * @return the formatted string
      */
-    protected String convertToString(ColumnExpr column, Object value)
+    protected String formatValue(ColumnExpr column, Object value)
     {
         return ObjectUtils.getString(value);
     }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBRecordData.java 
b/empire-db/src/main/java/org/apache/empire/db/DBRecordData.java
index 1c80e9e..415b518 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBRecordData.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBRecordData.java
@@ -489,7 +489,7 @@ public abstract class DBRecordData extends DBObject
         }
         else
         {   // convert to String
-            text = convertToString(column, value);
+            text = formatValue(column, value);
         }
         // done
         return text;
@@ -501,7 +501,7 @@ public abstract class DBRecordData extends DBObject
      * @param value the value to format
      * @return the formatted string
      */
-    protected String convertToString(ColumnExpr column, Object value)
+    protected String formatValue(ColumnExpr column, Object value)
     {
         return ObjectUtils.getString(value);
     }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAbstractFuncExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAbstractFuncExpr.java
index b2fa6b9..54704cc 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAbstractFuncExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAbstractFuncExpr.java
@@ -166,22 +166,28 @@ public abstract class DBAbstractFuncExpr extends 
DBColumnExpr
     {
         expr.addReferencedColumns(list);
     }
-
+    
     /**
-     * check if other function is the same and applies to the same column 
-     * @param other
-     * @return true if both functions are the same and on the same column or 
false otherwise
+     * Returns true if other is equal to this expression  
      */
-    public boolean isMutuallyExclusive(DBAbstractFuncExpr other)
+    @Override
+    public boolean equals(Object other)
     {
-        String tname = getFunctionName();
-        String oname = other.getFunctionName();
-        if (StringUtils.compareNotEqual(tname, oname))
-            return false;
-        // check update columns
-        DBColumn tcol = getUpdateColumn();
-        DBColumn ocol = other.getUpdateColumn();
-        return (tcol!=null) ? (tcol.equals(ocol)) : false;
+        if (other==this)
+            return true;
+        // Check Type
+        if (other instanceof DBAbstractFuncExpr)
+        {   // Compare
+            DBAbstractFuncExpr otherFunc = (DBAbstractFuncExpr)other;
+            // Expression must match
+            if (!expr.equals(otherFunc.expr))
+                return false;
+            // Function must match
+            String tname = getFunctionName();
+            String oname = otherFunc.getFunctionName();
+            return StringUtils.compareEqual(tname, oname);
+        }
+        return false;
     }
 
     /**
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
index 7698c57..2f7e77f 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBAliasExpr.java
@@ -154,6 +154,25 @@ public class DBAliasExpr extends DBColumnExpr
     {
         return expr.isAggregate();
     }
+    
+    /**
+     * Overrides the equals method
+     * @return true if alias name and expression match
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check for another Alias Expression
+        if (other instanceof DBAliasExpr)
+        {   // Compare with another alias expression
+            DBAliasExpr otherExpr = ((DBAliasExpr)other);
+            return this.alias.equalsIgnoreCase(otherExpr.getName()) &&
+                   this.expr.equals(otherExpr.unwrap());
+        }
+        return false;
+    }
 
     /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
@@ -208,26 +227,6 @@ public class DBAliasExpr extends DBColumnExpr
         }
         return field;
     }
-   
-    /**
-     * Overrides the equals method
-     * 
-     * @return true if alias name and expression match
-     */
-    @Override
-    public boolean equals(Object other)
-    {
-        if (other==this)
-            return true;
-        // Check for another Alias Expression
-        if (other instanceof DBAliasExpr)
-        {   // Compare with another alias expression
-            DBAliasExpr otherExpr = ((DBAliasExpr)other);
-            return this.alias.equalsIgnoreCase(otherExpr.getName()) &&
-                   this.expr.equals(otherExpr.unwrap());
-        }
-        return false;
-    }
 
     /**
      * Overrides the toString method.
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java
index 47be0aa..73a84e4 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCalcExpr.java
@@ -22,6 +22,7 @@ package org.apache.empire.db.expr.column;
 import java.util.Date;
 import java.util.Set;
 
+import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
@@ -164,6 +165,30 @@ public class DBCalcExpr extends DBColumnExpr
     {
         return false;
     }
+    
+    /**
+     * Returns true if other is equal to this expression  
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check Type
+        if (other instanceof DBCalcExpr)
+        {   // Compare
+            DBCalcExpr otherCalc = (DBCalcExpr)other;
+            // Expression must match
+            if (!expr.equals(otherCalc.expr))
+                return false;
+            // Operators must match
+            if (!StringUtils.compareEqual(this.op, otherCalc.op))
+                return false;
+            // Compare values
+            return ObjectUtils.compareEqual(this.value, otherCalc.value);
+        }
+        return false;
+    }
 
     /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCaseExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCaseExpr.java
index 7efde69..e6746c4 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCaseExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCaseExpr.java
@@ -18,6 +18,8 @@
  */
 package org.apache.empire.db.expr.column;
 
+import java.util.Set;
+
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
@@ -26,8 +28,6 @@ import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.xml.XMLUtil;
 import org.w3c.dom.Element;
 
-import java.util.Set;
-
 /**
  * This class is used to add the "case when ?=A then X else Y end" statement 
to the SQL-Command.
  * <P>
@@ -99,6 +99,31 @@ public class DBCaseExpr extends DBColumnExpr
     {
         return trueExpr.isAggregate();
     }
+    
+    /**
+     * Returns true if other is equal to this expression  
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check Type
+        if (other instanceof DBCaseExpr)
+        {   // Compare
+            DBCaseExpr otherCase = (DBCaseExpr)other;
+            // Expression must match
+            if (!compExpr.equals(otherCase.compExpr))
+                return false;
+            if (!trueExpr.equals(otherCase.trueExpr))
+                return false;
+            // finally compare elseExpr
+            if (elseExpr==null)
+                return (otherCase.elseExpr==null);
+            return elseExpr.equals(otherCase.elseExpr);
+        }
+        return false;
+    }
 
     @Override
     public void addReferencedColumns(Set<DBColumn> list)
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCoalesceExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCoalesceExpr.java
index 2f86ad6..ec5891e 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCoalesceExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCoalesceExpr.java
@@ -23,12 +23,12 @@ public class DBCoalesceExpr extends DBAbstractFuncExpr
     }
 
     /**
-     * Should we return true here?
+     * This is a transparent wrapper
      */
     @Override
     public boolean isWrapper()
-    {   
-        return false; // Should we return true here?
+    {   // yep
+        return true;
     }
 
     @Override
@@ -62,16 +62,16 @@ public class DBCoalesceExpr extends DBAbstractFuncExpr
     }
     
     /**
-     * Compares true if the other is also a coalesce expr on the same column
+     * Returns true if other is equal to this expression  
      */
     @Override
     public boolean equals(Object other)
     {
         if (other==this)
             return true;
-        // Check for another Alias Expression
+        // Check Type
         if (other instanceof DBCoalesceExpr)
-        {   // Compare with another alias expression
+        {   // Compare expressions
             DBColumnExpr otherExpr = ((DBCoalesceExpr)other).expr;
             return this.expr.equals(otherExpr);
         }
@@ -79,17 +79,6 @@ public class DBCoalesceExpr extends DBAbstractFuncExpr
     }
 
     /**
-     * check if other function is the same and applies to the same column 
-     * @param other
-     * @return true if both functions are the same and on the same column or 
false otherwise
-     */
-    @Override
-    public boolean isMutuallyExclusive(DBAbstractFuncExpr other)
-    {
-        return equals(other);
-    }
-
-    /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
      */
     @Override
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConcatExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConcatExpr.java
index d89ff0f..cc7d616 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConcatExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConcatExpr.java
@@ -134,6 +134,20 @@ public class DBConcatExpr extends DBColumnExpr
     {
         return false;
     }
+    
+    /**
+     * Returns true if other is equal to this expression  
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other instanceof DBConcatExpr)
+        {   // Compare left and right
+            return left .equals(((DBConcatExpr)other).left)
+                && right.equals(((DBConcatExpr)other).right);
+        }
+        return false;
+    }
 
     /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
@@ -177,15 +191,4 @@ public class DBConcatExpr extends DBColumnExpr
         }
         
     }
-    
-    @Override
-    public boolean equals(Object other)
-    {
-       if (other instanceof DBConcatExpr)
-       {       // Compare left and right
-               return left .equals(((DBConcatExpr)other).left)
-                   && right.equals(((DBConcatExpr)other).right);
-       }
-       return false;
-    }
 }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConcatFuncExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConcatFuncExpr.java
index 03cc024..1ded662 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConcatFuncExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConcatFuncExpr.java
@@ -74,6 +74,31 @@ public class DBConcatFuncExpr extends DBAbstractFuncExpr
     {
         return "CONCAT";
     }
+    
+    /**
+     * Returns true if other is equal to this expression  
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check Type
+        if (other instanceof DBConcatFuncExpr)
+        {   // Compare
+            DBConcatFuncExpr otherFunc = (DBConcatFuncExpr)other;
+            // Expression must match
+            if (!first.equals(otherFunc.first))
+                return false;
+            // all parts must match
+            for (int i=0; i<others.length; i++)
+                if (!others[i].equals(otherFunc.others[i]))
+                    return false;
+            // OK
+            return true;
+        }
+        return false;
+    }
 
     @Override
     public void addSQL(StringBuilder buf, long context)
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConvertExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConvertExpr.java
index 1749fac..34c4678 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConvertExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBConvertExpr.java
@@ -52,7 +52,7 @@ public class DBConvertExpr extends DBAbstractFuncExpr
     @Override
     protected String getFunctionName()
     {
-        return "convert";
+        return dataType.name();
     }
 
     @Override
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCountExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCountExpr.java
index 96134e5..270fa81 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCountExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCountExpr.java
@@ -157,6 +157,28 @@ public class DBCountExpr extends DBColumnExpr
     {
         return true;
     }
+    
+    /**
+     * Returns true if other is equal to this expression  
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check Type
+        if (other instanceof DBCountExpr)
+        {   // Compare
+            DBCountExpr otherCount = (DBCountExpr)other;
+            // Expression must match
+            if (this.column!=null)
+                return column.equals(otherCount.column);
+            if (this.rowset!=null)
+                return rowset.equals(otherCount.rowset);
+            // Should not come here
+        }
+        return false;
+    }
 
     /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBScalarExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBScalarExpr.java
index 779228b..32c6c01 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBScalarExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBScalarExpr.java
@@ -182,6 +182,27 @@ public class DBScalarExpr extends DBColumnExpr
     {
         return false;
     }
+    
+    /**
+     * Returns true if other is equal to this expression  
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check Type
+        if (other instanceof DBScalarExpr)
+        {   // Compare with same type
+            DBScalarExpr otherFunc = (DBScalarExpr)other;
+            // DataTypes must match
+            if (!dataType.equals(otherFunc.dataType))
+                return false;
+            // Templates must match
+            return StringUtils.compareEqual(this.template, otherFunc.template);
+        }
+        return false;
+    }
 
     /**
      * @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBValueExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBValueExpr.java
index fd30683..d9150b8 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBValueExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBValueExpr.java
@@ -46,8 +46,6 @@ public class DBValueExpr extends DBColumnExpr
   
     public final DBDatabase   db;
     public final DataType     type;
-    public final DBColumnExpr column;
-    // the underlying value
     protected Object          value;
 
     /**
@@ -61,20 +59,6 @@ public class DBValueExpr extends DBColumnExpr
     {
         this.db = db;
         this.type = type;
-        this.column = null;
-        this.value = value;
-    }
-
-    /**
-     * Construct a new DBValueExpr object set the specified parameters to this 
object.
-     * @param col the column
-     * @param value the value
-     */
-    public DBValueExpr(DBColumnExpr col, Object value)
-    {
-        this.column = col;
-        this.type = col.getDataType();
-        this.db = col.getDatabase();
         this.value = value;
     }
 
@@ -141,31 +125,24 @@ public class DBValueExpr extends DBColumnExpr
     @Override
     public String getName()
     {
-        return (column != null) ? column.getName() : null;
+        return "VAL_"+String.valueOf(value); 
     }
 
     /** this helper function calls the DBColumnExpr.addXML(Element, long) 
method */
     @Override
     public Element addXml(Element parent, long flags)
     {
-        Element elem;
-        if (column!=null)
-        {   // Update Column
-            elem = column.addXml(parent, flags);
-        }
-        else
-        {   // Add a column expression for this function
-            elem = XMLUtil.addElement(parent, "column");
-            String name = getName();
-            if (name!=null)
-                elem.setAttribute("name", getName());
-            // Add Other Attributes
-            if (attributes!=null)
-                attributes.addXml(elem, flags);
-            // add All Options
-            if (options!=null)
-                options.addXml(elem, this.type);
-        }
+        // Add a column expression for this function
+        Element elem = XMLUtil.addElement(parent, "column");
+        String name = getName();
+        if (name!=null)
+            elem.setAttribute("name", getName());
+        // Add Other Attributes
+        if (attributes!=null)
+            attributes.addXml(elem, flags);
+        // add All Options
+        if (options!=null)
+            options.addXml(elem, this.type);
         // Done
         elem.setAttribute("function", "value");
         return elem;
@@ -177,7 +154,7 @@ public class DBValueExpr extends DBColumnExpr
     @Override
     public DBColumn getSourceColumn()
     {
-        return (column != null) ? column.getSourceColumn() : null;
+        return null;
     }
 
     /**
@@ -186,7 +163,7 @@ public class DBValueExpr extends DBColumnExpr
     @Override
     public DBColumn getUpdateColumn()
     {
-        return (column != null) ? column.getUpdateColumn() : null;
+        return null;
     }
 
     /**
@@ -199,6 +176,24 @@ public class DBValueExpr extends DBColumnExpr
     {
         return false;
     }
+    
+    /**
+     * Returns true if other is equal to this expression  
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check Type
+        if (other instanceof DBValueExpr)
+        {   // Compare
+            Object otherValue = ((DBValueExpr)other).value;
+            // Values must match
+            return ObjectUtils.compareEqual(value, otherValue);
+        }
+        return false;
+    }
 
     /**
      * Creates the SQL-Command.
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBVarArgsFuncExpr.java
 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBVarArgsFuncExpr.java
index 77a3639..4c57c17 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBVarArgsFuncExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBVarArgsFuncExpr.java
@@ -20,6 +20,7 @@ package org.apache.empire.db.expr.column;
 
 import java.util.Set;
 
+import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.DataType;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBColumnExpr;
@@ -77,6 +78,34 @@ public class DBVarArgsFuncExpr extends DBColumnExpr
     {
         return false;
     }
+    
+    /**
+     * Returns true if other is equal to this expression  
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check Type
+        if (other instanceof DBVarArgsFuncExpr)
+        {   // Compare with same type
+            DBVarArgsFuncExpr otherFunc = (DBVarArgsFuncExpr)other;
+            // DataTypes must match
+            if (!dataType.equals(otherFunc.dataType))
+                return false;
+            // Templates must match
+            if (!StringUtils.compareEqual(this.template, otherFunc.template))
+                return false;
+            // all parts must match
+            for (int i=0; i<cols.length; i++)
+                if (!cols[i].equals(otherFunc.cols[i]))
+                    return false;
+            // OK
+            return true;
+        }
+        return false;
+    }
 
     @Override
     public DBColumn getSourceColumn()
@@ -118,8 +147,7 @@ public class DBVarArgsFuncExpr extends DBColumnExpr
         String postfix = "";
         int sep = template.indexOf("?");
         if (sep >= 0)
-        {
-            prefix  = template.substring(0, sep);
+        {   prefix  = template.substring(0, sep);
             postfix = template.substring(sep + 1);
         } 
         // append
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 06084af..3455a2b 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,6 +20,7 @@ package org.apache.empire.db.expr.compare;
 
 import java.util.Set;
 
+import org.apache.empire.commons.Unwrappable;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
@@ -160,18 +161,24 @@ public class DBCompareAndOrExpr extends DBCompareExpr
     }
     
     /**
-     * Returns wheter the constraint should replace another one or not.
+     * Returns whether the constraint should replace another one or not.
      * 
      * @return true it the constraints are mutually exclusive or false 
otherwise
      */
+    @SuppressWarnings("unchecked")
     @Override
     public boolean isMutuallyExclusive(DBCompareExpr other)
     {
+        if (other instanceof Unwrappable<?>)
+        {
+            other = ((Unwrappable<DBCompareExpr>)other).unwrap();
+        }
        if (other instanceof DBCompareAndOrExpr)
        {
-               DBCompareAndOrExpr o = (DBCompareAndOrExpr)other;
-               if (left.equals(o.left) && right.equals(o.right))
-                       return true;
+               DBCompareAndOrExpr otherExpr = (DBCompareAndOrExpr)other;
+            if (left .isMutuallyExclusive(otherExpr.left) &&
+                right.isMutuallyExclusive(otherExpr.right))
+                return (this.or==otherExpr.or);
        }
        return false;
     }
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 e4c24df..8f5816e 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,8 +28,6 @@ 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.DBAbstractFuncExpr;
-import org.apache.empire.db.expr.column.DBAliasExpr;
 
 
 /**
@@ -295,38 +293,30 @@ public class DBCompareColExpr extends DBCompareExpr
     @Override
     public boolean isMutuallyExclusive(DBCompareExpr other)
     {
+        // check type 
        if (other instanceof DBCompareColExpr)
-       {
-               DBCompareColExpr o = (DBCompareColExpr)other;
-               DBColumnExpr oexpr = o.getColumn();
-               if (expr.equals(oexpr))
-                       return true;
-               // unwrap
+       {   // unwrap
             DBColumnExpr texpr = expr;
-            if (texpr instanceof DBAliasExpr)
-                texpr = ((DBAliasExpr) texpr).unwrap();
-            if (oexpr instanceof DBAliasExpr)
-                oexpr = ((DBAliasExpr) oexpr).unwrap();
-            // check function expression
-            boolean tfunc = (texpr instanceof DBAbstractFuncExpr);
-            boolean ofunc = (oexpr instanceof DBAbstractFuncExpr); 
-            if (tfunc || ofunc) 
-            {   // check if both are the same
-                if (tfunc && ofunc)
-                {   // both are functions
-                    return 
((DBAbstractFuncExpr)texpr).isMutuallyExclusive((DBAbstractFuncExpr)oexpr);
-                }
-                else
-                {   // not the same
-                    return false; 
-                }
-            }
-            // finally check update columns
+            if (texpr.isWrapper())
+                texpr = texpr.unwrap();
+            // other
+            DBCompareColExpr o = (DBCompareColExpr)other;
+            DBColumnExpr oexpr = o.getColumn();
+            if (oexpr.isWrapper())
+                oexpr = oexpr.unwrap();
+               // Compare
+               if (texpr.equals(oexpr))
+                       return true;
+               /*
+            // probably not a good idea to do this:
                DBColumn tcol = texpr.getSourceColumn();
                DBColumn ocol = oexpr.getSourceColumn();
                return (tcol!=null) ? (tcol.equals(ocol)) : false;
+               */
+            return false;
        }
-       return false;
+       // other types
+       return equals(other);
     }
     
 }
\ No newline at end of file
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 c506152..f386872 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,6 +20,7 @@ package org.apache.empire.db.expr.compare;
 
 import java.util.Set;
 
+import org.apache.empire.commons.Unwrappable;
 import org.apache.empire.db.DBColumn;
 import org.apache.empire.db.DBCommand;
 import org.apache.empire.db.DBDatabase;
@@ -113,14 +114,24 @@ public class DBCompareNotExpr extends DBCompareExpr
     }
     
     /**
-     * Returns wheter the constraint should replace another one or not.
+     * Returns whether the constraint should replace another one or not.
      * 
      * @return true it the constraints are mutually exclusive or false 
otherwise
      */
+    @SuppressWarnings("unchecked")
     @Override
     public boolean isMutuallyExclusive(DBCompareExpr other)
     {
-       return false;
+        if (other instanceof Unwrappable<?>)
+        {
+            other = ((Unwrappable<DBCompareExpr>)other).unwrap();
+        }
+        if (other instanceof DBCompareNotExpr)
+        {
+            DBCompareNotExpr otherNot = (DBCompareNotExpr)other;
+            return expr.isMutuallyExclusive(otherNot.expr); 
+        }
+        return false;
     }
     
 }
\ No newline at end of file
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 d9f56b9..9b9953d 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
@@ -159,7 +159,7 @@ public class DBExistsExpr extends DBCompareExpr
        if (other instanceof DBExistsExpr)
        {
                DBExistsExpr o = (DBExistsExpr)other;
-               if (cmd==o.cmd && compareExpr==o.compareExpr)
+               if (cmd.equals(o.cmd) && compareExpr.equals(o.compareExpr))
                        return true;
        }
        return false;
diff --git 
a/empire-db/src/test/java/org/apache/empire/db/AliasExpressionTest.java 
b/empire-db/src/test/java/org/apache/empire/db/AliasExpressionTest.java
index 74ea828..7085c9e 100644
--- a/empire-db/src/test/java/org/apache/empire/db/AliasExpressionTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/AliasExpressionTest.java
@@ -19,10 +19,13 @@
 
 package org.apache.empire.db;
 
+import java.util.List;
+
 import org.apache.empire.data.DataType;
 import org.apache.empire.data.list.DataListEntry;
 import org.apache.empire.data.list.DataListHead;
 import org.apache.empire.db.context.DBContextStatic;
+import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.junit.Test;
 
 import junit.framework.Assert;
@@ -34,7 +37,7 @@ import junit.framework.Assert;
 public class AliasExpressionTest
 {
     /**
-     * Test Standard DBRecord with Serializable Context
+     * Test Alias Expression
      */
     @Test
     public void testAliasExpression()
@@ -67,6 +70,14 @@ public class AliasExpressionTest
         DBColumnExpr[] expr = cmd.getSelectExprList();
         // Hint: ALIAS_2_NEU is not a separate column
         Assert.assertEquals(expr.length, 4);
+        // where
+        cmd.where(ALIAS_1.isNot("Foo1"));
+        cmd.where(ALIAS_2.isNot("Foo2"));
+        cmd.where(ALIAS_2_NEU.isNot("Foo3"));
+        cmd.where(ALIAS_X.isNot("Foo4"));
+        // System.out.println(cmd.getSelect());
+        List<DBCompareExpr> list = cmd.getWhereConstraints();
+        Assert.assertEquals(list.size(), 1);
 
         // Query Record
         DBQuery q = new DBQuery(cmd);
diff --git 
a/empire-db/src/test/java/org/apache/empire/db/CoalesceExpressionTest.java 
b/empire-db/src/test/java/org/apache/empire/db/CoalesceExpressionTest.java
index 7fc9be8..d5e2210 100644
--- a/empire-db/src/test/java/org/apache/empire/db/CoalesceExpressionTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/CoalesceExpressionTest.java
@@ -19,10 +19,13 @@
 
 package org.apache.empire.db;
 
+import java.util.List;
+
 import org.apache.empire.data.DataType;
 import org.apache.empire.data.list.DataListEntry;
 import org.apache.empire.data.list.DataListHead;
 import org.apache.empire.db.context.DBContextStatic;
+import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.junit.Test;
 
 import junit.framework.Assert;
@@ -34,7 +37,7 @@ import junit.framework.Assert;
 public class CoalesceExpressionTest
 {
     /**
-     * Test Standard DBRecord with Serializable Context
+     * Test Coalesce Expression
      */
     @Test
     public void testCoalesceExpression()
@@ -68,6 +71,15 @@ public class CoalesceExpressionTest
         DBColumnExpr[] expr = cmd.getSelectExprList();
         // Hint: COALESCE_2_NEU is not a separate column
         Assert.assertEquals(expr.length, 3);
+        // where
+        cmd.where(COALESCE_1.is("Foo1"));
+        cmd.where(COALESCE_2.is("Foo2"));
+        cmd.where(t.C_TEXT.is("Foo"));
+        cmd.where(AMOUNT.is(5));
+        cmd.where(t.C_NUMBER.coalesce(7).is(3));
+        // System.out.println(cmd.getSelect());
+        List<DBCompareExpr> list = cmd.getWhereConstraints();
+        Assert.assertEquals(list.size(), 2);
 
         // Query Record
         DBQuery q = new DBQuery(cmd);
diff --git 
a/empire-db/src/test/java/org/apache/empire/db/FunctionExpressionTest.java 
b/empire-db/src/test/java/org/apache/empire/db/FunctionExpressionTest.java
new file mode 100644
index 0000000..179be84
--- /dev/null
+++ b/empire-db/src/test/java/org/apache/empire/db/FunctionExpressionTest.java
@@ -0,0 +1,189 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.empire.db;
+
+import java.util.List;
+
+import org.apache.empire.data.DataType;
+import org.apache.empire.data.list.DataListEntry;
+import org.apache.empire.data.list.DataListHead;
+import org.apache.empire.db.context.DBContextStatic;
+import org.apache.empire.db.expr.compare.DBCompareExpr;
+import org.junit.Test;
+
+import junit.framework.Assert;
+
+/**
+ * @author rainer
+ * @since 23.01.22
+ */
+public class FunctionExpressionTest
+{
+    /**
+     * Test Column Function Expressions
+     */
+    @Test
+    public void testFunctionExpression()
+        throws Exception
+    {
+        final TestDatabase db = new TestDatabase();
+        
+        DBContext context = new DBContextStatic(new MockDriver(), null);
+        db.open(context);
+        
+        TestDatabase.TestTable t = db.T_TEST;
+        TestDatabase.TestTable t2 = t.clone("tclone");
+        
+        DBColumn NUMBER = t.C_NUMBER;
+        DBColumnExpr TEST_COUNT = t.count();
+        DBColumnExpr TEST_2_COUNT = t2.count();
+        DBColumnExpr NUM_COUNT_1 = NUMBER.countDistinct();
+        DBColumnExpr NUM_COUNT_2 = NUMBER.countDistinct();
+        DBColumnExpr NUM_COUNT_3 = t2.C_NUMBER.countDistinct();
+        DBColumnExpr NUM_AVG_1 = NUMBER.avg();
+        DBColumnExpr NUM_AVG_2 = NUMBER.avg();
+        DBColumnExpr NUM_AVG_3 = t2.C_NUMBER.avg();
+        DBColumnExpr NUM_SUM_1 = NUMBER.sum();
+        DBColumnExpr NUM_SUM_2 = NUMBER.sum();
+        DBColumnExpr NUM_SUM_3 = t2.C_NUMBER.sum();
+        
+        String test_count = TEST_COUNT.getName();
+        String name_count = NUM_COUNT_1.getName();
+        String name_avg   = NUM_AVG_1.getName();
+        String name_sum   = NUM_SUM_1.getName();
+        Assert.assertEquals(test_count, "TESTTABLE_COUNT");
+        Assert.assertEquals(name_count, "NUMBER_COUNT");
+        Assert.assertEquals(name_avg, "NUMBER_AVG");
+        Assert.assertEquals(name_sum, "NUMBER_SUM");
+
+        DBCommand cmd = context.createCommand();
+        cmd.select(NUMBER, TEST_COUNT, TEST_2_COUNT);
+        cmd.select(NUM_COUNT_1, NUM_COUNT_2, NUM_COUNT_3);
+        cmd.select(NUM_AVG_1, NUM_AVG_2, NUM_AVG_3);
+        cmd.select(NUM_SUM_1, NUM_SUM_2, NUM_SUM_3);
+        // System.out.println(cmd.getSelect());
+        DBColumnExpr[] expr = cmd.getSelectExprList();
+        Assert.assertEquals(expr.length, 9);
+        // where
+        cmd.where(NUM_AVG_1.isNot(0).or(NUM_SUM_1.isNot(0)).parenthesis());
+        cmd.where(NUM_AVG_1.isNot(1).or(NUM_SUM_1.isNot(1)));
+        cmd.where(NUM_COUNT_1.isMoreOrEqual(5));
+        cmd.where(NUM_COUNT_2.isMoreOrEqual(3));
+        cmd.where(NUM_COUNT_3.isMoreOrEqual(4));
+        cmd.where(NUM_AVG_1.isNot(0));
+        cmd.where(NUM_SUM_1.isLessOrEqual(25));
+        cmd.where(NUM_SUM_2.isNotBetween(0, 5));
+        cmd.where(NUM_SUM_3.isSmallerThan(55));
+        // System.out.println(cmd.getSelect());
+        List<DBCompareExpr> list = cmd.getWhereConstraints();
+        Assert.assertEquals(list.size(), 6);
+
+        // Query Record
+        DBQuery q = new DBQuery(cmd);
+        DBRecord record = new DBRecord(context, q);
+        Assert.assertEquals(record.getFieldIndex(NUMBER), 0);
+        Assert.assertEquals(record.getFieldIndex(TEST_COUNT), 1);
+        Assert.assertEquals(record.getFieldIndex(TEST_2_COUNT), 2);
+        Assert.assertEquals(record.getFieldIndex(NUM_COUNT_1), 3);
+        Assert.assertEquals(record.getFieldIndex(NUM_COUNT_2), 3);
+        Assert.assertEquals(record.getFieldIndex(NUM_COUNT_3), 4);
+        Assert.assertEquals(record.getFieldIndex(NUM_AVG_1), 5);
+        Assert.assertEquals(record.getFieldIndex(NUM_AVG_2), 5);
+        Assert.assertEquals(record.getFieldIndex(NUM_AVG_3), 6);
+        Assert.assertEquals(record.getFieldIndex(NUM_SUM_1), 7);
+        Assert.assertEquals(record.getFieldIndex(NUM_SUM_2), 7);
+        Assert.assertEquals(record.getFieldIndex(NUM_SUM_3), 8);
+
+        // Reader 
+        DBReader reader = new MyReader(context);
+        reader.open(cmd);
+        Assert.assertEquals(reader.getFieldIndex(NUMBER), 0);
+        Assert.assertEquals(reader.getFieldIndex(TEST_COUNT), 1);
+        Assert.assertEquals(reader.getFieldIndex(TEST_2_COUNT), 2);
+        Assert.assertEquals(reader.getFieldIndex(NUM_COUNT_1), 3);
+        Assert.assertEquals(reader.getFieldIndex(NUM_COUNT_2), 3);
+        Assert.assertEquals(reader.getFieldIndex(NUM_COUNT_3), 4);
+        Assert.assertEquals(reader.getFieldIndex(NUM_AVG_1), 5);
+        Assert.assertEquals(reader.getFieldIndex(NUM_AVG_2), 5);
+        Assert.assertEquals(reader.getFieldIndex(NUM_AVG_3), 6);
+        Assert.assertEquals(reader.getFieldIndex(NUM_SUM_1), 7);
+        Assert.assertEquals(reader.getFieldIndex(NUM_SUM_2), 7);
+        Assert.assertEquals(reader.getFieldIndex(NUM_SUM_3), 8);
+        reader.close();
+        
+        // DataListEntry
+        DataListHead head = new DataListHead(cmd.getSelectExprList());
+        Object[] values = new Object[head.getColumns().length];
+        for (int i=0; i<values.length; i++)
+            values[i] = head.getColumns()[i].getName();
+        DataListEntry dle = new DataListEntry(head, 0, values);
+        Assert.assertEquals(dle.getFieldIndex(NUMBER), 0);
+        Assert.assertEquals(dle.getFieldIndex(TEST_COUNT), 1);
+        Assert.assertEquals(dle.getFieldIndex(TEST_2_COUNT), 2);
+        Assert.assertEquals(dle.getFieldIndex(NUM_COUNT_1), 3);
+        Assert.assertEquals(dle.getFieldIndex(NUM_COUNT_2), 3);
+        Assert.assertEquals(dle.getFieldIndex(NUM_COUNT_3), 4);
+        Assert.assertEquals(dle.getFieldIndex(NUM_AVG_1), 5);
+        Assert.assertEquals(dle.getFieldIndex(NUM_AVG_2), 5);
+        Assert.assertEquals(dle.getFieldIndex(NUM_AVG_3), 6);
+        Assert.assertEquals(dle.getFieldIndex(NUM_SUM_1), 7);
+        Assert.assertEquals(dle.getFieldIndex(NUM_SUM_2), 7);
+        Assert.assertEquals(dle.getFieldIndex(NUM_SUM_3), 8);
+
+        // done
+    }
+    
+    static class MyReader extends DBReader
+    {
+        public MyReader(DBContext context)
+        {
+            super(context, false);
+        }
+        
+        @Override
+        public void open(DBCommandExpr cmd, boolean scrollable)
+        {
+            super.init(cmd.getDatabase(), cmd.getSelectExprList(), null);
+        }
+    }
+    
+    /**
+     * Databae
+     */
+    static class TestDatabase extends DBDatabase
+    {
+        public final TestTable T_TEST = new TestTable(this);
+        static class TestTable extends DBTable
+        {
+            public final DBTableColumn C_ID;
+            public final DBTableColumn C_TEXT;
+            public final DBTableColumn C_NUMBER;
+
+            TestTable(DBDatabase db)
+            {
+                super("TESTTABLE", db);
+                this.C_ID = addColumn("id", DataType.INTEGER, 0, true);
+                this.C_TEXT = addColumn("TEXT", DataType.VARCHAR, 255, false);
+                this.C_NUMBER = addColumn("NUMBER", DataType.DECIMAL, 10.2, 
false);
+                setPrimaryKey(C_ID);
+            }
+        }
+    }
+}

Reply via email to