You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@openjpa.apache.org by Kevin Sutter <kw...@gmail.com> on 2008/05/28 19:10:56 UTC

Re: svn commit: r660825 [2/2] - in /openjpa/trunk: openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/ openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/ openjpa-kernel/src/main/java/org/apache/openjpa/datacache/ openjpa-kernel/sr

Same problem with StoreQuery.java...

Kevin

On Wed, May 28, 2008 at 1:08 AM, <fa...@apache.org> 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
> - * {@link 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 {@link #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 {@link #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
> -     * {@link #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 {@link Query#getOrderingClauses} from the
> -         * given result object. The result object will be an object from
> -         * the result object provider returned from {@link #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
> -         * {@link Map#entrySet}'s {@link 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 {@link FieldMetaData} to update
> -                * {@link 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
> + * {@link 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 {@link #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 {@link #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
> +     * {@link #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 {@link Query#getOrderingClauses} from the
> +         * given result object. The result object will be an object from
> +         * the result object provider returned from {@link #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
> +         * {@link Map#entrySet}'s {@link 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 {@link FieldMetaData} to update
> +                * {@link Constant}s, in cases where this query is for a
> bulk update.
> +                */
> +               public Map getUpdates (StoreQuery q);
> +       }
> +}
>
>
>