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 e3be166  EMPIREDB-362 new class DBCoalesceExpr for coalesce function + 
some minor improvements
e3be166 is described below

commit e3be16600e55314c8728a91740ca5551e3c17fe5
Author: Rainer Döbele <[email protected]>
AuthorDate: Tue Feb 22 18:34:17 2022 +0100

    EMPIREDB-362 new class DBCoalesceExpr for coalesce function + some minor 
improvements
---
 .../org/apache/empire/samples/db/SampleApp.java    |  12 +--
 empire-db-maven-plugin/pom.xml                     |   5 -
 .../java/org/apache/empire/commons/Options.java    |  11 +-
 .../main/java/org/apache/empire/data/Column.java   |   1 +
 .../org/apache/empire/data/list/DataListEntry.java |  10 +-
 .../org/apache/empire/data/list/DataListHead.java  |  61 +++++------
 .../java/org/apache/empire/db/DBColumnExpr.java    |   4 +-
 .../main/java/org/apache/empire/db/DBQuery.java    |  11 +-
 .../java/org/apache/empire/db/DBRecordData.java    |  51 ++++++++++
 .../java/org/apache/empire/db/DBTableColumn.java   |   2 +-
 .../src/main/java/org/apache/empire/db/DBView.java |   2 +-
 .../empire/db/expr/column/DBAbstractFuncExpr.java  |   8 +-
 .../apache/empire/db/expr/column/DBCaseExpr.java   |   2 +-
 .../empire/db/expr/column/DBCaseWhenExpr.java      |   2 +-
 .../empire/db/expr/column/DBCoalesceExpr.java      | 113 +++++++++++++++++++++
 .../apache/empire/db/expr/column/DBConcatExpr.java |   2 +-
 .../apache/empire/db/expr/column/DBFuncExpr.java   |   5 +-
 .../apache/empire/db/expr/column/DBValueExpr.java  |   2 +-
 .../org/apache/empire/commons/OptionsTest.java     |   4 +-
 .../org/apache/empire/db/AliasExpressionTest.java  |   2 +-
 ...essionTest.java => CoalesceExpressionTest.java} |  59 +++++------
 21 files changed, 261 insertions(+), 108 deletions(-)

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 b15c046..62895b6 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
@@ -522,12 +522,12 @@ public class SampleApp
                                // Text-Output by iterating through all records.
                        while (reader.moveNext())
                     {
-                           System.out.println(reader.getString(EMP.ID)
-                                   + "\t" + reader.getString(EMPLOYEE_NAME)
-                                   + "\t" + 
EMP.GENDER.getOptions().get(reader.getString(EMP.GENDER))
-                                + "\t" + reader.getString(EMP.SALARY)
-                                + "\t" + reader.getString(PAYMENTS_LAST_YEAR)
-                                   + "\t" + reader.getString(DEP.NAME));
+                           System.out.println(reader.getText(EMP.ID)
+                                   + "\t" + reader.getText(EMPLOYEE_NAME)
+                                   + "\t" + reader.getText(EMP.GENDER)
+                                + "\t" + reader.getText(EMP.SALARY)
+                                + "\t" + reader.getText(PAYMENTS_LAST_YEAR)
+                                   + "\t" + reader.getText(DEP.NAME));
                        }
                                break;
                 case BeanList:
diff --git a/empire-db-maven-plugin/pom.xml b/empire-db-maven-plugin/pom.xml
index ff7f999..7876ccb 100644
--- a/empire-db-maven-plugin/pom.xml
+++ b/empire-db-maven-plugin/pom.xml
@@ -62,11 +62,6 @@
             <scope>provided</scope><!-- annotations are needed only to build 
the plugin -->
         </dependency>
                <dependency>
-                       <groupId>commons-logging</groupId>
-                       <artifactId>commons-logging</artifactId>
-                       <version>1.1.1</version>
-               </dependency>
-               <dependency>
                        <groupId>junit</groupId>
                        <artifactId>junit</artifactId>
                        <scope>test</scope>
