You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2008/08/19 20:40:37 UTC
svn commit: r687120 [2/2] - in /openjpa/branches/1.2.x:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/
openjpa-jdbc/src/main/resources/org/apache/openjpa/jdbc/kernel/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/ openjpa-kernel/sr...
Modified: openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java?rev=687120&r1=687119&r2=687120&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java (original)
+++ openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java Tue Aug 19 11:40:34 2008
@@ -20,10 +20,7 @@
import java.io.Serializable;
import java.lang.reflect.Method;
-import java.sql.Time;
-import java.sql.Timestamp;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Calendar;
import java.util.Collection;
import java.util.Collections;
@@ -33,8 +30,6 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.TreeMap;
-
import javax.persistence.FlushModeType;
import javax.persistence.Query;
import javax.persistence.TemporalType;
@@ -72,17 +67,18 @@
private transient EntityManagerImpl _em;
private transient FetchPlan _fetch;
- private Map<String, Object> _named;
- private Map<Integer, Object> _positional;
-
- private static Object GAP_FILLER = new Object();
+ private Map _named;
+ private List _positional;
/**
* Constructor; supply factory exception translator and delegate.
*
- * @param em The EntityManager which created this query
- * @param ret Exception translater for this query
- * @param query The underlying "kernel" query.
+ * @param em
+ * The EntityManager which created this query
+ * @param ret
+ * Exception translater for this query
+ * @param query
+ * The underlying "kernel" query.
*/
public QueryImpl(EntityManagerImpl em, RuntimeExceptionTranslator ret,
org.apache.openjpa.kernel.Query query) {
@@ -250,179 +246,47 @@
validateParameters();
- // handle which types of parameters we are using, if any
- if (_positional != null)
- return _query.execute(_positional);
- if (_named != null)
- return _query.execute(_named);
- return _query.execute();
- }
-
- /**
- * Validate that the types of the parameters are correct.
- * The idea is to catch as many validation error as possible at the facade
- * layer itself.
- * For native SQL queries, however, parameter validation is bypassed as
- * we do not parse SQL.
- *
- * The expected parameters are parsed from the query and in a LinkedMap
- * key : name of the parameter as declared in query
- * value : expected Class of allowed value
- *
- * The bound parameters depends on positional or named parameter style
- *
- * TreeMap<Integer, Object> for positional parameters:
- * key : 1-based Integer index
- * value : bound value. GAP_FILLER if the position is not set. This
- * simplifies validation at the kernel layer
- *
- * Map<String, Object> for named parameters:
- * key : parameter name
- * value : the bound value
- *
- * Validation accounts for
- * a) gaps in positional parameters
- * SELECT p FROM PObject p WHERE p.a1=?1 AND p.a3=?3
- *
- * b) repeated parameters
- * SELECT p FROM PObject p WHERE p.a1=?1 AND p.a2=?1 AND p.a3=?2
- *
- * c) parameter is bound but not declared
- *
- * d) parameter is declared but not bound
- *
- * e) parameter does not match the value type
- *
- * f) parameter is primitive type but bound to null value
- */
- private void validateParameters() {
- if (isNative()) {
- removeGaps(_positional);
- return;
- }
- String query = getQueryString();
- if (_positional != null) {
- LinkedMap expected = _query.getParameterTypes();
- Map<Integer, Object> actual = _positional;
- for (Object o : expected.keySet()) {
- String position = (String) o;
- Class expectedParamType = (Class) expected.get(position);
- try {
- Integer.parseInt(position);
- } catch (NumberFormatException ex) {
- newValidationException("param-style-mismatch", query,
- expected.asList(),
- Arrays.toString(actual.keySet().toArray()));
- }
- Object actualValue = actual.get(Integer.parseInt(position));
- boolean valueUnspecified = (actualValue == GAP_FILLER)
- || (actualValue == null && (actual.size() < expected
- .size()));
- if (valueUnspecified)
- newValidationException("param-missing", position, query,
- Arrays.toString(actual.keySet().toArray()));
-
- if (expectedParamType.isPrimitive() && actualValue == null)
- newValidationException("param-type-null",
- position, query, expectedParamType.getName());
- if (actualValue != null &&
- !Filters.wrap(expectedParamType).isInstance(actualValue))
- newValidationException("param-type-mismatch",
- position, query, actualValue,
- actualValue.getClass().getName(),
- expectedParamType.getName());
-
- }
- for (Integer position : actual.keySet()) {
- Object actualValue = actual.get(position);
- Class expectedParamType = (Class) expected.get("" + position);
- boolean paramExpected = expected.containsKey("" + position);
- if (actualValue == GAP_FILLER) {
- if (paramExpected) {
- newValidationException("param-missing", position, query,
- Arrays.toString(actual.keySet().toArray()));
- }
- } else {
- if (!paramExpected)
- newValidationException("param-extra", position, query,
- expected.asList());
- if (expectedParamType.isPrimitive() && actualValue == null)
- newValidationException("param-type-null",
- position, query, expectedParamType.getName());
- if (actualValue != null
- && !Filters.wrap(expectedParamType).isInstance(actualValue))
- newValidationException("param-type-mismatch",
- position, query, actualValue,
- actualValue.getClass().getName(),
- expectedParamType.getName());
-
- }
- }
-
- } else if (_named != null) {
- LinkedMap expected = _query.getParameterTypes();
- // key : name of the parameter used while binding
- // value : user supplied parameter value. null may mean either
- // user has supplied a value or not specified at all
- Map<String, Object> actual = _named;
- for (Object o : expected.keySet()) {
- String expectedName = (String) o;
- Class expectedParamType = (Class) expected.get(expectedName);
- Object actualValue = actual.get(expectedName);
- boolean valueUnspecified = !actual.containsKey(expectedName);
- if (valueUnspecified) {
- newValidationException("param-missing", expectedName, query,
- Arrays.toString(actual.keySet().toArray()));
- }
- if (expectedParamType.isPrimitive() && actualValue == null)
- newValidationException("param-type-null",
- expectedName, query, expectedParamType.getName());
- if (actualValue != null
- && !Filters.wrap(expectedParamType).isInstance(actualValue)) {
- newValidationException("param-type-mismatch",
- expectedName, query, actualValue,
- actualValue.getClass().getName(),
- expectedParamType.getName());
- }
- }
- for (String actualName : actual.keySet()) {
- Object actualValue = actual.get(actualName);
- Class expectedParamType = (Class) expected.get(actualName);
- boolean paramExpected = expected.containsKey(actualName);
- if (!paramExpected) {
- newValidationException("param-extra", actualName, query,
- expected.asList());
- }
- if (expectedParamType.isPrimitive() && actualValue == null)
- newValidationException("param-type-null",
- actualName, query, expectedParamType.getName());
- if (actualValue != null
- && !Filters.wrap(expectedParamType).isInstance(actualValue)) {
- newValidationException("param-type-mismatch",
- actualName, query, actualValue,
- actualValue.getClass().getName(),
- expectedParamType.getName());
- }
- }
- }
- }
-
- Map<Integer, Object> removeGaps(Map<Integer, Object> map) {
- if (map == null || !map.containsValue(GAP_FILLER))
- return map;
- List<Integer> gaps = new ArrayList<Integer>();
- for (Integer key : map.keySet())
- if (map.get(key) == GAP_FILLER)
- gaps.add(key);
- for (Integer gap : gaps) {
- map.remove(gap);
- }
- return map;
- }
+ // handle which types of parameters we are using, if any
+ if (_positional != null)
+ return _query.execute(_positional.toArray());
+ if (_named != null)
+ return _query.execute(_named);
+ return _query.execute();
+ }
- void newValidationException(String msgKey, Object...args) {
- throw new ArgumentException(_loc.get(msgKey, args), null, null, false);
- }
+ /**
+ * Validate that the types of the parameters are correct.
+ */
+ private void validateParameters() {
+ if (_positional != null) {
+ LinkedMap types = _query.getParameterTypes();
+ for (int i = 0,
+ size = Math.min(_positional.size(), types.size());
+ i < size; i++)
+ validateParameter(String.valueOf(i),
+ (Class) types.getValue(i), _positional.get(i));
+ } else if (_named != null) {
+ Map types = _query.getParameterTypes();
+ for (Iterator i = _named.entrySet().iterator(); i.hasNext();) {
+ Map.Entry entry = (Map.Entry) i.next();
+ String name = (String) entry.getKey();
+ validateParameter(name, (Class) types.get(name),
+ entry.getValue());
+ }
+ }
+ }
+
+ private void validateParameter(String paramDesc, Class type, Object param) {
+ // null parameters are allowed, so are not validated
+ if (param == null || type == null)
+ return;
+
+ // check the parameter against the wrapped type
+ if (!Filters.wrap(type).isInstance(param))
+ throw new ArgumentException(_loc.get("bad-param-type",
+ paramDesc, param.getClass().getName(), type.getName()),
+ null, null, false);
+ }
public List getResultList() {
_em.assertNotCloseInvoked();
@@ -460,7 +324,7 @@
if (_query.getOperation() == QueryOperations.OP_DELETE) {
// handle which types of parameters we are using, if any
if (_positional != null)
- return asInt(_query.deleteAll(_positional));
+ return asInt(_query.deleteAll(_positional.toArray()));
if (_named != null)
return asInt(_query.deleteAll(_named));
return asInt(_query.deleteAll());
@@ -468,7 +332,7 @@
if (_query.getOperation() == QueryOperations.OP_UPDATE) {
// handle which types of parameters we are using, if any
if (_positional != null)
- return asInt(_query.updateAll(_positional));
+ return asInt(_query.updateAll(_positional.toArray()));
if (_named != null)
return asInt(_query.updateAll(_named));
return asInt(_query.updateAll());
@@ -569,76 +433,57 @@
public OpenJPAQuery setParameter(int position, Calendar value,
TemporalType t) {
- return setParameter(position, convertTemporalType(value, t));
+ return setParameter(position, value);
}
public OpenJPAQuery setParameter(int position, Date value,
TemporalType type) {
- return setParameter(position, convertTemporalType(value, type));
+ return setParameter(position, value);
}
- /**
- * Converts the given Date to a value corresponding to given temporal type.
- */
- Object convertTemporalType(Date value, TemporalType type) {
- switch (type) {
- case DATE:
- return value;
- case TIME:
- return new Time(value.getTime());
- case TIMESTAMP:
- return new Timestamp(value.getTime());
- default:
- return null;
- }
- }
-
- Object convertTemporalType(Calendar value, TemporalType type) {
- return convertTemporalType(value.getTime(), type);
- }
-
public OpenJPAQuery setParameter(int position, Object value) {
- _query.assertOpen();
- _em.assertNotCloseInvoked();
- _query.lock();
- try {
- if (isNative() && position < 1) {
- throw new IllegalArgumentException(_loc.get("bad-pos-params",
- position, _query.getQueryString()).toString());
- }
- // not allowed to mix positional and named parameters (EDR2 3.6.4)
- if (_named != null)
- throw new InvalidStateException(_loc.get(
- "no-pos-named-params-mix", _query.getQueryString()),
- null, null, false);
-
- if (position < 1)
- throw new InvalidStateException(_loc.get("illegal-index",
- position), null, null, false);
-
- if (_positional == null)
- _positional = new TreeMap<Integer, Object>();
-
- _positional.put(position, value);
- for (int i = 1; i < position; i++)
- if (!_positional.containsKey(i))
- _positional.put(i, GAP_FILLER);
-
- return this;
- } finally {
- _query.unlock();
- }
- }
+ _query.assertOpen();
+ _em.assertNotCloseInvoked();
+ _query.lock();
+ try {
+ if (isNative() && position < 1) {
+ throw new IllegalArgumentException(_loc.get("bad-pos-params",
+ position, _query.getQueryString()).toString());
+ }
+ // not allowed to mix positional and named parameters (EDR2 3.6.4)
+ if (_named != null)
+ throw new InvalidStateException(_loc.get
+ ("no-pos-named-params-mix", _query.getQueryString()),
+ null, null, false);
+
+ if (position < 1)
+ throw new InvalidStateException(_loc.get
+ ("illegal-index", position), null, null, false);
+ if (_positional == null)
+ _positional = new ArrayList();
+
+ // make sure it is at least the requested size
+ while (_positional.size() < position)
+ _positional.add(null);
+
+ // note that we add it to position - 1, since setPosition
+ // starts at 1, while List starts at 0
+ _positional.set(position - 1, value);
+ return this;
+ } finally {
+ _query.unlock();
+ }
+ }
public OpenJPAQuery setParameter(String name, Calendar value,
TemporalType t) {
- return setParameter(name, convertTemporalType(value, t));
+ return setParameter(name, value);
}
public OpenJPAQuery setParameter(String name, Date value,
TemporalType type) {
- return setParameter(name, convertTemporalType(value, type));
+ return setParameter(name, value);
}
public OpenJPAQuery setParameter(String name, Object value) {
@@ -673,21 +518,14 @@
return _positional != null;
}
- /**
- * Gets the array of positional parameter values. A value of
- * <code>GAP_FILLER</code> indicates that user has not set the
- * corresponding positional parameter. A value of null implies that user has
- * set the value as null.
- */
- public Object[] getPositionalParameters() {
- _query.lock();
- try {
- return (_positional == null) ? EMPTY_ARRAY : _positional.values()
- .toArray();
- } finally {
- _query.unlock();
- }
- }
+ public Object[] getPositionalParameters() {
+ _query.lock();
+ try {
+ return (_positional == null) ? EMPTY_ARRAY : _positional.toArray();
+ } finally {
+ _query.unlock();
+ }
+ }
public OpenJPAQuery setParameters(Object... params) {
_query.assertOpen();
Modified: openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=687120&r1=687119&r2=687120&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (original)
+++ openjpa/branches/1.2.x/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java Tue Aug 19 11:40:34 2008
@@ -1391,15 +1391,9 @@
if (log.isTraceEnabled())
log.trace(_loc.get("parse-query", name));
- QueryMetaData meta = getRepository().searchQueryMetaDataByName(name);
- if (meta != null) {
- Class defType = meta.getDefiningType();
- if ((defType != _cls) && log.isWarnEnabled()) {
- log.warn(_loc.get("dup-query", name, currentLocation(), defType));
- }
- pushElement(meta);
- return true;
- }
+ QueryMetaData meta = getRepository().getCachedQueryMetaData(null, name);
+ if (meta != null && log.isWarnEnabled())
+ log.warn(_loc.get("override-query", name, currentLocation()));
meta = getRepository().addQueryMetaData(null, name);
meta.setDefiningType(_cls);
Modified: openjpa/branches/1.2.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties?rev=687120&r1=687119&r2=687120&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties (original)
+++ openjpa/branches/1.2.x/openjpa-persistence/src/main/resources/org/apache/openjpa/persistence/localizer.properties Tue Aug 19 11:40:34 2008
@@ -34,8 +34,7 @@
dup-sequence: Found duplicate generator "{0}" in "{1}". Ignoring.
override-sequence: Found duplicate generator "{0}" in "{1}". Overriding \
previous definition.
-dup-query: Ignoring duplicate query "{0}" in "{1}". A query with the same name \
- been already declared in "{2}".
+dup-query: Found duplicate query "{0}" in "{1}". Ignoring.
override-query: Found duplicate query "{0}" in "{1}". Overriding previous \
definition.
no-seq-name: The sequence generator in "{0}" must declare a name.
@@ -149,13 +148,4 @@
EntityManagerFactory-displayorder: 50
EntityManagerFactory-expert: true
EntityManagerFactory-interface: org.apache.openjpa.persistence.EntityManagerFactoryImpl
-param-style-mismatch: Query "{0}" is declared with named parameters "{1}" but \
- actual parameters "{2}" are bound by position.
-param-missing: Parameter "{0}" declared in "{1}" but is missing from the bound \
- parameters "{2}".
-param-extra: Parameter "{0}" is bound to "{1}" but is missing from the \
- declared parameters "{2}".
-param-type-mismatch: Parameter "{0}" declared in "{1}" is set to value of \
- "{2}" of type "{3}", but this parameter is bound to a field of type "{4}".
-param-type-null: Parameter "{0}" declared in "{1}" is set to null, \
- but this parameter is bound to a field of primitive type "{2}".
+
Modified: openjpa/branches/1.2.x/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreManager.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreManager.java?rev=687120&r1=687119&r2=687120&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreManager.java (original)
+++ openjpa/branches/1.2.x/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreManager.java Tue Aug 19 11:40:34 2008
@@ -102,10 +102,6 @@
public DistributedJDBCConfiguration getConfiguration() {
return _conf;
}
-
- public SliceStoreManager getSlice(int i) {
- return _slices.get(i);
- }
/**
* Decides the index of the StoreManager by first looking at the
Modified: openjpa/branches/1.2.x/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java
URL: http://svn.apache.org/viewvc/openjpa/branches/1.2.x/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java?rev=687120&r1=687119&r2=687120&view=diff
==============================================================================
--- openjpa/branches/1.2.x/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java (original)
+++ openjpa/branches/1.2.x/openjpa-slice/src/main/java/org/apache/openjpa/slice/jdbc/DistributedStoreQuery.java Tue Aug 19 11:40:34 2008
@@ -32,7 +32,6 @@
import org.apache.openjpa.kernel.FetchConfiguration;
import org.apache.openjpa.kernel.OrderingMergedResultObjectProvider;
import org.apache.openjpa.kernel.QueryContext;
-import org.apache.openjpa.kernel.StoreManager;
import org.apache.openjpa.kernel.StoreQuery;
import org.apache.openjpa.kernel.exps.ExpressionParser;
import org.apache.openjpa.lib.rop.MergedResultObjectProvider;
@@ -62,15 +61,17 @@
_queries.add(q);
}
- public DistributedStoreManager getDistributedStore() {
- return (DistributedStoreManager)getStore();
- }
-
public Executor newDataStoreExecutor(ClassMetaData meta, boolean subs) {
ParallelExecutor ex = new ParallelExecutor(this, meta, subs, _parser,
ctx.getCompilation());
- for (StoreQuery q : _queries) {
- ex.addExecutor(q.newDataStoreExecutor(meta, subs));
+
+ FetchConfiguration fetch = getContext().getFetchConfiguration();
+ DistributedStoreManager store = (DistributedStoreManager)getContext()
+ .getStoreContext().getStoreManager().getInnermostDelegate();
+ List<SliceStoreManager> targets = store.getTargets(fetch);
+ for (StoreQuery q:_queries) {
+ if (targets.contains(((JDBCStoreQuery)q).getStore()))
+ ex.addExecutor(q.newDataStoreExecutor(meta, subs));
}
return ex;
}
@@ -116,23 +117,19 @@
*/
public ResultObjectProvider executeQuery(StoreQuery q,
final Object[] params, final Range range) {
+ ResultObjectProvider[] tmp = new ResultObjectProvider[executors.size()];
+ final Iterator<StoreQuery> qs = owner._queries.iterator();
final List<Future<ResultObjectProvider>> futures =
new ArrayList<Future<ResultObjectProvider>>();
- List<SliceStoreManager> targets = findTargets();
- for (int i = 0; i < owner._queries.size(); i++) {
- StoreQuery query = owner._queries.get(i);
- StoreManager sm = owner.getDistributedStore().getSlice(i);
- if (!targets.contains(sm))
- continue;
+ int i = 0;
+ for (Executor ex:executors) {
QueryExecutor call = new QueryExecutor();
- call.executor = executors.get(i);
- call.query = query;
+ call.executor = ex;
+ call.query = qs.next();
call.params = params;
call.range = range;
futures.add(threadPool.submit(call));
}
- int i = 0;
- ResultObjectProvider[] tmp = new ResultObjectProvider[futures.size()];
for (Future<ResultObjectProvider> future:futures) {
try {
tmp[i++] = future.get();
@@ -213,11 +210,6 @@
}
return new Integer(N);
}
-
- List<SliceStoreManager> findTargets() {
- FetchConfiguration fetch = owner.getContext().getFetchConfiguration();
- return owner.getDistributedStore().getTargets(fetch);
- }
}