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;
- // &
- if (text.indexOf('&')>=0)
- text = StringUtils.replaceAll(text, "&", "&");
- // <
- if (text.indexOf('<')>=0)
- text = StringUtils.replaceAll(text, "<", "<");
- // >
- if (text.indexOf('>')>=0)
- text = StringUtils.replaceAll(text, ">", ">");
- // 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
}