This is an automated email from the ASF dual-hosted git repository.
doebele pushed a commit to branch version3
in repository https://gitbox.apache.org/repos/asf/empire-db.git
The following commit(s) were added to refs/heads/version3 by this push:
new 1735d4d EMPIREDB-373 bugfix for DBCommand.clone()
1735d4d is described below
commit 1735d4de88bba6e50242ab2d8e17689df2446bd0
Author: Rainer Döbele <[email protected]>
AuthorDate: Tue Feb 15 18:58:19 2022 +0100
EMPIREDB-373 bugfix for DBCommand.clone()
---
.../main/java/org/apache/empire/db/DBCommand.java | 54 +++++++++++++++++-----
.../empire/db/expr/compare/DBCompareAndOrExpr.java | 10 ++++
.../empire/db/expr/compare/DBCompareColExpr.java | 14 ++++++
.../empire/db/expr/compare/DBCompareExpr.java | 6 +++
.../empire/db/expr/compare/DBCompareNotExpr.java | 14 +++++-
.../empire/db/expr/compare/DBExistsExpr.java | 15 +++++-
.../empire/db/expr/compare/DBParenthesisExpr.java | 24 ++++++++--
.../empire/db/expr/join/DBCompareJoinExpr.java | 2 +-
.../org/apache/empire/db/expr/set/DBSetExpr.java | 17 ++++++-
9 files changed, 135 insertions(+), 21 deletions(-)
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 0c9e288..bb6a4bd 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
@@ -115,15 +115,32 @@ public abstract class DBCommand extends DBCommandExpr
protected void resetParamUsage()
{
paramUsageCount = 0;
- // clear subquery params
if (cmdParams==null)
return;
+ // clear subquery params
for (int i=cmdParams.size()-1; i>=0 ;i--)
if (cmdParams.get(i).getCmd()!=this)
cmdParams.remove(i);
}
/**
+ * internally used to remove unused Command Params from list
+ * Note: Only one thread my generate an SQL statement
+ */
+ protected void completeParamUsage()
+ {
+ if (cmdParams==null)
+ return;
+ // check whether all params have been used
+ if (paramUsageCount < cmdParams.size())
+ { // Remove unused parameters
+ log.warn("DBCommand has {} unused Command params",
cmdParams.size()-paramUsageCount);
+ for (int i=cmdParams.size()-1; i>=paramUsageCount; i--)
+ cmdParams.remove(i);
+ }
+ }
+
+ /**
* internally used to reorder the command params to match their order of
occurance
*/
protected void notifyParamUsage(DBCmdParam param)
@@ -189,18 +206,18 @@ public abstract class DBCommand extends DBCommandExpr
clone.groupBy = new ArrayList<DBColumnExpr>(groupBy);
if (having!=null)
clone.having = new ArrayList<DBCompareExpr>(having);
- if (cmdParams!=null)
+ if (cmdParams!=null && !cmdParams.isEmpty())
{ // clone params
clone.paramUsageCount = 0;
clone.cmdParams = new ArrayList<DBCmdParam>();
- for (DBCmdParam p : cmdParams)
- { // checkCmd
- if (p.getCmd()!=this)
- continue;
- // copy
- DBCmdParam param = new DBCmdParam(clone, p.getDataType(),
p.getValue());
- clone.cmdParams.add(param);
- }
+ // clone set
+ for (int i=0; (clone.set!=null && i<clone.set.size()); i++)
+ clone.set.set(i, clone.set.get(i).copyCommand(clone));
+ // clone where and having
+ for (int i=0; (clone.where!=null && i<clone.where.size()); i++)
+ clone.where.set(i, clone.where.get(i).copyCommand(clone));
+ for (int i=0; (clone.having!=null && i<clone.having.size());
i++)
+ clone.having.set(i,
clone.having.get(i).copyCommand(clone));
}
// done
return clone;
@@ -1078,8 +1095,16 @@ public abstract class DBCommand extends DBCommandExpr
*/
public void clearSet()
{
+ if (set!=null && cmdParams!=null)
+ { // remove params
+ for (DBSetExpr set : this.set)
+ { // remove all
+ Object value = set.getValue();
+ if (value instanceof DBCmdParam)
+ cmdParams.remove(value);
+ }
+ }
set = null;
- cmdParams = null;
}
/**
@@ -1353,6 +1378,8 @@ public abstract class DBCommand extends DBCommandExpr
addGrouping(buf);
// Add Order
addOrder(buf);
+ // done
+ completeParamUsage();
}
/**
@@ -1410,6 +1437,8 @@ public abstract class DBCommand extends DBCommandExpr
addListExpr(buf, set, CTX_VALUE, ", ");
// End
buf.append(")");
+ // done
+ completeParamUsage();
return buf.toString();
}
@@ -1448,6 +1477,7 @@ public abstract class DBCommand extends DBCommandExpr
addWhere(buf, context);
}
// done
+ completeParamUsage();
return buf.toString();
}
@@ -1478,6 +1508,8 @@ public abstract class DBCommand extends DBCommandExpr
// where
addWhere(buf, CTX_NAME|CTX_VALUE);
}
+ // done
+ completeParamUsage();
return buf.toString();
}
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
index 9acf423..98ae024 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareAndOrExpr.java
@@ -94,6 +94,16 @@ public class DBCompareAndOrExpr extends DBCompareExpr
}
/**
+ * Copy Command
+ * @param cmd
+ */
+ @Override
+ public DBCompareExpr copyCommand(DBCommand cmd)
+ {
+ return new DBCompareAndOrExpr(left.copyCommand(cmd),
right.copyCommand(cmd), or);
+ }
+
+ /**
* @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
*/
@Override
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
index e31acf0..f9da3f7 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareColExpr.java
@@ -20,6 +20,7 @@ package org.apache.empire.db.expr.compare;
import java.util.Set;
+import org.apache.empire.data.DataType;
import org.apache.empire.db.DBCmdParam;
import org.apache.empire.db.DBCmpType;
import org.apache.empire.db.DBColumn;
@@ -142,6 +143,19 @@ public class DBCompareColExpr extends DBCompareExpr
return;
}
}
+
+ /**
+ * Copy Command
+ * @param cmd
+ */
+ @Override
+ public DBCompareExpr copyCommand(DBCommand cmd)
+ {
+ Object valueCopy = value;
+ if (value instanceof DBCmdParam)
+ valueCopy = cmd.addParam(DataType.UNKNOWN,
((DBCmdParam)value).getValue());
+ return new DBCompareColExpr(expr, cmpop, valueCopy);
+ }
/**
* @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
index b721c4b..20c47a0 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareExpr.java
@@ -70,5 +70,11 @@ public abstract class DBCompareExpr extends DBExpr
* @param cmd
*/
public abstract void prepareCommand(DBCommand cmd);
+
+ /**
+ * internally used for parameter cloning
+ * @param cmd
+ */
+ public abstract DBCompareExpr copyCommand(DBCommand cmd);
}
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
index 9c01eb4..5ffd495 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBCompareNotExpr.java
@@ -18,12 +18,12 @@
*/
package org.apache.empire.db.expr.compare;
+import java.util.Set;
+
import org.apache.empire.db.DBColumn;
import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDatabase;
-import java.util.Set;
-
/**
* This class is used for defining filter constraints based on a column
expression in SQL<br>
@@ -72,6 +72,16 @@ public class DBCompareNotExpr extends DBCompareExpr
}
/**
+ * Copy Command
+ * @param cmd
+ */
+ @Override
+ public DBCompareExpr copyCommand(DBCommand cmd)
+ {
+ return new DBCompareNotExpr(expr.copyCommand(cmd));
+ }
+
+ /**
* @see org.apache.empire.db.DBExpr#addReferencedColumns(Set)
*/
@Override
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 032ba99..63d12d4 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
@@ -83,7 +83,20 @@ public class DBExistsExpr extends DBCompareExpr
@Override
public void prepareCommand(DBCommand cmd)
{
- /* nothing yet */
+ if (compareExpr!=null)
+ compareExpr.prepareCommand(cmd);
+ }
+
+ /**
+ * Copy Command
+ * @param cmd
+ */
+ @Override
+ public DBCompareExpr copyCommand(DBCommand newCmd)
+ {
+ if (compareExpr==null)
+ return this;
+ return new DBExistsExpr(cmd, compareExpr.copyCommand(newCmd));
}
/**
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
index dffdf0f..d5ad8ed 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/compare/DBParenthesisExpr.java
@@ -20,6 +20,7 @@ package org.apache.empire.db.expr.compare;
import java.util.Set;
+import org.apache.empire.commons.Unwrappable;
import org.apache.empire.db.DBColumn;
import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDatabase;
@@ -28,17 +29,24 @@ import org.apache.empire.db.DBDatabase;
* This class wraps an existing compare expression with parenthesis.
* <P>
*/
-public class DBParenthesisExpr extends DBCompareExpr
+public class DBParenthesisExpr extends DBCompareExpr implements
Unwrappable<DBCompareExpr>
{
// *Deprecated* private static final long serialVersionUID = 1L;
private final DBCompareExpr wrapped;
- public DBParenthesisExpr(DBCompareExpr wrap)
+ public DBParenthesisExpr(DBCompareExpr expr)
{
- this.wrapped = wrap;
+ this.wrapped = expr;
}
-
- public DBCompareExpr getWrapped()
+
+ @Override
+ public boolean isWrapper()
+ {
+ return true;
+ }
+
+ @Override
+ public DBCompareExpr unwrap()
{
return wrapped;
}
@@ -63,6 +71,12 @@ public class DBParenthesisExpr extends DBCompareExpr
}
@Override
+ public DBCompareExpr copyCommand(DBCommand cmd)
+ {
+ return new DBParenthesisExpr(wrapped.copyCommand(cmd));
+ }
+
+ @Override
public void addReferencedColumns(Set<DBColumn> list)
{
wrapped.addReferencedColumns(list);
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
index 0d6ff18..a67dec2 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBCompareJoinExpr.java
@@ -48,7 +48,7 @@ public class DBCompareJoinExpr extends DBColumnJoinExpr
{
// DBParenthesisExpr
if (expr instanceof DBParenthesisExpr)
- return findFirstColumn(((DBParenthesisExpr)expr).getWrapped());
+ return findFirstColumn(((DBParenthesisExpr)expr).unwrap());
// DBCompareORExpr
if (expr instanceof DBCompareAndOrExpr)
return findFirstColumn(((DBCompareAndOrExpr)expr).getLeft());
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/set/DBSetExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/set/DBSetExpr.java
index 5ea509a..8d258b5 100644
--- a/empire-db/src/main/java/org/apache/empire/db/expr/set/DBSetExpr.java
+++ b/empire-db/src/main/java/org/apache/empire/db/expr/set/DBSetExpr.java
@@ -18,9 +18,12 @@
*/
package org.apache.empire.db.expr.set;
-import java.util.*;
+import java.util.Set;
+import org.apache.empire.data.DataType;
+import org.apache.empire.db.DBCmdParam;
import org.apache.empire.db.DBColumn;
+import org.apache.empire.db.DBCommand;
import org.apache.empire.db.DBDatabase;
import org.apache.empire.db.DBExpr;
import org.apache.empire.db.DBRowSet;
@@ -111,6 +114,18 @@ public class DBSetExpr extends DBExpr
}
/**
+ * Copy Command
+ * @param cmd
+ */
+ public DBSetExpr copyCommand(DBCommand cmd)
+ {
+ Object valueCopy = value;
+ if (value instanceof DBCmdParam)
+ valueCopy = cmd.addParam(DataType.UNKNOWN,
((DBCmdParam)value).getValue());
+ return new DBSetExpr(column, valueCopy);
+ }
+
+ /**
* Creates the SQL-Command.
*
* @param buf the SQL-Command