diff --git a/empire-db/src/main/java/org/apache/empire/commons/Options.java 
b/empire-db/src/main/java/org/apache/empire/commons/Options.java
index 72d6f24..429b467 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/Options.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/Options.java
@@ -26,6 +26,7 @@ import java.util.Iterator;
 import java.util.Map.Entry;
 import java.util.Set;
 
+import org.apache.empire.data.DataType;
 import org.apache.empire.exceptions.InvalidArgumentException;
 import org.apache.empire.xml.XMLUtil;
 import org.w3c.dom.Element;
@@ -352,14 +353,18 @@ public class Options extends AbstractSet<OptionEntry> 
implements Cloneable, Seri
      * @param element the element to add the option tags to
      * @param flags not used for now
      */
-    public void addXml(Element element, long flags)
+    public void addXml(Element element, DataType dataType)
     { 
         // add All Options
         for(OptionEntry e:list){
-            String value = String.valueOf(e.getValue());
+            Object value = e.getValue();
+            if (value instanceof Enum<?>)
+            {   // Take either the name or the ordinal
+                value = ObjectUtils.getEnumValue((Enum<?>)value, 
dataType.isNumeric());
+            }
             // Create Option Element
             Element opt = XMLUtil.addElement(element, "option", e.getText());
-            opt.setAttribute("value", value);
+            opt.setAttribute("value", String.valueOf(value));
             if (e.isActive()==false)
                 opt.setAttribute("disabled", "true");
         }
diff --git a/empire-db/src/main/java/org/apache/empire/data/Column.java 
b/empire-db/src/main/java/org/apache/empire/data/Column.java
index 8106735..92b9678 100644
--- a/empire-db/src/main/java/org/apache/empire/data/Column.java
+++ b/empire-db/src/main/java/org/apache/empire/data/Column.java
@@ -34,6 +34,7 @@ public interface Column extends ColumnExpr
     public static final String COLATTR_TOOLTIP   = "tooltip";
     public static final String COLATTR_TYPE      = "type";
     public static final String COLATTR_ENUMTYPE  = "enumType";
+    public static final String COLATTR_NULLTEXT  = "nullText";
 
     public static final String COLATTR_MINLENGTH = "minLength";
     public static final String COLATTR_MINVALUE  = "minValue";
diff --git 
a/empire-db/src/main/java/org/apache/empire/data/list/DataListEntry.java 
b/empire-db/src/main/java/org/apache/empire/data/list/DataListEntry.java
index d718faa..a388e15 100644
--- a/empire-db/src/main/java/org/apache/empire/data/list/DataListEntry.java
+++ b/empire-db/src/main/java/org/apache/empire/data/list/DataListEntry.java
@@ -337,16 +337,16 @@ public class DataListEntry implements RecordData, 
Serializable
      * Miscellaneous functions
      */
 
-    public String format(String name)
+    public String getText(String name)
     {
         int idx = getFieldIndex(name);
-        return head.formatValue(idx, values[idx]);
+        return head.getText(idx, values[idx]);
     }
 
-    public String format(ColumnExpr col)
+    public String getText(ColumnExpr col)
     {
         int idx = getFieldIndex(col);
-        return head.formatValue(idx, values[idx]);
+        return head.getText(idx, values[idx]);
     }
     
     @Override
@@ -355,7 +355,7 @@ public class DataListEntry implements RecordData, 
Serializable
         StringBuilder b = new StringBuilder();
         for (int i=0; i<values.length; i++)
         {
-            b.append(head.formatValue(i, values[i]));
+            b.append(head.getText(i, values[i]));
             b.append(head.columnSeparator);
         }
         return b.toString();
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 40a917f..2e31f23 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
@@ -23,6 +23,7 @@ import java.io.Serializable;
 import org.apache.empire.commons.ObjectUtils;
 import org.apache.empire.commons.Options;
 import org.apache.empire.commons.StringUtils;
+import org.apache.empire.data.Column;
 import org.apache.empire.data.ColumnExpr;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBObject;
@@ -92,37 +93,43 @@ public class DataListHead implements Serializable
     }
     
     /**
-     * Custom value formatting
-     * Default is to convert to a String and calls escape() 
-     * @param idx the field index
-     * @param value the value
+     * Returns the value of a column as a formatted text
+     * This converts the value to a string if necessary and performs an 
options lookup
+     * To customize conversion please override convertToString()
+     * @param column the column for which to get the formatted value
+     * @param value the value to format
      * @return the formatted value
      */
