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 2009/06/10 02:41:38 UTC
svn commit: r783166 [3/3] - in /openjpa/trunk:
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/exps/
openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/schema/
openjpa-kernel/src/main/java/org/apache/openjpa/kernel/exps/
openjpa-kernel/src/ma...
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TransactionHistory_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TransactionHistory_.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TransactionHistory_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TransactionHistory_.java Wed Jun 10 00:41:35 2009
@@ -1,22 +1,3 @@
-/*
- * 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.
- */
-
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
@@ -26,8 +7,8 @@
import java.sql.Timestamp;
import javax.persistence.metamodel.Attribute;
-@javax.persistence.metamodel.TypesafeMetamodel(
- value=org.apache.openjpa.persistence.criteria.TransactionHistory.class)
+@javax.persistence.metamodel.TypesafeMetamodel
+(value=org.apache.openjpa.persistence.criteria.TransactionHistory.class)
public class TransactionHistory_ {
public static volatile Attribute<TransactionHistory,String> details;
public static volatile Attribute<TransactionHistory,Integer> id;
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Transaction_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Transaction_.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Transaction_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Transaction_.java Wed Jun 10 00:41:35 2009
@@ -1,22 +1,3 @@
-/*
- * 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.
- */
-
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
@@ -24,7 +5,7 @@
package org.apache.openjpa.persistence.criteria;
-@javax.persistence.metamodel.TypesafeMetamodel(
- value=org.apache.openjpa.persistence.criteria.Transaction.class)
+@javax.persistence.metamodel.TypesafeMetamodel
+(value=org.apache.openjpa.persistence.criteria.Transaction.class)
public class Transaction_ {
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/VideoStore_.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/VideoStore_.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/VideoStore_.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/VideoStore_.java Wed Jun 10 00:41:35 2009
@@ -1,22 +1,3 @@
-/*
- * 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.
- */
-
/**
* Generated by OpenJPA MetaModel Generator Tool.
**/
@@ -26,8 +7,8 @@
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Map;
-@javax.persistence.metamodel.TypesafeMetamodel(
- value=org.apache.openjpa.persistence.criteria.VideoStore.class)
+@javax.persistence.metamodel.TypesafeMetamodel
+(value=org.apache.openjpa.persistence.criteria.VideoStore.class)
public class VideoStore_ {
public static volatile Attribute<VideoStore,Integer> id;
public static volatile Attribute<VideoStore,Address> location;
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/TestMetamodel.java Wed Jun 10 00:41:35 2009
@@ -161,7 +161,7 @@
assertEquals(CollectionType.COLLECTION, relColl.getCollectionType());
assertEquals(e0, relColl.getDeclaringType());
assertEquals(r1, relColl.getElementType());
- assertEquals(java.util.Collection.class, relColl.getMemberJavaType());
+ assertEquals(ExplicitFieldAccess.class, relColl.getMemberJavaType());
assertEquals(BindableType.COLLECTION, relColl.getBindableType());
assertEquals(Multiplicity.ONE_TO_MANY, relColl.getMultiplicity());
}
@@ -175,7 +175,7 @@
assertEquals(CollectionType.LIST, relList.getCollectionType());
assertEquals(e0, relList.getDeclaringType());
assertEquals(r1, relList.getElementType());
- assertEquals(java.util.List.class, relList.getMemberJavaType());
+ assertEquals(ExplicitFieldAccess.class, relList.getMemberJavaType());
assertEquals(BindableType.COLLECTION, relList.getBindableType());
assertEquals(Multiplicity.ONE_TO_MANY, relList.getMultiplicity());
}
@@ -189,7 +189,7 @@
assertEquals(CollectionType.SET, relSet.getCollectionType());
assertEquals(e0, relSet.getDeclaringType());
assertEquals(r1, relSet.getElementType());
- assertEquals(java.util.Set.class, relSet.getMemberJavaType());
+ assertEquals(ExplicitFieldAccess.class, relSet.getMemberJavaType());
assertEquals(BindableType.COLLECTION, relSet.getBindableType());
assertEquals(Multiplicity.ONE_TO_MANY, relSet.getMultiplicity());
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/AnnotationPersistenceMetaDataParser.java Wed Jun 10 00:41:35 2009
@@ -548,8 +548,10 @@
Entity entity = _cls.getAnnotation(Entity.class);
MappedSuperclass mapped = _cls.getAnnotation(MappedSuperclass.class);
+ Embeddable embeddable = _cls.getAnnotation(Embeddable.class);
if (isMetaDataMode()) {
meta.setAbstract(mapped != null);
+ if (embeddable != null) meta.setEmbeddable();
// while the spec only provides for embedded exclusive, it doesn't
// seem hard to support otherwise
if (entity == null)
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/ResultItemImpl.java Wed Jun 10 00:41:35 2009
@@ -30,14 +30,12 @@
public class ResultItemImpl<X> implements ResultItem<X> {
protected String _alias;
protected Class<X> _cls;
- static int i = 0;
+
protected ResultItemImpl(Class<X> cls) {
_cls = cls;
}
public String getAlias() {
- if (_alias == null)
- _alias = "c"+ i++;
return _alias;
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/XMLPersistenceMetaDataParser.java Wed Jun 10 00:41:35 2009
@@ -881,6 +881,7 @@
meta.setEmbeddedOnly(mappedSuper || embeddable);
if (embeddable) {
+ meta.setEmbeddable();
addDeferredEmbeddableMetaData(_cls, access);
}
}
Added: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java?rev=783166&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java (added)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java Wed Jun 10 00:41:35 2009
@@ -0,0 +1,67 @@
+/*
+ * 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.persistence.criteria;
+
+import javax.persistence.criteria.Selection;
+
+import org.apache.openjpa.kernel.exps.Value;
+
+/**
+ * The context holds named variables for nodes of CriteriaQuery.
+ * Creates unique alias for the nodes.
+ *
+ * @author Pinaki Poddar
+ *
+ */
+public interface AliasContext {
+ /**
+ * Gets the alias for the given node.
+ * If no alias is set on the given node then create an alias, assign it to
+ * the node.
+ */
+ String getAlias(Selection<?> node);
+
+ /**
+ * Register the given variable of corresponding given value against the
+ * given node.
+ *
+ * @param node of query tree
+ * @param variable must be a variable
+ * @param value path value
+ */
+ void registerVariable(Selection<?> node, Value variable, Value path);
+
+ /**
+ * Affirms if the given node has been registered.
+ */
+ boolean isRegistered(Selection<?> node);
+
+ /**
+ * Gets the registered variable for the given node.
+ * Return null if the node is not registered.
+ */
+ Value getVariable(Selection<?> node);
+
+ /**
+ * Gets the registered path value for the given node.
+ * Return null if the node is not registered.
+ */
+ Value getValue(Selection<?> node);
+
+}
Propchange: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java
------------------------------------------------------------------------------
svn:eol-style = native
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java Wed Jun 10 00:41:35 2009
@@ -390,7 +390,6 @@
public Expression<Integer> locate(Expression<String> x,
Expression<String> pattern) {
return new Expressions.Locate(x, pattern);
-
}
public Expression<Integer> locate(Expression<String> x, String pattern) {
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpressionBuilder.java Wed Jun 10 00:41:35 2009
@@ -20,6 +20,7 @@
package org.apache.openjpa.persistence.criteria;
import java.util.ArrayList;
+import java.util.HashSet;
import java.util.List;
import java.util.Set;
@@ -28,6 +29,7 @@
import javax.persistence.criteria.Order;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.Selection;
+import javax.persistence.metamodel.Entity;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.QueryExpressions;
@@ -37,19 +39,14 @@
import org.apache.openjpa.persistence.meta.Types;
/**
- * Subquery is an expression as its selection item.
+ * Converts expressions of a CriteriaQuery to kernel Expression.
+ *
+ * @author Fay Wang
*
*/
public class CriteriaExpressionBuilder {
-
private int aliasCount = 0;
- private CriteriaQueryImpl criteriaQuery = null;
-
- public CriteriaExpressionBuilder(CriteriaQueryImpl criteriaQuery) {
- this.criteriaQuery = criteriaQuery;
- }
-
public QueryExpressions getQueryExpressions(ExpressionFactory factory,
CriteriaQueryImpl q) {
QueryExpressions exps = new QueryExpressions();
@@ -79,13 +76,22 @@
protected void evalAccessPaths(QueryExpressions exps,
ExpressionFactory factory, CriteriaQueryImpl q) {
+ Set<ClassMetaData> metas = new HashSet<ClassMetaData>();
Set<Root<?>> roots = q.getRoots();
if (roots != null) {
- exps.accessPath = new ClassMetaData[roots.size()];
- int i = 0;
- for (Root<?> r : roots)
- exps.accessPath[i++] = ((Types.Managed<?>)r.getModel()).meta;
+ for (Root<?> root : roots) {
+
+ metas.add(((Types.Managed<?>)root.getModel()).meta);
+ if (root.getJoins() != null) {
+ for (Join<?,?> join : root.getJoins()) {
+ Class<?> cls = join.getMember().getMemberJavaType();
+ Entity<?> entity = q.getMetamodel().entity(cls);
+ metas.add(((Types.Managed<?>)entity).meta);
+ }
+ }
+ }
}
+ exps.accessPath = metas.toArray(new ClassMetaData[metas.size()]);
}
protected void evalOrdering(QueryExpressions exps,
@@ -200,7 +206,7 @@
if (sels == null) {
projections.add(((ExpressionImpl<?>)s).
toValue(factory, model, q));
- aliases.add(nextAlias());
+ aliases.add(q.getAlias(s));
} else {
// this is for constructor expression in the selection
exps.resultClass = s.getJavaType();
@@ -228,8 +234,4 @@
org.apache.openjpa.kernel.exps.Expression e2) {
return e1 == null ? e2 : e2 == null ? e1 : factory.and(e1, e2);
}
-
- protected String nextAlias() {
- return "jpqlalias" + (++aliasCount);
- }
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java Wed Jun 10 00:41:35 2009
@@ -20,8 +20,10 @@
import java.util.ArrayList;
import java.util.Arrays;
+import java.util.HashMap;
import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import javax.persistence.Parameter;
@@ -37,6 +39,7 @@
import org.apache.commons.collections.map.LinkedMap;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.QueryExpressions;
+import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
import org.apache.openjpa.persistence.meta.Types;
@@ -49,10 +52,11 @@
* that can be interpreted and executed against a data store by OpenJPA kernel.
*
* @author Pinaki Poddar
+ * @author Fay Wang
*
* @since 2.0.0
*/
-public class CriteriaQueryImpl implements CriteriaQuery {
+public class CriteriaQueryImpl implements CriteriaQuery, AliasContext {
private final MetamodelImpl _model;
private Set<Root<?>> _roots;
private PredicateImpl _where;
@@ -64,18 +68,28 @@
private List<Subquery<?>> _subqueries;
private Boolean _distinct;
private LinkedMap _parameterTypes;
- private CriteriaExpressionBuilder _exprBuilder;
- private SubqueryImpl _context;
+ private SubqueryImpl<?> _context;
+
+ // AliasContext
+ private int aliasCount = 0;
+ private static String ALIAS_BASE = "autoAlias";
+
+ private Map<Selection<?>,Value> _variables =
+ new HashMap<Selection<?>, Value>();
+ private Map<Selection<?>,Value> _values =
+ new HashMap<Selection<?>, Value>();
+ private Map<Selection<?>,String> _aliases =
+ new HashMap<Selection<?>, String>();
public CriteriaQueryImpl(MetamodelImpl model) {
this._model = model;
}
- public void setContext(SubqueryImpl context) {
+ public void setContext(SubqueryImpl<?> context) {
_context = context;
}
- public SubqueryImpl getContext() {
+ public SubqueryImpl<?> getContext() {
return _context;
}
@@ -150,8 +164,11 @@
return root;
}
- public <X> Root<X> from(Class<X> entityClass) {
- return from(_model.entity(entityClass));
+ public <X> Root<X> from(Class<X> cls) {
+ Entity<X> entity = _model.entity(cls);
+ if (entity == null)
+ throw new IllegalArgumentException(cls + " is not an entity");
+ return from(entity);
}
public List<Expression<?>> getGroupList() {
@@ -190,7 +207,7 @@
public <U> Subquery<U> subquery(Class<U> type) {
if (_subqueries == null)
_subqueries = new ArrayList<Subquery<?>>();
- Subquery<U> subquery = new SubqueryImpl(type, this);
+ Subquery<U> subquery = new SubqueryImpl<U>(type, this);
_subqueries.add(subquery);
return subquery;
}
@@ -203,21 +220,85 @@
_parameterTypes = parameterTypes;
}
- public CriteriaExpressionBuilder getExprBuilder() {
- return _exprBuilder;
- }
-
/**
* Populate a kernel expression tree by translating the components of this
* receiver with the help of the given {@link ExpressionFactory}.
*/
QueryExpressions getQueryExpressions(ExpressionFactory factory) {
- _exprBuilder = new CriteriaExpressionBuilder(this);
- return _exprBuilder.getQueryExpressions(factory, this);
+ return new CriteriaExpressionBuilder()
+ .getQueryExpressions(factory, this);
}
public void assertRoot() {
if (_roots == null || _roots.isEmpty())
throw new IllegalStateException("no root is set");
}
+
+ //
+ // AliasContext management
+ //
+
+ /**
+ * Gets the alias of the given node. Creates if necessary.
+ */
+ public String getAlias(Selection<?> selection) {
+ String alias = selection.getAlias();
+ if (alias != null) {
+ _aliases.put(selection, alias);
+ return alias;
+ }
+ alias = ALIAS_BASE + (++aliasCount);
+ while (_aliases.containsValue(alias))
+ alias = ALIAS_BASE + (++aliasCount);
+ selection.setAlias(alias);
+ _aliases.put(selection, alias);
+ return _aliases.get(selection);
+ }
+
+ public Value getVariable(Selection<?> selection) {
+ return _variables.get(selection);
+ }
+
+ public Value getValue(Selection<?> selection) {
+ return _values.get(selection);
+ }
+
+ /**
+ * Register the given variable of given path value against the given node.
+ * If the given node has no alias then an alias is set to the given node.
+ * If the variable or the path has non-null alias, then that alias must
+ * be equal to the alias of the given node. Otherwise, the node alias is set
+ * on the variable and path.
+ */
+ public void registerVariable(Selection<?> node, Value var, Value path) {
+ if (!var.isVariable())
+ throw new RuntimeException(var.getClass() + " is not a variable");
+ if (var.getPath() != path)
+ throw new RuntimeException(var + " and " + path);
+ String alias = getAlias(node);
+
+ if (!alias.equals(var.getAlias())) {
+ if (var.getAlias() == null)
+ var.setAlias(alias);
+ else
+ throw new RuntimeException("Variable alias " + var.getAlias() +
+ " does not match expected selection alias " + alias);
+ }
+ if (!alias.equals(path.getAlias())) {
+ if (path.getAlias() == null)
+ path.setAlias(alias);
+ else
+ throw new RuntimeException("Path alias " + path.getAlias() +
+ " does not match expected selection alias " + alias);
+ }
+ if (isRegistered(node))
+ throw new RuntimeException(node + " is already bound");
+ _variables.put(node, var);
+ _values.put(node, path);
+ _aliases.put(node, alias);
+ }
+
+ public boolean isRegistered(Selection<?> selection) {
+ return _variables.containsKey(selection);
+ }
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java Wed Jun 10 00:41:35 2009
@@ -43,15 +43,11 @@
/**
* Convert the given Criteria expression to a corresponding kernel value
* using the given ExpressionFactory.
- * Also sets the alias of the resulting value.
+ * Handles null expression.
*/
static Value toValue(ExpressionImpl<?> e, ExpressionFactory factory,
MetamodelImpl model, CriteriaQueryImpl q) {
- Value v = e == null ? factory.getNull() : e.toValue(factory, model, q);
- //v.setImplicitType(e.getJavaType());
- //v.setAlias(e.getAlias());
-
- return v;
+ return (e == null) ? factory.getNull() : e.toValue(factory, model, q);
}
/**
@@ -577,7 +573,7 @@
Value val1 = Expressions.toValue(e1, factory, model, q);
Value val2 = Expressions.toValue(e2, factory, model, q);
JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null,
- ((CriteriaQueryImpl)q).getParameterTypes(), null);
+ q.getParameterTypes(), null);
return isNegated() ? factory.notEqual(val1, val2)
: factory.equal(val1, val2);
}
@@ -599,7 +595,7 @@
Value val1 = Expressions.toValue(e1, factory, model, q);
Value val2 = Expressions.toValue(e2, factory, model, q);
JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null,
- ((CriteriaQueryImpl)q).getParameterTypes(), null);
+ q.getParameterTypes(), null);
return factory.greaterThan(val1, val2);
}
}
@@ -620,7 +616,7 @@
Value val1 = Expressions.toValue(e1, factory, model, q);
Value val2 = Expressions.toValue(e2, factory, model, q);
JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null,
- ((CriteriaQueryImpl)q).getParameterTypes(), null);
+ q.getParameterTypes(), null);
return factory.greaterThanEqual(val1, val2);
}
}
@@ -662,7 +658,7 @@
Value val1 = Expressions.toValue(e1, factory, model, q);
Value val2 = Expressions.toValue(e2, factory, model, q);
JPQLExpressionBuilder.setImplicitTypes(val1, val2, null, null,
- ((CriteriaQueryImpl)q).getParameterTypes(), null);
+ q.getParameterTypes(), null);
return factory.lessThanEqual(val1, val2);
}
}
@@ -1192,35 +1188,31 @@
Expressions.toValue(e, factory, model, q));
}
}
-
- public static class Exists extends PredicateImpl {
- SubqueryImpl<?> e;
- public Exists(Subquery<?> x) {
+
+ public static class Exists<X> extends PredicateImpl {
+ final SubqueryImpl<X> e;
+ public Exists(Subquery<X> x) {
super();
- e = (SubqueryImpl<?>)x;
+ e = (SubqueryImpl<X>)x;
}
@Override
public PredicateImpl clone() {
- return new Exists(e);
+ return new Exists<X>(e);
}
@Override
org.apache.openjpa.kernel.exps.Expression toKernelExpression(
ExpressionFactory factory, MetamodelImpl model,
CriteriaQueryImpl q) {
- org.apache.openjpa.kernel.exps.Expression notEmpty =
+ org.apache.openjpa.kernel.exps.Expression exists =
factory.isNotEmpty(Expressions.toValue(e, factory, model, q));
- if (isNegated())
- return factory.not(notEmpty);
- else
- return notEmpty;
-
+ return isNegated() ? factory.not(exists) : exists;
}
}
public static class All<X> extends ExpressionImpl<X> {
- SubqueryImpl<X> e;
+ final SubqueryImpl<X> e;
public All(Subquery<X> x) {
super(x.getJavaType());
e = (SubqueryImpl<X>)x;
@@ -1234,7 +1226,7 @@
}
public static class Any<X> extends ExpressionImpl<X> {
- SubqueryImpl<X> e;
+ final SubqueryImpl<X> e;
public Any(Subquery<X> x) {
super(x.getJavaType());
e = (SubqueryImpl<X>)x;
@@ -1248,7 +1240,7 @@
}
public static class Some<X> extends ExpressionImpl<X> {
- SubqueryImpl<X> e;
+ final SubqueryImpl<X> e;
public Some(Subquery<X> x) {
super(x.getJavaType());
e = (SubqueryImpl<X>)x;
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/FromImpl.java Wed Jun 10 00:41:35 2009
@@ -33,12 +33,9 @@
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Collection;
import javax.persistence.metamodel.List;
-import javax.persistence.metamodel.ManagedType;
import javax.persistence.metamodel.Map;
-import javax.persistence.metamodel.Member;
import javax.persistence.metamodel.Set;
-import org.apache.openjpa.persistence.criteria.PathImpl;
import org.apache.openjpa.persistence.meta.Members;
import org.apache.openjpa.persistence.meta.Types;
@@ -71,14 +68,7 @@
}
/**
- * Create a path from the given parent ending at the given member.
- */
-// protected FromImpl(PathImpl<?,Z> parent, Members.Member<? super Z, X> m) {
-// super(parent, m);
-// }
-
- /**
- * Return the joins that have been made from this type.
+ * Return the joins that have been made from this receiver.
*/
public java.util.Set<Join<X, ?>> getJoins() {
return _joins;
@@ -175,85 +165,82 @@
// String based counterparts
- public Join join(String attributeName) {
- return join(type.getAttribute(attributeName));
+ public <W,Y> Join<W,Y> join(String attr) {
+ return join(attr, JoinType.INNER);
}
- public Join join(String attributeName, JoinType jt) {
- return join(type.getAttribute(attributeName), jt);
+ public <W,Y> Join<W,Y> join(String attr, JoinType jt) {
+ return (Join<W,Y>)join(type.getAttribute(attr), jt);
}
- public CollectionJoin joinCollection(String attributeName) {
- return join(type.getCollection(attributeName));
+ public <W,Y> CollectionJoin<W, Y> joinCollection(String attr) {
+ return (CollectionJoin<W,Y>)join(attr, JoinType.INNER);
}
- public CollectionJoin joinCollection(String attributeName, JoinType jt) {
- return join(type.getCollection(attributeName), jt);
+ public <W,Y> CollectionJoin<W, Y> joinCollection(String attr, JoinType jt) {
+ return (CollectionJoin<W,Y>)join(type.getCollection(attr), jt);
}
- public ListJoin joinList(String attributeName) {
- return join(type.getList(attributeName));
+ public <W,Y> ListJoin<W, Y> joinList(String attr) {
+ return (ListJoin<W,Y>)join(attr, JoinType.INNER);
}
- public ListJoin joinList(String attributeName, JoinType jt) {
- return join(type.getList(attributeName), jt);
+ public <W,Y> ListJoin<W,Y> joinList(String attr, JoinType jt) {
+ return (ListJoin<W,Y>)join(type.getList(attr), jt);
}
- public MapJoin joinMap(String attributeName) {
- return join(type.getMap(attributeName));
+ public <W,K,V> MapJoin<W,K,V> joinMap(String attr) {
+ return (MapJoin<W,K,V>)join(type.getMap(attr));
}
- public MapJoin joinMap(String attributeName, JoinType jt) {
- return join(type.getMap(attributeName));
+ public <W,K,V> MapJoin<W,K,V> joinMap(String attr, JoinType jt) {
+ return (MapJoin<W,K,V>)join(type.getMap(attr));
}
- public SetJoin joinSet(String attributeName) {
- return join(type.getSet(attributeName));
+ public <W,Y> SetJoin<W, Y> joinSet(String attr) {
+ return (SetJoin<W, Y>)join(type.getSet(attr));
}
- public SetJoin joinSet(String attributeName, JoinType jt) {
- return join(type.getSet(attributeName), jt);
+ public <W,Y> SetJoin<W, Y> joinSet(String attr, JoinType jt) {
+ return (SetJoin<W, Y>)join(type.getSet(attr), jt);
}
- public Fetch fetch(Attribute assoc) {
- // TODO Auto-generated method stub
+ private void addJoin(Join<X,?> join) {
+ if (_joins == null)
+ _joins = new HashSet<Join<X,?>>();
+ _joins.add(join);
+ }
+
+
+ public <Y> Fetch<X, Y> fetch(Attribute<? super X, Y> assoc, JoinType jt) {
throw new AbstractMethodError();
}
- public Fetch fetch(AbstractCollection assoc) {
- // TODO Auto-generated method stub
+ public <Y> Fetch<X,Y> fetch(Attribute<? super X, Y> assoc) {
throw new AbstractMethodError();
}
- public Fetch fetch(String assocName) {
- // TODO Auto-generated method stub
+ public <Y> Fetch<X, Y> fetch(AbstractCollection<? super X, ?, Y> assoc,
+ JoinType jt) {
throw new AbstractMethodError();
}
-
- public Fetch fetch(Attribute assoc, JoinType jt) {
- // TODO Auto-generated method stub
+
+ public <Y> Fetch<X,Y> fetch(AbstractCollection<? super X, ?, Y> assoc) {
throw new AbstractMethodError();
}
- public Fetch fetch(AbstractCollection assoc, JoinType jt) {
- // TODO Auto-generated method stub
- throw new AbstractMethodError();
+ //String-based:
+
+ public <Y> Fetch<X, Y> fetch(String assocName) {
+ return (Fetch<X, Y>)fetch(type.getAttribute(assocName));
}
- public Fetch fetch(String assocName, JoinType jt) {
- // TODO Auto-generated method stub
- throw new AbstractMethodError();
+ public <Y> Fetch<X, Y> fetch(String assocName, JoinType jt) {
+ return (Fetch<X, Y>)fetch(type.getAttribute(assocName), JoinType.INNER);
}
public java.util.Set<Fetch<X, ?>> getFetches() {
- // TODO Auto-generated method stub
throw new AbstractMethodError();
}
-
- private void addJoin(Join<X,?> join) {
- if (_joins == null)
- _joins = new HashSet<Join<X,?>>();
- _joins.add(join);
- }
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Joins.java Wed Jun 10 00:41:35 2009
@@ -74,6 +74,8 @@
@Override
public Value toValue(ExpressionFactory factory, MetamodelImpl model,
CriteriaQueryImpl c) {
+ if (c.isRegistered(this))
+ return c.getValue(this);
boolean allowNull = joinType != JoinType.INNER;
org.apache.openjpa.kernel.exps.Path path =
(org.apache.openjpa.kernel.exps.Path)
@@ -92,10 +94,11 @@
org.apache.openjpa.kernel.exps.Value path = this.toValue
(factory, model, c);
ClassMetaData meta = _member.fmd.getDeclaredTypeMetaData();
- Value var = factory.newBoundVariable(getAlias(),
+ Value var = factory.newBoundVariable(c.getAlias(this),
meta.getDescribedType());
org.apache.openjpa.kernel.exps.Expression join = factory
.bindVariable(var, path);
+ c.registerVariable(this, var, path);
return join;
}
}
@@ -105,15 +108,13 @@
*
* @param Z type being joined from
* @param C Java collection type of the container
- * @param type of the element being joined to
+ * @param E type of the element being joined to
*
*/
public static abstract class AbstractCollection<Z,C,E>
extends FromImpl<Z,E>
implements AbstractCollectionJoin<Z, C, E> {
final JoinType joinType;
-// final FromImpl<?, Z> _from;
-// final Members.BaseCollection<? super Z, C, E> _member;
public AbstractCollection(FromImpl<?,Z> from,
Members.BaseCollection<? super Z, C, E> member, JoinType jt) {
@@ -177,11 +178,10 @@
ClassMetaData meta = _member.fmd.isElementCollection()
? _member.fmd.getEmbeddedMetaData()
: _member.fmd.getElement().getDeclaredTypeMetaData();
- Value var = factory.newBoundVariable(getAlias(),
+
+ Value var = factory.newBoundVariable(c.getAlias(this),
meta.getDescribedType());
- org.apache.openjpa.kernel.exps.Expression join = factory
- .bindVariable(var, path);
- return join;
+ return factory.bindVariable(var, path);
}
}
@@ -291,5 +291,24 @@
public Path<V> value() {
throw new AbstractMethodError();
}
+
+ @Override
+ public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+ ExpressionFactory factory, MetamodelImpl model,
+ CriteriaQueryImpl c) {
+ org.apache.openjpa.kernel.exps.Value path = toValue
+ (factory, model, c);
+
+ ClassMetaData meta = _member.fmd.isElementCollection()
+ ? _member.fmd.getEmbeddedMetaData()
+ : _member.fmd.getElement().getDeclaredTypeMetaData();
+
+ Value var = factory.newBoundVariable(c.getAlias(this),
+ meta.getDescribedType());
+ org.apache.openjpa.kernel.exps.Expression join = factory
+ .bindValueVariable(var, path);
+ c.registerVariable(this, var, path);
+ return join;
+ }
}
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PathImpl.java Wed Jun 10 00:41:35 2009
@@ -19,11 +19,8 @@
package org.apache.openjpa.persistence.criteria;
-import java.util.Set;
-
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Path;
-import javax.persistence.criteria.Root;
import javax.persistence.metamodel.AbstractCollection;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.Bindable;
@@ -42,7 +39,8 @@
* from another (parent) path.
*
* @author Pinaki Poddar
- *
+ * @author Fay Wang
+ *
* @param <Z> the type of the parent path
* @param <X> the type of this path
*/
@@ -61,7 +59,9 @@
}
/**
- * Create a path from the given parent representing the the given member.
+ * Create a path from the given non-null parent representing the the given
+ * non-null member. The given class denotes the type expressed by this
+ * path.
*/
public PathImpl(PathImpl<?,Z> parent, Members.Member<? super Z, ?> member,
Class<X> cls) {
@@ -72,70 +72,65 @@
throw new NullPointerException("Null parent for member " + member);
if (member == null)
throw new NullPointerException("Null member for parent " + parent);
-
}
public PathImpl<?,Z> getParentPath() {
return _parent;
}
- public PathImpl getInnermostParentPath() {
- if (_parent == null)
- return this;
- PathImpl _p = _parent.getInnermostParentPath();
- if (_p == null)
- return _parent;
- else
- return _p.getInnermostParentPath();
+ public PathImpl<?,?> getInnermostParentPath() {
+ return (_parent == null) ? this : _parent.getInnermostParentPath();
}
/**
- * Convert this path to a kernel path value.
+ * Convert this path to a kernel path.
*/
@Override
- public Value toValue(ExpressionFactory factory, MetamodelImpl model,
- CriteriaQueryImpl q) {
- Value var = null;
- SubqueryImpl subquery = q.getContext();
- PathImpl parent = getInnermostParentPath();
- if (subquery != null && inSubquery(parent, subquery)) {
- org.apache.openjpa.kernel.exps.Subquery subQ =
- subquery.getSubQ();
- org.apache.openjpa.kernel.exps.Path path = factory.newPath(subQ);
+ public Value toValue(
+ ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl q) {
+ if (q.isRegistered(this))
+ return q.getValue(this);
+ org.apache.openjpa.kernel.exps.Path path = null;
+ SubqueryImpl<?> subquery = q.getContext();
+ PathImpl<?,?> parent = getInnermostParentPath();
+ if (parent.inSubquery(subquery)) {
+ org.apache.openjpa.kernel.exps.Subquery subQ = subquery.getSubQ();
+ path = factory.newPath(subQ);
path.setMetaData(subQ.getMetaData());
boolean allowNull = false;
path.get(_member.fmd, allowNull);
- var = path;
} else if (_parent != null) {
- org.apache.openjpa.kernel.exps.Path path =
- (org.apache.openjpa.kernel.exps.Path)
- _parent.toValue(factory, model, q);
+ if (q.isRegistered(_parent)) {
+ path = factory.newPath(q.getVariable(_parent));
+ } else {
+ path = (org.apache.openjpa.kernel.exps.Path)
+ _parent.toValue(factory, model, q);
+ }
boolean allowNull = false;
path.get(_member.fmd, allowNull);
- var = path;
} else {
- var = factory.newPath();//getJavaType());
- var.setMetaData(model.repos.getMetaData(getJavaType(), null, true));
+ path = factory.newPath();
+ path.setMetaData(model.repos.getCachedMetaData(getJavaType()));
}
if (_member != null) {
int typeCode = _member.fmd.getDeclaredTypeCode();
if (typeCode != JavaTypes.COLLECTION && typeCode != JavaTypes.MAP)
- var.setImplicitType(getJavaType());
+ path.setImplicitType(getJavaType());
}
- var.setAlias(getAlias());
- return var;
+ path.setAlias(q.getAlias(this));
+ return path;
}
- public static boolean inSubquery(PathImpl parent, SubqueryImpl subquery) {
- Set<Root<?>> roots = subquery.getRoots();
- for (Root<?> r : roots) {
- if (parent == r)
- return true;
- }
- return false;
+ /**
+ * Affirms if this receiver occurs in the roots of the given subquery.
+ */
+ public boolean inSubquery(SubqueryImpl<?> subquery) {
+ return subquery != null && subquery.getRoots().contains(this);
}
-
+ /**
+ * Create a new path with this path as parent.
+ */
public <Y> Path<Y> get(Attribute<? super X, Y> attr) {
return new PathImpl<X,Y>(this, (Members.Attribute<? super X, Y>)attr,
attr.getJavaType());
@@ -181,5 +176,5 @@
*/
public Expression<Class<? extends X>> type() {
return new Expressions.Type<X>(this);
- }
+ }
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/PredicateImpl.java Wed Jun 10 00:41:35 2009
@@ -105,7 +105,7 @@
ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
result = _op == BooleanOperator.AND
? factory.and(result, e.toKernelExpression(factory, model, q))
- : factory.or(result, e.toKernelExpression(factory,model,q));
+ : factory.or(result, e.toKernelExpression(factory,model,q));
}
return _negated ? factory.not(result) : result;
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/RootImpl.java Wed Jun 10 00:41:35 2009
@@ -22,17 +22,20 @@
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.Entity;
+import org.apache.openjpa.kernel.exps.Expression;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
+import org.apache.openjpa.kernel.exps.Path;
+import org.apache.openjpa.kernel.exps.Subquery;
import org.apache.openjpa.kernel.exps.Value;
import org.apache.openjpa.persistence.meta.MetamodelImpl;
import org.apache.openjpa.persistence.meta.Types;
/**
- * A path without a parent.
+ * A root path without a parent.
*
* @author Pinaki Poddar
*
- * @param <X>
+ * @param <X> the type of the entity
*/
public class RootImpl<X> extends FromImpl<X,X> implements Root<X> {
private final Types.Entity<X> _entity;
@@ -61,14 +64,14 @@
@Override
public Value toValue(ExpressionFactory factory, MetamodelImpl model,
CriteriaQueryImpl c) {
- SubqueryImpl subquery = c.getContext();
- Value var = null;
- if (subquery != null && PathImpl.inSubquery(this, subquery)) {
- org.apache.openjpa.kernel.exps.Subquery subQ =
- subquery.getSubQ();
+ SubqueryImpl<?> subquery = c.getContext();
+ Path var = null;
+ if (inSubquery(subquery)) {
+ Subquery subQ = subquery.getSubQ();
var = factory.newPath(subQ);
- } else
+ } else {
var = factory.newPath();
+ }
var.setMetaData(_entity.meta);
return var;
}
@@ -80,21 +83,18 @@
@Override
public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl c) {
- org.apache.openjpa.kernel.exps.Value path = toValue(factory, model, c);
-
- Value var = factory.newBoundVariable(getAlias(),
+ Value path = toValue(factory, model, c);
+ Value var = factory.newBoundVariable(c.getAlias(this),
_entity.meta.getDescribedType());
- org.apache.openjpa.kernel.exps.Expression exp =
- factory.bindVariable(var, path);
+ Expression exp = factory.bindVariable(var, path);
if (_correlatedParent == null)
return exp;
- org.apache.openjpa.kernel.exps.Value path1 =
- _correlatedParent.toValue(factory, model, c);
- org.apache.openjpa.kernel.exps.Expression equal =
- factory.equal(path1, path);
- //return factory.and(exp, equal);
- return equal;
-
+ Value path1 = _correlatedParent.toValue(factory, model, c);
+ return factory.equal(path1, path);
+ }
+
+ public String toString() {
+ return _entity.toString();
}
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SubqueryImpl.java Wed Jun 10 00:41:35 2009
@@ -1,3 +1,21 @@
+/*
+ * 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.persistence.criteria;
import java.util.LinkedHashSet;
@@ -24,7 +42,15 @@
import org.apache.openjpa.kernel.exps.QueryExpressions;
import org.apache.openjpa.kernel.jpql.JPQLExpressionBuilder;
-
+/**
+ * Subquery is an expression which itself is a query and always appears in the
+ * context of a parent query.
+ *
+ * @author Pinaki Poddar
+ * @author Fay Wang
+ *
+ * @param <T> the type selected by this subquery.
+ */
public class SubqueryImpl<T> extends ExpressionImpl<T> implements Subquery<T> {
private final CriteriaQueryImpl _parent;
private final CriteriaQueryImpl _delegate;
@@ -139,12 +165,15 @@
public <X,Y> CollectionJoin<X,Y> correlate(CollectionJoin<X,Y> join) {
return join;
}
+
public <X,Y> SetJoin<X,Y> correlate(SetJoin<X,Y> join) {
return join;
}
+
public <X,Y> ListJoin<X,Y> correlate(ListJoin<X,Y> join) {
return join;
}
+
public <X,K,V> MapJoin<X,K,V> correlate(MapJoin<X,K,V> join) {
return join;
}
@@ -164,14 +193,14 @@
public Value toValue(ExpressionFactory factory, MetamodelImpl model,
CriteriaQueryImpl q) {
final boolean subclasses = true;
- CriteriaExpressionBuilder queryEval = q.getExprBuilder();
- String alias = queryEval.nextAlias();
+ CriteriaExpressionBuilder queryEval = new CriteriaExpressionBuilder();
+ String alias = q.getAlias(this);
ClassMetaData candidate =
((Types.Managed<?>)getRoot().getModel()).meta;
_subq = factory.newSubquery(candidate, subclasses, alias);
_subq.setMetaData(candidate);
- QueryExpressions subexp = q.getExprBuilder().
- getQueryExpressions(factory, _delegate);
+ QueryExpressions subexp = queryEval.getQueryExpressions(factory,
+ _delegate);
_subq.setQueryExpressions(subexp);
if (subexp.projections.length > 0)
JPQLExpressionBuilder.checkEmbeddable(subexp.projections[0], null);
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Members.java Wed Jun 10 00:41:35 2009
@@ -164,6 +164,10 @@
public Class<E> getJavaType() {
return fmd.getDeclaredType();
}
+
+ public Class getMemberJavaType() {
+ return fmd.getElement().getDeclaredType();
+ }
}
/**
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/MetamodelImpl.java Wed Jun 10 00:41:35 2009
@@ -27,7 +27,6 @@
import java.lang.reflect.Field;
import java.lang.reflect.GenericArrayType;
import java.lang.reflect.ParameterizedType;
-import java.lang.reflect.TypeVariable;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
@@ -46,7 +45,6 @@
import javax.persistence.metamodel.AbstractCollection.CollectionType;
import javax.persistence.metamodel.Type.PersistenceType;
-import org.apache.openjpa.lib.util.J2DoPrivHelper;
import org.apache.openjpa.lib.util.Localizer;
import org.apache.openjpa.meta.ClassMetaData;
import org.apache.openjpa.meta.FieldMetaData;
@@ -61,12 +59,14 @@
*/
public class MetamodelImpl implements Metamodel {
public final MetaDataRepository repos;
- Map<Class<?>, Entity<?>> _entities = new HashMap<Class<?>, Entity<?>>();
- Map<Class<?>, Embeddable<?>> _embeddables =
+ private Map<Class<?>, Entity<?>> _entities =
+ new HashMap<Class<?>, Entity<?>>();
+ private Map<Class<?>, Embeddable<?>> _embeddables =
new HashMap<Class<?>, Embeddable<?>>();
- Map<Class<?>, MappedSuperclass<?>> _mappedsupers =
+ private Map<Class<?>, MappedSuperclass<?>> _mappedsupers =
new HashMap<Class<?>, MappedSuperclass<?>>();
- Map<Class<?>, Type<?>> _basics = new HashMap<Class<?>, Type<?>>();
+ private Map<Class<?>, Type<?>> _basics =
+ new HashMap<Class<?>, Type<?>>();
private static Localizer _loc = Localizer.forPackage(MetamodelImpl.class);
@@ -141,8 +141,10 @@
public static PersistenceType getPersistenceType(ClassMetaData meta) {
if (meta == null)
return BASIC;
- if (meta.isEmbeddedOnly())
- return meta.isAbstract() ? MAPPED_SUPERCLASS : EMBEDDABLE;
+ if (meta.isAbstract())
+ return MAPPED_SUPERCLASS;
+ if (meta.isEmbeddable())
+ return EMBEDDABLE;
return ENTITY;
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/meta/Types.java Wed Jun 10 00:41:35 2009
@@ -411,11 +411,27 @@
void assertType(String msg, FieldMetaData fmd, Class<?> actual,
Class<?> expected) {
if (expected != null && !expected.isAssignableFrom(actual)) {
+ if (wrap(expected) != wrap(actual)) {
throw new IllegalArgumentException(_loc.get(msg, fmd.getName(),
actual, expected).getMessage());
+ }
}
}
-
+
+ Class<?> wrap(Class<?> c) {
+ if (c.isPrimitive()) {
+ if (c == int.class) return Integer.class;
+ if (c == long.class) return Long.class;
+ if (c == boolean.class) return Boolean.class;
+ if (c == byte.class) return Byte.class;
+ if (c == char.class) return Character.class;
+ if (c == double.class) return Double.class;
+ if (c == float.class) return Float.class;
+ if (c == short.class) return Short.class;
+ }
+ return c;
+ }
+
boolean isDeclared(Member<?,?> member) {
return member.getDeclaringType() == this;
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java?rev=783166&r1=783165&r2=783166&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/util/SourceCode.java Wed Jun 10 00:41:35 2009
@@ -625,7 +625,7 @@
public void write(PrintWriter out, int tab) {
tab(out, tab);
- out.print("@"+name);
+ out.println("@"+name);
writeList(out, BLANK, args, BRACKET_ARGS, false);
out.println();
}