Author: ppoddar
Date: Wed May 6 05:39:17 2009
New Revision: 772058
URL: http://svn.apache.org/viewvc?rev=772058&view=rev
Log:
OPENJPA-1013,OPENJPA-1014: Support In() and IsNull()
Modified:
openjpa/trunk/ (props changed)
openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/conf/
(props changed)
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestTypesafeCriteria.java
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/
(props changed)
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/PredicateImpl.java
Propchange: openjpa/trunk/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Wed May 6 05:39:17 2009
@@ -1,7 +1,10 @@
.*
-
openjpa-database
-
target
-
subs
+*.bat
+enhance.xml
+user.dict
+wip
+patches
+bin
Propchange: openjpa/trunk/openjpa-lib/src/test/java/org/apache/openjpa/lib/conf/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed May 6 05:39:17 2009
@@ -0,0 +1 @@
+TestMavenProperty.java
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=772058&r1=772057&r2=772058&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
Wed May 6 05:39:17 2009
@@ -25,6 +25,7 @@
*/
public class TestTypesafeCriteria extends SQLListenerTestCase {
CriteriaBuilder cb;
+ CriteriaQuery c;
EntityManager em;
public void setUp() {
@@ -32,6 +33,8 @@
setDictionary();
cb = (CriteriaBuilder)emf.getQueryBuilder();
em = emf.createEntityManager();
+
+ c = cb.create();
}
void setDictionary() {
@@ -50,6 +53,14 @@
assertEquivalence(c, jpql);
}
+ public void testImplicitRoot() {
+ String jpql = "select a from Account a";
+ CriteriaQuery c = cb.create();
+ c.from(Account.class);
+
+ assertEquivalence(c, jpql);
+ }
+
public void testEqual() {
String jpql = "select a from Account a where a.balance=100";
@@ -98,6 +109,13 @@
assertEquivalence(c, jpql);
}
+ public void testInPredicate() {
+ String jpql = "select a from Account a where a.owner in ('X','Y','Z')";
+ CriteriaQuery c = cb.create();
+ Root<Account> account = c.from(Account.class);
+
c.where(cb.in(account.get(Account_.owner)).value("X").value("Y").value("Z"));
+ assertEquivalence(c, jpql);
+ }
public void testBinaryPredicate() {
String jpql = "select a from Account a where a.balance>100 and
a.balance<200";
Propchange:
openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/meta/
------------------------------------------------------------------------------
--- svn:ignore (added)
+++ svn:ignore Wed May 6 05:39:17 2009
@@ -0,0 +1,11 @@
+*_.class
+ArrayMember.class
+Embed0.class
+Embed1.class
+ExplicitFieldAccess.class
+ExplicitFieldAccessMixed.class
+ExplicitPropertyAccess.class
+ExplicitPropertyAccessMixed.class
+ImplicitFieldAccessBase.class
+ImplicitFieldAccessMappedSuperclass.class
+ImplicitFieldAccessSubclass.class
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=772058&r1=772057&r2=772058&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
Wed May 6 05:39:17 2009
@@ -23,6 +23,7 @@
import javax.persistence.criteria.Expression;
import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.QueryBuilder.In;
import org.apache.openjpa.kernel.exps.ExpressionFactory;
import org.apache.openjpa.kernel.exps.Value;
@@ -60,32 +61,37 @@
}
public Predicate in(Object... values) {
- // TODO Auto-generated method stub
- throw new AbstractMethodError();
+ In<X> result = new Expressions.In<X>(this);
+ for (Object v : values)
+ result.value((X)v);
+ return result;
}
public Predicate in(Expression<?>... values) {
- // TODO Auto-generated method stub
- throw new AbstractMethodError();
+ In<X> result = new Expressions.In<X>(this);
+ for (Expression<?> e : values)
+ result.value((Expression<? extends X>)e);
+ return result;
}
public Predicate in(Collection<?> values) {
- // TODO Auto-generated method stub
- throw new AbstractMethodError();
+ In<X> result = new Expressions.In<X>(this);
+ for (Object e : values)
+ result.value((X)e);
+ return result;
}
public Predicate in(Expression<?> values) {
- // TODO Auto-generated method stub
- throw new AbstractMethodError();
+ In<X> result = new Expressions.In<X>(this);
+ result.value((Expression<? extends X>)values);
+ return result;
}
public Predicate isNotNull() {
- // TODO Auto-generated method stub
- throw new AbstractMethodError();
+ return new Expressions.IsNotNull(this);
}
public Predicate isNull() {
- // TODO Auto-generated method stub
- throw new AbstractMethodError();
+ 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=772058&r1=772057&r2=772058&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 May 6 05:39:17 2009
@@ -24,6 +24,7 @@
import java.util.List;
import javax.persistence.criteria.Expression;
+import javax.persistence.criteria.Predicate;
import javax.persistence.criteria.QueryBuilder;
import javax.persistence.criteria.QueryBuilder.Trimspec;
@@ -700,12 +701,45 @@
}
}
- public static class In<T> extends PredicateImpl
+ public static class IsNull extends PredicateImpl {
+ ExpressionImpl<?> e;
+ public IsNull(ExpressionImpl<?> e) {
+ super();
+ this.e = e;
+ }
+
+ @Override
+ org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+ ExpressionFactory factory, MetamodelImpl model) {
+ return factory.equal(
+ Expressions.toValue(e, factory, model),
+ factory.getNull());
+ }
+ }
+
+ public static class IsNotNull extends PredicateImpl {
+ ExpressionImpl<?> e;
+ public IsNotNull(ExpressionImpl<?> e) {
+ super();
+ this.e = e;
+ }
+
+ @Override
+ org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+ ExpressionFactory factory, MetamodelImpl model) {
+ return factory.notEqual(
+ Expressions.toValue(e, factory, model),
+ factory.getNull());
+ }
+ }
+
+
+ public static class In<T> extends PredicateImpl.Or
implements QueryBuilder.In<T> {
- private List<Expression<? extends T>> values =
- new ArrayList<Expression<? extends T>>();
+ ExpressionImpl<?> e;
public In(Expression<?> e) {
- super(null);
+ super((Predicate[])null);
+ this.e = (ExpressionImpl<?>)e;
}
public Expression<T> getExpression() {
@@ -713,12 +747,22 @@
}
public In<T> value(T value) {
- return value(new Constant<T>(value));
+ add(new Expressions.Equal(e,value));
+ return this;
}
public In<T> value(Expression<? extends T> value) {
- values.add(value);
+ add(new Expressions.Equal(e,value));
return this;
}
+
+ @Override
+ org.apache.openjpa.kernel.exps.Expression toKernelExpression(
+ ExpressionFactory factory, MetamodelImpl model) {
+ IsNotNull notNull = new Expressions.IsNotNull(e);
+ return factory.and(
+ super.toKernelExpression(factory, model),
+ notNull.toKernelExpression(factory, model));
+ }
}
}
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=772058&r1=772057&r2=772058&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 May 6 05:39:17 2009
@@ -44,8 +44,10 @@
protected PredicateImpl(BooleanOperator op, Predicate...restrictions) {
this(op);
- for (Predicate p : restrictions)
- add((PredicateImpl)p);
+ if (restrictions != null) {
+ for (Predicate p : restrictions)
+ add((PredicateImpl)p);
+ }
}
public PredicateImpl add(Expression<Boolean> s) {
@@ -70,7 +72,8 @@
public PredicateImpl negate() {
PredicateImpl not = new PredicateImpl(_op);
not._negated = true;
- not._exps = new ArrayList<Expression<Boolean>>(this._exps);
+ if (_exps != null)
+ not._exps = new ArrayList<Expression<Boolean>>(this._exps);
not._op = this._op;
return not;
}
@@ -90,13 +93,14 @@
org.apache.openjpa.kernel.exps.Expression ke2 =
e2.toKernelExpression(factory, model);
org.apache.openjpa.kernel.exps.Expression result =
- _op == BooleanOperator.AND ?
- factory.and(ke1,ke2) : factory.or(ke1, ke2);
+ _op == BooleanOperator.AND
+ ? factory.and(ke1,ke2) : factory.or(ke1, ke2);
for (int i = 2; i < _exps.size(); i++) {
ExpressionImpl<?> e = (ExpressionImpl<?>)_exps.get(i);
- result = factory.and(result,
- e.toKernelExpression(factory, model));
+ result = _op == BooleanOperator.AND
+ ? factory.and(result, e.toKernelExpression(factory, model))
+ : factory.or(result, e.toKernelExpression(factory, model));
}
return _negated ? factory.not(result) : result;
}
@@ -119,7 +123,7 @@
}
public Or(Predicate...restrictions) {
- super(BooleanOperator.AND, restrictions);
+ super(BooleanOperator.OR, restrictions);
}
}
}