You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by aw...@apache.org on 2006/09/07 19:51:09 UTC
svn commit: r441158 [2/5] - in /incubator/openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/sql/ openjpa-kernel/s...
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ContainsExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ContainsExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ContainsExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ContainsExpression.java Thu Sep 7 10:51:05 2006
@@ -17,7 +17,6 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.sql.Select;
import serp.util.Numbers;
@@ -36,8 +35,7 @@
super(val1, val2);
}
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
Val val1 = getValue1();
if (contains != null && val1 instanceof PCPath) {
PCPath sql = (PCPath) val1;
@@ -53,7 +51,7 @@
sql.setContainsId(count.toString());
}
- super.initialize(sel, store, params, contains);
+ return super.initialize(sel, ctx, contains);
}
protected boolean isDirectComparison() {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ContainsKeyExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ContainsKeyExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ContainsKeyExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ContainsKeyExpression.java Thu Sep 7 10:51:05 2006
@@ -17,7 +17,6 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.sql.Select;
/**
@@ -35,12 +34,10 @@
super(val1, val2);
}
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
Val val1 = getValue1();
if (val1 instanceof PCPath)
((PCPath) val1).getKey();
-
- super.initialize(sel, store, params, contains);
+ return super.initialize(sel, ctx, contains);
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Count.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Count.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Count.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Count.java Thu Sep 7 10:51:05 2006
@@ -15,7 +15,6 @@
*/
package org.apache.openjpa.jdbc.kernel.exps;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.sql.Select;
/**
@@ -33,11 +32,9 @@
super(val);
}
- public void initialize(Select sel, JDBCStore store, boolean nullTest) {
- super.initialize(sel, store, nullTest);
+ public ExpState initialize(Select sel, ExpContext ctx, int flags) {
// join into related object if present
- if (getVal()instanceof PCPath)
- ((PCPath) getVal()).joinRelation();
+ return initializeValue(sel, ctx, JOIN_REL);
}
protected Class getType(Class c) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CurrentDate.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CurrentDate.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CurrentDate.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/CurrentDate.java Thu Sep 7 10:51:05 2006
@@ -17,10 +17,10 @@
import java.util.Date;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
+import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
+import org.apache.openjpa.util.InternalException;
/**
* A literal current DATE/TIME/TIMESTAMP value in a filter.
@@ -30,13 +30,9 @@
class CurrentDate
extends Const {
- static final int DATE = 1;
- static final int TIME = 2;
- static final int TIMESTAMP = 3;
-
private final int _type;
- CurrentDate(int type) {
+ public CurrentDate(int type) {
_type = type;
}
@@ -47,24 +43,25 @@
public void setImplicitType(Class type) {
}
- public Object getValue() {
+ public Object getValue(Object[] params) {
return new Date();
}
- public void calculateValue(Select sel, JDBCStore store,
- Object[] params, Val other, JDBCFetchConfiguration fetch) {
- }
-
- public void appendTo(SQLBuffer sql, int index, Select sel,
- JDBCStore store, Object[] params, JDBCFetchConfiguration fetch) {
- if (_type == DATE)
- sql.append(store.getDBDictionary().currentDateFunction);
- else if (_type == TIME)
- sql.append(store.getDBDictionary().currentTimeFunction);
- else if (_type == TIMESTAMP)
- sql.append(store.getDBDictionary().currentTimestampFunction);
- }
-
- public void clearParameters() {
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer sql, int index) {
+ switch (_type) {
+ case JavaSQLTypes.DATE:
+ sql.append(ctx.store.getDBDictionary().currentDateFunction);
+ break;
+ case JavaSQLTypes.TIME:
+ sql.append(ctx.store.getDBDictionary().currentTimeFunction);
+ break;
+ case JavaSQLTypes.TIMESTAMP:
+ sql.append(ctx.store.getDBDictionary().
+ currentTimestampFunction);
+ break;
+ default:
+ throw new InternalException();
+ }
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Distinct.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Distinct.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Distinct.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Distinct.java Thu Sep 7 10:51:05 2006
@@ -15,7 +15,6 @@
*/
package org.apache.openjpa.jdbc.kernel.exps;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.sql.Select;
/**
@@ -30,16 +29,12 @@
super(val);
}
- public void initialize(Select sel, JDBCStore store, boolean nullTest) {
- super.initialize(sel, store, nullTest);
-
+ public ExpState initialize(Select sel, ExpContext ctx, int flags) {
// join into related object if present
- if (getVal()instanceof PCPath)
- ((PCPath) getVal()).joinRelation();
+ return initializeValue(sel, ctx, JOIN_REL);
}
protected String getOperator() {
return "DISTINCT";
}
}
-
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EmptyExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EmptyExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EmptyExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EmptyExpression.java Thu Sep 7 10:51:05 2006
@@ -17,9 +17,6 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
-import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
import org.apache.openjpa.kernel.exps.ExpressionVisitor;
@@ -32,20 +29,16 @@
class EmptyExpression
implements Exp {
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
+ return ExpState.NULL;
}
- public void appendTo(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf) {
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- }
-
- public Joins getJoins() {
- return null;
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
}
public void acceptVisit(ExpressionVisitor visitor) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EndsWithExpression.java Thu Sep 7 10:51:05 2006
@@ -17,14 +17,11 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.FieldMapping;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.schema.Table;
import org.apache.openjpa.jdbc.sql.DBDictionary;
-import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
import org.apache.openjpa.kernel.exps.ExpressionVisitor;
@@ -39,9 +36,6 @@
private final Val _val1;
private final Val _val2;
- private Joins _joins = null;
- private String _pre = null;
- private String _post = null;
/**
* Constructor. Supply values.
@@ -51,70 +45,67 @@
_val2 = val2;
}
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
- _val1.initialize(sel, store, false);
- _val2.initialize(sel, store, false);
- _joins = sel.and(_val1.getJoins(), _val2.getJoins());
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
+ ExpState s1 = _val1.initialize(sel, ctx, 0);
+ ExpState s2 = _val2.initialize(sel, ctx, 0);
+ return new BinaryOpExpState(sel.and(s1.joins, s2.joins), s1, s2);
+ }
+
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf) {
+ BinaryOpExpState bstate = (BinaryOpExpState) state;
+ _val1.calculateValue(sel, ctx, bstate.state1, _val2, bstate.state2);
+ _val2.calculateValue(sel, ctx, bstate.state2, _val1, bstate.state1);
- DBDictionary dict = store.getDBDictionary();
+ DBDictionary dict = ctx.store.getDBDictionary();
String func = dict.stringLengthFunction;
+ String pre = null;
+ String post = null;
if (func != null) {
int idx = func.indexOf("{0}");
- _pre = func.substring(0, idx);
- _post = func.substring(idx + 3);
+ pre = func.substring(0, idx);
+ post = func.substring(idx + 3);
}
- }
- public void appendTo(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- _val1.calculateValue(sel, store, params, _val2, fetch);
- _val2.calculateValue(sel, store, params, _val1, fetch);
-
- if (_val1 instanceof Const && ((Const) _val1).getValue() == null)
+ if (_val1 instanceof Const && ((Const) _val1).getValue(ctx,
+ bstate.state1) == null)
buf.append("1 <> 1");
else if (_val2 instanceof Const) {
- Object o = ((Const) _val2).getValue();
+ Object o = ((Const) _val2).getValue(ctx, bstate.state2);
if (o == null)
buf.append("1 <> 1");
else {
Column col = null;
if (_val1 instanceof PCPath) {
- Column[] cols = ((PCPath) _val1).getColumns();
+ Column[] cols = ((PCPath) _val1).getColumns(bstate.state1);
if (cols.length == 1)
col = cols[0];
}
- _val1.appendTo(buf, 0, sel, store, params, fetch);
+ _val1.appendTo(sel, ctx, bstate.state1, buf, 0);
buf.append(" LIKE ");
buf.appendValue("%" + o.toString(), col);
}
} else {
// if we can't use LIKE, we have to take the substring of the
// first value and compare it to the second
- DBDictionary dict = store.getDBDictionary();
- dict.assertSupport(_pre != null, "StringLengthFunction");
- dict.substring(buf,
- new FilterValueImpl(_val1, sel, store, params, fetch),
- new StringLengthDifferenceFilterValue(sel, store, params,
- fetch), null);
+ dict.assertSupport(pre != null, "StringLengthFunction");
+ dict.substring(buf,
+ new FilterValueImpl(sel, ctx, bstate.state1, _val1),
+ new StringLengthDifferenceFilterValue(sel, ctx, bstate, pre,
+ post), null);
buf.append(" = ");
- _val2.appendTo(buf, 0, sel, store, params, fetch);
+ _val2.appendTo(sel, ctx, bstate.state2, buf, 0);
}
- sel.append(buf, _joins);
- _val1.clearParameters();
- _val2.clearParameters();
- }
-
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- _val1.selectColumns(sel, store, params, true, fetch);
- _val2.selectColumns(sel, store, params, true, fetch);
+ sel.append(buf, state.joins);
}
- public Joins getJoins() {
- return _joins;
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ BinaryOpExpState bstate = (BinaryOpExpState) state;
+ _val1.selectColumns(sel, ctx, bstate.state1, true);
+ _val2.selectColumns(sel, ctx, bstate.state2, true);
}
public void acceptVisit(ExpressionVisitor visitor) {
@@ -131,16 +122,18 @@
implements FilterValue {
private final Select _sel;
- private final JDBCStore _store;
- private final Object[] _params;
- private final JDBCFetchConfiguration _fetch;
+ private final ExpContext _ctx;
+ private final BinaryOpExpState _state;
+ private final String _pre;
+ private final String _post;
- public StringLengthDifferenceFilterValue(Select sel,
- JDBCStore store, Object[] params, JDBCFetchConfiguration fetch) {
+ public StringLengthDifferenceFilterValue(Select sel, ExpContext ctx,
+ BinaryOpExpState state, String pre, String post) {
_sel = sel;
- _store = store;
- _params = params;
- _fetch = fetch;
+ _ctx = ctx;
+ _state = state;
+ _pre = pre;
+ _post = post;
}
public Class getType() {
@@ -157,18 +150,18 @@
public void appendTo(SQLBuffer buf, int index) {
buf.append(_pre);
- _val1.appendTo(buf, index, _sel, _store, _params, _fetch);
+ _val1.appendTo(_sel, _ctx, _state.state1, buf, index);
buf.append(_post).append(" - ").append(_pre);
- _val2.appendTo(buf, index, _sel, _store, _params, _fetch);
+ _val2.appendTo(_sel, _ctx, _state.state2, buf, index);
buf.append(_post);
}
public String getColumnAlias(Column col) {
- return _sel.getColumnAlias(col, _joins);
+ return _sel.getColumnAlias(col, _state.joins);
}
public String getColumnAlias(String col, Table table) {
- return _sel.getColumnAlias(col, table, _joins);
+ return _sel.getColumnAlias(col, table, _state.joins);
}
public Object toDataStoreValue(Object val) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/EqualExpression.java Thu Sep 7 10:51:05 2006
@@ -15,8 +15,6 @@
*/
package org.apache.openjpa.jdbc.kernel.exps;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
@@ -35,39 +33,41 @@
super(val1, val2);
}
- public void appendTo(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch,
- boolean val1Null, boolean val2Null) {
+ public void appendTo(Select sel, ExpContext ctx, BinaryOpExpState bstate,
+ SQLBuffer buf, boolean val1Null, boolean val2Null) {
if (val1Null && val2Null)
buf.appendValue(null).append(" IS ").appendValue(null);
else if (val1Null || val2Null) {
Val val = (val1Null) ? getValue2() : getValue1();
+ ExpState state = (val1Null) ? bstate.state2 : bstate.state1;
if (!isDirectComparison()) {
- int len = val.length();
+ int len = val.length(sel, ctx, state);
for (int i = 0; i < len; i++) {
if (i > 0)
buf.append(" AND ");
- val.appendTo(buf, i, sel, store, params, fetch);
+ val.appendTo(sel, ctx, state, buf, i);
buf.append(" IS ").appendValue(null);
}
} else
- val.appendIsNull(buf, sel, store, params, fetch);
+ val.appendIsNull(sel, ctx, state, buf);
} else {
Val val1 = getValue1();
Val val2 = getValue2();
- if (val1.length() == 1 && val2.length() == 1) {
- store.getDBDictionary().comparison(buf, "=",
- new FilterValueImpl(val1, sel, store, params, fetch),
- new FilterValueImpl(val2, sel, store, params, fetch));
+ if (val1.length(sel, ctx, bstate.state1) == 1
+ && val2.length(sel, ctx, bstate.state2) == 1) {
+ ctx.store.getDBDictionary().comparison(buf, "=",
+ new FilterValueImpl(sel, ctx, bstate.state1, val1),
+ new FilterValueImpl(sel, ctx, bstate.state2, val2));
} else {
- int len = java.lang.Math.max(val1.length(), val2.length());
+ int len = java.lang.Math.max(val1.length(sel, ctx,
+ bstate.state1), val2.length(sel, ctx, bstate.state2));
for (int i = 0; i < len; i++) {
if (i > 0)
buf.append(" AND ");
- val1.appendTo(buf, i, sel, store, params, fetch);
+ val1.appendTo(sel, ctx, bstate.state1, buf, i);
buf.append(" = ");
- val2.appendTo(buf, i, sel, store, params, fetch);
+ val2.appendTo(sel, ctx, bstate.state2, buf, i);
}
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Exp.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Exp.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Exp.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Exp.java Thu Sep 7 10:51:05 2006
@@ -17,9 +17,6 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
-import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
import org.apache.openjpa.kernel.exps.Expression;
@@ -35,38 +32,25 @@
/**
* Initialize the expression. This method should recursively
- * initialize any sub-expressions or values. It should also cache
- * the {@link Joins} instance containing the joins for this expression.
+ * initialize any sub-expressions or values.
*
- * @param params the parameter values; the initialization process
- * should not rely on exact values, but may need
- * to see if parameter values are null
* @param contains map of relation paths to the number of times
* the paths appear in a contains() expression;
* used to ensure paths used for contains() within
* the same AND expression used different aliases
*/
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains);
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains);
/**
* Append the SQL for this expression to the given buffer. The SQL
* should optionally include any joins this expression needs.
*/
- public void appendTo(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch);
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf);
/**
- * Select just the columns for this value.
+ * Select just the columns for this expression.
*/
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch);
-
- /**
- * Return the joins for this expression. These joins should be created
- * and cached during the {@link #initialize} method. The parent
- * expression might modify these joins during its own initialization so
- * that common joins are moved up the expression tree.
- */
- public Joins getJoins();
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks);
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Extension.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Extension.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Extension.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/Extension.java Thu Sep 7 10:51:05 2006
@@ -18,8 +18,6 @@
import java.sql.SQLException;
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
import org.apache.openjpa.jdbc.sql.Joins;
@@ -43,7 +41,6 @@
private final Val _target;
private final Val _arg;
private final ClassMapping _candidate;
- private Joins _joins = null;
private ClassMetaData _meta = null;
private Class _cast = null;
@@ -93,119 +90,108 @@
_cast = type;
}
- public void initialize(Select sel, JDBCStore store, boolean nullTest) {
+ public ExpState initialize(Select sel, ExpContext ctx, int flags) {
// note that we tell targets and args to extensions that are sql
// paths to go ahead and join to their related object (if any),
// because we assume that, unlike most operations, if a relation
// field like a 1-1 is given as the target of an extension, then
// the extension probably acts on some field or column in the
// related object, not the 1-1 field itself
- Joins j1 = null;
- Joins j2 = null;
- if (_target != null) {
- _target.initialize(sel, store, false);
- if (_target instanceof PCPath)
- ((PCPath) _target).joinRelation();
- j1 = _target.getJoins();
- }
- if (_arg != null) {
- _arg.initialize(sel, store, false);
- if (_arg instanceof PCPath)
- ((PCPath) _arg).joinRelation();
- j2 = _arg.getJoins();
- }
- _joins = sel.and(j1, j2);
+ ExpState targetState = null;
+ ExpState argState = null;
+ if (_target != null)
+ targetState = _target.initialize(sel, ctx, JOIN_REL);
+ if (_arg != null)
+ argState = _arg.initialize(sel, ctx, JOIN_REL);
+ Joins j1 = (targetState == null) ? null : targetState.joins;
+ Joins j2 = (argState == null) ? null : argState.joins;
+ return new ExtensionExpState(sel.and(j1, j2), targetState,
+ argState);
}
- public Joins getJoins() {
- return _joins;
- }
+ /**
+ * Expression state.
+ */
+ private static class ExtensionExpState
+ extends ExpState {
+
+ public final ExpState targetState;
+ public final ExpState argState;
- public Object toDataStoreValue(Object val, JDBCStore store) {
- return val;
+ public ExtensionExpState(Joins joins, ExpState targetState,
+ ExpState argState) {
+ super(joins);
+ this.targetState = targetState;
+ this.argState = argState;
+ }
}
- public void select(Select sel, JDBCStore store, Object[] params,
- boolean pks, JDBCFetchConfiguration fetch) {
- sel.select(newSQLBuffer(sel, store, params, fetch), this);
+ public void select(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ sel.select(newSQLBuffer(sel, ctx, state), this);
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ ExtensionExpState estate = (ExtensionExpState) state;
if (_target != null)
- _target.selectColumns(sel, store, params, true, fetch);
+ _target.selectColumns(sel, ctx, estate.targetState, true);
if (_arg != null)
- _arg.selectColumns(sel, store, params, true, fetch);
+ _arg.selectColumns(sel, ctx, estate.argState, true);
}
- public void groupBy(Select sel, JDBCStore store, Object[] params,
- JDBCFetchConfiguration fetch) {
- sel.groupBy(newSQLBuffer(sel, store, params, fetch));
+ public void groupBy(Select sel, ExpContext ctx, ExpState state) {
+ sel.groupBy(newSQLBuffer(sel, ctx, state));
}
- public void orderBy(Select sel, JDBCStore store, Object[] params,
- boolean asc, JDBCFetchConfiguration fetch) {
- sel.orderBy(newSQLBuffer(sel, store, params, fetch), asc, false);
+ public void orderBy(Select sel, ExpContext ctx, ExpState state,
+ boolean asc) {
+ sel.orderBy(newSQLBuffer(sel, ctx, state), asc, false);
}
- private SQLBuffer newSQLBuffer(Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- calculateValue(sel, store, params, null, fetch);
- SQLBuffer buf = new SQLBuffer(store.getDBDictionary());
- appendTo(buf, 0, sel, store, params, fetch);
- clearParameters();
+ private SQLBuffer newSQLBuffer(Select sel, ExpContext ctx, ExpState state) {
+ calculateValue(sel, ctx, state, null, null);
+ SQLBuffer buf = new SQLBuffer(ctx.store.getDBDictionary());
+ appendTo(sel, ctx, state, buf, 0);
return buf;
}
- public Object load(Result res, JDBCStore store,
- JDBCFetchConfiguration fetch)
+ public Object load(ExpContext ctx, ExpState state, Result res)
throws SQLException {
return Filters.convert(res.getObject(this,
JavaSQLTypes.JDBC_DEFAULT, null), getType());
}
- public void calculateValue(Select sel, JDBCStore store,
- Object[] params, Val other, JDBCFetchConfiguration fetch) {
+ public void calculateValue(Select sel, ExpContext ctx, ExpState state,
+ Val other, ExpState otherState) {
+ ExtensionExpState estate = (ExtensionExpState) state;
if (_target != null)
- _target.calculateValue(sel, store, params, null, fetch);
+ _target.calculateValue(sel, ctx, estate.targetState, null, null);
if (_arg != null)
- _arg.calculateValue(sel, store, params, null, fetch);
+ _arg.calculateValue(sel, ctx, estate.argState, null, null);
}
- public void clearParameters() {
- if (_target != null)
- _target.clearParameters();
- if (_arg != null)
- _arg.clearParameters();
- }
-
- public int length() {
+ public int length(Select sel, ExpContext ctx, ExpState state) {
return 1;
}
- public void appendTo(SQLBuffer sql, int index, Select sel,
- JDBCStore store, Object[] params, JDBCFetchConfiguration fetch) {
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer sql, int index) {
+ ExtensionExpState estate = (ExtensionExpState) state;
FilterValue target = (_target == null) ? null
- : new FilterValueImpl(_target, sel, store, params, fetch);
- _listener.appendTo(sql, target, getArgs(sel, store, params, fetch),
- _candidate, store);
- sel.append(sql, _joins);
+ : new FilterValueImpl(sel, ctx, estate.targetState, _target);
+ _listener.appendTo(sql, target, getArgs(sel, ctx, estate.argState),
+ _candidate, ctx.store);
+ sel.append(sql, state.joins);
}
- private FilterValue[] getArgs(Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
+ private FilterValue[] getArgs(Select sel, ExpContext ctx, ExpState state) {
if (_arg == null)
return null;
- if (_arg instanceof Args) {
- Val[] vals = ((Args) _arg).getVals();
- FilterValue[] filts = new FilterValue[vals.length];
- for (int i = 0; i < vals.length; i++)
- filts[i] = new FilterValueImpl(vals[i], sel, store, params,
- fetch);
- return filts;
- }
- return new FilterValue[]{
- new FilterValueImpl(_arg, sel, store, params, fetch)
+ if (_arg instanceof Args)
+ return ((Args) _arg).newFilterValues(sel, ctx, state);
+ return new FilterValue[] {
+ new FilterValueImpl(sel, ctx, state, _arg)
};
}
@@ -222,16 +208,14 @@
// Exp implementation
//////////////////////
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
- initialize(sel, store, false);
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
+ return initialize(sel, ctx, 0);
}
- public void appendTo(SQLBuffer sql, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- calculateValue(sel, store, params, null, fetch);
- appendTo(sql, 0, sel, store, params, fetch);
- sel.append(sql, getJoins());
- clearParameters();
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer sql) {
+ calculateValue(sel, ctx, state, null, null);
+ appendTo(sel, ctx, state, sql, 0);
+ sel.append(sql, state.joins);
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/FilterValueImpl.java Thu Sep 7 10:51:05 2006
@@ -15,8 +15,6 @@
*/
package org.apache.openjpa.jdbc.kernel.exps;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.FieldMapping;
import org.apache.openjpa.jdbc.schema.Column;
@@ -32,19 +30,17 @@
class FilterValueImpl
implements FilterValue {
- private final Val _val;
private final Select _sel;
- private final JDBCStore _store;
- private final Object[] _params;
- private final JDBCFetchConfiguration _fetch;
+ private final ExpContext _ctx;
+ private final ExpState _state;
+ private final Val _val;
- public FilterValueImpl(Val val, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- _val = val;
+ public FilterValueImpl(Select sel, ExpContext ctx, ExpState state,
+ Val val) {
_sel = sel;
- _store = store;
- _params = params;
- _fetch = fetch;
+ _ctx = ctx;
+ _state = state;
+ _val = val;
}
public Class getType() {
@@ -52,7 +48,7 @@
}
public int length() {
- return _val.length();
+ return _val.length(_sel, _ctx, _state);
}
public void appendTo(SQLBuffer buf) {
@@ -60,19 +56,19 @@
}
public void appendTo(SQLBuffer buf, int index) {
- _val.appendTo(buf, index, _sel, _store, _params, _fetch);
+ _val.appendTo(_sel, _ctx, _state, buf, index);
}
public String getColumnAlias(Column col) {
- return _sel.getColumnAlias(col, _val.getJoins());
+ return _sel.getColumnAlias(col, _state.joins);
}
public String getColumnAlias(String col, Table table) {
- return _sel.getColumnAlias(col, table, _val.getJoins());
+ return _sel.getColumnAlias(col, table, _state.joins);
}
public Object toDataStoreValue(Object val) {
- return _val.toDataStoreValue(val, _store);
+ return _val.toDataStoreValue(_sel, _ctx, _state, val);
}
public boolean isConstant() {
@@ -80,11 +76,12 @@
}
public Object getValue() {
- return (isConstant()) ? ((Const) _val).getValue() : null;
+ return (isConstant()) ? ((Const) _val).getValue(_ctx.params) : null;
}
public Object getSQLValue() {
- return (isConstant()) ? ((Const) _val).getSQLValue() : null;
+ return (isConstant()) ? ((Const) _val).getSQLValue(_sel, _ctx, _state)
+ : null;
}
public boolean isPath() {
@@ -92,10 +89,10 @@
}
public ClassMapping getClassMapping() {
- return (isPath()) ? ((PCPath) _val).getClassMapping() : null;
+ return (isPath()) ? ((PCPath) _val).getClassMapping(_state) : null;
}
public FieldMapping getFieldMapping() {
- return (isPath()) ? ((PCPath) _val).getFieldMapping() : null;
+ return (isPath()) ? ((PCPath) _val).getFieldMapping(_state) : null;
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GetMapValue.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GetMapValue.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GetMapValue.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GetMapValue.java Thu Sep 7 10:51:05 2006
@@ -17,8 +17,6 @@
import java.sql.SQLException;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.FieldMapping;
import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
@@ -27,7 +25,6 @@
import org.apache.openjpa.jdbc.meta.strats.RelationStrategies;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.schema.ForeignKey;
-import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.Result;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
@@ -42,9 +39,9 @@
*/
class GetMapValue
extends AbstractVal {
+
private final Val _map;
private final Val _key;
- private Joins _joins = null;
private ClassMetaData _meta = null;
private Class _cast = null;
@@ -71,7 +68,6 @@
public Class getType() {
if (_cast != null)
return _cast;
-
return _map.getType();
}
@@ -79,135 +75,133 @@
_cast = type;
}
- public void initialize(Select sel, JDBCStore store, boolean nullTest) {
- _map.initialize(sel, store, false);
- _key.initialize(sel, store, false);
- _joins = sel.and(_map.getJoins(), _key.getJoins());
+ public ExpState initialize(Select sel, ExpContext ctx, int flags) {
+ ExpState mapState = _map.initialize(sel, ctx, 0);
+ ExpState keyState = _key.initialize(sel, ctx, 0);
+ return new GetMapValueExpState(sel.and(mapState.joins, keyState.joins),
+ mapState, keyState);
}
- public Joins getJoins() {
- return _joins;
+ /**
+ * Expression state.
+ */
+ private static class GetMapValueExpState
+ extends ExpState {
+
+ public final ExpState mapState;
+ public final ExpState keyState;
+
+ public GetMapValueExpState(Joins joins, ExpState mapState,
+ ExpState keyState) {
+ super(joins);
+ this.mapState = mapState;
+ this.keyState = keyState;
+ }
}
- public Object toDataStoreValue(Object val, JDBCStore store) {
- return _map.toDataStoreValue(val, store);
+ public Object toDataStoreValue(Select sel, ExpContext ctx, ExpState state,
+ Object val) {
+ GetMapValueExpState gstate = (GetMapValueExpState) state;
+ return _map.toDataStoreValue(sel, ctx, gstate.mapState, val);
}
- public void select(Select sel, JDBCStore store, Object[] params,
- boolean pks, JDBCFetchConfiguration fetch) {
- sel.select(newSQLBuffer(sel, store, params, fetch), this);
+ public void select(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ sel.select(newSQLBuffer(sel, ctx, state), this);
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- _map.selectColumns(sel, store, params, true, fetch);
- _key.selectColumns(sel, store, params, true, fetch);
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ GetMapValueExpState gstate = (GetMapValueExpState) state;
+ _map.selectColumns(sel, ctx, gstate.mapState, true);
+ _key.selectColumns(sel, ctx, gstate.keyState, true);
}
- public void groupBy(Select sel, JDBCStore store, Object[] params,
- JDBCFetchConfiguration fetch) {
- sel.groupBy(newSQLBuffer(sel, store, params, fetch));
+ public void groupBy(Select sel, ExpContext ctx, ExpState state) {
+ sel.groupBy(newSQLBuffer(sel, ctx, state));
}
- public void orderBy(Select sel, JDBCStore store, Object[] params,
- boolean asc, JDBCFetchConfiguration fetch) {
- sel.orderBy(newSQLBuffer(sel, store, params, fetch), asc, false);
+ public void orderBy(Select sel, ExpContext ctx, ExpState state,
+ boolean asc) {
+ sel.orderBy(newSQLBuffer(sel, ctx, state), asc, false);
}
- private SQLBuffer newSQLBuffer(Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- calculateValue(sel, store, params, null, fetch);
- SQLBuffer buf = new SQLBuffer(store.getDBDictionary());
- appendTo(buf, 0, sel, store, params, fetch);
- clearParameters();
+ private SQLBuffer newSQLBuffer(Select sel, ExpContext ctx, ExpState state) {
+ calculateValue(sel, ctx, state, null, null);
+ SQLBuffer buf = new SQLBuffer(ctx.store.getDBDictionary());
+ appendTo(sel, ctx, state, buf, 0);
return buf;
}
- public Object load(Result res, JDBCStore store,
- JDBCFetchConfiguration fetch)
+ public Object load(ExpContext ctx, ExpState state, Result res)
throws SQLException {
return Filters.convert(res.getObject(this,
JavaSQLTypes.JDBC_DEFAULT, null), getType());
}
- public void calculateValue(Select sel, JDBCStore store,
- Object[] params, Val other, JDBCFetchConfiguration fetch) {
- _map.calculateValue(sel, store, params, null, fetch);
- _key.calculateValue(sel, store, params, null, fetch);
- }
-
- public void clearParameters() {
- _map.clearParameters();
- _key.clearParameters();
+ public void calculateValue(Select sel, ExpContext ctx, ExpState state,
+ Val other, ExpState otherState) {
+ GetMapValueExpState gstate = (GetMapValueExpState) state;
+ _map.calculateValue(sel, ctx, gstate.mapState, null, null);
+ _key.calculateValue(sel, ctx, gstate.keyState, null, null);
}
- public int length() {
+ public int length(Select sel, ExpContext ctx, ExpState state) {
return 1;
}
- public void appendTo(SQLBuffer sql, int index, Select sel,
- JDBCStore store, Object[] params, JDBCFetchConfiguration fetch) {
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer sql, int index) {
if (!(_map instanceof PCPath))
throw new UnsupportedOperationException();
-
if (!(_key instanceof Const))
throw new UnsupportedOperationException();
+ GetMapValueExpState gstate = (GetMapValueExpState) state;
PCPath map = (PCPath) _map;
- Object key = ((Const) _key).getValue();
-
- FieldMapping field = map.getFieldMapping();
-
+ Object key = ((Const) _key).getValue(ctx, gstate.keyState);
+ FieldMapping field = map.getFieldMapping(gstate.mapState);
if (!(field.getStrategy() instanceof LRSMapFieldStrategy))
throw new UnsupportedOperationException();
LRSMapFieldStrategy strat = (LRSMapFieldStrategy) field.getStrategy();
-
ClassMapping[] clss = strat.getIndependentValueMappings(true);
if (clss != null && clss.length > 1)
throw RelationStrategies.unjoinable(field);
ClassMapping cls = (clss.length == 0) ? null : clss[0];
ForeignKey fk = strat.getJoinForeignKey(cls);
- DBDictionary dict = store.getDBDictionary();
- SQLBuffer sub = new SQLBuffer(dict);
// manually create a subselect for the Map's value
- sub.append("(SELECT ");
+ sql.append("(SELECT ");
Column[] values = field.getElementMapping().getColumns();
for (int i = 0; i < values.length; i++) {
if (i > 0)
- sub.append(", ");
- sub.append(values[i].getFullName());
+ sql.append(", ");
+ sql.append(values[i].getFullName());
}
-
- sub.append(" FROM ").append(values[0].getTable().getFullName()).
+ sql.append(" FROM ").append(values[0].getTable().getFullName()).
append(" WHERE ");
// add in the joins
- ContainerFieldStrategy.appendUnaliasedJoin(sub, sel, null,
- dict, field, fk);
+ ContainerFieldStrategy.appendUnaliasedJoin(sql, sel, null,
+ ctx.store.getDBDictionary(), field, fk);
+ sql.append(" AND ");
- sub.append(" AND ");
-
- key = strat.toKeyDataStoreValue(key, store);
+ key = strat.toKeyDataStoreValue(key, ctx.store);
Column[] cols = strat.getKeyColumns(cls);
Object[] vals = (cols.length == 1) ? null : (Object[]) key;
for (int i = 0; i < cols.length; i++) {
- sub.append(cols[i].getFullName());
-
+ sql.append(cols[i].getFullName());
if (vals == null)
- sub.append((key == null) ? " IS " : " = ").
+ sql.append((key == null) ? " IS " : " = ").
appendValue(key, cols[i]);
else
- sub.append((vals[i] == null) ? " IS " : " = ").
+ sql.append((vals[i] == null) ? " IS " : " = ").
appendValue(vals[i], cols[i]);
}
-
- sub.append(")");
-
- sql.append(sub);
+ sql.append(")");
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GetObjectId.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GetObjectId.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GetObjectId.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/GetObjectId.java Thu Sep 7 10:51:05 2006
@@ -17,12 +17,9 @@
import java.sql.SQLException;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.Joinable;
import org.apache.openjpa.jdbc.schema.Column;
-import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.Result;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
@@ -57,8 +54,11 @@
_path = path;
}
- public Column[] getColumns() {
- return _path.getClassMapping().getPrimaryKeyColumns();
+ /**
+ * Return the oid columns.
+ */
+ public Column[] getColumns(ExpState state) {
+ return _path.getClassMapping(state).getPrimaryKeyColumns();
}
public ClassMetaData getMetaData() {
@@ -76,26 +76,23 @@
public void setImplicitType(Class type) {
}
- public void initialize(Select sel, JDBCStore store, boolean nullTest) {
- _path.initialize(sel, store, false);
- _path.joinRelation();
+ public ExpState initialize(Select sel, ExpContext ctx, int flags) {
+ ExpState state = _path.initialize(sel, ctx, JOIN_REL);
// it's difficult to get calls on non-pc fields to always return null
// without screwing up the SQL, to just don't let users call it on
// non-pc fields at all
- if (_path.getClassMapping() == null
- || _path.getClassMapping().getEmbeddingMapping() != null)
+ ClassMapping cls = _path.getClassMapping(state);
+ if (cls == null || cls.getEmbeddingMapping() != null)
throw new UserException(_loc.get("bad-getobjectid",
- _path.getFieldMapping()));
- }
-
- public Joins getJoins() {
- return _path.getJoins();
+ _path.getFieldMapping(state)));
+ return state;
}
- public Object toDataStoreValue(Object val, JDBCStore store) {
+ public Object toDataStoreValue(Select sel, ExpContext ctx, ExpState state,
+ Object val) {
// if datastore identity, try to convert to a long value
- ClassMapping mapping = _path.getClassMapping();
+ ClassMapping mapping = _path.getClassMapping(state);
if (mapping.getIdentityType() == mapping.ID_DATASTORE) {
if (val instanceof Id)
return Numbers.valueOf(((Id) val).getId());
@@ -129,48 +126,42 @@
return ordered;
}
- public void select(Select sel, JDBCStore store, Object[] params,
- boolean pks, JDBCFetchConfiguration fetch) {
- selectColumns(sel, store, params, true, fetch);
+ public void select(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ selectColumns(sel, ctx, state, true);
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- _path.selectColumns(sel, store, params, true, fetch);
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ _path.selectColumns(sel, ctx, state, true);
}
- public void groupBy(Select sel, JDBCStore store, Object[] params,
- JDBCFetchConfiguration fetch) {
- _path.groupBy(sel, store, params, fetch);
+ public void groupBy(Select sel, ExpContext ctx, ExpState state) {
+ _path.groupBy(sel, ctx, state);
}
- public void orderBy(Select sel, JDBCStore store, Object[] params,
- boolean asc, JDBCFetchConfiguration fetch) {
- _path.orderBy(sel, store, params, asc, fetch);
+ public void orderBy(Select sel, ExpContext ctx, ExpState state,
+ boolean asc) {
+ _path.orderBy(sel, ctx, state, asc);
}
- public Object load(Result res, JDBCStore store,
- JDBCFetchConfiguration fetch)
+ public Object load(ExpContext ctx, ExpState state, Result res)
throws SQLException {
- return _path.load(res, store, true, fetch);
- }
-
- public void calculateValue(Select sel, JDBCStore store,
- Object[] params, Val other, JDBCFetchConfiguration fetch) {
- _path.calculateValue(sel, store, params, null, fetch);
+ return _path.load(ctx, state, res, true);
}
- public void clearParameters() {
- _path.clearParameters();
+ public void calculateValue(Select sel, ExpContext ctx, ExpState state,
+ Val other, ExpState otherState) {
+ _path.calculateValue(sel, ctx, state, null, null);
}
- public int length() {
- return _path.length();
+ public int length(Select sel, ExpContext ctx, ExpState state) {
+ return _path.length(sel, ctx, state);
}
- public void appendTo(SQLBuffer sql, int index, Select sel,
- JDBCStore store, Object[] params, JDBCFetchConfiguration fetch) {
- _path.appendTo(sql, index, sel, store, params, fetch);
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer sql, int index) {
+ _path.appendTo(sel, ctx, state, sql, index);
}
public void acceptVisit(ExpressionVisitor visitor) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InExpression.java Thu Sep 7 10:51:05 2006
@@ -20,8 +20,6 @@
import java.util.Iterator;
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.schema.Column;
import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
@@ -48,58 +46,79 @@
_const = constant;
}
- public Const getConst() {
+ /**
+ * Constant collection.
+ */
+ public Const getConstant() {
return _const;
}
+ /**
+ * Contained value.
+ */
public Val getValue() {
return _val;
}
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
- _val.initialize(sel, store, false);
- _const.initialize(sel, store, false);
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
+ ExpState valueState = _val.initialize(sel, ctx, 0);
+ ExpState constantState = _const.initialize(sel, ctx, 0);
+ return new InExpState(valueState.joins, constantState, valueState);
+ }
+
+ /**
+ * Expression state.
+ */
+ private static class InExpState
+ extends ExpState {
+
+ public final ExpState constantState;
+ public final ExpState valueState;
+
+ public InExpState(Joins joins, ExpState constantState,
+ ExpState valueState) {
+ super(joins);
+ this.constantState = constantState;
+ this.valueState = valueState;
+ }
}
- public void appendTo(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- _val.calculateValue(sel, store, params, null, fetch);
- _const.calculateValue(sel, store, params, null, fetch);
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf) {
+ InExpState istate = (InExpState) state;
+ _const.calculateValue(sel, ctx, istate.constantState, null, null);
+ _val.calculateValue(sel, ctx, istate.valueState, null, null);
- Collection coll = getCollection();
+ Collection coll = getCollection(ctx, istate.constantState);
if (coll != null) {
Collection ds = new ArrayList(coll.size());
for (Iterator itr = coll.iterator(); itr.hasNext();)
- ds.add(_val.toDataStoreValue(itr.next(), store));
+ ds.add(_val.toDataStoreValue(sel, ctx, istate.valueState,
+ itr.next()));
coll = ds;
}
Column[] cols = null;
if (_val instanceof PCPath)
- cols = ((PCPath) _val).getColumns();
+ cols = ((PCPath) _val).getColumns(istate.valueState);
else if (_val instanceof GetObjectId)
- cols = ((GetObjectId) _val).getColumns();
+ cols = ((GetObjectId) _val).getColumns(istate.valueState);
if (coll == null || coll.isEmpty())
buf.append("1 <> 1");
- else if (_val.length() == 1)
- inContains(buf, sel, store, params, fetch, coll, cols);
+ else if (_val.length(sel, ctx, istate.valueState) == 1)
+ inContains(sel, ctx, istate.valueState, buf, coll, cols);
else
- orContains(buf, sel, store, params, fetch, coll, cols);
- sel.append(buf, _val.getJoins());
-
- _val.clearParameters();
- _const.clearParameters();
+ orContains(sel, ctx, istate.valueState, buf, coll, cols);
+ sel.append(buf, state.joins);
}
/**
* Construct an IN clause with the value of the given collection.
*/
- private void inContains(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch,
- Collection coll, Column[] cols) {
- _val.appendTo(buf, 0, sel, store, params, fetch);
+ private void inContains(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf, Collection coll, Column[] cols) {
+ _val.appendTo(sel, ctx, state, buf, 0);
buf.append(" IN (");
Column col = (cols != null && cols.length == 1) ? cols[0] : null;
@@ -115,9 +134,8 @@
* If the value to test is a compound key, we can't use IN,
* so create a clause like '(a = b AND c = d) OR (e = f AND g = h) ...'
*/
- private void orContains(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch, Collection coll,
- Column[] cols) {
+ private void orContains(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf, Collection coll, Column[] cols) {
if (coll.size() > 1)
buf.append("(");
@@ -133,7 +151,7 @@
if (i > 0)
buf.append(" AND ");
- _val.appendTo(buf, i, sel, store, params, fetch);
+ _val.appendTo(sel, ctx, state, buf, i);
if (vals[i] == null)
buf.append(" IS ");
else
@@ -149,21 +167,18 @@
buf.append(")");
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- _val.selectColumns(sel, store, params, true, fetch);
- _const.selectColumns(sel, store, params, pks, fetch);
- }
-
- public Joins getJoins() {
- return _val.getJoins();
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ InExpState istate = (InExpState) state;
+ _const.selectColumns(sel, ctx, istate.constantState, true);
+ _val.selectColumns(sel, ctx, istate.valueState, true);
}
/**
* Return the collection to test for containment with.
*/
- protected Collection getCollection() {
- return (Collection) _const.getValue();
+ protected Collection getCollection(ExpContext ctx, ExpState state) {
+ return (Collection) _const.getValue(ctx, state);
}
public void acceptVisit(ExpressionVisitor visitor) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InKeyExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InKeyExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InKeyExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InKeyExpression.java Thu Sep 7 10:51:05 2006
@@ -37,8 +37,8 @@
/**
* Return the collection to test for containment with.
*/
- protected Collection getCollection() {
- Map map = (Map) getConst().getValue();
+ protected Collection getCollection(ExpContext ctx, ExpState state) {
+ Map map = (Map) getConstant().getValue(ctx, state);
return (map == null) ? null : map.keySet();
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InSubQExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InSubQExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InSubQExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InSubQExpression.java Thu Sep 7 10:51:05 2006
@@ -17,8 +17,6 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
@@ -43,31 +41,44 @@
_sub = sub;
}
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
- _val.initialize(sel, store, false);
- _sub.initialize(sel, store, false);
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
+ ExpState subqState = _sub.initialize(sel, ctx, 0);
+ ExpState valueState = _val.initialize(sel, ctx, 0);
+ return new InSubQExpState(valueState.joins, subqState, valueState);
}
- public void appendTo(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- _val.calculateValue(sel, store, params, null, fetch);
- _sub.calculateValue(sel, store, params, null, fetch);
- _val.appendTo(buf, 0, sel, store, params, fetch);
- buf.append(" IN ");
- _sub.appendTo(buf, 0, sel, store, params, fetch);
- _val.clearParameters();
- _sub.clearParameters();
+ /**
+ * Expression state.
+ */
+ private static class InSubQExpState
+ extends ExpState {
+
+ public final ExpState subqState;
+ public final ExpState valueState;
+
+ public InSubQExpState(Joins joins, ExpState subqState,
+ ExpState valueState) {
+ super(joins);
+ this.subqState = subqState;
+ this.valueState = valueState;
+ }
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- _val.selectColumns(sel, store, params, true, fetch);
- _sub.selectColumns(sel, store, params, pks, fetch);
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf) {
+ InSubQExpState istate = (InSubQExpState) state;
+ _sub.calculateValue(sel, ctx, istate.subqState, null, null);
+ _val.calculateValue(sel, ctx, istate.valueState, null, null);
+ _val.appendTo(sel, ctx, istate.valueState, buf, 0);
+ buf.append(" IN ");
+ _sub.appendTo(sel, ctx, istate.valueState, buf, 0);
}
- public Joins getJoins() {
- return _val.getJoins();
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ InSubQExpState istate = (InSubQExpState) state;
+ _sub.selectColumns(sel, ctx, istate.subqState, pks);
+ _val.selectColumns(sel, ctx, istate.valueState, true);
}
public void acceptVisit(ExpressionVisitor visitor) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InValueExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InValueExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InValueExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InValueExpression.java Thu Sep 7 10:51:05 2006
@@ -37,8 +37,8 @@
/**
* Return the collection to test for containment with.
*/
- protected Collection getCollection() {
- Map map = (Map) getConst().getValue();
+ protected Collection getCollection(ExpContext ctx, ExpState state) {
+ Map map = (Map) getConstant().getValue(ctx, state);
return (map == null) ? null : map.values();
}
}
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IndexOf.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IndexOf.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IndexOf.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IndexOf.java Thu Sep 7 10:51:05 2006
@@ -17,10 +17,7 @@
import java.sql.SQLException;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
-import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.Result;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
@@ -38,7 +35,6 @@
private final Val _val1;
private final Val _val2;
- private Joins _joins = null;
private ClassMetaData _meta = null;
private Class _cast = null;
@@ -58,10 +54,6 @@
_meta = meta;
}
- public boolean isVariable() {
- return false;
- }
-
public Class getType() {
if (_cast != null)
return _cast;
@@ -72,87 +64,72 @@
_cast = type;
}
- public void initialize(Select sel, JDBCStore store, boolean nullTest) {
- _val1.initialize(sel, store, false);
- _val2.initialize(sel, store, false);
- _joins = sel.and(_val1.getJoins(), _val2.getJoins());
- }
-
- public Joins getJoins() {
- return _joins;
+ public ExpState initialize(Select sel, ExpContext ctx, int flags) {
+ ExpState s1 = _val1.initialize(sel, ctx, 0);
+ ExpState s2 = _val2.initialize(sel, ctx, 0);
+ return new BinaryOpExpState(sel.and(s1.joins, s2.joins), s1, s2);
}
- public Object toDataStoreValue(Object val, JDBCStore store) {
- return val;
+ public void select(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ sel.select(newSQLBuffer(sel, ctx, state), this);
}
- public void select(Select sel, JDBCStore store, Object[] params,
- boolean pks, JDBCFetchConfiguration fetch) {
- sel.select(newSQLBuffer(sel, store, params, fetch), this);
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ BinaryOpExpState bstate = (BinaryOpExpState) state;
+ _val1.selectColumns(sel, ctx, bstate.state1, true);
+ _val2.selectColumns(sel, ctx, bstate.state2, true);
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- _val1.selectColumns(sel, store, params, true, fetch);
- _val2.selectColumns(sel, store, params, true, fetch);
+ public void groupBy(Select sel, ExpContext ctx, ExpState state) {
+ sel.groupBy(newSQLBuffer(sel, ctx, state));
}
- public void groupBy(Select sel, JDBCStore store, Object[] params,
- JDBCFetchConfiguration fetch) {
- sel.groupBy(newSQLBuffer(sel, store, params, fetch));
+ public void orderBy(Select sel, ExpContext ctx, ExpState state,
+ boolean asc) {
+ sel.orderBy(newSQLBuffer(sel, ctx, state), asc, false);
}
- public void orderBy(Select sel, JDBCStore store, Object[] params,
- boolean asc, JDBCFetchConfiguration fetch) {
- sel.orderBy(newSQLBuffer(sel, store, params, fetch), asc, false);
- }
-
- private SQLBuffer newSQLBuffer(Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- calculateValue(sel, store, params, null, fetch);
- SQLBuffer buf = new SQLBuffer(store.getDBDictionary());
- appendTo(buf, 0, sel, store, params, fetch);
- clearParameters();
+ private SQLBuffer newSQLBuffer(Select sel, ExpContext ctx, ExpState state) {
+ calculateValue(sel, ctx, state, null, null);
+ SQLBuffer buf = new SQLBuffer(ctx.store.getDBDictionary());
+ appendTo(sel, ctx, state, buf, 0);
return buf;
}
- public Object load(Result res, JDBCStore store,
- JDBCFetchConfiguration fetch)
+ public Object load(ExpContext ctx, ExpState state, Result res)
throws SQLException {
- return Filters.convert(res.getObject(this,
- JavaSQLTypes.JDBC_DEFAULT, null), getType());
- }
-
- public void calculateValue(Select sel, JDBCStore store,
- Object[] params, Val other, JDBCFetchConfiguration fetch) {
- _val1.calculateValue(sel, store, params, null, fetch);
- _val2.calculateValue(sel, store, params, null, fetch);
+ return Filters.convert(res.getObject(this, JavaSQLTypes.JDBC_DEFAULT,
+ null), getType());
}
- public void clearParameters() {
- _val1.clearParameters();
- _val2.clearParameters();
+ public void calculateValue(Select sel, ExpContext ctx, ExpState state,
+ Val other, ExpState otherState) {
+ BinaryOpExpState bstate = (BinaryOpExpState) state;
+ _val1.calculateValue(sel, ctx, bstate.state1, null, null);
+ _val2.calculateValue(sel, ctx, bstate.state2, null, null);
}
- public int length() {
+ public int length(Select sel, ExpContext ctx, ExpState state) {
return 1;
}
- public void appendTo(SQLBuffer sql, int index, Select sel,
- JDBCStore store, Object[] params, JDBCFetchConfiguration fetch) {
- FilterValue str = new FilterValueImpl(_val1, sel, store, params, fetch);
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer sql, int index) {
+ BinaryOpExpState bstate = (BinaryOpExpState) state;
+ FilterValue str = new FilterValueImpl(sel, ctx, bstate.state1, _val1);
FilterValue search;
FilterValue start = null;
if (_val2 instanceof Args) {
- Val[] args = ((Args) _val2).getVals();
- search =
- new FilterValueImpl(args[0], sel, store, params, fetch);
- start =
- new FilterValueImpl(args[1], sel, store, params, fetch);
+ FilterValue[] filts = ((Args) _val2).newFilterValues(sel, ctx,
+ bstate.state2);
+ search = filts[0];
+ start = filts[1];
} else
- search = new FilterValueImpl(_val2, sel, store, params, fetch);
+ search = new FilterValueImpl(sel, ctx, bstate.state2, _val2);
- store.getDBDictionary().indexOf(sql, str, search, start);
+ ctx.store.getDBDictionary().indexOf(sql, str, search, start);
}
public void acceptVisit(ExpressionVisitor visitor) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InstanceofExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InstanceofExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InstanceofExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/InstanceofExpression.java Thu Sep 7 10:51:05 2006
@@ -17,8 +17,6 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
import org.apache.openjpa.jdbc.meta.ClassMapping;
import org.apache.openjpa.jdbc.meta.Discriminator;
import org.apache.openjpa.jdbc.meta.FieldMapping;
@@ -39,10 +37,6 @@
private final PCPath _path;
private final Class _cls;
- private Joins _joins = null;
- private Discriminator _dsc = null;
- private Class _relCls = null;
- private ClassMapping _mapping = null;
/**
* Constructor. Supply path and class to test for.
@@ -52,96 +46,117 @@
_cls = cls;
}
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
// note that we tell the path to go ahead and join to its related
// object (if any) in order to access its class indicator
- _path.initialize(sel, store, false);
- _path.joinRelation();
- _joins = _path.getJoins();
+ ExpState pathState = _path.initialize(sel, ctx, Val.JOIN_REL);
// does this path represent a relation? if not, what class
// is the field?
- ClassMapping rel = _path.getClassMapping();
- if (rel == null) {
- FieldMapping field = _path.getFieldMapping();
+ ClassMapping relMapping = _path.getClassMapping(pathState);
+ Class rel = null;
+ if (relMapping == null) {
+ FieldMapping field = _path.getFieldMapping(pathState);
switch (field.getTypeCode()) {
case JavaTypes.MAP:
if (_path.isKey())
- _relCls = field.getKey().getDeclaredType();
+ rel = field.getKey().getDeclaredType();
// no break
case JavaTypes.ARRAY:
case JavaTypes.COLLECTION:
- _relCls = field.getElement().getDeclaredType();
+ rel = field.getElement().getDeclaredType();
break;
default:
- _relCls = field.getDeclaredType();
+ rel = field.getDeclaredType();
}
} else
- _relCls = rel.getDescribedType();
+ rel = relMapping.getDescribedType();
// if the path represents a relation, get its class indicator and
// make sure it's joined down to its base type
- _dsc = (rel == null || !rel.getDescribedType().isAssignableFrom(_cls))
- ? null : rel.getDiscriminator();
- if (_dsc != null) {
+ Discriminator discrim = (relMapping == null
+ || !relMapping.getDescribedType().isAssignableFrom(_cls))
+ ? null : relMapping.getDiscriminator();
+ ClassMapping mapping = null;
+ Joins joins = pathState.joins;
+ if (discrim != null) {
// cache mapping for cast
- MappingRepository repos = store.getConfiguration().
+ MappingRepository repos = ctx.store.getConfiguration().
getMappingRepositoryInstance();
- _mapping = repos.getMapping(_cls, store.getContext().
+ mapping = repos.getMapping(_cls, ctx.store.getContext().
getClassLoader(), false);
// if not looking for a PC, don't bother with indicator
- if (_mapping == null)
- _dsc = null;
+ if (mapping == null)
+ discrim = null;
else {
- ClassMapping owner = _dsc.getClassMapping();
+ ClassMapping owner = discrim.getClassMapping();
ClassMapping from, to;
- if (rel.getDescribedType().isAssignableFrom
+ if (relMapping.getDescribedType().isAssignableFrom
(owner.getDescribedType())) {
from = owner;
- to = rel;
+ to = relMapping;
} else {
- from = rel;
+ from = relMapping;
to = owner;
}
for (; from != null && from != to;
from = from.getJoinablePCSuperclassMapping())
- _joins = from.joinSuperclass(_joins, false);
+ joins = from.joinSuperclass(joins, false);
}
}
+ return new InstanceofExpState(joins, pathState, mapping, discrim, rel);
}
- public void appendTo(SQLBuffer sql, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
+ /**
+ * Expression state.
+ */
+ private static class InstanceofExpState
+ extends ExpState {
+
+ public final ExpState pathState;
+ public final ClassMapping mapping;
+ public final Discriminator discrim;
+ public final Class rel;
+
+ public InstanceofExpState(Joins joins, ExpState pathState,
+ ClassMapping mapping, Discriminator discrim, Class rel) {
+ super(joins);
+ this.pathState = pathState;
+ this.mapping = mapping;
+ this.discrim = discrim;
+ this.rel = rel;
+ }
+ }
+
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer sql) {
// if no class indicator or a final class, just append true or false
// depending on whether the cast matches the expected type
- if (_dsc == null) {
- if (_cls.isAssignableFrom(_relCls))
+ InstanceofExpState istate = (InstanceofExpState) state;
+ if (istate.discrim == null) {
+ if (_cls.isAssignableFrom(istate.rel))
sql.append("1 = 1");
else
sql.append("1 <> 1");
} else {
- store.loadSubclasses(_dsc.getClassMapping());
- SQLBuffer buf = _dsc.getClassConditions(sel, _joins, _mapping,
- true);
+ ctx.store.loadSubclasses(istate.discrim.getClassMapping());
+ SQLBuffer buf = istate.discrim.getClassConditions(sel,
+ istate.joins, istate.mapping, true);
if (buf == null)
sql.append("1 = 1");
else
sql.append(buf);
}
- sel.append(sql, _joins);
- }
-
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- if (_dsc != null)
- sel.select(_dsc.getColumns(), _joins);
+ sel.append(sql, istate.joins);
}
- public Joins getJoins() {
- return _joins;
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ InstanceofExpState istate = (InstanceofExpState) state;
+ if (istate.discrim != null)
+ sel.select(istate.discrim.getColumns(), istate.joins);
}
public void acceptVisit(ExpressionVisitor visitor) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IsEmptyExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IsEmptyExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IsEmptyExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IsEmptyExpression.java Thu Sep 7 10:51:05 2006
@@ -17,9 +17,6 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
-import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
import org.apache.openjpa.kernel.exps.ExpressionVisitor;
@@ -41,28 +38,22 @@
_val = val;
}
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
- _val.initialize(sel, store, true);
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
+ return _val.initialize(sel, ctx, Val.NULL_CMP);
}
- public void appendTo(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- _val.calculateValue(sel, store, params, null, fetch);
- _val.appendIsEmpty(buf, sel, store, params, fetch);
- sel.append(buf, _val.getJoins());
- _val.clearParameters();
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf) {
+ _val.calculateValue(sel, ctx, state, null, null);
+ _val.appendIsEmpty(sel, ctx, state, buf);
+ sel.append(buf, state.joins);
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- _val.selectColumns(sel, store, params, true, fetch);
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ _val.selectColumns(sel, ctx, state, true);
}
- public Joins getJoins() {
- return _val.getJoins();
- }
-
public void acceptVisit(ExpressionVisitor visitor) {
visitor.enter(this);
_val.acceptVisit(visitor);
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IsNotEmptyExpression.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IsNotEmptyExpression.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IsNotEmptyExpression.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/IsNotEmptyExpression.java Thu Sep 7 10:51:05 2006
@@ -17,9 +17,6 @@
import java.util.Map;
-import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
-import org.apache.openjpa.jdbc.kernel.JDBCStore;
-import org.apache.openjpa.jdbc.sql.Joins;
import org.apache.openjpa.jdbc.sql.SQLBuffer;
import org.apache.openjpa.jdbc.sql.Select;
import org.apache.openjpa.kernel.exps.ExpressionVisitor;
@@ -41,26 +38,20 @@
_val = val;
}
- public void initialize(Select sel, JDBCStore store,
- Object[] params, Map contains) {
- _val.initialize(sel, store, true);
+ public ExpState initialize(Select sel, ExpContext ctx, Map contains) {
+ return _val.initialize(sel, ctx, Val.NULL_CMP);
}
- public void appendTo(SQLBuffer buf, Select sel, JDBCStore store,
- Object[] params, JDBCFetchConfiguration fetch) {
- _val.calculateValue(sel, store, params, null, fetch);
- _val.appendIsNotEmpty(buf, sel, store, params, fetch);
- sel.append(buf, _val.getJoins());
- _val.clearParameters();
+ public void appendTo(Select sel, ExpContext ctx, ExpState state,
+ SQLBuffer buf) {
+ _val.calculateValue(sel, ctx, state, null, null);
+ _val.appendIsNotEmpty(sel, ctx, state, buf);
+ sel.append(buf, state.joins);
}
- public void selectColumns(Select sel, JDBCStore store,
- Object[] params, boolean pks, JDBCFetchConfiguration fetch) {
- _val.selectColumns(sel, store, params, true, fetch);
- }
-
- public Joins getJoins() {
- return _val.getJoins();
+ public void selectColumns(Select sel, ExpContext ctx, ExpState state,
+ boolean pks) {
+ _val.selectColumns(sel, ctx, state, true);
}
public void acceptVisit(ExpressionVisitor visitor) {
Modified: incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java?view=diff&rev=441158&r1=441157&r2=441158
==============================================================================
--- incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java (original)
+++ incubator/openjpa/trunk/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/JDBCExpressionFactory.java Thu Sep 7 10:51:05 2006
@@ -19,6 +19,7 @@
import org.apache.openjpa.jdbc.kernel.JDBCFetchConfiguration;
import org.apache.openjpa.jdbc.kernel.JDBCStoreQuery;
import org.apache.openjpa.jdbc.meta.ClassMapping;
+import org.apache.openjpa.jdbc.meta.JavaSQLTypes;
import org.apache.openjpa.jdbc.sql.DBDictionary;
import org.apache.openjpa.jdbc.sql.Select;
import org.apache.openjpa.kernel.exps.AggregateListener;
@@ -34,7 +35,6 @@
import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.meta.ClassMetaData;
-import org.apache.openjpa.util.ImplHelper;
import org.apache.openjpa.util.UserException;
/**
@@ -48,12 +48,10 @@
implements ExpressionFactory {
private static final Val NULL = new Null();
- private static final Val CURRENT_DATE =
- new CurrentDate(CurrentDate.DATE);
- private static final Val CURRENT_TIME =
- new CurrentDate(CurrentDate.TIME);
+ private static final Val CURRENT_DATE = new CurrentDate(JavaSQLTypes.DATE);
+ private static final Val CURRENT_TIME = new CurrentDate(JavaSQLTypes.TIME);
private static final Val CURRENT_TIMESTAMP =
- new CurrentDate(CurrentDate.TIMESTAMP);
+ new CurrentDate(JavaSQLTypes.TIMESTAMP);
private static final Localizer _loc = Localizer.forPackage
(JDBCExpressionFactory.class);
@@ -69,56 +67,10 @@
}
/**
- * Evaluate the expression, returning a SQL select with the proper
- * conditions. Use {@link #select} to then select the data.
- * This method returns null if there is no query criteria. It is
- * synchronized because factories may be cached and used by multiple
- * queries at the same time.
+ * Use to create SQL select.
*/
- public synchronized Select evaluate(JDBCStoreQuery q,
- JDBCFetchConfiguration fetch, QueryExpressions exps, Object[] params) {
- // figure out proper cache level based on parameters
- int level = getCacheLevel(q, params);
- return _cons.evaluate(q.getStore(), null, null, exps, params,
- level, fetch);
- }
-
- /**
- * Return the cache level for this query. The level depends on whether
- * the query uses any params, as well as the types and values of those
- * params.
- */
- private int getCacheLevel(JDBCStoreQuery q, Object[] params) {
- // if there are no parameters, we can cache the full SQL
- if (params.length == 0)
- return SelectConstructor.CACHE_FULL;
-
- // if there is a null PC parameter, we have to cache differently
- // since it affects joins
- LinkedMap types = null;
- Class type;
- for (int i = 0; i < params.length; i++) {
- if (params[i] != null)
- continue;
-
- if (types == null)
- types = q.getContext().getParameterTypes();
-
- type = (Class) types.getValue(i);
- if (type != null && ImplHelper.isManagedType(type))
- return SelectConstructor.CACHE_NULL;
- }
- return SelectConstructor.CACHE_JOINS;
- }
-
- /**
- * Select the data for this query.
- */
- public void select(JDBCStoreQuery q, ClassMapping mapping,
- boolean subclasses, Select sel, QueryExpressions exps,
- Object[] params, JDBCFetchConfiguration fetch, int eager) {
- _cons.select(q.getStore(), mapping, subclasses, sel, exps,
- params, fetch, eager);
+ public SelectConstructor getSelectConstructor() {
+ return _cons;
}
public Expression emptyExpression() {