|
|
|
Pinaki Poddar
|
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(); } Pinaki
|
||||||||||||||||
| Free Embeddable Forum Powered by Nabble | Help |