-    public String formatValue(int idx, Object value)
-    {   // check empty
-        if (ObjectUtils.isEmpty(value))
-            return StringUtils.EMPTY;
-        // check options
+    public String getText(int idx, Object value)
+    {   // find text
         String text;
-        Options options = columns[idx].getOptions();
+        ColumnExpr column = columns[idx];
+        // check options first
+        Options options = column.getOptions();
         if (options!=null && options.has(value))
         {   // lookup option
             text = options.get(value);
         }
+        else if (ObjectUtils.isEmpty(value))
+        {   // empty
+            value = column.getAttribute(Column.COLATTR_NULLTEXT);
+            text = (value!=null ? value.toString() : StringUtils.EMPTY);
+        }
         else if (value instanceof String)
         {   // we already have a string
             text = (String)value;
         }
-        else if (columns[idx].getDataType().isText())
-        {   // we have a text expression, convert ourselves
-            text = ObjectUtils.getString(value);
+        else if (value instanceof Enum<?>)
+        {   // convert from enum
+            value = ObjectUtils.getEnumValue((Enum<?>)value, 
column.getDataType().isNumeric());
+            text  = StringUtils.toString(value, StringUtils.EMPTY);
         }
         else
         {   // convert to String
-            text = convertToString(columns[idx], value);
+            text = convertToString(column, value);
         }
-        // Escape
-        return escape(text);
+        // Done
+        return text;
     }
 
     /**
@@ -136,26 +143,4 @@ public class DataListHead implements Serializable
         return ObjectUtils.getString(value);
     }
     
-    /**
-     * Escapes the formatted value
-     * Default is a simple HTML escape
-     * Overwrite in order to change the behavior
-     */
-    protected String escape(String text)
-    {
-        if (text==null || text.length()==0)
-            return StringUtils.EMPTY;
-        // &amp;
-        if (text.indexOf('&')>=0)
-            text = StringUtils.replaceAll(text, "&", "&amp;");
-        // &lt;
-        if (text.indexOf('<')>=0)
-            text = StringUtils.replaceAll(text, "<", "&lt;");
-        // &gt;
-        if (text.indexOf('>')>=0)
-            text = StringUtils.replaceAll(text, ">", "&gt;");
-        // done
-        return text;
-    }
-    
 }
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 9b9f65b..fb1a5e3 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
@@ -33,6 +33,7 @@ import org.apache.empire.data.DataType;
 import org.apache.empire.db.expr.column.DBAliasExpr;
 import org.apache.empire.db.expr.column.DBCalcExpr;
 import org.apache.empire.db.expr.column.DBCaseExpr;
+import org.apache.empire.db.expr.column.DBCoalesceExpr;
 import org.apache.empire.db.expr.column.DBConcatExpr;
 import org.apache.empire.db.expr.column.DBConcatFuncExpr;
 import org.apache.empire.db.expr.column.DBConvertExpr;
@@ -710,7 +711,8 @@ public abstract class DBColumnExpr extends DBExpr
      */
     public DBColumnExpr coalesce(Object nullValue)
     {
-        return getExprFromPhrase(DBSqlPhrase.SQL_FUNC_COALESCE, new Object[] { 
nullValue }, getUpdateColumn(), false);
+        // return getExprFromPhrase(DBSqlPhrase.SQL_FUNC_COALESCE, new 
Object[] { nullValue }, getUpdateColumn(), false);
+        return new DBCoalesceExpr(this, nullValue);
     }
 
     /**
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java 
b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
index e5a91a9..9e5af54 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBQuery.java
@@ -30,7 +30,6 @@ import org.apache.empire.data.ColumnExpr;
 import org.apache.empire.db.exceptions.NoPrimaryKeyException;
 import org.apache.empire.db.exceptions.RecordUpdateAmbiguousException;
 import org.apache.empire.db.exceptions.RecordUpdateFailedException;
-import org.apache.empire.db.expr.column.DBAliasExpr;
 import org.apache.empire.db.expr.compare.DBCompareColExpr;
 import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.db.expr.join.DBColumnJoinExpr;
@@ -117,9 +116,13 @@ public class DBQuery extends DBRowSet
         {   // Init Columns 
             queryColumns[i] = createQueryColumn(exprList[i], i);
             // add column
-            DBColumn column = exprList[i].getUpdateColumn();
-            if (column==null || (exprList[i] instanceof DBAliasExpr))
-            {   // use QueryColumn
+            DBColumn column;
+            if (exprList[i] instanceof DBColumn)
+            {   // use directly
+                column = (DBColumn)exprList[i];
+            }
+            else
+            {   // create Wrapper
                 column = new DBQueryExprColumn(this, 
queryColumns[i].getName(), exprList[i]); 
             }
             columns.add(column);
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 346583d..1c80e9e 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
@@ -30,6 +30,7 @@ import java.util.Date;
 import org.apache.commons.beanutils.BeanUtils;
 import org.apache.commons.beanutils.PropertyUtils;
 import org.apache.empire.commons.ObjectUtils;
+import org.apache.empire.commons.Options;
 import org.apache.empire.commons.StringUtils;
 import org.apache.empire.data.Column;
 import org.apache.empire.data.ColumnExpr;
@@ -454,8 +455,58 @@ public abstract class DBRecordData extends DBObject
     {
         return isNull(getFieldIndex(column));
     }
+    
+    /**
+     * Returns the value of a column as a formatted text
+     * This converts the value to a string if necessary and performs an 
options lookup
+     * To customize conversion please override convertToString()
+     * @param column the column for which to get the formatted value
+     * @return the formatted value
+     */
+    public String getText(ColumnExpr column)
+    {   
+        String text;
+        Object value = get(column);
+        // check options first
+        Options options = column.getOptions();
+        if (options!=null && options.has(value))
+        {   // lookup option
+            text = options.get(value);
+        }
+        else if (ObjectUtils.isEmpty(value))
+        {   // empty
+            value = column.getAttribute(Column.COLATTR_NULLTEXT);
+            text = (value!=null ? value.toString() : StringUtils.EMPTY);
+        }
+        else if (value instanceof String)
+        {   // we already have a string
+            text = (String)value;
+        }
+        else if (value instanceof Enum<?>)
+        {   // convert from enum
+            value = ObjectUtils.getEnumValue((Enum<?>)value, 
column.getDataType().isNumeric());
+            text  = StringUtils.toString(value, StringUtils.EMPTY);
+        }
+        else
+        {   // convert to String
+            text = convertToString(column, value);
+        }
+        // done
+        return text;
+    }
 
     /**
+     * Convert a non-string value to a string
+     * @param column the column expression 
+     * @param value the value to format
+     * @return the formatted string
+     */
+    protected String convertToString(ColumnExpr column, Object value)
+    {
+        return ObjectUtils.getString(value);
+    }
+    
+    /**
      * Set a single property value of a java bean object used by 
readProperties.
      */
     protected void setBeanProperty(ColumnExpr column, Object bean, String 
property, Object value)
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java 
b/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
index 84f7ffd..a4f608e 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBTableColumn.java
@@ -391,7 +391,7 @@ public class DBTableColumn extends DBColumn
             attributes.addXml(elem, flags);
         // add All Options
         if (options!=null)
