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 69ea173 EMPIREDB-314 SQL-format function support
69ea173 is described below
commit 69ea1739a4c24785f2334d79a52e58999eda7086
Author: Rainer Döbele <[email protected]>
AuthorDate: Wed Oct 23 10:07:39 2019 +0200
EMPIREDB-314
SQL-format function support
---
.../java/org/apache/empire/db/DBColumnExpr.java | 12 +++++++
.../main/java/org/apache/empire/db/DBCommand.java | 26 +++++++++++++--
.../org/apache/empire/db/DBDatabaseDriver.java | 1 +
.../empire/db/derby/DBDatabaseDriverDerby.java | 2 ++
.../empire/db/expr/column/DBAbstractFuncExpr.java | 38 +++++++++++++++++++---
.../apache/empire/db/h2/DBDatabaseDriverH2.java | 1 +
.../empire/db/hsql/DBDatabaseDriverHSql.java | 1 +
.../empire/db/mysql/DBDatabaseDriverMySQL.java | 1 +
.../empire/db/oracle/DBDatabaseDriverOracle.java | 1 +
.../db/postgresql/DBDatabaseDriverPostgreSQL.java | 1 +
.../empire/db/sqlite/DBDatabaseDriverSQLite.java | 1 +
.../empire/db/sqlserver/DBDatabaseDriverMSSQL.java | 1 +
12 files changed, 78 insertions(+), 8 deletions(-)
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 3c2b33e..61e6492 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
@@ -864,6 +864,18 @@ public abstract class DBColumnExpr extends DBExpr
}
/**
+ * Formats a column-expression using a format string
+ * This function is intended for formatting numbers.
+ * Formatting any other data types may not supported and be database
specific
+ * @param format the format string. Beware: This is passed to the database
"as is" and hence may be database specific.
+ * @return a string expression representing the formatted value
+ */
+ public DBColumnExpr format(String format)
+ {
+ return getExprFromPhrase(DBDatabaseDriver.SQL_FUNC_FORMAT, new
Object[] { format }, getUpdateColumn(), false, DataType.VARCHAR);
+ }
+
+ /**
* Creates and returns a sql-expression that returns the string length of
this expression.
* @return the new DBFuncExpr object
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
index 74778b3..caffa5a 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommand.java
@@ -778,11 +778,11 @@ public abstract class DBCommand extends DBCommandExpr
return;
removeConstraintOn(where, col);
}
-
+
/**
* Returns a copy of the defined joins.
*
- * @return vector of joins
+ * @return the list of joins
*/
public List<DBJoinExpr> getJoins()
{
@@ -813,9 +813,29 @@ public abstract class DBCommand extends DBCommandExpr
having = new ArrayList<DBCompareExpr>();
setConstraint(having, expr);
}
+
+ /**
+ * Returns true if the command has having-constraints or false if not.
+ *
+ * @return true if constraints have been set on the command
+ */
+ public boolean hasHavingConstraints()
+ {
+ return (having!=null && having.size()>0);
+ }
+
+ /**
+ * Returns a copy of the defined having clauses.
+ *
+ * @return list of having constraints
+ */
+ public List<DBCompareExpr> getHavingConstraints()
+ {
+ return (this.having!=null ? Collections.unmodifiableList(this.having)
: null);
+ }
/**
- * removes a constraint on a particular column from the where clause
+ * removes a constraint on a particular column from the having clause
* @param col the column expression for which to remove the constraint
*/
public void removeHavingConstraintOn(DBColumnExpr col)
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
b/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
index 44b09c9..4aacd7b 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBDatabaseDriver.java
@@ -94,6 +94,7 @@ public abstract class DBDatabaseDriver implements Serializable
public static final int SQL_FUNC_FLOOR = 123; // Oracle: floor(?)
public static final int SQL_FUNC_CEILING = 124; // Oracle: ceil(?)
public static final int SQL_FUNC_MODULO = 125; // Oracle: mod(?)
+ public static final int SQL_FUNC_FORMAT = 126; // Oracle: TO_CHAR(?)
// Date
public static final int SQL_FUNC_DAY = 132; // MSSQL: month(?)
public static final int SQL_FUNC_MONTH = 133; // MSSQL: month(?)
diff --git
a/empire-db/src/main/java/org/apache/empire/db/derby/DBDatabaseDriverDerby.java
b/empire-db/src/main/java/org/apache/empire/db/derby/DBDatabaseDriverDerby.java
index e60b6a8..8eed386 100644
---
a/empire-db/src/main/java/org/apache/empire/db/derby/DBDatabaseDriverDerby.java
+++
b/empire-db/src/main/java/org/apache/empire/db/derby/DBDatabaseDriverDerby.java
@@ -220,6 +220,8 @@ public class DBDatabaseDriverDerby extends DBDatabaseDriver
case SQL_FUNC_TRUNC: return "truncate(?,{0})";
case SQL_FUNC_CEILING: return "ceiling(?)";
case SQL_FUNC_FLOOR: return "floor(?)";
+ case SQL_FUNC_MODULO: return "mod(?,{0})";
+ case SQL_FUNC_FORMAT: return "format(?, {0:VARCHAR})";
// Date
case SQL_FUNC_DAY: return "day(?)";
case SQL_FUNC_MONTH: return "month(?)";
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 ffff472..d89fd3d 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
@@ -27,7 +27,10 @@ import org.apache.empire.db.DBColumn;
import org.apache.empire.db.DBColumnExpr;
import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBDatabaseDriver;
+import org.apache.empire.exceptions.InvalidArgumentException;
import org.apache.empire.xml.XMLUtil;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
import org.w3c.dom.Element;
@@ -37,6 +40,7 @@ import org.w3c.dom.Element;
public abstract class DBAbstractFuncExpr extends DBColumnExpr
{
private final static long serialVersionUID = 1L;
+ private static final Logger log =
LoggerFactory.getLogger(DBAbstractFuncExpr.class);
protected final DBColumnExpr expr;
protected final DBColumn updateColumn; // optional
@@ -156,13 +160,37 @@ public abstract class DBAbstractFuncExpr extends
DBColumnExpr
{
// Get Template
if (params != null)
- { // Replace Params
- DataType dataType = expr.getDataType();
+ { // Replace Params
for (int i = 0; i < params.length; i++)
- { // String test =(params[i] != null) ? params[i].toString() :
"";
- String value = getObjectValue(dataType, params[i],
CTX_DEFAULT, ",");
+ { // Detect placeholder and data type
+ DataType paramDataType = expr.getDataType();
+ int idx;
+ String ph = "{"+String.valueOf(i);
+ if ((idx=template.indexOf(ph))>=0) {
+ // param found
+ idx += ph.length();
+ int end = template.indexOf('}', idx);
+ if (end<idx)
+ throw new InvalidArgumentException("template",
template);
+ // check if type is specified
+ if (template.charAt(idx)==':')
+ { // DataType is specified
+ String typeName = ((end>=idx) ?
template.substring(idx+1, end) : null);
+ DataType dataType = ((typeName!=null) ?
DataType.valueOf(typeName) : null);
+ if (dataType!=null)
+ paramDataType = dataType;
+ }
+ // complete placeholder
+ ph += template.substring(idx, end+1);
+
+ } else {
+ log.warn("No placeholder found in template {} for paramter
{}", template, i);
+ continue;
+ }
+ // get param and replace
+ String paramAsString = getObjectValue(paramDataType,
params[i], CTX_DEFAULT, ",");
// template = template.replaceAll("\\{" + String.valueOf(i) +
"\\}", value);
- template = StringUtils.replaceAll(template, "{"+
String.valueOf(i) + "}", value);
+ template = StringUtils.replaceAll(template, ph, paramAsString);
}
}
// Get Prefix and Postfix
diff --git
a/empire-db/src/main/java/org/apache/empire/db/h2/DBDatabaseDriverH2.java
b/empire-db/src/main/java/org/apache/empire/db/h2/DBDatabaseDriverH2.java
index 5b168ba..67289ec 100644
--- a/empire-db/src/main/java/org/apache/empire/db/h2/DBDatabaseDriverH2.java
+++ b/empire-db/src/main/java/org/apache/empire/db/h2/DBDatabaseDriverH2.java
@@ -268,6 +268,7 @@ public class DBDatabaseDriverH2 extends DBDatabaseDriver
case SQL_FUNC_CEILING: return "ceiling(?)";
case SQL_FUNC_FLOOR: return "floor(?)";
case SQL_FUNC_MODULO: return "mod(?,{0})";
+ case SQL_FUNC_FORMAT: return "format(?, {0:VARCHAR})";
// Date
case SQL_FUNC_DAY: return "day(?)";
case SQL_FUNC_MONTH: return "month(?)";
diff --git
a/empire-db/src/main/java/org/apache/empire/db/hsql/DBDatabaseDriverHSql.java
b/empire-db/src/main/java/org/apache/empire/db/hsql/DBDatabaseDriverHSql.java
index 1ae3104..72a2f03 100644
---
a/empire-db/src/main/java/org/apache/empire/db/hsql/DBDatabaseDriverHSql.java
+++
b/empire-db/src/main/java/org/apache/empire/db/hsql/DBDatabaseDriverHSql.java
@@ -160,6 +160,7 @@ public class DBDatabaseDriverHSql extends DBDatabaseDriver
case SQL_FUNC_CEILING: return "ceiling(?)";
case SQL_FUNC_FLOOR: return "floor(?)";
case SQL_FUNC_MODULO: return "mod(?,{0})";
+ case SQL_FUNC_FORMAT: return "TO_CHAR(?, {0:VARCHAR})";
// Date
case SQL_FUNC_DAY: return "day(?)";
case SQL_FUNC_MONTH: return "month(?)";
diff --git
a/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
b/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
index 7b57ba5..11c9859 100644
---
a/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
+++
b/empire-db/src/main/java/org/apache/empire/db/mysql/DBDatabaseDriverMySQL.java
@@ -1028,6 +1028,7 @@ public class DBDatabaseDriverMySQL extends
DBDatabaseDriver
case SQL_FUNC_CEILING: return "ceiling(?)";
case SQL_FUNC_FLOOR: return "floor(?)";
case SQL_FUNC_MODULO: return "mod(?,{0})";
+ case SQL_FUNC_FORMAT: return "format(?, {0:INTEGER})";
/* TODO: supports only decimal places. Add support for a format string */
// Date
case SQL_FUNC_DAY: return "day(?)";
case SQL_FUNC_MONTH: return "month(?)";
diff --git
a/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
b/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
index 32556df..c25e7b9 100644
---
a/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
+++
b/empire-db/src/main/java/org/apache/empire/db/oracle/DBDatabaseDriverOracle.java
@@ -189,6 +189,7 @@ public class DBDatabaseDriverOracle extends DBDatabaseDriver
case SQL_FUNC_CEILING: return "ceil(?)";
case SQL_FUNC_FLOOR: return "floor(?)";
case SQL_FUNC_MODULO: return "mod(?,{0})";
+ case SQL_FUNC_FORMAT: return "TO_CHAR(?,
{0:VARCHAR})";
// Date
case SQL_FUNC_DAY: return oracle8Compatibilty ?
"to_number(to_char(?,'DD'))" : "extract(day from ?)";
case SQL_FUNC_MONTH: return oracle8Compatibilty ?
"to_number(to_char(?,'MM'))" : "extract(month from ?)";
diff --git
a/empire-db/src/main/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQL.java
b/empire-db/src/main/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQL.java
index ce279b5..39965e5 100644
---
a/empire-db/src/main/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQL.java
+++
b/empire-db/src/main/java/org/apache/empire/db/postgresql/DBDatabaseDriverPostgreSQL.java
@@ -368,6 +368,7 @@ public class DBDatabaseDriverPostgreSQL extends
DBDatabaseDriver
case SQL_FUNC_CEILING: return "ceiling(?)";
case SQL_FUNC_FLOOR: return "floor(?)";
case SQL_FUNC_MODULO: return "mod(?,{0})";
+ case SQL_FUNC_FORMAT: return "format({0:VARCHAR}, ?)";
// Date
case SQL_FUNC_DAY: return "extract(day
from ?)";
case SQL_FUNC_MONTH: return "extract(month
from ?)";
diff --git
a/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
b/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
index a516c1e..d038427 100644
---
a/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
+++
b/empire-db/src/main/java/org/apache/empire/db/sqlite/DBDatabaseDriverSQLite.java
@@ -349,6 +349,7 @@ public class DBDatabaseDriverSQLite extends DBDatabaseDriver
case SQL_FUNC_CEILING: return "ceiling(?)";
case SQL_FUNC_FLOOR: return "floor(?)";
case SQL_FUNC_MODULO: return "mod(?,{0})";
+ case SQL_FUNC_FORMAT: return "printf({0:VARCHAR}, ?)";
// Date
case SQL_FUNC_DAY: return "day(?)";
case SQL_FUNC_MONTH: return "month(?)";
diff --git
a/empire-db/src/main/java/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java
b/empire-db/src/main/java/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java
index 4804f5c..d013245 100644
---
a/empire-db/src/main/java/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java
+++
b/empire-db/src/main/java/org/apache/empire/db/sqlserver/DBDatabaseDriverMSSQL.java
@@ -337,6 +337,7 @@ public class DBDatabaseDriverMSSQL extends DBDatabaseDriver
case SQL_FUNC_CEILING: return "ceiling(?)";
case SQL_FUNC_FLOOR: return "floor(?)";
case SQL_FUNC_MODULO: return "((?) % {0})";
+ case SQL_FUNC_FORMAT: return "format(?, {0:VARCHAR})";
// Date
case SQL_FUNC_DAY: return "day(?)";
case SQL_FUNC_MONTH: return "month(?)";