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/09/10 18:58:46 UTC
svn commit: r813514 - in /openjpa/trunk:
openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/
openjpa-persistence/src/main/java/org/apache/openjpa/persistence/
openjpa-persistence/src/main/java/org/apache/openjpa/persistence/...
Author: ppoddar
Date: Thu Sep 10 16:58:44 2009
New Revision: 813514
URL: http://svn.apache.org/viewvc?rev=813514&view=rev
Log:
OPENJPA-1288: alias() first version. Assumes in-place change and does not create new instance. Retired TupleElementImpl.
Removed:
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/TupleElementImpl.java
openjpa/trunk/openjpa-persistence/src/test/java/org/apache/openjpa/persistence/TestTupleImpl.java
Modified:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestStringCriteria.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaBuilder.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpression.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaQueryImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/OrderImpl.java
openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java Thu Sep 10 16:58:44 2009
@@ -76,7 +76,7 @@
CriteriaTest.auditor = auditor;
}
- protected CriteriaBuilder getCriteriaBuilder() {
+ protected OpenJPACriteriaBuilder getCriteriaBuilder() {
return cb;
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestMetaModelTypesafeCriteria.java Thu Sep 10 16:58:44 2009
@@ -224,8 +224,8 @@
Root<Customer> c = q.from(Customer.class);
Join<Customer, Order> o = c.join(customer_.getSet("orders", Order.class));
Join<Customer, Address> a = c.join(customer_.getSingularAttribute("address", Address.class));
- Expression<Double> taxedCost = cb.prod(o.get(order_.getSingularAttribute("totalCost", Double.class)), 1.08);
- taxedCost.alias("taxedCost");
+ Expression<Double> taxedCost = (Expression<Double>)cb.prod(o.get(order_.getSingularAttribute("totalCost",
+ Double.class)), 1.08).alias("taxedCost");
q.where(cb.equal(a.get(address_.getSingularAttribute("state", String.class)), "CA"),
cb.equal(a.get(address_.getSingularAttribute("county", String.class)), "Santa Clara"));
q.multiselect(o.get(order_.getSingularAttribute("quantity", Integer.class)),
@@ -550,8 +550,8 @@
Root<Customer> c = q.from(Customer.class);
Join<Customer, Order> o = c.join(customer_.getSet("orders", Order.class));
Join<Customer, Address> a = c.join(customer_.getSingularAttribute("address", Address.class));
- Expression<Double> taxedCost = cb.prod(o.get(order_.getSingularAttribute("totalCost", Double.class)), 1.08);
- taxedCost.alias("taxedCost");
+ Expression<Double> taxedCost = (Expression<Double>)cb.prod(o.get(order_.getSingularAttribute("totalCost",
+ Double.class)), 1.08).alias("taxedCost");
q.where(cb.equal(a.get(address_.getSingularAttribute("state", String.class)), "CA"),
cb.equal(a.get(address_.getSingularAttribute("county", String.class)), "Santa Clara"));
q.orderBy(cb.asc(o.get(order_.getSingularAttribute("quantity", Integer.class))),
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestStringCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestStringCriteria.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestStringCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestStringCriteria.java Thu Sep 10 16:58:44 2009
@@ -29,6 +29,7 @@
import javax.persistence.criteria.ListJoin;
import javax.persistence.criteria.MapJoin;
import javax.persistence.criteria.ParameterExpression;
+import javax.persistence.criteria.Path;
import javax.persistence.criteria.Root;
import javax.persistence.criteria.SetJoin;
import javax.persistence.criteria.Subquery;
@@ -41,6 +42,7 @@
String jpql = "select c from Customer c where c.name='Autowest Toyota'";
CriteriaQuery<Customer> q = cb.createQuery(Customer.class);
Root<Customer> customer = q.from(Customer.class);
+ Path<String> path = customer.<String>get("name");
q.select(customer).where(cb.equal(customer.get("name"), "Autowest Toyota"));
assertEquivalence(q, jpql);
@@ -138,8 +140,8 @@
SetJoin<Customer, Order> o = c.joinSet("orders");
Join<Customer, Address> a = c.join("address");
q.where(cb.equal(a.get("state"), "CA"), cb.equal(a.get("county"), "Santa Clara"));
- Expression<Float> productTerm = cb.toFloat(cb.prod(o.get("totalCost").as(Float.class), 1.08));
- productTerm.alias("taxedCost");
+ Expression<Float> productTerm = (Expression<Float>)cb.toFloat(cb.prod(o.get("totalCost").as(Float.class), 1.08))
+ .alias("taxedCost");
q.multiselect(o.get("quantity"), productTerm, a.get("zipCode"));
assertEquivalence(q, jpql);
@@ -387,8 +389,8 @@
SetJoin<Customer, Order> o = c.joinSet("orders");
Join<Customer, Address> a = c.join("address");
q.where(cb.equal(a.get("state"), "CA"), cb.equal(a.get("county"), "Santa Clara"));
- Expression<Float> productTerm = cb.toFloat(cb.prod(o.get("totalCost").as(Float.class), 1.08));
- productTerm.alias("taxedCost");
+ Expression<Float> productTerm = (Expression<Float>)cb.toFloat(cb.prod(o.get("totalCost").as(Float.class), 1.08))
+ .alias("taxedCost");
q.orderBy(cb.asc(o.get("quantity")), cb.asc(productTerm), cb.asc(a.get("zipCode")));
q.multiselect(o.get("quantity"), productTerm, a.get("zipCode"));
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypeSafeCondExpression.java Thu Sep 10 16:58:44 2009
@@ -789,5 +789,4 @@
assertEquivalence(q, query);
}
-
}
Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java Thu Sep 10 16:58:44 2009
@@ -34,6 +34,7 @@
import javax.persistence.criteria.MapJoin;
import javax.persistence.criteria.ParameterExpression;
import javax.persistence.criteria.Root;
+import javax.persistence.criteria.Selection;
import javax.persistence.criteria.SetJoin;
import javax.persistence.criteria.Subquery;
@@ -806,8 +807,7 @@
Root<Customer> c = q.from(Customer.class);
Join<Customer, Order> o = c.join(Customer_.orders);
Join<Customer, Address> a = c.join(Customer_.address);
- Expression<Double> taxedCost = cb.prod(o.get(Order_.totalCost), 1.08);
- taxedCost.alias("taxedCost");
+ Expression<Double> taxedCost = (Expression<Double>)cb.prod(o.get(Order_.totalCost), 1.08).alias("taxedCost");
q.where(cb.equal(a.get(Address_.state), "CA"),
cb.equal(a.get(Address_.county), "Santa Clara"));
q.orderBy(cb.asc(o.get(Order_.quantity)),
@@ -1260,4 +1260,19 @@
assertEquals(jResult.get(i).getName(), cResult.get(i).getName());
}
}
+
+ public void testAlias() {
+ String jpql = "SELECT AVG(a.balance) AS x FROM Account a ORDER BY x";
+
+ OpenJPACriteriaQuery<Double> c = cb.createQuery(Double.class);
+ Root<Account> account = c.from(Account.class);
+ Expression<Double> original = cb.avg(account.get(Account_.balance));
+ Expression<Double> aliased = (Expression<Double>)original.alias("x");
+ c.orderBy(cb.asc(aliased));
+ assertSame(original, aliased);
+ assertEquals("x", aliased.getAlias());
+ c.select(aliased);
+ assertEquivalence(c, jpql);
+ assertEquals(jpql, c.toCQL());
+ }
}
Modified: 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=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/AliasContext.java Thu Sep 10 16:58:44 2009
@@ -25,12 +25,13 @@
/**
* The context holds named variables for nodes of CriteriaQuery.
- * Creates unique alias for the nodes.
+ * Can create unique alias for the nodes that has not been aliased explicitly.
*
* @author Pinaki Poddar
+ * @since 2.0.0
*
*/
-public interface AliasContext {
+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
@@ -70,5 +71,4 @@
* Return null if the node is not registered.
*/
Value getRegisteredValue(Selection<?> node);
-
}
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=813514&r1=813513&r2=813514&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 Thu Sep 10 16:58:44 2009
@@ -41,6 +41,7 @@
import javax.persistence.criteria.Subquery;
import javax.persistence.metamodel.Attribute;
import javax.persistence.metamodel.ManagedType;
+import javax.persistence.metamodel.Metamodel;
import org.apache.openjpa.kernel.ExpressionStoreQuery;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
@@ -71,6 +72,10 @@
_model = model;
return this;
}
+
+ public Metamodel getMetamodel() {
+ return _model;
+ }
public QueryExpressions eval(Object parsed, ExpressionStoreQuery query,
ExpressionFactory factory, ClassMetaData candidate) {
@@ -310,7 +315,7 @@
}
public <E, C extends Collection<E>> Predicate isMember(Expression<E> e, Expression<C> c) {
- return new Expressions.IsMember<E>((Class<E>)e.getJavaType(), e, c);
+ return new Expressions.IsMember<E>(e, c);
}
public <C extends Collection<?>> Predicate isNotEmpty(Expression<C> collection) {
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpression.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpression.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpression.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/CriteriaExpression.java Thu Sep 10 16:58:44 2009
@@ -19,7 +19,7 @@
package org.apache.openjpa.persistence.criteria;
/**
- * Interface to support Visitor pattern on Criteria Query nodes.
+ * Interface to support Visitor pattern and CQL conversion of Criteria Query nodes.
*
* @author Pinaki Poddar
* @since 2.0.0
@@ -42,4 +42,9 @@
* Get a string representation of this node as a variable in the context of the given query.
*/
StringBuilder asVariable(AliasContext q);
+
+ /**
+ * Get a string representation of this node as a projection term in the context of the given query.
+ */
+ StringBuilder asProjection(AliasContext q);
}
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=813514&r1=813513&r2=813514&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 Thu Sep 10 16:58:44 2009
@@ -467,7 +467,7 @@
//
/**
- * Gets the alias of the given node. Creates if necessary.
+ * Gets the alias of the given node. Creates an automatic alias, if necessary.
*/
public String getAlias(Selection<?> selection) {
String alias = selection.getAlias();
@@ -478,7 +478,7 @@
alias = ALIAS_BASE + (++aliasCount);
while (_aliases.containsValue(alias))
alias = ALIAS_BASE + (++aliasCount);
- selection.alias(alias);
+ ((SelectionImpl<?>)selection).setAutoAlias(alias);
_aliases.put(selection, alias);
return _aliases.get(selection);
}
@@ -652,7 +652,7 @@
void render(StringBuilder buffer, Set<Root<?>> roots, List<Join<?,?>> correlatedJoins) {
buffer.append("SELECT ");
if (isDistinct()) buffer.append(" DISTINCT ");
- buffer.append(_selection != null ? ((CriteriaExpression)_selection).asValue(this) : "*");
+ buffer.append(_selection != null ? ((CriteriaExpression)_selection).asProjection(this) : "*");
buffer.append(" FROM ");
renderRoots(buffer, roots);
renderJoins(buffer, correlatedJoins);
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/ExpressionImpl.java Thu Sep 10 16:58:44 2009
@@ -29,7 +29,7 @@
import org.apache.openjpa.persistence.meta.MetamodelImpl;
/**
- * Expression for Criteria query.
+ * Expression node for Criteria query.
*
* @param <X> the type of the value this expression represents.
*
@@ -45,20 +45,16 @@
}
/**
- * Perform a typecast upon the expression.
- * Warning: may result in a runtime failure.
- * @param type
- * @return expression
+ * Creates a new expression of the given type. If the given type is same as this expression's type then
+ * returns the same instance.
+ * May cause runtime cast failure if this expression's immutable type is not convertible to the given type.
*/
public <Y> Expression<Y> as(Class<Y> type) {
return type == getJavaType() ? (Expression<Y>)this : new Expressions.CastAs<Y>(type, this);
}
/**
- * Apply a predicate to test whether the expression is a member
- * of the argument list.
- * @param values
- * @return predicate testing for membership in the list
+ * Create a predicate to test whether this expression is a member of the given argument values.
*/
public Predicate in(Object... values) {
In<X> result = new Expressions.In<X>(this);
@@ -68,10 +64,7 @@
}
/**
- * Apply a predicate to test whether the expression is a member
- * of the argument list.
- * @param values
- * @return predicate testing for membership
+ * Create a predicate to test whether this expression is a member of the given argument expressions.
*/
public Predicate in(Expression<?>... values) {
In<X> result = new Expressions.In<X>(this);
@@ -81,10 +74,7 @@
}
/**
- * Apply a predicate to test whether the expression is a member
- * of the collection.
- * @param values collection
- * @return predicate testing for membership
+ * Create a predicate to test whether this expression is a member of the given collection element values.
*/
public Predicate in(Collection<?> values) {
In<X> result = new Expressions.In<X>(this);
@@ -94,10 +84,7 @@
}
/**
- * Apply a predicate to test whether the expression is a member
- * of the collection.
- * @param values expression corresponding to collection
- * @return predicate testing for membership
+ * Create a predicate to test whether this expression is a member of the given expression representing a collection.
*/
public Predicate in(Expression<Collection<?>> values) {
In<X> result = new Expressions.In<X>(this);
@@ -106,16 +93,14 @@
}
/**
- * Apply a predicate to test whether the expression is not null.
- * @return predicate testing whether the expression is not null.
+ * Create a predicate to test whether this expression is not null.
*/
public Predicate isNotNull() {
return new Expressions.IsNotNull(this);
}
/**
- * Apply a predicate to test whether the expression is null.
- * @return predicate testing whether the expression is null
+ * Create a predicate to test whether this expression is null.
*/
public Predicate isNull() {
return new Expressions.IsNull(this);
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=813514&r1=813513&r2=813514&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 Thu Sep 10 16:58:44 2009
@@ -268,12 +268,7 @@
e1 = (ExpressionImpl<?>)x;
e2 = (ExpressionImpl<?>)y;
}
-
-// @Override
-// public PredicateImpl clone() {
-// return new BinaryLogicalExpression(e1, e2);
-// }
-
+
public void acceptVisit(CriteriaExpressionVisitor visitor) {
Expressions.acceptVisit(visitor, this, e1, e2);
}
@@ -535,27 +530,27 @@
private ExpressionImpl<Integer> from;
private ExpressionImpl<String> path;
- public Locate(Expression<String> x, Expression<String> y, Expression<Integer> from) {
+ public Locate(Expression<String> path, Expression<String> pattern, Expression<Integer> from) {
super(Integer.class);
- path = (ExpressionImpl<String>)x;
- pattern = (ExpressionImpl<String>)y;
+ this.path = (ExpressionImpl<String>)path;
+ this.pattern = (ExpressionImpl<String>)pattern;
this.from = (ExpressionImpl<Integer>)from;
}
- public Locate(Expression<String> x, Expression<String> y) {
- this(x, y, null);
+ public Locate(Expression<String> path, Expression<String> pattern) {
+ this(path, pattern, null);
}
- public Locate(Expression<String> x, String y) {
- this(x, new Constant<String>(y), null);
+ public Locate(Expression<String> path, String pattern) {
+ this(path, new Constant<String>(pattern), null);
}
- public Locate(String x, Expression<String> y) {
- this(new Constant<String>(x), y, null);
+ public Locate(String path, Expression<String> pattern) {
+ this(new Constant<String>(path), pattern, null);
}
- public Locate(Expression<String> x, String y, int from) {
- this(x, new Constant<String>(y), new Constant<Integer>(from));
+ public Locate(Expression<String> path, String pattern, int from) {
+ this(path, new Constant<String>(pattern), new Constant<Integer>(from));
}
@Override
@@ -994,15 +989,15 @@
}
public static class Between<Y extends Comparable<Y>> extends PredicateImpl.And {
- private final ExpressionImpl<?> e;
- private final ExpressionImpl<?> v1;
- private final ExpressionImpl<?> v2;
+ private final ExpressionImpl<? extends Y> e;
+ private final ExpressionImpl<? extends Y> v1;
+ private final ExpressionImpl<? extends Y> v2;
public Between(Expression<? extends Y> v, Expression<? extends Y> x, Expression<? extends Y> y) {
super(new GreaterThanEqual(v,x), new LessThanEqual(v,y));
- e = (ExpressionImpl<?>)v;
- v1 = (ExpressionImpl<?>)x;
- v2 = (ExpressionImpl<?>)y;
+ e = (ExpressionImpl<? extends Y>)v;
+ v1 = (ExpressionImpl<? extends Y>)x;
+ v2 = (ExpressionImpl<? extends Y>)y;
}
public Between(Expression<? extends Y> v, Y x, Y y) {
@@ -1182,18 +1177,14 @@
final ExpressionImpl<E> element;
final ExpressionImpl<?> collection;
- public IsMember(Class<E> t, Expression<E> element, Expression<?> collection) {
+ public IsMember(Expression<E> element, Expression<?> collection) {
super();
this.element = (ExpressionImpl<E>)element;
this.collection = (ExpressionImpl<?>)collection;
}
- public IsMember(Class<E> t, E element, Expression<?> collection) {
- this(t, new Constant<E>(element), collection);
- }
-
public IsMember(E element, Expression<?> collection) {
- this((Class<E>)element.getClass(), element, collection);
+ this(new Constant<E>(element), collection);
}
@Override
@@ -1567,12 +1558,16 @@
return caseOperand;
}
- public SimpleCase<C,R> when(C when, Expression<? extends R> then) {
- whens.add(new Constant<C>(when));
+ public SimpleCase<C,R> when(Expression<C> when, Expression<? extends R> then) {
+ whens.add(when);
thens.add(then);
return this;
}
+ public SimpleCase<C,R> when(C when, Expression<? extends R> then) {
+ return when(new Constant<C>(when), then);
+ }
+
public SimpleCase<C,R> when(C when, R then) {
return when(when, new Expressions.Constant<R>(then));
}
@@ -1828,27 +1823,4 @@
Expressions.acceptVisit(visitor, this, _args);
}
}
-
- public static class DelegatingExpression<X> extends ExpressionImpl<X> {
- final ExpressionImpl<? extends X> _delegate;
- public DelegatingExpression(ExpressionImpl<? extends X> del) {
- super((Class<X>)del.getJavaType());
- _delegate = del;
- }
-
- @Override
- Value toValue(ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl<?> q) {
- return _delegate.toValue(factory, model, q);
- }
-
- @Override
- public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
- ExpressionFactory factory, MetamodelImpl model, CriteriaQueryImpl<?> q) {
- return _delegate.toKernelExpression(factory, model, q);
- }
-
- public void acceptVisit(CriteriaExpressionVisitor visitor) {
- Expressions.acceptVisit(visitor, this, _delegate);
- }
- }
}
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/OrderImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/OrderImpl.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/OrderImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/OrderImpl.java Thu Sep 10 16:58:44 2009
@@ -61,7 +61,12 @@
}
public StringBuilder asValue(AliasContext q) {
- return e.asValue(q).append(_ascending ? "" : " DESC");
+ return (e.isAutoAliased() ? e.asValue(q) : new StringBuilder(e.getAlias()))
+ .append(_ascending ? "" : " DESC");
+ }
+
+ public StringBuilder asProjection(AliasContext q) {
+ throw new IllegalStateException(this + " can not be rendered as projection");
}
public StringBuilder asVariable(AliasContext q) {
Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java?rev=813514&r1=813513&r2=813514&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/SelectionImpl.java Thu Sep 10 16:58:44 2009
@@ -23,35 +23,85 @@
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Selection;
-import org.apache.openjpa.persistence.TupleElementImpl;
-
/**
- * An item selected in the projection clause of Criteria query.
+ * An item selected in the projection clause of Criteria query.
+ * Base implementation for all concrete expressions.
*
* @author Pinaki Poddar
*
* @param <X>
*/
-public class SelectionImpl<X> extends TupleElementImpl<X>
- implements Selection<X>, CriteriaExpression {
+public abstract class SelectionImpl<X> implements Selection<X>, CriteriaExpression {
+ private final Class<X> _cls;
+ private String _alias;
+ private Boolean _autoAliased;
+ /**
+ * Construct with the immutable type represented by this selection term.
+ */
public SelectionImpl(Class<X> cls) {
- super(cls);
+ _cls = cls;
}
-
+
+ /**
+ * Gets the immutable type represented by this selection term.
+ */
+ public Class<X> getJavaType() {
+ return _cls;
+ }
+
+ /**
+ * Gets the alias set of this selection term.
+ */
+ public String getAlias() {
+ return _alias;
+ }
+
+ /**
+ * Sets the alias on this selection term.
+ */
public Selection<X> alias(String alias) {
- super.setAlias(alias);
+ _alias = alias;
+ _autoAliased = false;
return this;
}
-
+
+ /**
+ * Sets the alias of this expression internally. Only valid if the expression is not aliased explicitly
+ * by calling {@linkplain #alias(String)}.
+ */
+ void setAutoAlias(String alias) {
+ if (Boolean.FALSE.equals(_autoAliased))
+ throw new IllegalStateException(this + " has been aliased. Can not set alias automatically");
+ _alias = alias;
+ _autoAliased = true;
+ }
+
+ /**
+ * Affirms if the alias of this expression is assigned automatically.
+ */
+ boolean isAutoAliased() {
+ return _autoAliased == null ? true : _autoAliased.booleanValue();
+ }
+
+ /**
+ * Throws IllegalStateException because a selection term, by default, consists of single value.
+ */
public List<Selection<?>> getCompoundSelectionItems() {
throw new IllegalStateException(this + " is not a compound selection");
}
+ /**
+ * Returns false because a selection term, by default, consists of single value.
+ */
public boolean isCompoundSelection() {
return false;
}
+ // ------------------------------------------------------------------------------------
+ // Contract for CriteriaExpression implemented mostly as a no-op for easier derivation.
+ // ------------------------------------------------------------------------------------
+
public StringBuilder asValue(AliasContext q) {
throw new IllegalStateException(this.getClass().getSimpleName() + " can not be rendered as value");
}
@@ -60,8 +110,12 @@
throw new IllegalStateException(this.getClass().getSimpleName() + " can not be rendered as variable");
}
+ public final StringBuilder asProjection(AliasContext q) {
+ String as = (isAutoAliased() ? "" : " AS " + getAlias());
+ return asValue(q).append(as);
+ }
+
public void acceptVisit(CriteriaExpressionVisitor visitor) {
Expressions.acceptVisit(visitor, this, (Expression<?>[])null);
}
-
}