-            options.addXml(elem, flags);
+            options.addXml(elem, this.type);
         // done
         return elem;
     }
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBView.java 
b/empire-db/src/main/java/org/apache/empire/db/DBView.java
index ce520be..85320d1 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBView.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBView.java
@@ -182,7 +182,7 @@ public abstract class DBView extends DBRowSet
             // add All Options
             Options fieldOptions = getOptions();
             if (fieldOptions != null)
-                fieldOptions.addXml(elem, flags);
+                fieldOptions.addXml(elem, this.dataType);
             // done
             return elem;
         }
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 d124dec..b2fa6b9 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
@@ -40,7 +40,7 @@ import org.w3c.dom.Element;
 public abstract class DBAbstractFuncExpr extends DBColumnExpr
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
-    private static final Logger log = 
LoggerFactory.getLogger(DBAbstractFuncExpr.class);
+    protected static final Logger log = 
LoggerFactory.getLogger(DBAbstractFuncExpr.class);
   
     protected final DBColumnExpr expr;
     protected final DBColumn     updateColumn; // optional
@@ -60,7 +60,7 @@ public abstract class DBAbstractFuncExpr extends DBColumnExpr
     {
         this.expr = expr;
         this.updateColumn = updateColumn;
-        this.isAggregate = isAggregate;
+        this.isAggregate = isAggregate || expr.isAggregate(); 
         this.dataType = dataType;
     }
 
