Same problem with StoreQuery.java... Kevin
On Wed, May 28, 2008 at 1:08 AM, <[EMAIL PROTECTED]> wrote: > Modified: > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StoreQuery.java > URL: > http://svn.apache.org/viewvc/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StoreQuery.java?rev=660825&r1=660824&r2=660825&view=diff > > ============================================================================== > --- > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StoreQuery.java > (original) > +++ > openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/StoreQuery.java > Tue May 27 23:08:41 2008 > @@ -1,322 +1,325 @@ > -/* > - * Licensed to the Apache Software Foundation (ASF) under one > - * or more contributor license agreements. See the NOTICE file > - * distributed with this work for additional information > - * regarding copyright ownership. The ASF licenses this file > - * to you under the Apache License, Version 2.0 (the > - * "License"); you may not use this file except in compliance > - * with the License. You may obtain a copy of the License at > - * > - * http://www.apache.org/licenses/LICENSE-2.0 > - * > - * Unless required by applicable law or agreed to in writing, > - * software distributed under the License is distributed on an > - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > - * KIND, either express or implied. See the License for the > - * specific language governing permissions and limitations > - * under the License. > - */ > -package org.apache.openjpa.kernel; > - > -import java.io.Serializable; > -import java.util.Iterator; > -import java.util.Map; > - > -import org.apache.commons.collections.map.LinkedMap; > -import org.apache.openjpa.kernel.exps.AggregateListener; > -import org.apache.openjpa.kernel.exps.Constant; > -import org.apache.openjpa.kernel.exps.FilterListener; > -import org.apache.openjpa.lib.rop.ResultObjectProvider; > -import org.apache.openjpa.meta.ClassMetaData; > -import org.apache.openjpa.meta.FieldMetaData; > - > -/** > - * Component that executes queries against the datastore. For > - * expression-based queries, consider subclassing > - * [EMAIL PROTECTED] ExpressionStoreManagerQuery}. > - * > - * @author Abe White > - * @since 0.4.0 > - */ > -public interface StoreQuery > - extends QueryOperations, Serializable { > - > - // linkedmap doesn't allow a size of 0, so use 1 > - public static final LinkedMap EMPTY_PARAMS = new LinkedMap(1, 1F); > - public static final ClassMetaData[] EMPTY_METAS = new > ClassMetaData[0]; > - public static final String[] EMPTY_STRINGS = new String[0]; > - public static final Object[] EMPTY_OBJECTS = new Object[0]; > - public static final Class[] EMPTY_CLASSES = new Class[0]; > - public static final boolean[] EMPTY_BOOLEANS = new boolean[0]; > - > - /** > - * Return the query context that has been set. > - */ > - public QueryContext getContext(); > - > - /** > - * Set the current query context. This will be called before use. > - */ > - public void setContext(QueryContext ctx); > - > - /** > - * This is invoked when the user or a facade creates a new query with > - * an object that the system does not recognize. Return true if > - * the object is recognized by the store, false otherwise. > - */ > - public boolean setQuery(Object query); > - > - /** > - * Return the standard filter listener for the given tag, or null. > - */ > - public FilterListener getFilterListener(String tag); > - > - /** > - * Return the standard filter listener for the given tag, or null. > - */ > - public AggregateListener getAggregateListener(String tag); > - > - /** > - * Create a new key for caching compiled query information. May be > null. > - */ > - public Object newCompilationKey(); > - > - /** > - * Create a new compilation for this query. May be null. > - */ > - public Object newCompilation(); > - > - /** > - * Populate internal data from compilation. > - */ > - public void populateFromCompilation(Object comp); > - > - /** > - * Invalidate any internal compilation state. > - */ > - public void invalidateCompilation(); > - > - /** > - * True if this query supports datastore execution, false if it > - * can only run in memory. > - */ > - public boolean supportsDataStoreExecution(); > - > - /** > - * True if this query supports in-memory execution, false if it > - * can only run against the datastore. > - */ > - public boolean supportsInMemoryExecution(); > - > - /** > - * Return an executor for in-memory execution of this query. > - * Executors must be cachable and thread safe. If this class returns > - * true from [EMAIL PROTECTED] #supportsAbstractExecutors}, the given > metadata > - * will always be for the candidate class of this query, or possibly > - * null if the candidate class is not itself persistence capable (like > - * an interface or abstract base class). Otherwise, the given type > will > - * be a mapped class. > - * > - * @param subs whether to include dependent mapped subclasses in the > - * results; independent subclasses should never be included > - */ > - public Executor newInMemoryExecutor(ClassMetaData meta, boolean subs); > - > - /** > - * Return an executor for datastore execution of this query. > - * Executors must be cachable and thread safe. If this class returns > - * true from [EMAIL PROTECTED] #supportsAbstractExecutors}, the given > metadata > - * will always be for the candidate class of this query, or possibly > - * null if the candidate class is not itself persistence capable (like > - * an interface or abstract base class). Otherwise, the given type > will > - * be a mapped class. > - * > - * @param subs whether to include dependent mapped subclasses in the > - * results; independent subclasses should never be included > - */ > - public Executor newDataStoreExecutor(ClassMetaData meta, boolean > subs); > - > - /** > - * Return true if this query supports execution against abstract or > - * interface types. Returns false by default, meaning we will only > - * request executors for persistent classes. In this case, we will > - * automatically combine the results of the executors for all > - * implementing classes if we execute a query for an interface for > - * abstract type. > - */ > - public boolean supportsAbstractExecutors(); > - > - /** > - * Whether this query requires a candidate class. > - */ > - public boolean requiresCandidateType(); > - > - /** > - * Whether this query requires parameters to be declared. > - */ > - public boolean requiresParameterDeclarations(); > - > - /** > - * Whether this query supports declared parameters. > - */ > - public boolean supportsParameterDeclarations(); > - > - /** > - * A query result range. > - */ > - public static class Range { > - public long start = 0L; > - public long end = Long.MAX_VALUE; > - public boolean lrs = false; > - > - public Range() { > - } > - > - public Range(long start, long end) { > - this.start = start; > - this.end = end; > - } > - } > - > - /** > - * An executor provides a uniform interface to the mechanism for > executing > - * either an in-memory or datastore query. In the common case, the > - * [EMAIL PROTECTED] #executeQuery} method will be called before other > methods, > - * though this is not guaranteed. > - * > - * @author Marc Prud'hommeaux > - */ > - public static interface Executor { > - > - /** > - * Return the result of executing this query with the given > parameter > - * values. If this query is a projection and this executor does > not > - * pack results itself, each element of the returned result object > - * provider should be an object array containing the projection > values. > - * > - * @param lrs true if the query result should be treated as a > - * large result set, assuming the query is not an > - * aggregate and does not have grouping > - * @see #isPacking > - */ > - public ResultObjectProvider executeQuery(StoreQuery q, Object[] > params, > - Range range); > - > - /** > - * Deleted the objects that result from the execution of the > - * query, retuning the number of objects that were deleted. > - */ > - public Number executeDelete(StoreQuery q, Object[] params); > - > - /** > - * Updates the objects that result from the execution of the > - * query, retuning the number of objects that were updated. > - */ > - public Number executeUpdate(StoreQuery q, Object[] params); > - > - /** > - * Return a description of the commands that will be sent to > - * the datastore in order to execute the query. > - */ > - public String[] getDataStoreActions(StoreQuery q, Object[] params, > - Range range); > - > - /** > - * Validate components of query. > - */ > - public void validate(StoreQuery q); > - > - /** > - * Mutate the given range to set any range information stored in > - * the query string and/or parameters. > - */ > - public void getRange(StoreQuery q, Object[] params, Range range); > - > - /** > - * Extract the value of the <code>orderIndex</code>th ordering > - * expression in [EMAIL PROTECTED] Query#getOrderingClauses} from the > - * given result object. The result object will be an object from > - * the result object provider returned from [EMAIL PROTECTED] > #executeQuery}. > - * This method is used when several result lists have to be merged > - * in memory. If this exeuctor's parent query supports executors > on > - * abstract or interface classes, this method will not be used. > - * > - * @see StoreQuery#supportsAbstractExecutors > - */ > - public Object getOrderingValue(StoreQuery q, Object[] params, > - Object resultObject, int orderIndex); > - > - /** > - * Return the ordering direction for all ordering clauses, or > empty > - * array if none. > - */ > - public boolean[] getAscending(StoreQuery q); > - > - /** > - * Return true if this executor packs projections into the result > - * class itself. Executors for query languages that allow > projections > - * without result clauses must return true and perform the result > - * packing themselves. > - */ > - public boolean isPacking(StoreQuery q); > - > - /** > - * If this is not a projection but the candidate results are > placed > - * into a result class with an alias, return that alias. > - */ > - public String getAlias(StoreQuery q); > - > - /** > - * Return the alias for each projection element, or empty array > - * if not a projection. > - */ > - public String[] getProjectionAliases(StoreQuery q); > - > - /** > - * Return the expected types of the projections used by this > query, > - * or an empty array if not a projection. > - */ > - public Class[] getProjectionTypes(StoreQuery q); > - > - /** > - * Return an array of all persistent classes used in this query, > or > - * empty array if unknown. > - */ > - public ClassMetaData[] getAccessPathMetaDatas(StoreQuery q); > - > - /** > - * Returns the operation this executor is meant to execute. > - * > - * @see QueryOperations > - */ > - public int getOperation(StoreQuery q); > - > - /** > - * Return true if the compiled query is an aggregate. > - */ > - public boolean isAggregate(StoreQuery q); > - > - /** > - * Whether the compiled query has grouping. > - */ > - public boolean hasGrouping(StoreQuery q); > - > - /** > - * Return a map of parameter names to types. The returned > - * [EMAIL PROTECTED] Map#entrySet}'s [EMAIL PROTECTED] Iterator} > must return values in > the > - * order in which they were declared or used. > - */ > - public LinkedMap getParameterTypes(StoreQuery q); > - > - /** > - * Returns the result class, if any. > - */ > - public Class getResultClass(StoreQuery q); > - > - /** > - * Return a map of [EMAIL PROTECTED] FieldMetaData} to update > - * [EMAIL PROTECTED] Constant}s, in cases where this query is > for a > bulk update. > - */ > - public Map getUpdates (StoreQuery q); > - } > -} > +/* > + * Licensed to the Apache Software Foundation (ASF) under one > + * or more contributor license agreements. See the NOTICE file > + * distributed with this work for additional information > + * regarding copyright ownership. The ASF licenses this file > + * to you under the Apache License, Version 2.0 (the > + * "License"); you may not use this file except in compliance > + * with the License. You may obtain a copy of the License at > + * > + * http://www.apache.org/licenses/LICENSE-2.0 > + * > + * Unless required by applicable law or agreed to in writing, > + * software distributed under the License is distributed on an > + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY > + * KIND, either express or implied. See the License for the > + * specific language governing permissions and limitations > + * under the License. > + */ > +package org.apache.openjpa.kernel; > + > +import java.io.Serializable; > +import java.util.Iterator; > +import java.util.Map; > + > +import org.apache.commons.collections.map.LinkedMap; > +import org.apache.openjpa.kernel.exps.AggregateListener; > +import org.apache.openjpa.kernel.exps.Constant; > +import org.apache.openjpa.kernel.exps.FilterListener; > +import org.apache.openjpa.lib.rop.ResultObjectProvider; > +import org.apache.openjpa.meta.ClassMetaData; > +import org.apache.openjpa.meta.FieldMetaData; > + > +/** > + * Component that executes queries against the datastore. For > + * expression-based queries, consider subclassing > + * [EMAIL PROTECTED] ExpressionStoreManagerQuery}. > + * > + * @author Abe White > + * @since 0.4.0 > + */ > +public interface StoreQuery > + extends QueryOperations, Serializable { > + > + // linkedmap doesn't allow a size of 0, so use 1 > + public static final LinkedMap EMPTY_PARAMS = new LinkedMap(1, 1F); > + public static final ClassMetaData[] EMPTY_METAS = new > ClassMetaData[0]; > + public static final String[] EMPTY_STRINGS = new String[0]; > + public static final Object[] EMPTY_OBJECTS = new Object[0]; > + public static final Class[] EMPTY_CLASSES = new Class[0]; > + public static final boolean[] EMPTY_BOOLEANS = new boolean[0]; > + > + /** > + * Return the query context that has been set. > + */ > + public QueryContext getContext(); > + > + /** > + * Set the current query context. This will be called before use. > + */ > + public void setContext(QueryContext ctx); > + > + /** > + * This is invoked when the user or a facade creates a new query with > + * an object that the system does not recognize. Return true if > + * the object is recognized by the store, false otherwise. > + */ > + public boolean setQuery(Object query); > + > + /** > + * Return the standard filter listener for the given tag, or null. > + */ > + public FilterListener getFilterListener(String tag); > + > + /** > + * Return the standard filter listener for the given tag, or null. > + */ > + public AggregateListener getAggregateListener(String tag); > + > + /** > + * Create a new key for caching compiled query information. May be > null. > + */ > + public Object newCompilationKey(); > + > + /** > + * Create a new compilation for this query. May be null. > + */ > + public Object newCompilation(); > + > + /** > + * Populate internal data from compilation. > + */ > + public void populateFromCompilation(Object comp); > + > + /** > + * Invalidate any internal compilation state. > + */ > + public void invalidateCompilation(); > + > + /** > + * True if this query supports datastore execution, false if it > + * can only run in memory. > + */ > + public boolean supportsDataStoreExecution(); > + > + /** > + * True if this query supports in-memory execution, false if it > + * can only run against the datastore. > + */ > + public boolean supportsInMemoryExecution(); > + > + /** > + * Return an executor for in-memory execution of this query. > + * Executors must be cachable and thread safe. If this class returns > + * true from [EMAIL PROTECTED] #supportsAbstractExecutors}, the given > metadata > + * will always be for the candidate class of this query, or possibly > + * null if the candidate class is not itself persistence capable (like > + * an interface or abstract base class). Otherwise, the given type > will > + * be a mapped class. > + * > + * @param subs whether to include dependent mapped subclasses in the > + * results; independent subclasses should never be included > + */ > + public Executor newInMemoryExecutor(ClassMetaData meta, boolean subs); > + > + /** > + * Return an executor for datastore execution of this query. > + * Executors must be cachable and thread safe. If this class returns > + * true from [EMAIL PROTECTED] #supportsAbstractExecutors}, the given > metadata > + * will always be for the candidate class of this query, or possibly > + * null if the candidate class is not itself persistence capable (like > + * an interface or abstract base class). Otherwise, the given type > will > + * be a mapped class. > + * > + * @param subs whether to include dependent mapped subclasses in the > + * results; independent subclasses should never be included > + */ > + public Executor newDataStoreExecutor(ClassMetaData meta, boolean > subs); > + > + /** > + * Return true if this query supports execution against abstract or > + * interface types. Returns false by default, meaning we will only > + * request executors for persistent classes. In this case, we will > + * automatically combine the results of the executors for all > + * implementing classes if we execute a query for an interface for > + * abstract type. > + */ > + public boolean supportsAbstractExecutors(); > + > + /** > + * Whether this query requires a candidate class. > + */ > + public boolean requiresCandidateType(); > + > + /** > + * Whether this query requires parameters to be declared. > + */ > + public boolean requiresParameterDeclarations(); > + > + /** > + * Whether this query supports declared parameters. > + */ > + public boolean supportsParameterDeclarations(); > + > + public Object evaluate(Object value, Object ob, Object[] params, > + OpenJPAStateManager sm); > + > + /** > + * A query result range. > + */ > + public static class Range { > + public long start = 0L; > + public long end = Long.MAX_VALUE; > + public boolean lrs = false; > + > + public Range() { > + } > + > + public Range(long start, long end) { > + this.start = start; > + this.end = end; > + } > + } > + > + /** > + * An executor provides a uniform interface to the mechanism for > executing > + * either an in-memory or datastore query. In the common case, the > + * [EMAIL PROTECTED] #executeQuery} method will be called before other > methods, > + * though this is not guaranteed. > + * > + * @author Marc Prud'hommeaux > + */ > + public static interface Executor { > + > + /** > + * Return the result of executing this query with the given > parameter > + * values. If this query is a projection and this executor does > not > + * pack results itself, each element of the returned result object > + * provider should be an object array containing the projection > values. > + * > + * @param lrs true if the query result should be treated as a > + * large result set, assuming the query is not an > + * aggregate and does not have grouping > + * @see #isPacking > + */ > + public ResultObjectProvider executeQuery(StoreQuery q, Object[] > params, > + Range range); > + > + /** > + * Deleted the objects that result from the execution of the > + * query, retuning the number of objects that were deleted. > + */ > + public Number executeDelete(StoreQuery q, Object[] params); > + > + /** > + * Updates the objects that result from the execution of the > + * query, retuning the number of objects that were updated. > + */ > + public Number executeUpdate(StoreQuery q, Object[] params); > + > + /** > + * Return a description of the commands that will be sent to > + * the datastore in order to execute the query. > + */ > + public String[] getDataStoreActions(StoreQuery q, Object[] params, > + Range range); > + > + /** > + * Validate components of query. > + */ > + public void validate(StoreQuery q); > + > + /** > + * Mutate the given range to set any range information stored in > + * the query string and/or parameters. > + */ > + public void getRange(StoreQuery q, Object[] params, Range range); > + > + /** > + * Extract the value of the <code>orderIndex</code>th ordering > + * expression in [EMAIL PROTECTED] Query#getOrderingClauses} from the > + * given result object. The result object will be an object from > + * the result object provider returned from [EMAIL PROTECTED] > #executeQuery}. > + * This method is used when several result lists have to be merged > + * in memory. If this exeuctor's parent query supports executors > on > + * abstract or interface classes, this method will not be used. > + * > + * @see StoreQuery#supportsAbstractExecutors > + */ > + public Object getOrderingValue(StoreQuery q, Object[] params, > + Object resultObject, int orderIndex); > + > + /** > + * Return the ordering direction for all ordering clauses, or > empty > + * array if none. > + */ > + public boolean[] getAscending(StoreQuery q); > + > + /** > + * Return true if this executor packs projections into the result > + * class itself. Executors for query languages that allow > projections > + * without result clauses must return true and perform the result > + * packing themselves. > + */ > + public boolean isPacking(StoreQuery q); > + > + /** > + * If this is not a projection but the candidate results are > placed > + * into a result class with an alias, return that alias. > + */ > + public String getAlias(StoreQuery q); > + > + /** > + * Return the alias for each projection element, or empty array > + * if not a projection. > + */ > + public String[] getProjectionAliases(StoreQuery q); > + > + /** > + * Return the expected types of the projections used by this > query, > + * or an empty array if not a projection. > + */ > + public Class[] getProjectionTypes(StoreQuery q); > + > + /** > + * Return an array of all persistent classes used in this query, > or > + * empty array if unknown. > + */ > + public ClassMetaData[] getAccessPathMetaDatas(StoreQuery q); > + > + /** > + * Returns the operation this executor is meant to execute. > + * > + * @see QueryOperations > + */ > + public int getOperation(StoreQuery q); > + > + /** > + * Return true if the compiled query is an aggregate. > + */ > + public boolean isAggregate(StoreQuery q); > + > + /** > + * Whether the compiled query has grouping. > + */ > + public boolean hasGrouping(StoreQuery q); > + > + /** > + * Return a map of parameter names to types. The returned > + * [EMAIL PROTECTED] Map#entrySet}'s [EMAIL PROTECTED] Iterator} > must return values in > the > + * order in which they were declared or used. > + */ > + public LinkedMap getParameterTypes(StoreQuery q); > + > + /** > + * Returns the result class, if any. > + */ > + public Class getResultClass(StoreQuery q); > + > + /** > + * Return a map of [EMAIL PROTECTED] FieldMetaData} to update > + * [EMAIL PROTECTED] Constant}s, in cases where this query is > for a > bulk update. > + */ > + public Map getUpdates (StoreQuery q); > + } > +} > > >
