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 d30b42e1 EMPIREDB-416 DBCaseExpr bugfix for sourceColumn
d30b42e1 is described below

commit d30b42e1ede8cb74f3dc007570becb222f932d64
Author: Rainer Döbele <[email protected]>
AuthorDate: Sun Mar 24 14:48:53 2024 +0100

    EMPIREDB-416
    DBCaseExpr bugfix for sourceColumn
---
 .../java/org/apache/empire/db/DBQueryColumn.java   | 12 ++-----
 .../apache/empire/db/expr/column/DBCaseExpr.java   | 39 +++++++++++++---------
 2 files changed, 26 insertions(+), 25 deletions(-)

diff --git a/empire-db/src/main/java/org/apache/empire/db/DBQueryColumn.java 
b/empire-db/src/main/java/org/apache/empire/db/DBQueryColumn.java
index 43d4772f..8dc827ca 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBQueryColumn.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBQueryColumn.java
@@ -19,7 +19,6 @@
 package org.apache.empire.db;
 
 import org.apache.empire.commons.Options;
-import org.apache.empire.data.Column;
 import org.apache.empire.data.DataType;
 import org.w3c.dom.Element;
 
@@ -90,17 +89,12 @@ public class DBQueryColumn extends DBColumn
     }
 
     @Override
-    @SuppressWarnings("unchecked")
     public Class<Enum<?>> getEnumType()
     {
-        // check expression attribute
-        Object enumType = expr.getAttribute(Column.COLATTR_ENUMTYPE);
+        // enum type of expression
+        Class<Enum<?>> enumType = expr.getEnumType();
         if (enumType!=null)
-            return ((Class<Enum<?>>)enumType);        
-        // otherwise check update column
-        DBColumn col = expr.getSourceColumn();
-        if (col!=null)
-            return col.getEnumType();
+            return enumType;  
         // otherwise 
         return super.getEnumType();
     }
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 20698e53..2d2b3f23 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
@@ -26,21 +26,22 @@ import org.apache.empire.db.DBColumnExpr;
 import org.apache.empire.db.DBDatabase;
 import org.apache.empire.db.DBExpr;
 import org.apache.empire.db.expr.compare.DBCompareColExpr;
-import org.apache.empire.db.expr.compare.DBCompareExpr;
 import org.apache.empire.xml.XMLUtil;
 import org.w3c.dom.Element;
 
 /**
- * This class is used to add the "case when ?=A then X else Y end" statement 
to the SQL-Command.
+ * This class represents a SQL case expression
+ * like "case when ?=A then X else Y end"
+ *   or "case ? when A then X else Y end"
  * <P>
- * There is no need to explicitly create instances of this class.<BR>
- * Instead use {@link DBColumnExpr#when(DBCompareExpr, Object) }
+ * This abstract class is implemented by DBCaseMapExpr and DBCaseWhenExpr
  * <P>
  * @author doebele
  */
 public abstract class DBCaseExpr extends DBColumnExpr
 {
     // detect 
+    private DBDatabase database = null;
     private DBColumn sourceColumn = null;
     private DataType dataType = DataType.UNKNOWN;
     private Class<Enum<?>> enumType = null;
@@ -55,7 +56,7 @@ public abstract class DBCaseExpr extends DBColumnExpr
     @Override
     public final DBDatabase getDatabase()
     {
-        return sourceColumn.getDatabase();
+        return database;
     }
 
     @Override
@@ -127,13 +128,17 @@ public abstract class DBCaseExpr extends DBColumnExpr
     /**
      * Init case expression. 
      * Must be called from all constructors!
-     * @param sourceColumn
-     * @param valueMap
-     * @param elseValue
+     * @param caseColumn the case expression column (if any)
+     * @param valueMap the value or conditions map
+     * @param elseValue the else value
      */
-    protected void init(DBColumn sourceColumn, Map<?,?> valueMap, Object 
elseValue)
+    protected void init(DBColumn caseColumn, Map<?,?> valueMap, Object 
elseValue)
     {
-        this.sourceColumn = sourceColumn;
+        /*
+         * Important: caseColumn is not the sourceColumn
+         * sourceColumn must be set from target values!
+         */
+        this.database = (caseColumn!=null ? caseColumn.getDatabase() : null);
         for (Map.Entry<?, ?> entry : valueMap.entrySet())
         {   // check compare expr
             registerCompareValue(entry.getKey());
@@ -144,14 +149,12 @@ public abstract class DBCaseExpr extends DBColumnExpr
     
     private void registerCompareValue(Object value)
     {
+        // set properties from value
+        if (this.database==null && (value instanceof DBExpr) && 
((DBExpr)value).getDatabase()!=null)
+            this.database=((DBExpr)value).getDatabase();
         if (value instanceof DBCompareColExpr)
             value = ((DBCompareColExpr)value).getColumnExpr();
-        if (!(value instanceof DBColumnExpr))
-            return; // not a function
-        DBColumnExpr colExpr = (DBColumnExpr)value;
-        if (this.sourceColumn==null && colExpr.getSourceColumn()!=null)
-            this.sourceColumn = colExpr.getSourceColumn();
-        if (colExpr.isAggregate())
+        if (value instanceof DBColumnExpr && 
((DBColumnExpr)value).isAggregate())
             this.aggregateFunc = true;
     }
 
@@ -164,6 +167,10 @@ public abstract class DBCaseExpr extends DBColumnExpr
         if (value instanceof DBColumnExpr)
         {   // Column Expression
             DBColumnExpr colExpr = ((DBColumnExpr)value);
+            if (this.database==null)
+                this.database=colExpr.getDatabase();
+            if (this.sourceColumn==null && colExpr.getSourceColumn()!=null)
+                this.sourceColumn = colExpr.getSourceColumn();
             if (this.dataType==DataType.UNKNOWN)
                 this.dataType = colExpr.getDataType();
             if (this.enumType== null && colExpr.getEnumType()!=null)

Reply via email to