You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2010/03/11 15:05:17 UTC

svn commit: r921854 - in /cayenne/main/trunk: docs/doc/src/main/resources/ framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/ framework/cayenne-jdk1.5-unpublishe...

Author: aadamchik
Date: Thu Mar 11 14:05:17 2010
New Revision: 921854

URL: http://svn.apache.org/viewvc?rev=921854&view=rev
Log:
CAY-1402 Ability to use Terminating @size in Nested Properties Against Collections

* Patch by Andrew Lindsey
* Code refactoring
* Unit tests

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneTest.java
      - copied, changed from r921836, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/CayenneTest.xml
      - copied, changed from r921836, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml
Removed:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml
Modified:
    cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/Cayenne.java

Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=921854&r1=921853&r2=921854&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Thu Mar 11 14:05:17 2010
@@ -32,6 +32,7 @@ CAY-1374 Add parent dataMap property to 
 CAY-1380 Support for Escaped LIKE Clauses in Expressions
 CAY-1393 Update velocity to 1.6.3
 CAY-1394 DI-based replacement for JNDI hack
+CAY-1402 Ability to use Terminating @size in Nested Properties Against Collections
 
 Bug Fixes Since 3.0:
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/Cayenne.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/Cayenne.java?rev=921854&r1=921853&r2=921854&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/Cayenne.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/Cayenne.java Thu Mar 11 14:05:17 2010
@@ -49,6 +49,14 @@ import org.apache.cayenne.reflect.Proper
  * @since 3.1 
  */
 public final class Cayenne {
+    
+    /**
+     * A special property denoting a size of the to-many collection, when encountered at
+     * the end of the path</p>
+     * 
+     * @since 3.1
+     */
+    final static String PROPERTY_COLLECTION_SIZE = "@size";
 
     /**
      * Returns mapped ObjEntity for object. If an object is transient or is not
@@ -160,30 +168,38 @@ public final class Cayenne {
                     tokenIndex);
         }
         else if (property instanceof Collection) {
-            /**
-             * Support for collection property in the middle of the path
-             */
+            
+            Collection<?> collection = (Collection) property;
+            
+            if (tokenIndex < tokenizedPath.length - 1) {
+                if (tokenizedPath[tokenIndex + 1].equals(PROPERTY_COLLECTION_SIZE)) {
+                    return collection.size();
+                }
+            }
+
+            // Support for collection property in the middle of the path
             Collection<Object> result = property instanceof List
                     ? new ArrayList<Object>()
                     : new HashSet<Object>();
-            for (Object obj : (Collection<?>) property) {
-                if (obj instanceof CayenneDataObject) {
-                    Object rest = readNestedProperty(
-                            (CayenneDataObject) obj,
+            for (Object object : collection) {
+                if (object instanceof CayenneDataObject) {
+
+                    Object tail = readNestedProperty(
+                            (CayenneDataObject) object,
                             path,
                             tokenizedPath,
                             tokenIndex + 1,
                             tokenIndex);
-                    if (rest instanceof Collection) {
-                        /**
-                         * We don't want nested collections. E.g.
-                         * readNestedProperty("paintingArray.paintingTitle") should return
-                         * List<String>
-                         */
-                        result.addAll((Collection<?>) rest);
+
+                    if (tail instanceof Collection) {
+
+                        // We don't want nested collections. E.g.
+                        // readNestedProperty("paintingArray.paintingTitle")
+                        // should return List<String>
+                        result.addAll((Collection<?>) tail);
                     }
                     else {
-                        result.add(rest);
+                        result.add(tail);
                     }
                 }
             }

Copied: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneTest.java (from r921836, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneTest.java?p2=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneTest.java&p1=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java&r1=921836&r2=921854&rev=921854&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/DataObjectUtilsTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/CayenneTest.java Thu Mar 11 14:05:17 2010
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -37,11 +38,10 @@ import org.apache.cayenne.query.EJBQLQue
 import org.apache.cayenne.query.ObjectIdQuery;
 import org.apache.cayenne.query.SQLTemplate;
 import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.test.TableHelper;
 import org.apache.cayenne.unit.CayenneCase;
 
-/**
- */
-public class DataObjectUtilsTest extends CayenneCase {
+public class CayenneTest extends CayenneCase {
 
     @Override
     protected void setUp() throws Exception {
@@ -49,6 +49,30 @@ public class DataObjectUtilsTest extends
         deleteTestData();
     }
 
+    public void testReadNestedProperty_ToMany() throws Exception {
+
+        TableHelper artistHelper = new TableHelper(getDbHelper(), "ARTIST");
+        artistHelper.setColumns("ARTIST_ID", "ARTIST_NAME");
+        artistHelper.insert(1, "a");
+
+        TableHelper paintingHelper = new TableHelper(getDbHelper(), "PAINTING");
+        paintingHelper.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE");
+        paintingHelper.insert(1, 1, "a1");
+        paintingHelper.insert(2, 1, "a2");
+
+        Artist a = Cayenne.objectForPK(createDataContext(), Artist.class, 1);
+        Collection<String> titles = (Collection<String>) Cayenne.readNestedProperty(
+                a,
+                "paintingArray.paintingTitle");
+
+        assertEquals(2, titles.size());
+        assertTrue(titles.contains("a1"));
+        assertTrue(titles.contains("a2"));
+        
+        int size = (Integer) Cayenne.readNestedProperty(a, "paintingArray.@size");
+        assertEquals(2, size);
+    }
+
     public void testScalarObjectForQuery() throws Exception {
         createTestData("testScalarObjectForQuery");
         DataContext context = createDataContext();
@@ -57,8 +81,12 @@ public class DataObjectUtilsTest extends
 
         DataMap map = getDomain().getMap("testmap");
         SQLTemplate query = new SQLTemplate(map, sql);
-        query.setTemplate(FrontBaseAdapter.class.getName(), "SELECT COUNT(ARTIST_ID) AS X FROM ARTIST");
-        query.setTemplate(OpenBaseAdapter.class.getName(), "SELECT COUNT(ARTIST_ID) AS X FROM ARTIST");
+        query.setTemplate(
+                FrontBaseAdapter.class.getName(),
+                "SELECT COUNT(ARTIST_ID) AS X FROM ARTIST");
+        query.setTemplate(
+                OpenBaseAdapter.class.getName(),
+                "SELECT COUNT(ARTIST_ID) AS X FROM ARTIST");
         query.setColumnNamesCapitalization(CapsStrategy.UPPER);
 
         SQLResult rsMap = new SQLResult();
@@ -70,16 +98,18 @@ public class DataObjectUtilsTest extends
         assertTrue(object instanceof Number);
         assertEquals(2, ((Number) object).intValue());
     }
-    
+
     public void testScalarObjectForQuery2() throws Exception {
         createTestData("testScalarObjectForQuery");
         DataContext context = createDataContext();
-        
+
         String ejbql = "SELECT count(a) from Artist a";
         EJBQLQuery query = new EJBQLQuery(ejbql);
         Object object = Cayenne.objectForQuery(context, query);
         assertNotNull(object);
-        assertTrue("Object class: " + object.getClass().getName(), object instanceof Number);
+        assertTrue(
+                "Object class: " + object.getClass().getName(),
+                object instanceof Number);
         assertEquals(2, ((Number) object).intValue());
     }
 
@@ -128,11 +158,9 @@ public class DataObjectUtilsTest extends
         assertSame(o2, Cayenne.objectForPK(context, o2.getObjectId()));
 
         try {
-            assertNull(Cayenne.objectForPK(context, new ObjectId(
-                    "Artist",
-                    new byte[] {
-                            1, 2, 3
-                    })));
+            assertNull(Cayenne.objectForPK(context, new ObjectId("Artist", new byte[] {
+                    1, 2, 3
+            })));
 
             fail("An attempt to fetch an object for "
                     + "the non-existent temp id should have failed...");
@@ -197,10 +225,7 @@ public class DataObjectUtilsTest extends
         Map pk = new HashMap();
         pk.put(CompoundPkTestEntity.KEY1_PK_COLUMN, "PK1");
         pk.put(CompoundPkTestEntity.KEY2_PK_COLUMN, "PK2");
-        Object object = Cayenne.objectForPK(
-                context,
-                CompoundPkTestEntity.class,
-                pk);
+        Object object = Cayenne.objectForPK(context, CompoundPkTestEntity.class, pk);
 
         assertNotNull(object);
         assertTrue(object instanceof CompoundPkTestEntity);

Copied: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/CayenneTest.xml (from r921836, cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml)
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/CayenneTest.xml?p2=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/CayenneTest.xml&p1=cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/DataObjectUtilsTest.xml&r1=921836&r2=921854&rev=921854&view=diff
==============================================================================
    (empty)