You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by fa...@apache.org on 2009/05/19 22:04:10 UTC

svn commit: r776435 - in /openjpa/trunk: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/ openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/

Author: faywang
Date: Tue May 19 20:04:10 2009
New Revision: 776435

URL: http://svn.apache.org/viewvc?rev=776435&view=rev
Log:
OPENJPA-1013: NOT IN/ IS (NOT) NULL/LIKE support

Modified:
    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/CriteriaQueryImpl.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/criteria/Expressions.java

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=776435&r1=776434&r2=776435&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 Tue May 19 20:04:10 2009
@@ -54,8 +54,6 @@
  * The test scenarios are from TestEJBQLCondExpression in 
  * org.apache.openjpa.persistence.jpql.expressions. 
  * 
- * @author Fay Wang
- *
  */
 public class TestTypeSafeCondExpression extends SQLListenerTestCase {
 
@@ -114,7 +112,7 @@
         String query = "SELECT o FROM CompUser o";
         CriteriaQuery c = cb.create();
         c.from(CompUser.class);
-
+        assertEquivalence(c, query);
         List result = em.createQuery(c).getResultList();
 
         assertNotNull("the list is null", result);
@@ -132,7 +130,7 @@
         q.where(cb.and(cb.between(c.get(CompUser_.age), 19, 40), 
                 cb.equal(c.get(CompUser_.computerName), "PC")));
         q.select(c.get(CompUser_.name));
-
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("the list is null", result);
@@ -153,6 +151,7 @@
         q.where(cb.and(cb.between(c.get(CompUser_.age), 19, 40).negate(), 
                 cb.equal(c.get(CompUser_.computerName), "PC")));
         q.select(c.get(CompUser_.name));
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("the list is null", result);
@@ -168,7 +167,7 @@
         Root<CompUser> c = q.from(CompUser.class);
         q.where(cb.in(c.get(CompUser_.age)).value(29).value(40).value(10));
         q.select(c.get(CompUser_.name));
-
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("the list is null", result);
@@ -188,6 +187,7 @@
         Root<CompUser> c = q.from(CompUser.class);
         q.where(cb.in(c.get(CompUser_.age)).value(29).value(40).value(10).negate());
         q.select(c.get(CompUser_.name));
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull(result);
@@ -198,7 +198,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testLikeExprUsingCriteria1() {
         String query =
             "SELECT o.computerName FROM CompUser o WHERE o.name LIKE 'Sha%' AND " + 
@@ -206,10 +205,13 @@
 
         CriteriaQuery q = cb.create();
         Root<CompUser> c = q.from(CompUser.class);
-        q.where(cb.and(cb.like(c.get(CompUser_.name),"Sha%")), 
-                cb.in(c.get(CompUser_.computerName)).value("PC").negate());
-        q.select(c.get(CompUser_.computerName));
+        q.where(cb.and(
+                    cb.like(c.get(CompUser_.name),"Sha%"), 
+                    cb.in(c.get(CompUser_.computerName)).value("PC").negate()
+                ));
         
+        q.select(c.get(CompUser_.computerName));
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull(result);
@@ -225,10 +227,12 @@
 
         CriteriaQuery q = cb.create();
         Root<CompUser> c = q.from(CompUser.class);
-        q.where(cb.and(cb.like(c.get(CompUser_.name),"Sha%o_")), 
-                cb.in(c.get(CompUser_.computerName)).value("PC").negate());
+        q.where(cb.and(
+                    cb.like(c.get(CompUser_.name),"Sha%o_"), 
+                    cb.in(c.get(CompUser_.computerName)).value("PC").negate()
+                ));
         q.select(c.get(CompUser_.computerName));
-
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull(result);
@@ -244,6 +248,7 @@
         Root<CompUser> c = q.from(CompUser.class);
         q.where(cb.like(c.get(CompUser_.name),"_J%"));
         q.select(c.get(CompUser_.name));
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull(result);
@@ -259,7 +264,7 @@
         Parameter<String> param = cb.parameter(String.class);
         q.where(cb.like(c.get(CompUser_.name), param, '|'));
         q.select(c.get(CompUser_.name));
-
+        assertEquivalence(q, query);
         List result = em.createQuery(q).setParameter(1, "%|_%").getResultList();
 
         assertNotNull(result);
@@ -268,7 +273,6 @@
         em.clear();
     }
 
-    @AllowFailure
     public void testNullExprUsingCriteria() {
         String query =
             "SELECT o.name FROM CompUser o WHERE o.age IS NOT NULL AND o.computerName = 'PC' ";
@@ -278,7 +282,7 @@
         q.where(cb.and(cb.notEqual(c.get(CompUser_.age), null), 
                 cb.equal(c.get(CompUser_.computerName), "PC")));
         q.select(c.get(CompUser_.name));
-
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("the list is null", result);
@@ -290,7 +294,6 @@
         em.clear();
     }
     
-    @AllowFailure
     public void testNullExpr2UsingCriteria() {
         String query =
             "SELECT o.name FROM CompUser o WHERE o.address.country IS NULL";
@@ -300,7 +303,7 @@
         Parameter<String> param = cb.parameter(String.class);
         q.where(cb.equal(c.get(CompUser_.address).get(Address_.country), null));
         q.select(c.get(CompUser_.name));
-
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("the list is null", result);
@@ -319,7 +322,7 @@
         Root<CompUser> c = q.from(CompUser.class);
         //q.where(cb.isNotEmpty(c.get(CompUser_.nicknames)));
         q.select(c);
-
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("the list is null", result);
@@ -342,7 +345,7 @@
         sq.where(cb.equal(c, o.get(CompUser_.address)));
         q.where(cb.exists(sq));
         q.select(o.get(CompUser_.name)).distinct(true);
-                
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("the list is null", result);
@@ -371,7 +374,7 @@
                 o.get(CompUser_.address).get(Address_.country)));
         q.where(cb.exists(sq).negate());
         q.select(o.get(CompUser_.name)).distinct(true);
