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/07/30 21:56:52 UTC

svn commit: r799432 - in /openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria: CriteriaTest.java Person.java results/TestMultiselect.java

Author: ppoddar
Date: Thu Jul 30 19:56:52 2009
New Revision: 799432

URL: http://svn.apache.org/viewvc?rev=799432&view=rev
Log:
OPENJPA-1013: Add tests for multiselect()

Added:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/results/TestMultiselect.java   (with props)
Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Person.java

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java?rev=799432&r1=799431&r2=799432&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/CriteriaTest.java Thu Jul 30 19:56:52 2009
@@ -59,8 +59,8 @@
     protected static OpenJPAEntityManagerFactorySPI emf;
     protected static SQLAuditor auditor;
     
-    CriteriaBuilder cb;
-    EntityManager em;
+    protected CriteriaBuilder cb;
+    protected EntityManager em;
     
     protected static Class[] CLASSES = {
             Account.class,

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Person.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Person.java?rev=799432&r1=799431&r2=799432&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Person.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/Person.java Thu Jul 30 19:56:52 2009
@@ -38,6 +38,14 @@
     
 	@ElementCollection
 	private Set<String> nickNames;
+	
+	protected Person() {
+	    this("?");
+	}
+	
+	public Person(String name) {
+	    setName(name);
+	}
 
     public int getId() {
         return id;

Added: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/results/TestMultiselect.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/results/TestMultiselect.java?rev=799432&view=auto
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/results/TestMultiselect.java (added)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/criteria/results/TestMultiselect.java Thu Jul 30 19:56:52 2009
@@ -0,0 +1,277 @@
+/*
+ * 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.results;
+
+import java.lang.reflect.Array;
+import java.util.List;
+
+import javax.persistence.PersistenceException;
+import javax.persistence.Tuple;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Root;
+
+import org.apache.openjpa.persistence.criteria.CriteriaTest;
+import org.apache.openjpa.persistence.criteria.Person;
+import org.apache.openjpa.persistence.criteria.Person_;
+import org.apache.openjpa.persistence.test.AllowFailure;
+
+
+/**
+ * Test variations of {@link CriteriaQuery#multiselect(java.util.List)} arguments.
+ * 
+ * @author Pinaki Poddar
+ *
+ */
+
+@AllowFailure(value=true, message="Tests:16 Errors:1 Failure:7")
+public class TestMultiselect extends CriteriaTest {
+    private static final Class[] CLASSES = {Person.class};
+    private static boolean initialized = false;
+    
+    @Override
+    public void setUp() {
+        super.setUp();
+        if (!initialized) {
+            createData();
+            initialized = true;
+        }
+    }
+    
+    @Override
+    protected Class[] getDomainClasses() {
+        return CLASSES;
+    }
+    
+    void createData() {
+        em.getTransaction().begin();
+        Person p = new Person("Test Result Shape");
+        em.persist(p);
+        em.getTransaction().commit();
+    }
+    
+    /**
+    * If the type of the criteria query is CriteriaQuery<Tuple>
+    * (i.e., a criteria query object created by either the 
+    * createTupleQuery method or by passing a Tuple class argument 
+    * to the createQuery method), a Tuple object corresponding to 
+    * the elements of the list passed to the multiselect method 
+    * will be instantiated and returned for each row that results 
+    * from the query execution.
+    * */
+    
+    public void testTupleQuery() {
+        CriteriaQuery<Tuple> q = cb.createTupleQuery();
+        Root<Person> p = q.from(Person.class); 
+        q.multiselect(p.get(Person_.name), p.get(Person_.id));
+        
+        assertResult(q, Tuple.class);
+    }
+    
+    public void testTupleQueryExplicit() {
+        CriteriaQuery<Tuple> q = cb.createQuery(Tuple.class);
+        Root<Person> p = q.from(Person.class); 
+        q.multiselect(p.get(Person_.name), p.get(Person_.id));
+        
+        assertResult(q, Tuple.class);
+    }
+  
+    //=======================================================================
+    
+    /**
+     * If the type of the criteria query is CriteriaQuery<X> for
+     * some user-defined class X (i.e., a criteria query object
+     * created by passing a X class argument to the createQuery 
+     * method), then the elements of the list passed to the
+     * multiselect method will be passed to the X constructor and 
+     * an instance of type X will be returned for each row.  
+     */
+    public void testUserResultQueryWithExplictProjectionOfConstructorArguments() {
+        CriteriaQuery<Person> q = cb.createQuery(Person.class);
+        Root<Person> p = q.from(Person.class); 
+        q.multiselect(p.get(Person_.name));
+        
+        assertResult(q, Person.class);
+    }
+    
+    public void testUserResultQueryWithImplicitProjection() {
+        CriteriaQuery<Person> q = cb.createQuery(Person.class);
+        Root<Person> p = q.from(Person.class); 
+        
+        assertResult(q, Person.class);
+    }
+
+    public void testUserResultQueryWithMismatchProjectionOfConstructorArguments() {
+        CriteriaQuery<Person> q = cb.createQuery(Person.class);
+        Root<Person> p = q.from(Person.class); 
+        q.multiselect(p.get(Person_.name), p.get(Person_.id));
+        
+        fail("Person has no constrcutor with (name,id)", q);
+    }
+    
+    // ======================================================================
+    /**
+     * If the type of the criteria query is CriteriaQuery<X[]> for
+     * some class X, an instance of type X[] will be returned for 
+     * each row.   The elements of the array will correspond to the 
+     * elements of the list passed to the multiselect method.  
+     */
+    
+    public void testUserClassArray() {
+        CriteriaQuery<Person[]> q = cb.createQuery(Person[].class);
+        Root<Person> p = q.from(Person.class); 
+        q.multiselect(p,p);
+        
+        assertResult(q, Person[].class, Person.class, Person.class);
+    }
+    
+    public void testBasicClassArray() {
+        CriteriaQuery<String[]> q = cb.createQuery(String[].class);
+        Root<Person> p = q.from(Person.class); 
+        q.multiselect(p.get(Person_.name), p.get(Person_.name));
+        
+        assertResult(q, String[].class);
+    }
+    
+    public void testTupleArray() {
+        CriteriaQuery<Tuple[]> q = cb.createQuery(Tuple[].class);
+        Root<Person> p = q.from(Person.class); 
+        q.multiselect(p.get(Person_.name), p.get(Person_.name));
+        
+        assertResult(q, Tuple[].class);
+    }
+// =================================================================    
+    /**
+     * If the type of the criteria query is CriteriaQuery<Object>
+     * or if the criteria query was created without specifying a 
+     * type, and the list passed to the multiselect method contains 
+     * only a single element, an instance of type Object will be 
+     * returned for each row.
+     */
+    public void testSingleObject() {
+        CriteriaQuery<Object> q = cb.createQuery(Object.class);
+        Root<Person> p = q.from(Person.class);
+        q.multiselect(p);
+        
+        assertResult(q, Object.class);
+    }
+    
+    public void testSingleObjectViaConstructor() {
+        CriteriaQuery<Object> q = cb.createQuery(Object.class);
+        Root<Person> p = q.from(Person.class);
+        q.multiselect(cb.construct(Person.class, p.get(Person_.name)));
+        
+        assertResult(q, Object.class);
+    }
+    
+    public void testSingleObjectAsProperty() {
+        CriteriaQuery<Object> q = cb.createQuery(Object.class);
+        Root<Person> p = q.from(Person.class);
+        q.multiselect(p.get(Person_.name));
+        
+        assertResult(q, Object.class);
+    }
+    
+    public void testSingleObjectImplicit() {
+        CriteriaQuery<?> q = cb.createQuery();
+        Root<Person> p = q.from(Person.class);
+        q.multiselect(p);
+        
+        assertResult(q, Object.class);
+    }
+    
+    public void testSingleObjectViaConstructorImplicit() {
+        CriteriaQuery<?> q = cb.createQuery();
+        Root<Person> p = q.from(Person.class);
+        q.multiselect(cb.construct(Person.class, p.get(Person_.name)));
+        
+        assertResult(q, Object.class);
+    }
+    
+    public void testSingleObjectAsPropertyImplicit() {
+        CriteriaQuery<?> q = cb.createQuery();
+        Root<Person> p = q.from(Person.class);
+        q.multiselect(p.get(Person_.name));
+        
+        assertResult(q, Object.class);
+    }
+
+// ================================================================================
+    /**
+     * If the type of the criteria query is CriteriaQuery<Object>
+     * or if the criteria query was created without specifying a 
+     * type, and the list passed to the multiselect method contains 
+     * more than one element, an instance of type Object[] will be 
+     * instantiated and returned for each row.  The elements of the 
+     * array will correspond to the elements of the list passed to
+     * the multiselect method.
+     */
+    public void testSingleObjectMultipleProjections() {
+        CriteriaQuery<Object> q = cb.createQuery(Object.class);
+        Root<Person> p = q.from(Person.class);
+        q.multiselect(p.get(Person_.name), p.get(Person_.id));
+        
+        assertResult(q, Object[].class, String.class, Integer.class);
+    }
+    
+    public void testSingleObjectMultipleProjectionsAndConstructor() {
+        CriteriaQuery<Object> q = cb.createQuery(Object.class);
+        Root<Person> p = q.from(Person.class);
+        q.multiselect(cb.construct(Person.class, p.get(Person_.name)), p.get(Person_.id), p.get(Person_.name));
+        
+        assertResult(q, Object[].class, Person.class, Integer.class, String.class);
+    }
+    
+    /**
+     * An element of the list passed to the multiselect method 
+     * must not be a tuple- or array-valued compound selection item. 
+     */
+    
+    
+// =============== assertions by result types ========================
+    
+    void assertResult(CriteriaQuery<?> q, Class<?> resultClass) {
+        assertResult(q, resultClass, (Class<?>[])null);
+    }
+    /**
+     * Assert the query result elements by their types 
+     */
+    void assertResult(CriteriaQuery<?> q, Class<?> resultClass, Class<?>... arrayElementClasses) {
+        List<?> result = em.createQuery(q).getResultList();
+        assertFalse(result.isEmpty());
+        for (Object row : result) {
+            assertTrue(row.getClass() + " does not match actual result " + resultClass, resultClass.isInstance(row));
+            if (resultClass.isArray() && arrayElementClasses != null) {
+                for (int i = 0; i < arrayElementClasses.length; i++) {
+                    Object element = Array.get(row, i);
+                    assertTrue(i + "-th array element " + arrayElementClasses[i] + " does not match actual result " 
+                       + element.getClass(), arrayElementClasses[i].isInstance(element));
+                }
+            }
+        }
+    }
+    
+    void fail(String msg, CriteriaQuery<?> q) {
+        try {
+            em.createQuery(q).getResultList();
+            fail("Expected to fail " + msg);
+        } catch (PersistenceException e) {
+            // this is an expected exception
+        }
+    }
+}

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