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)