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/02 21:47:11 UTC

svn commit: r810685 - 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: ppoddar
Date: Wed Sep  2 19:47:10 2009
New Revision: 810685

URL: http://svn.apache.org/viewvc?rev=810685&view=rev
Log:
OPENJPA-1276: preserve precedence order while rendering logical operators/operands

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCQL.java   (with props)
Modified:
    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/PredicateImpl.java

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCQL.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCQL.java?rev=810685&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCQL.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCQL.java Wed Sep  2 19:47:10 2009
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.openjpa.persistence.criteria;
+
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+
+/**
+ * Test logical predicates precedence is preserved and rendered correctly in CQL.
+ * 
+ * @author Pinaki Poddar
+ *
+ */
+public class TestCQL extends CriteriaTest {
+    public void testLogicalPrecedence() {
+        OpenJPACriteriaQuery<Person> q = cb.createQuery(Person.class);
+        Root<Person> p = q.from(Person.class);
+        q.select(p);
+        Predicate a = cb.equal(p.get(Person_.name), "A");
+        Predicate b = cb.equal(p.get(Person_.name), "B");
+        Predicate c = cb.equal(p.get(Person_.name), "C");
+        Predicate d = cb.equal(p.get(Person_.name), "D");
+        
+        // (a OR b) AND (c or D)
+        q.where(cb.or(a,b), cb.or(c,d));
+        
+        String jpql = "";
+        // The strings are compared for exact match so be careful about spaces and such... 
+        jpql = "SELECT p FROM Person p WHERE ((p.name = 'A' OR p.name = 'B') AND (p.name = 'C' OR p.name = 'D'))";
+        assertEquivalence(q, jpql);
+        assertEquals(jpql, q.toCQL());
+        
+        // (a OR b or C) AND D
+        q.where(cb.or(a,b,c), d);
+        jpql = "SELECT p FROM Person p WHERE ((p.name = 'A' OR p.name = 'B' OR p.name = 'C') AND p.name = 'D')";
+        assertEquivalence(q, jpql);
+        assertEquals(jpql, q.toCQL());
+        
+        // a AND (b OR c) AND d 
+        q.where(a, cb.or(b,c), d);
+        jpql = "SELECT p FROM Person p WHERE (p.name = 'A' AND (p.name = 'B' OR p.name = 'C') AND p.name = 'D')";
+        assertEquivalence(q, jpql);
+        assertEquals(jpql, q.toCQL());
+        
+        // a OR (b AND (c OR d)) 
+        q.where(cb.or(a, cb.and(b, cb.or(c,d))));
+        jpql = "SELECT p FROM Person p WHERE (p.name = 'A' OR (p.name = 'B' AND (p.name = 'C' OR p.name = 'D')))";
+        assertEquivalence(q, jpql);
+        assertEquals(jpql, q.toCQL());
+    }
+}

Propchange: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/TestCQL.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=810685&r1=810684&r2=810685&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 Wed Sep  2 19:47:10 2009
@@ -92,7 +92,7 @@
      *  @param resultClass  type of the query result
      *  @return query object
      */
-    public <T> CriteriaQuery<T> createQuery(Class<T> resultClass) {
+    public <T> OpenJPACriteriaQuery<T> createQuery(Class<T> resultClass) {
         return new CriteriaQueryImpl<T>(_model, resultClass);
     }
 
@@ -101,7 +101,7 @@
      *  objects as its result.
      *  @return query object
      */
-    public CriteriaQuery<Tuple> createTupleQuery() {
+    public OpenJPACriteriaQuery<Tuple> createTupleQuery() {
         return new CriteriaQueryImpl<Tuple>(_model, Tuple.class);
     }
 
@@ -498,7 +498,7 @@
     }
 
     public Predicate or(Predicate... restrictions) {
-        return new PredicateImpl.Or();
+        return new PredicateImpl.Or(restrictions);
     }
 
     public Predicate or(Expression<Boolean> x, Expression<Boolean> y) {

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=810685&r1=810684&r2=810685&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 Sep  2 19:47:10 2009
@@ -141,8 +141,11 @@
     }
     
     public StringBuilder asValue(CriteriaQueryImpl<?> q) {
-        return Expressions.asValue(q, _exps == null ? null : _exps.toArray(new Expression<?>[_exps.size()]), 
-            " " +_op + " ");
+        boolean braces = _exps != null && _exps.size() > 1;
+        StringBuilder buffer =  Expressions.asValue(q, _exps == null ? null : 
+            _exps.toArray(new Expression<?>[_exps.size()]), " " +_op + " ");
+        if (braces) buffer.insert(0, "(").append(")");
+        return buffer;
     }