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 4a192f0b EMPIREDB-454 DBCommand: getSelect with Skip options
4a192f0b is described below
commit 4a192f0bcb8ef6932fed23b6d07cad21116c4142
Author: Rainer Döbele <[email protected]>
AuthorDate: Fri Jan 10 09:23:52 2025 +0100
EMPIREDB-454
DBCommand: getSelect with Skip options
---
.../java/org/apache/empire/commons/ValueUtils.java | 12 ++---
.../java/org/apache/empire/db/DBCombinedCmd.java | 4 +-
.../main/java/org/apache/empire/db/DBCommand.java | 61 ++++++++++++++--------
.../java/org/apache/empire/db/DBCommandExpr.java | 30 +++++++++--
.../main/java/org/apache/empire/db/DBUtils.java | 19 ++-----
.../empire/db/expr/compare/DBExistsExpr.java | 2 +-
.../org/apache/empire/dbms/h2/DBMSHandlerH2.java | 4 +-
.../org/apache/empire/dbms/hsql/DBCommandHSql.java | 4 +-
.../apache/empire/dbms/mysql/DBMSHandlerMySQL.java | 8 +--
.../apache/empire/dbms/oracle/DBCommandOracle.java | 43 +++++++++------
.../empire/dbms/postgresql/DBCommandPostgres.java | 4 +-
11 files changed, 113 insertions(+), 78 deletions(-)
diff --git a/empire-db/src/main/java/org/apache/empire/commons/ValueUtils.java
b/empire-db/src/main/java/org/apache/empire/commons/ValueUtils.java
index 999a982c..bd00cc30 100644
--- a/empire-db/src/main/java/org/apache/empire/commons/ValueUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/commons/ValueUtils.java
@@ -91,12 +91,12 @@ public class ValueUtils
return true;
if (o==ObjectUtils.NO_VALUE)
throw new InvalidValueException(o);
- if ((o instanceof String) && ((String)o).length()==0)
- return true;
- if ((o instanceof Object[]) && ((Object[])o).length==0)
- return true;
- if ((o instanceof Collection<?>) && ((Collection<?>)o).isEmpty())
- return true;
+ if ((o instanceof String))
+ return ((String)o).length()==0;
+ if ((o instanceof Object[]))
+ return ((Object[])o).length==0;
+ if ((o instanceof Collection<?>))
+ return ((Collection<?>)o).isEmpty();
if (o instanceof DBValueExpr)
return isEmpty(((DBValueExpr)o).getValue());
if (o instanceof Enum)
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCombinedCmd.java
b/empire-db/src/main/java/org/apache/empire/db/DBCombinedCmd.java
index 92ade6ad..99355c9c 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCombinedCmd.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCombinedCmd.java
@@ -214,7 +214,7 @@ public class DBCombinedCmd extends DBCommandExpr
* @param sql the SQL-Command
*/
@Override
- public void getSelect(DBSQLBuilder sql, short flags)
+ public void getSelect(DBSQLBuilder sql, int flags)
{
cmdParams.clear(0);
// the left part
@@ -242,7 +242,7 @@ public class DBCombinedCmd extends DBCommandExpr
else
right.getSelect(sql, flags);
// Add optional Order by statement
- if (orderBy!=null && !orderBy.isEmpty() && (flags & SF_NO_ORDER)==0)
+ if (notEmpty(orderBy) && not(flags, SF_SKIP_ORDER))
{ // add ORDER BY
sql.append("\r\nORDER BY ");
addListExpr(sql, orderBy, CTX_DEFAULT, ", ");
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 15bf9ec2..b9c23fe1 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
@@ -45,6 +45,7 @@ import org.apache.empire.dbms.DBMSHandler;
import org.apache.empire.dbms.DBSqlPhrase;
import org.apache.empire.exceptions.InvalidArgumentException;
import org.apache.empire.exceptions.ItemNotFoundException;
+import org.apache.empire.exceptions.NotSupportedException;
import org.apache.empire.exceptions.ObjectNotValidException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -179,6 +180,12 @@ public abstract class DBCommand extends DBCommandExpr
for (int i=0; (clone.having!=null && i<clone.having.size()); i++)
clone.having.set(i, clone.having.get(i).copy(clone));
}
+ // check params
+ if (clone.cmdParams.size()!=this.cmdParams.size())
+ { // Failed to copy all DBCmdParams
+ log.error("DBCommand.clone failed: Not all DBCmdParams could be
replaced.");
+ throw new NotSupportedException(this, "clone");
+ }
// done
return clone;
}
@@ -192,9 +199,9 @@ public abstract class DBCommand extends DBCommandExpr
if (hasSetExpr())
return this.set.get(0).getDatabase();
// two more chances (should we?)
- if (where!=null && !where.isEmpty())
+ if (notEmpty(where))
return where.get(0).getDatabase();
- if (orderBy!=null && !orderBy.isEmpty())
+ if (notEmpty(orderBy))
return orderBy.get(0).getDatabase();
// not valid yet
throw new ObjectNotValidException(this);
@@ -325,7 +332,7 @@ public abstract class DBCommand extends DBCommandExpr
@Override
public boolean hasSelectExpr()
{
- return (select!=null && !select.isEmpty());
+ return notEmpty(select);
}
/**
@@ -600,7 +607,7 @@ public abstract class DBCommand extends DBCommandExpr
*/
public boolean hasSetExpr()
{
- return (this.set!=null ? !this.set.isEmpty() : false);
+ return notEmpty(set);
}
/**
@@ -1210,7 +1217,7 @@ public abstract class DBCommand extends DBCommandExpr
*/
public boolean hasGroupBy()
{
- return (this.groupBy!=null ? !this.groupBy.isEmpty() : false);
+ return notEmpty(groupBy);
}
/**
@@ -1618,21 +1625,29 @@ public abstract class DBCommand extends DBCommandExpr
* Creates a select SQL-Statement
*/
@Override
- public void getSelect(DBSQLBuilder sql, short flags)
+ public void getSelect(DBSQLBuilder sql, int flags)
{
- resetParamUsage();
- if (select == null)
- throw new ObjectNotValidException(this); // invalid!
// Prepares statement
- addSelect(sql);
+ resetParamUsage();
+ // Select clause
+ if (not(flags, SF_SKIP_SELECT))
+ { // check
+ if (select == null)
+ throw new ObjectNotValidException(this); // invalid!
+ // add select
+ addSelect(sql);
+ }
// From clause
- addFrom(sql);
+ if (not(flags, SF_SKIP_FROM))
+ addFrom(sql);
// Add Where
- addWhere(sql);
+ if (not(flags, SF_SKIP_WHERE))
+ addWhere(sql);
// Add Grouping
- addGrouping(sql);
+ if (not(flags, SF_SKIP_GROUP))
+ addGrouping(sql);
// Add Order
- if ((flags & SF_NO_ORDER)==0)
+ if (not(flags, SF_SKIP_ORDER))
addOrder(sql);
// done
completeParamUsage();
@@ -1656,7 +1671,7 @@ public abstract class DBCommand extends DBCommandExpr
sql.append("( ");
// Set Expressions
ArrayList<DBCompareColExpr> compexpr = null;
- if (where!=null && !where.isEmpty())
+ if (notEmpty(where))
{ // Convert ColumnExpression List to Column List
compexpr = new ArrayList<DBCompareColExpr>(where.size());
for (DBCompareExpr expr : where)
@@ -1735,7 +1750,7 @@ public abstract class DBCommand extends DBCommandExpr
return null;
DBSQLBuilder sql = createSQLBuilder("UPDATE ");
DBRowSet table = set.get(0).getTable();
- if (joins!=null && !joins.isEmpty())
+ if (notEmpty(joins))
{ // Join Update
addUpdateWithJoins(sql, table);
}
@@ -1784,7 +1799,7 @@ public abstract class DBCommand extends DBCommandExpr
resetParamUsage();
DBSQLBuilder sql = createSQLBuilder("DELETE ");
// joins or simple
- if (joins!=null && !joins.isEmpty())
+ if (notEmpty(joins))
{ // delete with joins
addDeleteWithJoins(sql, table);
}
@@ -1900,7 +1915,7 @@ public abstract class DBCommand extends DBCommandExpr
protected void addWhere(DBSQLBuilder sql, long context)
{
- if (where!=null && !where.isEmpty())
+ if (notEmpty(where))
{
sql.append("\r\nWHERE ");
// add where expression
@@ -1915,13 +1930,13 @@ public abstract class DBCommand extends DBCommandExpr
protected void addGrouping(DBSQLBuilder sql)
{
- if (groupBy!=null && !groupBy.isEmpty())
- { // Group by
+ if (notEmpty(groupBy))
+ { // Group by
sql.append("\r\nGROUP BY ");
addListExpr(sql, groupBy, CTX_DEFAULT, ", ");
}
- if (having!=null && !having.isEmpty())
- { // Having
+ if (notEmpty(having))
+ { // Having
sql.append("\r\nHAVING ");
addListExpr(sql, having, CTX_DEFAULT, " AND ");
}
@@ -1929,7 +1944,7 @@ public abstract class DBCommand extends DBCommandExpr
protected void addOrder(DBSQLBuilder sql)
{
- if (orderBy!=null && !orderBy.isEmpty())
+ if (notEmpty(orderBy))
{ // order By
sql.append("\r\nORDER BY ");
addListExpr(sql, orderBy, CTX_DEFAULT, ", ");
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
b/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
index 12ab9cec..38886532 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCommandExpr.java
@@ -19,6 +19,7 @@
package org.apache.empire.db;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Set;
@@ -46,8 +47,29 @@ public abstract class DBCommandExpr extends DBExpr
private static final Logger log =
LoggerFactory.getLogger(DBCommandExpr.class);
// Select Context Flags
- public static final short SF_DEFAULT = 0; // Default
- public static final short SF_NO_ORDER = 1; // No order by
+ public static final int SF_DEFAULT = 0; // Default
+ public static final int SF_SKIP_SELECT = 1; // No select
+ public static final int SF_SKIP_FROM = 2; // No from / joins
+ public static final int SF_SKIP_WHERE = 4; // No where
+ public static final int SF_SKIP_GROUP = 8; // No group by / having
+ public static final int SF_SKIP_ORDER = 16; // No order by
+ public static final int SF_SKIP_LIMIT = 32; // No limit
+
+ /**
+ * Checks if a flag is NOT set
+ */
+ protected final boolean not(int flags, int flag)
+ {
+ return ((flags & flag)==0);
+ }
+
+ /**
+ * Checks if a collection is not null or empty
+ */
+ protected final boolean notEmpty(Collection<?> list)
+ {
+ return (list!=null && !list.isEmpty());
+ }
// Internal Classes
protected static class DBCmdQuery extends DBRowSet
@@ -361,13 +383,13 @@ public abstract class DBCommandExpr extends DBExpr
* returns an SQL select command
* @param sql the sql builder to add the command to
*/
- public abstract void getSelect(DBSQLBuilder sql, short flags);
+ public abstract void getSelect(DBSQLBuilder sql, int flags);
/**
* returns an SQL select command for querying records.
* @return the SQL-Command
*/
- public final String getSelect(short flags)
+ public final String getSelect(int flags)
{
DBSQLBuilder sql = createSQLBuilder(null);
getSelect(sql, flags);
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
index fe40aaee..7762626c 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBUtils.java
@@ -488,23 +488,12 @@ public class DBUtils implements DBContextAware
// check if aggregate
if (aggregate)
{ // For Aggregations: Wrap
- String sql = "SELECT COUNT(*) FROM
("+cmd.getSelect(DBCommandExpr.SF_NO_ORDER) + ") q";
+ String sql = "SELECT COUNT(*) FROM
("+cmd.getSelect(DBCommandExpr.SF_SKIP_ORDER) + ") q";
return querySingleInt(sql, cmd.getParamValues(), 0);
}
- // find any rowset
- DBRowSet rs = exprList[0].getRowSet();
- // create the count command
- DBCommand countCmd = cmd.clone();
- if (countCmd.getParams().size()!=cmd.getParams().size())
- { // Failed to copy all DBCmdParams
- String sql = "SELECT COUNT(*) FROM
("+cmd.getSelect(DBCommandExpr.SF_NO_ORDER) + ") q";
- return querySingleInt(sql, cmd.getParamValues(), 0);
- }
- countCmd.clearSelect();
- countCmd.clearOrderBy();
- countCmd.select(rs.count());
- // perform query
- return querySingleInt(countCmd);
+ // simple expression
+ String sql = "SELECT COUNT(*)
"+cmd.getSelect(DBCommandExpr.SF_SKIP_SELECT | DBCommandExpr.SF_SKIP_ORDER);
+ return querySingleInt(sql, cmd.getParamValues(), 0);
}
/**
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
index 7f0f187f..bb36f8ad 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBExistsExpr.java
@@ -142,7 +142,7 @@ public class DBExistsExpr extends DBCompareExpr
return;
}
sql.append(" exists (");
- cmd.getSelect(sql, DBCommandExpr.SF_NO_ORDER);
+ cmd.getSelect(sql, DBCommandExpr.SF_SKIP_ORDER);
if (compareExpr != null)
{
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
b/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
index ae11ed3d..9abafc99 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/h2/DBMSHandlerH2.java
@@ -94,11 +94,11 @@ public class DBMSHandlerH2 extends DBMSHandlerBase
}
@Override
- public void getSelect(DBSQLBuilder sql, short flags)
+ public void getSelect(DBSQLBuilder sql, int flags)
{ // Prepares statement
super.getSelect(sql, flags);
// add limit and offset
- if (limitRows>=0)
+ if (limitRows>=0 && not(flags, SF_SKIP_LIMIT))
{ sql.append("\r\nLIMIT ");
sql.append(String.valueOf(limitRows));
// Offset
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBCommandHSql.java
b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBCommandHSql.java
index 95efcbf4..77bd2db3 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBCommandHSql.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/hsql/DBCommandHSql.java
@@ -75,11 +75,11 @@ public class DBCommandHSql extends DBCommand
}
@Override
- public void getSelect(DBSQLBuilder sql, short flags)
+ public void getSelect(DBSQLBuilder sql, int flags)
{ // call base class
super.getSelect(sql, flags);
// add limit and offset
- if (limitRows>=0)
+ if (limitRows>=0 && not(flags, SF_SKIP_LIMIT))
{ sql.append("\r\nLIMIT ");
sql.append(String.valueOf(limitRows));
// Offset
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
b/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
index 300d2ebf..542093fe 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/mysql/DBMSHandlerMySQL.java
@@ -94,11 +94,11 @@ public class DBMSHandlerMySQL extends DBMSHandlerBase
}
@Override
- public void getSelect(DBSQLBuilder sql, short flags)
+ public void getSelect(DBSQLBuilder sql, int flags)
{ // call base class
super.getSelect(sql, flags);
// add limit and offset
- if (limit>=0)
+ if (limit>=0 && not(flags, SF_SKIP_LIMIT))
{ sql.append("\r\nLIMIT ");
sql.append(String.valueOf(limit));
// Offset
@@ -981,11 +981,11 @@ public class DBMSHandlerMySQL extends DBMSHandlerBase
skip = -1;
}
@Override
- public void getSelect(DBSQLBuilder sql, short flags)
+ public void getSelect(DBSQLBuilder sql, int flags)
{ // Prepares statement
super.getSelect(sql, flags);
// add limit and offset
- if (limit>=0)
+ if (limit>=0 && not(flags, SF_SKIP_LIMIT))
{ sql.append("\r\nLIMIT ");
sql.append(String.valueOf(limit));
// Offset
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
index e5483e70..cc383639 100644
--- a/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
+++ b/empire-db/src/main/java/org/apache/empire/dbms/oracle/DBCommandOracle.java
@@ -157,33 +157,40 @@ public class DBCommandOracle extends DBCommand
* @param sql the SQL statement
*/
@Override
- public synchronized void getSelect(DBSQLBuilder sql, short flags)
+ public synchronized void getSelect(DBSQLBuilder sql, int flags)
{
+ // Prepare
resetParamUsage();
- if (select == null)
- throw new ObjectNotValidException(this);
// limit rows
boolean usePreparedStatements = isPreparedStatementsEnabled();
- if (limitRows>=0)
+ if (limitRows>=0 && not(flags, SF_SKIP_LIMIT))
{ // add limitRows and skipRows wrapper
sql.append("SELECT * FROM (");
if (skipRows>0)
sql.append("SELECT row_.*, rownum rownum_ FROM (");
}
// Prepares statement
- sql.append("SELECT ");
- if (StringUtils.isNotEmpty(optimizerHint))
- { // Append an optimizer hint to the select statement e.g. SELECT
/*+ RULE */
- sql.append("/*+ ").append(optimizerHint).append(" */ ");
+ if (not(flags, SF_SKIP_SELECT))
+ { // check select
+ if (select == null)
+ throw new ObjectNotValidException(this);
+ // Select
+ sql.append("SELECT ");
+ if (StringUtils.isNotEmpty(optimizerHint))
+ { // Append an optimizer hint to the select statement e.g.
SELECT /*+ RULE */
+ sql.append("/*+ ").append(optimizerHint).append(" */ ");
+ }
+ if (selectDistinct)
+ sql.append("DISTINCT ");
+ // Add Select Expressions
+ addListExpr(sql, select, CTX_ALL, ", ");
}
- if (selectDistinct)
- sql.append("DISTINCT ");
- // Add Select Expressions
- addListExpr(sql, select, CTX_ALL, ", ");
// Join
- addFrom(sql);
+ if (not(flags, SF_SKIP_FROM))
+ addFrom(sql);
// Where
- addWhere(sql);
+ if (not(flags, SF_SKIP_WHERE))
+ addWhere(sql);
// Connect By
if (connectBy != null)
{ // Add 'Connect By Prior' Expression
@@ -197,9 +204,10 @@ public class DBCommandOracle extends DBCommand
}
}
// Grouping
- addGrouping(sql);
+ if (not(flags, SF_SKIP_GROUP))
+ addGrouping(sql);
// Order
- if (orderBy!=null && !orderBy.isEmpty() && (flags & SF_NO_ORDER)==0)
+ if (notEmpty(orderBy) && not(flags, SF_SKIP_ORDER))
{ // add ORDER BY
if (connectBy != null)
sql.append("\r\nORDER SIBLINGS BY ");
@@ -209,7 +217,7 @@ public class DBCommandOracle extends DBCommand
addListExpr(sql, orderBy, CTX_DEFAULT, ", ");
}
// limit rows end
- if (limitRows>=0)
+ if (limitRows>=0 && not(flags, SF_SKIP_LIMIT))
{ // add limitRows and skipRows constraints
sql.append(") row_ WHERE rownum<=");
sql.append(usePreparedStatements ? "?" :
String.valueOf(skipRows+limitRows));
@@ -219,6 +227,7 @@ public class DBCommandOracle extends DBCommand
sql.append(usePreparedStatements ? "?" :
String.valueOf(skipRows));
}
}
+ // done
completeParamUsage();
}
diff --git
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBCommandPostgres.java
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBCommandPostgres.java
index 6355fc36..546d9056 100644
---
a/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBCommandPostgres.java
+++
b/empire-db/src/main/java/org/apache/empire/dbms/postgresql/DBCommandPostgres.java
@@ -149,11 +149,11 @@ public class DBCommandPostgres extends DBCommand
}
@Override
- public void getSelect(DBSQLBuilder sql, short flags)
+ public void getSelect(DBSQLBuilder sql, int flags)
{ // call base class
super.getSelect(sql, flags);
// add limit and offset
- if (limit>=0)
+ if (limit>=0 && not(flags, SF_SKIP_LIMIT))
{ sql.append("\r\nLIMIT ");
sql.append(String.valueOf(limit));
// Offset