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);
        }
     }
 }


Reply via email to