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 6c6b966b EMPIREDB-412 DBColumnJoinExpr copy and concat
6c6b966b is described below
commit 6c6b966b23b9f9fb5bc77975ae352710e8796b0b
Author: Rainer Döbele <[email protected]>
AuthorDate: Mon May 15 15:24:50 2023 +0200
EMPIREDB-412
DBColumnJoinExpr copy and concat
---
.../main/java/org/apache/empire/db/DBCmpType.java | 41 +++++++++++++++
.../main/java/org/apache/empire/db/DBCommand.java | 13 ++---
.../empire/db/expr/column/DBParenthesisExpr.java | 12 +++++
.../empire/db/expr/compare/DBCompareAndOrExpr.java | 12 +++++
.../empire/db/expr/compare/DBCompareColExpr.java | 12 +++++
.../empire/db/expr/join/DBColumnJoinExpr.java | 58 ++++++++++++++++------
6 files changed, 125 insertions(+), 23 deletions(-)
diff --git a/empire-db/src/main/java/org/apache/empire/db/DBCmpType.java
b/empire-db/src/main/java/org/apache/empire/db/DBCmpType.java
index bb1121c1..cfa6fe2f 100644
--- a/empire-db/src/main/java/org/apache/empire/db/DBCmpType.java
+++ b/empire-db/src/main/java/org/apache/empire/db/DBCmpType.java
@@ -58,4 +58,45 @@ public enum DBCmpType
default: return DBCmpType.NULL;
}
}
+
+ /**
+ * For Debugging only
+ */
+ @Override
+ public String toString()
+ {
+ switch (this)
+ {
+ case EQUAL:
+ return "=";
+ case NOTEQUAL:
+ return "<>";
+ case LESSTHAN:
+ return "<";
+ case MOREOREQUAL:
+ return ">=";
+ case GREATERTHAN:
+ return ">";
+ case LESSOREQUAL:
+ return "<=";
+ case LIKE:
+ return " LIKE ";
+ case NOTLIKE:
+ return " NOT LIKE ";
+ case NULL:
+ return " IS NULL";
+ case NOTNULL:
+ return " IS NOT NULL";
+ case BETWEEN:
+ return " BETWEEN ";
+ case NOTBETWEEN:
+ return " NOT BETWEEN ";
+ case IN:
+ return " IN ";
+ case NOTIN:
+ return " NOT IN ";
+ default:
+ return " ";
+ }
+ }
}
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 5540fae6..27ed8ab2 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
@@ -800,8 +800,6 @@ public abstract class DBCommand extends DBCommandExpr
throw new InvalidArgumentException("left|right", left);
if (left.getSourceColumn().getRowSet()==right.getRowSet())
throw new InvalidArgumentException("rowset",
left.getSourceColumn().getRowSet().getName()+"|"+right.getRowSet().getName());
- // create the expression
- DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, joinType);
// additional constraints
DBCompareExpr where = null;
for (int i=0; i<addlConstraints.length; i++)
@@ -812,9 +810,8 @@ public abstract class DBCommand extends DBCommandExpr
// Chain with previouss
where = (where!=null ? where.and(cmpExpr) : cmpExpr);
}
- if (where!=null)
- join.where(where);
- // done
+ // create the expression
+ DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, joinType,
where);
join(join);
return this;
}
@@ -837,7 +834,6 @@ public abstract class DBCommand extends DBCommandExpr
/*
* TODO: Find a better solution / Make DBColumnJoinExpr multi-column
*/
- DBColumnJoinExpr join = new DBColumnJoinExpr(left[0], right[0],
joinType);
// compare the columns except the first
DBCompareExpr where = null;
for (int i=1; i<left.length; i++)
@@ -851,9 +847,8 @@ public abstract class DBCommand extends DBCommandExpr
DBCompareExpr cmpExpr = addlConstraints[i];
where = (where!=null ? where.and(cmpExpr) : cmpExpr);
}
- if (where!=null)
- join.where(where);
- // done
+ // create the expression
+ DBColumnJoinExpr join = new DBColumnJoinExpr(left[0], right[0],
joinType, where);
join(join);
return this;
}
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBParenthesisExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBParenthesisExpr.java
index 796fb66d..5aec9d3c 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/column/DBParenthesisExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/column/DBParenthesisExpr.java
@@ -189,6 +189,18 @@ public class DBParenthesisExpr extends DBColumnExpr
implements Unwrappable<DBCol
wrapped.addSQL(sql, context); // |CTX_NOPARENTHESES
sql.append(")");
}
+
+ /**
+ * For Debugging
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder b = new StringBuilder("(");
+ b.append(wrapped.toString());
+ b.append(")");
+ return b.toString();
+ }
/**
* This function set the alias name to the XML tag.
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 b293b3b3..5fb9ce78 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
@@ -161,6 +161,18 @@ public class DBCompareAndOrExpr extends DBCompareExpr
sql.append(")");
}
+ /**
+ * For Debugging
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder b = new StringBuilder(left.toString());
+ b.append((or ? " OR " : " AND "));
+ b.append(right.toString());
+ return b.toString();
+ }
+
/**
* Returns whether the constraint should replace another one or not.
*
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 eac1cd65..855e1419 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
@@ -293,6 +293,18 @@ public class DBCompareColExpr extends DBCompareExpr
// Add Comparison Value
addCompareExpr(sql, context);
}
+
+ /**
+ * For Debugging
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder b = new StringBuilder(expr.toString());
+ b.append(cmpop.toString());
+ b.append(value.toString());
+ return b.toString();
+ }
/**
* Returns whether the constraint should replace another one or not.
diff --git
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
index b5ffc51c..c2536b94 100644
---
a/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
+++
b/empire-db/src/main/java/org/apache/empire/db/expr/join/DBColumnJoinExpr.java
@@ -39,22 +39,38 @@ public class DBColumnJoinExpr extends DBJoinExpr
protected DBColumnExpr right;
// Additional
- public DBCompareExpr compExpr = null;
+ public DBCompareExpr compExpr; // should be final but still used by where()
/**
- * Constructs a new DBJoinExpr object initialize this object with
- * the left and right column and the data type of the join
- * expression.
+ * Constructs a join expression based on two columns or column expressions
*
* @param left left value
* @param right right value
* @param type data type (JOIN_INNER, JOIN_LEFT or JOIN_RIGHT)
+ * @param addlConstraint additional constraint
*/
- public DBColumnJoinExpr(DBColumnExpr left, DBColumnExpr right, DBJoinType
type)
+ public DBColumnJoinExpr(DBColumnExpr left, DBColumnExpr right, DBJoinType
type, DBCompareExpr addlConstraint)
{
super(type);
this.left = left;
this.right = right;
+ this.compExpr = addlConstraint;
+ }
+
+ public DBColumnJoinExpr(DBColumnExpr left, DBColumnExpr right, DBJoinType
type)
+ {
+ this(left, right, type, null);
+ }
+
+ /**
+ * Copy and concat constructor
+ *
+ * @param joinExpr the original joinExpr
+ * @param addlContraint additional constraint
+ */
+ public DBColumnJoinExpr(DBColumnJoinExpr joinExpr, DBCompareExpr
addlConstraint)
+ {
+ this(joinExpr.left, joinExpr.right, joinExpr.type,
(joinExpr.compExpr!=null ? joinExpr.compExpr.and(addlConstraint) :
addlConstraint));
}
/**
@@ -190,8 +206,7 @@ public class DBColumnJoinExpr extends DBJoinExpr
if (this.compExpr==null)
return this; // not necessary
// Copy compareExpr
- DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, type);
- join.compExpr = compExpr.copy(newCmd);
+ DBColumnJoinExpr join = new DBColumnJoinExpr(left, right, type,
compExpr.copy(newCmd));
return join;
}
@@ -210,8 +225,8 @@ public class DBColumnJoinExpr extends DBJoinExpr
* @param expr the compare expression
*/
public void where(DBCompareExpr expr)
- { // Set Compare Expression
- compExpr = expr;
+ { // Set Compare Expression
+ this.compExpr = expr;
}
/**
@@ -222,11 +237,9 @@ public class DBColumnJoinExpr extends DBJoinExpr
*/
public DBColumnJoinExpr and(DBCompareExpr expr)
{ // Add Compare Expression
- if (compExpr==null)
- compExpr = expr;
- else
- compExpr = compExpr.and(expr);
- return this;
+ if (expr==null || expr.equals(this.compExpr))
+ return this; // no change
+ return new DBColumnJoinExpr(this, expr);
}
/**
@@ -285,6 +298,23 @@ public class DBColumnJoinExpr extends DBJoinExpr
}
}
}
+
+ /**
+ * For Debugging
+ */
+ @Override
+ public String toString()
+ {
+ StringBuilder b = new StringBuilder(left.toString());
+ b.append("=");
+ b.append(right.toString());
+ if (this.compExpr!=null)
+ {
+ b.append(" AND ");
+ b.append(this.compExpr.toString());
+ }
+ return b.toString();
+ }
/**
* Compares two DBJoinExpr objects.