@@ -155,7 +155,7 @@ public abstract class DBAbstractFuncExpr extends 
DBColumnExpr
     @Override
     public boolean isAggregate()
     {
-        return isAggregate || expr.isAggregate();
+        return isAggregate ;
     }
 
     /**
@@ -270,7 +270,7 @@ public abstract class DBAbstractFuncExpr extends 
DBColumnExpr
                 attributes.addXml(elem, flags);
             // add All Options
             if (options!=null)
-                options.addXml(elem, flags);
+                options.addXml(elem, this.dataType);
         }
         // Done
         elem.setAttribute("function", getFunctionName());
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 a3b593a..7efde69 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
@@ -139,7 +139,7 @@ public class DBCaseExpr extends DBColumnExpr
             attributes.addXml(elem, flags);
         // add All Options
         if (options!=null)
-            options.addXml(elem, flags);
+            options.addXml(elem, getDataType());
         // Done
         elem.setAttribute("function", "case");
         return elem;
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCaseWhenExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCaseWhenExpr.java
index 81d878e..3984c53 100644
--- 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCaseWhenExpr.java
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCaseWhenExpr.java
@@ -170,7 +170,7 @@ public class DBCaseWhenExpr extends DBColumnExpr
             attributes.addXml(elem, flags);
         // add All Options
         if (options!=null)
-            options.addXml(elem, flags);
+            options.addXml(elem, getDataType());
         // Done
         elem.setAttribute("function", "case");
         return elem;
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
new file mode 100644
index 0000000..2f86ad6
--- /dev/null
+++ 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBCoalesceExpr.java
@@ -0,0 +1,113 @@
+/*
+ * ESTEAM Software GmbH, 22.02.2022
+ */
+package org.apache.empire.db.expr.column;
+
+import java.util.Set;
+
+import org.apache.empire.commons.StringUtils;
+import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBColumnExpr;
+import org.apache.empire.db.DBExpr;
+import org.apache.empire.dbms.DBSqlPhrase;
+
+public class DBCoalesceExpr extends DBAbstractFuncExpr
+{
+    private final Object nullValue;
+    
+    public DBCoalesceExpr(DBColumnExpr expr, Object nullValue)
+    {
+        super(expr, expr.getUpdateColumn(), false, expr.getDataType());
+        // set the null value
+        this.nullValue = nullValue;
+    }
+
+    /**
+     * Should we return true here?
+     */
+    @Override
+    public boolean isWrapper()
+    {   
+        return false; // Should we return true here?
+    }
+
+    @Override
+    public DBColumnExpr unwrap()
+    {
+        return expr;
+    }
+
+    @Override
+    protected String getFunctionName()
+    {
+        return StringUtils.EMPTY;
+    }
+    
+    /**
+     * Returns the column name.
+     */
+    @Override
+    public String getName()
+    {
+        return expr.getName();
+    }
+    
+    /**
+     * Returns the column enum type
+     */
+    @Override
+    public Class<Enum<?>> getEnumType()
+    {
+        return expr.getEnumType();
+    }
+    
+    /**
+     * Compares true if the other is also a coalesce expr on the same column
+     */
+    @Override
+    public boolean equals(Object other)
+    {
+        if (other==this)
+            return true;
+        // Check for another Alias Expression
+        if (other instanceof DBCoalesceExpr)
+        {   // Compare with another alias expression
+            DBColumnExpr otherExpr = ((DBCoalesceExpr)other).expr;
+            return this.expr.equals(otherExpr);
+        }
+        return false;
+    }
+
+    /**
+     * 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
+    public void addReferencedColumns(Set<DBColumn> list)
+    {
+        super.addReferencedColumns(list);
+        // add referenced columns
+        if (nullValue instanceof DBExpr)
+            ((DBExpr)nullValue).addReferencedColumns(list);
+    }
+
+    @Override
+    public void addSQL(StringBuilder sql, long context)
+    {
+        // Get the template
+        String template = 
getDbms().getSQLPhrase(DBSqlPhrase.SQL_FUNC_COALESCE);
+        // Add SQL
+        super.addSQL(sql, template, new Object[] { nullValue }, context);
+    }
+
+}
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 e4cdd18..d89ff0f 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
@@ -107,7 +107,7 @@ public class DBConcatExpr extends DBColumnExpr
             attributes.addXml(elem, flags);
         // add All Options
         if (options!=null)
-            options.addXml(elem, flags);
+            options.addXml(elem, getDataType());
         // Done
         return elem;
     }
diff --git 
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBFuncExpr.java 
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBFuncExpr.java
index 601516e..6751330 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBFuncExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBFuncExpr.java
@@ -43,7 +43,7 @@ import org.apache.empire.dbms.DBSqlPhrase;
 public class DBFuncExpr extends DBAbstractFuncExpr
 {
     // *Deprecated* private static final long serialVersionUID = 1L;
-  
+
     protected final DBSqlPhrase  phrase;
     protected final Object[]     params;
     protected String             template;
@@ -69,6 +69,9 @@ public class DBFuncExpr extends DBAbstractFuncExpr
         this.phrase = phrase;
         this.params = params;
         this.template = null;
+        // check
+        if (phrase==DBSqlPhrase.SQL_FUNC_COALESCE)
+            log.warn("DBFuncExpr should not be used for SQL_FUNC_COALESCE. Use 
DBCoalesceExpr instead.");
     }
 
     /**
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 d371499..fd30683 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
@@ -164,7 +164,7 @@ public class DBValueExpr extends DBColumnExpr
                 attributes.addXml(elem, flags);
             // add All Options
             if (options!=null)
-                options.addXml(elem, flags);
+                options.addXml(elem, this.type);
         }
         // Done
         elem.setAttribute("function", "value");
diff --git a/empire-db/src/test/java/org/apache/empire/commons/OptionsTest.java 
b/empire-db/src/test/java/org/apache/empire/commons/OptionsTest.java
index d97a80e..e0a6e36 100644
--- a/empire-db/src/test/java/org/apache/empire/commons/OptionsTest.java
+++ b/empire-db/src/test/java/org/apache/empire/commons/OptionsTest.java
@@ -31,6 +31,7 @@ import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.parsers.ParserConfigurationException;
 
 import org.apache.empire.commons.Options.InsertPos;
+import org.apache.empire.data.DataType;
 import org.junit.Test;
 import org.w3c.dom.Document;
 import org.w3c.dom.Element;
@@ -342,8 +343,7 @@ public class OptionsTest
         Element root = doc.createElement("root");
         doc.appendChild(root);
 
-        // TODO get rid of flags param??
-        options.addXml(root, 0);
+        options.addXml(root, DataType.VARCHAR);
         Node node = root.getFirstChild();
         assertNotNull("no child was added", node);
         assertEquals("option", node.getNodeName());
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 a8d78d0..74ea828 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
@@ -37,7 +37,7 @@ public class AliasExpressionTest
      * Test Standard DBRecord with Serializable Context
      */
     @Test
-    public void testSerializationWithSerializableContext()
+    public void testAliasExpression()
         throws Exception
     {
         final TestDatabase db = new TestDatabase();
diff --git 
a/empire-db/src/test/java/org/apache/empire/db/AliasExpressionTest.java 
b/empire-db/src/test/java/org/apache/empire/db/CoalesceExpressionTest.java
similarity index 65%
copy from empire-db/src/test/java/org/apache/empire/db/AliasExpressionTest.java
copy to empire-db/src/test/java/org/apache/empire/db/CoalesceExpressionTest.java
index a8d78d0..7fc9be8 100644
--- a/empire-db/src/test/java/org/apache/empire/db/AliasExpressionTest.java
+++ b/empire-db/src/test/java/org/apache/empire/db/CoalesceExpressionTest.java
@@ -31,13 +31,13 @@ import junit.framework.Assert;
  * @author rainer
  * @since 23.01.22
  */
-public class AliasExpressionTest
+public class CoalesceExpressionTest
 {
     /**
      * Test Standard DBRecord with Serializable Context
      */
     @Test
-    public void testSerializationWithSerializableContext()
+    public void testCoalesceExpression()
         throws Exception
     {
         final TestDatabase db = new TestDatabase();
@@ -46,49 +46,46 @@ public class AliasExpressionTest
         db.open(context);
         
         TestDatabase.TestTable t = db.T_TEST;
-        DBColumnExpr ALIAS_1 = t.C_TEXT.as("ALIAS_1");
-        DBColumnExpr ALIAS_2 = t.C_TEXT.as("ALIAS_2");
-        DBColumnExpr ALIAS_2_NEU = t.C_TEXT.as("ALIAS_2");
-        DBColumnExpr ALIAS_X = t.C_TEXT.as("ALIAS_X");
-        DBColumnExpr AMOUNT = t.C_NUMBER.as("AMOUNT");
+        DBColumnExpr COALESCE_1 = t.C_TEXT.coalesce("COALESCE_1");
+        DBColumnExpr COALESCE_2 = t.C_TEXT.coalesce("COALESCE_2");
+        DBColumnExpr AMOUNT = t.C_NUMBER.coalesce(5);
+        
+        String propName = t.C_TEXT.getBeanPropertyName();
+        Assert.assertEquals(COALESCE_1.getBeanPropertyName(), propName);
+        propName = t.C_NUMBER.getBeanPropertyName();
+        Assert.assertEquals(AMOUNT.getBeanPropertyName(), propName);
 
         // Table Record
         DBRecord record = new DBRecord(context, t);
         int textIndex = record.getFieldIndex(t.C_TEXT);
-        Assert.assertEquals(record.getFieldIndex(ALIAS_1), textIndex);
-        Assert.assertEquals(record.getFieldIndex(ALIAS_2), textIndex);
-        Assert.assertEquals(record.getFieldIndex(ALIAS_2_NEU), textIndex);
-        Assert.assertEquals(record.getFieldIndex(ALIAS_X), textIndex);
+        Assert.assertEquals(record.getFieldIndex(COALESCE_1), textIndex);
+        Assert.assertEquals(record.getFieldIndex(COALESCE_2), textIndex);
         int numberIndex = record.getFieldIndex(t.C_NUMBER);
         Assert.assertEquals(record.getFieldIndex(AMOUNT), numberIndex);
         
         DBCommand cmd = context.createCommand();
-        cmd.select(ALIAS_1, t.C_TEXT, ALIAS_2, ALIAS_2_NEU, AMOUNT); /* Don't 
select ALIAS_X */
+        cmd.select(COALESCE_1, t.C_TEXT, COALESCE_2, AMOUNT); /* Don't select 
COALESCE_2 */
         DBColumnExpr[] expr = cmd.getSelectExprList();
-        // Hint: ALIAS_2_NEU is not a separate column
-        Assert.assertEquals(expr.length, 4);
+        // Hint: COALESCE_2_NEU is not a separate column
+        Assert.assertEquals(expr.length, 3);
 
         // Query Record
         DBQuery q = new DBQuery(cmd);
         record = new DBRecord(context, q);
         Assert.assertEquals(record.getFieldIndex(t.C_TEXT), 1);
-        Assert.assertEquals(record.getFieldIndex(ALIAS_1), 0);
-        Assert.assertEquals(record.getFieldIndex(ALIAS_2), 2);
-        Assert.assertEquals(record.getFieldIndex(ALIAS_2_NEU), 2);
-        Assert.assertEquals(record.getFieldIndex(ALIAS_X), 1);
-        Assert.assertEquals(record.getFieldIndex(AMOUNT), 3);
-        Assert.assertEquals(record.getFieldIndex(t.C_NUMBER), 3);
+        Assert.assertEquals(record.getFieldIndex(COALESCE_1), 0);
+        Assert.assertEquals(record.getFieldIndex(COALESCE_2), 0);
+        Assert.assertEquals(record.getFieldIndex(AMOUNT), 2);
+        Assert.assertEquals(record.getFieldIndex(t.C_NUMBER), 2);
 
         // Reader 
         DBReader reader = new MyReader(context);
         reader.open(cmd);
         Assert.assertEquals(reader.getFieldIndex(t.C_TEXT), 1);
-        Assert.assertEquals(reader.getFieldIndex(ALIAS_1), 0);
-        Assert.assertEquals(reader.getFieldIndex(ALIAS_2), 2);
-        Assert.assertEquals(reader.getFieldIndex(ALIAS_2_NEU), 2);
-        Assert.assertEquals(reader.getFieldIndex(ALIAS_X), 1);
-        Assert.assertEquals(reader.getFieldIndex(AMOUNT), 3);
-        Assert.assertEquals(reader.getFieldIndex(t.C_NUMBER), 3);
+        Assert.assertEquals(reader.getFieldIndex(COALESCE_1), 0);
+        Assert.assertEquals(reader.getFieldIndex(COALESCE_2), 0);
+        Assert.assertEquals(reader.getFieldIndex(AMOUNT), 2);
+        Assert.assertEquals(reader.getFieldIndex(t.C_NUMBER), 2);
         reader.close();
         
         // DataListEntry
@@ -98,12 +95,10 @@ public class AliasExpressionTest
             values[i] = head.getColumns()[i].getName();
         DataListEntry dle = new DataListEntry(head, 0, values);
         Assert.assertEquals(dle.getString(t.C_TEXT), values[1]);
-        Assert.assertEquals(dle.getString(ALIAS_1), values[0]);
-        Assert.assertEquals(dle.getString(ALIAS_2), values[2]);
-        Assert.assertEquals(dle.getString(ALIAS_2_NEU), values[2]);
-        Assert.assertEquals(dle.getString(ALIAS_X), values[1]);
-        Assert.assertEquals(dle.getString(AMOUNT), values[3]);
-        Assert.assertEquals(dle.getString(t.C_NUMBER), values[3]);
+        Assert.assertEquals(dle.getString(COALESCE_1), values[0]);
+        Assert.assertEquals(dle.getString(COALESCE_2), values[0]);
+        Assert.assertEquals(dle.getString(AMOUNT), values[2]);
+        Assert.assertEquals(dle.getString(t.C_NUMBER), values[2]);
 
         // done
     }

Reply via email to