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)