-
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("list is null", result);
@@ -394,6 +397,7 @@
         sq.select(s.get(CompUser_.computerName));
         sq.where(cb.notEqual(s.get(CompUser_.address).get(Address_.country), null));
         q.where(cb.equal(o.get(CompUser_.address).get(Address_.zipCode), cb.any(sq)));
+        assertEquivalence(q, query);
         List result = em.createQuery(q).getResultList();
 
         assertNotNull("list is null", result);
@@ -434,6 +438,21 @@
         em.getTransaction().commit();
     }
     
+    void assertEquivalence(CriteriaQuery c, String jpql) {
+        
+        sql.clear(); 
+        List cList = em.createQuery(c).getResultList();
+        assertEquals(1, sql.size()); 
+        String cSQL = sql.get(0);
+        
+        sql.clear();
+        List jList = em.createQuery(jpql).getResultList();
+        assertEquals(1, sql.size());
+        String jSQL = sql.get(0);
+
+        assertEquals(jSQL, cSQL);
+    }
+
     public CompUser createUser(String name, String cName, Address add, int age,
         boolean isMale) {
         CompUser user = null;

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=776435&r1=776434&r2=776435&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 Tue May 19 20:04:10 2009
@@ -46,9 +46,6 @@
  * asserting that the resultant SQL queries for these two alternative form
  * of executing a query are the same.
  * 
- * 
- *  
- * @author Pinaki Poddar
  *
  */
 public class TestTypesafeCriteria extends SQLListenerTestCase {

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=776435&r1=776434&r2=776435&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 Tue May 19 20:04:10 2009
@@ -288,8 +288,9 @@
     }
 
     void setImplicitTypes(Value val1, Value val2, Class<?> expected) {
-        Class<?> c1 = val1.getType();
-        Class<?> c2 = val2.getType();
+        Class<?> c1 = (val1 == null ? null : val1.getType());
+        Class<?> c2 = (val2 == null ? null : val2.getType());
+        
         boolean o1 = c1 == AbstractExpressionBuilder.TYPE_OBJECT;
         boolean o2 = c2 == AbstractExpressionBuilder.TYPE_OBJECT;
 
@@ -305,8 +306,9 @@
             // we never expect a pc type, so don't bother with metadata
             val1.setImplicitType(expected);
             val2.setImplicitType(expected);
-        } else if (AbstractExpressionBuilder.isNumeric(val1.getType()) 
-            != AbstractExpressionBuilder.isNumeric(val2.getType())) {
+        } else if (c1 != null && c2 != null && 
+            AbstractExpressionBuilder.isNumeric(c1) 
+            != AbstractExpressionBuilder.isNumeric(c2)) {
             AbstractExpressionBuilder.convertTypes(val1, val2);
         }
 

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=776435&r1=776434&r2=776435&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 Tue May 19 20:04:10 2009
@@ -40,8 +40,8 @@
 	
 	static Value toValue(ExpressionImpl<?> e, ExpressionFactory factory, 
 		MetamodelImpl model, CriteriaQuery q) {
-		Value v = e.toValue(factory, model, q);
-		return v;
+		return (e == null ? factory.getNull() : 
+		    e.toValue(factory, model, q));
 	}
 	
 	/**
@@ -695,8 +695,6 @@
     	ExpressionImpl<String> str;
     	ExpressionImpl<String> pattern;
     	ExpressionImpl<Character> escapeChar;
-    	static ExpressionImpl<Character> defaultEscape = 
-    		new Constant<Character>(new Character(' '));
     	
     	public Like(Expression<String> x, Expression<String> pattern,
     	        Expression<Character> escapeChar) {
@@ -711,11 +709,11 @@
     	}
     	
     	public Like(Expression<String> x, Expression<String> pattern) {
-    		this(x, pattern, defaultEscape);
+    		this(x, pattern, null);
     	}
     	
     	public Like(Expression<String> x, String pattern) {
-    		this(x, new Constant<String>(pattern), defaultEscape);
+    		this(x, new Constant<String>(pattern), null);
     	}
     	public Like(Expression<String> x, String pat,  
     		Expression<Character> esc) {
@@ -729,10 +727,12 @@
         public org.apache.openjpa.kernel.exps.Expression toKernelExpression(
         	ExpressionFactory factory, MetamodelImpl model, 
         	CriteriaQuery q) {
+    	    String escapeStr = escapeChar == null ? null :
+    	        Expressions.toValue(escapeChar, factory, model, q).toString();
             return factory.matches(
             	Expressions.toValue(str, factory, model, q), 
             	Expressions.toValue(pattern, factory, model, q), "_", "%", 
-            	Expressions.toValue(escapeChar, factory, model, q).toString());
+            	escapeStr);
         }
     }
     
@@ -808,6 +808,7 @@
     public static class In<T> extends PredicateImpl.Or 
     	implements QueryBuilder.In<T> {
     	ExpressionImpl<?> e;
+    	boolean negate;
     	public In(Expression<?> e) {
     		super((Predicate[])null);
     		this.e = (ExpressionImpl<?>)e;
@@ -826,13 +827,23 @@
     		add(new Expressions.Equal(e,value));
         	return this;
     	}
+    	
+    	public In<T> negate() {
+    	    this.negate = true;
+    	    return this;
+    	}
     
     	@Override
         org.apache.openjpa.kernel.exps.Expression toKernelExpression(
             ExpressionFactory factory, MetamodelImpl model, CriteriaQuery q) {
+    	    org.apache.openjpa.kernel.exps.Expression inExpr = 
+    	        super.toKernelExpression(factory, model, q); 
     		IsNotNull notNull = new Expressions.IsNotNull(e);
+    		if (negate) 
+    		    inExpr = factory.not(inExpr);
+    		
     		return factory.and(
-     		    super.toKernelExpression(factory, model, q),
+    		    inExpr,
     		    notNull.toKernelExpression(factory, model, q));
     	}
     }