Return-Path: Delivered-To: apmail-openjpa-commits-archive@www.apache.org Received: (qmail 41947 invoked from network); 19 May 2009 21:51:03 -0000 Received: from hermes.apache.org (HELO mail.apache.org) (140.211.11.3) by minotaur.apache.org with SMTP; 19 May 2009 21:51:03 -0000 Received: (qmail 58225 invoked by uid 500); 19 May 2009 20:04:36 -0000 Delivered-To: apmail-openjpa-commits-archive@openjpa.apache.org Received: (qmail 58196 invoked by uid 500); 19 May 2009 20:04:36 -0000 Mailing-List: contact commits-help@openjpa.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@openjpa.apache.org Delivered-To: mailing list commits@openjpa.apache.org Received: (qmail 58187 invoked by uid 99); 19 May 2009 20:04:36 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 19 May 2009 20:04:36 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=10.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 19 May 2009 20:04:32 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id EBFDD23888AD; Tue, 19 May 2009 20:04:10 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: 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/ Date: Tue, 19 May 2009 20:04:10 -0000 To: commits@openjpa.apache.org From: faywang@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20090519200410.EBFDD23888AD@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org 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 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 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 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 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 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 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 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 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 str; ExpressionImpl pattern; ExpressionImpl escapeChar; - static ExpressionImpl defaultEscape = - new Constant(new Character(' ')); public Like(Expression x, Expression pattern, Expression escapeChar) { @@ -711,11 +709,11 @@ } public Like(Expression x, Expression pattern) { - this(x, pattern, defaultEscape); + this(x, pattern, null); } public Like(Expression x, String pattern) { - this(x, new Constant(pattern), defaultEscape); + this(x, new Constant(pattern), null); } public Like(Expression x, String pat, Expression 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 extends PredicateImpl.Or implements QueryBuilder.In { 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 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)); } }