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 2014/11/02 08:10:28 UTC
[40/48] Installing Maven Failsafe Plugin
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDeleteRulesIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDeleteRulesIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDeleteRulesIT.java
new file mode 100644
index 0000000..47b2ba3
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDeleteRulesIT.java
@@ -0,0 +1,250 @@
+/*****************************************************************
+ * 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.cayenne.access;
+
+import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.SQLTemplate;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.testdo.testmap.ArtGroup;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.testdo.testmap.ArtistExhibit;
+import org.apache.cayenne.testdo.testmap.Exhibit;
+import org.apache.cayenne.testdo.testmap.Gallery;
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.testdo.testmap.PaintingInfo;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.sql.Types;
+import java.util.List;
+
+// TODO: redefine all test cases in terms of entities in "relationships" map
+// and merge this test case with DeleteRulesTst that inherits
+// from RelationshipTestCase.
+@UseServerRuntime("cayenne-small-testmap.xml")
+public class DataContextDeleteRulesIT extends ServerCase {
+
+ @Inject
+ private DataContext context;
+
+ @Inject
+ private DBHelper dbHelper;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("PAINTING_INFO");
+ dbHelper.deleteAll("PAINTING");
+ dbHelper.deleteAll("ARTIST_EXHIBIT");
+ dbHelper.deleteAll("ARTIST_GROUP");
+ dbHelper.update("ARTGROUP").set("PARENT_GROUP_ID", null, Types.INTEGER).execute();
+ dbHelper.deleteAll("ARTGROUP");
+ dbHelper.deleteAll("ARTIST");
+ dbHelper.deleteAll("EXHIBIT");
+ dbHelper.deleteAll("GALLERY");
+ }
+
+ public void testNullifyToOne() {
+ // ArtGroup toParentGroup
+ ArtGroup parentGroup = (ArtGroup) context.newObject("ArtGroup");
+ parentGroup.setName("Parent");
+
+ ArtGroup childGroup = (ArtGroup) context.newObject("ArtGroup");
+ childGroup.setName("Child");
+ parentGroup.addToChildGroupsArray(childGroup);
+
+ // Check to make sure that the relationships are both exactly correct
+ // before starting. We're not really testing this, but it is imperative
+ // that it is correct before testing the real details.
+ assertEquals(parentGroup, childGroup.getToParentGroup());
+ assertTrue(parentGroup.getChildGroupsArray().contains(childGroup));
+
+ // Always good to commit before deleting... bad things happen otherwise
+ context.commitChanges();
+
+ context.deleteObjects(childGroup);
+
+ // The things we are testing.
+ assertFalse(parentGroup.getChildGroupsArray().contains(childGroup));
+ // Although deleted, the property should be null (good cleanup policy)
+ // assertNull(childGroup.getToParentGroup());
+
+ // And be sure that the commit works afterwards, just for sanity
+ context.commitChanges();
+ }
+
+ /**
+ * Tests that deleting a source of a flattened relationship with CASCADE rule results
+ * in deleting a join and a target.
+ */
+ public void testCascadeToManyFlattened() {
+ // testing Artist.groupArray relationship
+ ArtGroup aGroup = context.newObject(ArtGroup.class);
+ aGroup.setName("Group Name");
+ Artist anArtist = context.newObject(Artist.class);
+ anArtist.setArtistName("A Name");
+ anArtist.addToGroupArray(aGroup);
+ assertTrue(anArtist.getGroupArray().contains(aGroup));
+
+ context.commitChanges();
+
+ SQLTemplate checkQuery = new SQLTemplate(
+ Artist.class,
+ "SELECT * FROM ARTIST_GROUP");
+ checkQuery.setFetchingDataRows(true);
+ List<?> joins1 = context.performQuery(checkQuery);
+ assertEquals(1, joins1.size());
+
+ context.deleteObjects(anArtist);
+
+ assertEquals(PersistenceState.DELETED, aGroup.getPersistenceState());
+ assertFalse(anArtist.getGroupArray().contains(aGroup));
+ context.commitChanges();
+
+ List<?> joins2 = context.performQuery(checkQuery);
+ assertEquals(0, joins2.size());
+ }
+
+ /**
+ * Tests that deleting a source of a flattened relationship with NULLIFY rule results
+ * in deleting a join together with the object deleted.
+ */
+ public void testNullifyToManyFlattened() {
+ // testing ArtGroup.artistArray relationship
+ ArtGroup aGroup = context.newObject(ArtGroup.class);
+ aGroup.setName("Group Name");
+ Artist anArtist = context.newObject(Artist.class);
+ anArtist.setArtistName("A Name");
+ aGroup.addToArtistArray(anArtist);
+
+ context.commitChanges();
+
+ // Preconditions
+ assertTrue(aGroup.getArtistArray().contains(anArtist));
+ assertTrue(anArtist.getGroupArray().contains(aGroup));
+
+ SQLTemplate checkQuery = new SQLTemplate(
+ Artist.class,
+ "SELECT * FROM ARTIST_GROUP");
+ checkQuery.setFetchingDataRows(true);
+ List<?> joins1 = context.performQuery(checkQuery);
+ assertEquals(1, joins1.size());
+
+ context.deleteObjects(aGroup);
+ assertFalse(anArtist.getGroupArray().contains(aGroup));
+ context.commitChanges();
+
+ List<?> joins2 = context.performQuery(checkQuery);
+ assertEquals(0, joins2.size());
+ }
+
+ public void testNullifyToMany() {
+ // ArtGroup childGroupsArray
+ ArtGroup parentGroup = (ArtGroup) context.newObject("ArtGroup");
+ parentGroup.setName("Parent");
+
+ ArtGroup childGroup = (ArtGroup) context.newObject("ArtGroup");
+ childGroup.setName("Child");
+ parentGroup.addToChildGroupsArray(childGroup);
+
+ // Preconditions - good to check to be sure
+ assertEquals(parentGroup, childGroup.getToParentGroup());
+ assertTrue(parentGroup.getChildGroupsArray().contains(childGroup));
+
+ context.commitChanges();
+
+ context.deleteObjects(parentGroup);
+
+ // The things we are testing.
+ assertNull(childGroup.getToParentGroup());
+
+ // Although deleted, the property should be null (good cleanup policy)
+ // assertFalse(parentGroup.getChildGroupsArray().contains(childGroup));
+ context.commitChanges();
+ }
+
+ public void testCascadeToOne() {
+ // Painting toPaintingInfo
+ Painting painting = (Painting) context.newObject("Painting");
+ painting.setPaintingTitle("A Title");
+
+ PaintingInfo info = (PaintingInfo) context.newObject("PaintingInfo");
+ painting.setToPaintingInfo(info);
+
+ // Must commit before deleting.. this relationship is dependent,
+ // and everything must be committed for certain things to work
+ context.commitChanges();
+
+ context.deleteObjects(painting);
+
+ // info must also be deleted
+ assertEquals(PersistenceState.DELETED, info.getPersistenceState());
+ assertNull(info.getPainting());
+ assertNull(painting.getToPaintingInfo());
+ context.commitChanges();
+ }
+
+ public void testCascadeToMany() {
+ // Artist artistExhibitArray
+ Artist anArtist = (Artist) context.newObject("Artist");
+ anArtist.setArtistName("A Name");
+ Exhibit anExhibit = (Exhibit) context.newObject("Exhibit");
+ anExhibit.setClosingDate(new java.sql.Timestamp(System.currentTimeMillis()));
+ anExhibit.setOpeningDate(new java.sql.Timestamp(System.currentTimeMillis()));
+
+ // Needs a gallery... required for data integrity
+ Gallery gallery = (Gallery) context.newObject("Gallery");
+ gallery.setGalleryName("A Name");
+
+ anExhibit.setToGallery(gallery);
+
+ ArtistExhibit artistExhibit = (ArtistExhibit) context.newObject("ArtistExhibit");
+
+ artistExhibit.setToArtist(anArtist);
+ artistExhibit.setToExhibit(anExhibit);
+ context.commitChanges();
+
+ context.deleteObjects(anArtist);
+
+ // Test that the link record was deleted, and removed from the relationship
+ assertEquals(PersistenceState.DELETED, artistExhibit.getPersistenceState());
+ assertFalse(anArtist.getArtistExhibitArray().contains(artistExhibit));
+ context.commitChanges();
+ }
+
+ public void testDenyToMany() {
+ // Gallery paintingArray
+ Gallery gallery = (Gallery) context.newObject("Gallery");
+ gallery.setGalleryName("A Name");
+ Painting painting = (Painting) context.newObject("Painting");
+ painting.setPaintingTitle("A Title");
+ gallery.addToPaintingArray(painting);
+ context.commitChanges();
+
+ try {
+ context.deleteObjects(gallery);
+ fail("Should have thrown an exception");
+ }
+ catch (Exception e) {
+ // GOOD!
+ }
+ context.commitChanges();
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDeleteRulesTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDeleteRulesTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDeleteRulesTest.java
deleted file mode 100644
index f734077..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDeleteRulesTest.java
+++ /dev/null
@@ -1,250 +0,0 @@
-/*****************************************************************
- * 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.cayenne.access;
-
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.SQLTemplate;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.testdo.testmap.ArtGroup;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.ArtistExhibit;
-import org.apache.cayenne.testdo.testmap.Exhibit;
-import org.apache.cayenne.testdo.testmap.Gallery;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.testdo.testmap.PaintingInfo;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-// TODO: redefine all test cases in terms of entities in "relationships" map
-// and merge this test case with DeleteRulesTst that inherits
-// from RelationshipTestCase.
-@UseServerRuntime("cayenne-small-testmap.xml")
-public class DataContextDeleteRulesTest extends ServerCase {
-
- @Inject
- private DataContext context;
-
- @Inject
- private DBHelper dbHelper;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("PAINTING_INFO");
- dbHelper.deleteAll("PAINTING");
- dbHelper.deleteAll("ARTIST_EXHIBIT");
- dbHelper.deleteAll("ARTIST_GROUP");
- dbHelper.update("ARTGROUP").set("PARENT_GROUP_ID", null, Types.INTEGER).execute();
- dbHelper.deleteAll("ARTGROUP");
- dbHelper.deleteAll("ARTIST");
- dbHelper.deleteAll("EXHIBIT");
- dbHelper.deleteAll("GALLERY");
- }
-
- public void testNullifyToOne() {
- // ArtGroup toParentGroup
- ArtGroup parentGroup = (ArtGroup) context.newObject("ArtGroup");
- parentGroup.setName("Parent");
-
- ArtGroup childGroup = (ArtGroup) context.newObject("ArtGroup");
- childGroup.setName("Child");
- parentGroup.addToChildGroupsArray(childGroup);
-
- // Check to make sure that the relationships are both exactly correct
- // before starting. We're not really testing this, but it is imperative
- // that it is correct before testing the real details.
- assertEquals(parentGroup, childGroup.getToParentGroup());
- assertTrue(parentGroup.getChildGroupsArray().contains(childGroup));
-
- // Always good to commit before deleting... bad things happen otherwise
- context.commitChanges();
-
- context.deleteObjects(childGroup);
-
- // The things we are testing.
- assertFalse(parentGroup.getChildGroupsArray().contains(childGroup));
- // Although deleted, the property should be null (good cleanup policy)
- // assertNull(childGroup.getToParentGroup());
-
- // And be sure that the commit works afterwards, just for sanity
- context.commitChanges();
- }
-
- /**
- * Tests that deleting a source of a flattened relationship with CASCADE rule results
- * in deleting a join and a target.
- */
- public void testCascadeToManyFlattened() {
- // testing Artist.groupArray relationship
- ArtGroup aGroup = context.newObject(ArtGroup.class);
- aGroup.setName("Group Name");
- Artist anArtist = context.newObject(Artist.class);
- anArtist.setArtistName("A Name");
- anArtist.addToGroupArray(aGroup);
- assertTrue(anArtist.getGroupArray().contains(aGroup));
-
- context.commitChanges();
-
- SQLTemplate checkQuery = new SQLTemplate(
- Artist.class,
- "SELECT * FROM ARTIST_GROUP");
- checkQuery.setFetchingDataRows(true);
- List<?> joins1 = context.performQuery(checkQuery);
- assertEquals(1, joins1.size());
-
- context.deleteObjects(anArtist);
-
- assertEquals(PersistenceState.DELETED, aGroup.getPersistenceState());
- assertFalse(anArtist.getGroupArray().contains(aGroup));
- context.commitChanges();
-
- List<?> joins2 = context.performQuery(checkQuery);
- assertEquals(0, joins2.size());
- }
-
- /**
- * Tests that deleting a source of a flattened relationship with NULLIFY rule results
- * in deleting a join together with the object deleted.
- */
- public void testNullifyToManyFlattened() {
- // testing ArtGroup.artistArray relationship
- ArtGroup aGroup = context.newObject(ArtGroup.class);
- aGroup.setName("Group Name");
- Artist anArtist = context.newObject(Artist.class);
- anArtist.setArtistName("A Name");
- aGroup.addToArtistArray(anArtist);
-
- context.commitChanges();
-
- // Preconditions
- assertTrue(aGroup.getArtistArray().contains(anArtist));
- assertTrue(anArtist.getGroupArray().contains(aGroup));
-
- SQLTemplate checkQuery = new SQLTemplate(
- Artist.class,
- "SELECT * FROM ARTIST_GROUP");
- checkQuery.setFetchingDataRows(true);
- List<?> joins1 = context.performQuery(checkQuery);
- assertEquals(1, joins1.size());
-
- context.deleteObjects(aGroup);
- assertFalse(anArtist.getGroupArray().contains(aGroup));
- context.commitChanges();
-
- List<?> joins2 = context.performQuery(checkQuery);
- assertEquals(0, joins2.size());
- }
-
- public void testNullifyToMany() {
- // ArtGroup childGroupsArray
- ArtGroup parentGroup = (ArtGroup) context.newObject("ArtGroup");
- parentGroup.setName("Parent");
-
- ArtGroup childGroup = (ArtGroup) context.newObject("ArtGroup");
- childGroup.setName("Child");
- parentGroup.addToChildGroupsArray(childGroup);
-
- // Preconditions - good to check to be sure
- assertEquals(parentGroup, childGroup.getToParentGroup());
- assertTrue(parentGroup.getChildGroupsArray().contains(childGroup));
-
- context.commitChanges();
-
- context.deleteObjects(parentGroup);
-
- // The things we are testing.
- assertNull(childGroup.getToParentGroup());
-
- // Although deleted, the property should be null (good cleanup policy)
- // assertFalse(parentGroup.getChildGroupsArray().contains(childGroup));
- context.commitChanges();
- }
-
- public void testCascadeToOne() {
- // Painting toPaintingInfo
- Painting painting = (Painting) context.newObject("Painting");
- painting.setPaintingTitle("A Title");
-
- PaintingInfo info = (PaintingInfo) context.newObject("PaintingInfo");
- painting.setToPaintingInfo(info);
-
- // Must commit before deleting.. this relationship is dependent,
- // and everything must be committed for certain things to work
- context.commitChanges();
-
- context.deleteObjects(painting);
-
- // info must also be deleted
- assertEquals(PersistenceState.DELETED, info.getPersistenceState());
- assertNull(info.getPainting());
- assertNull(painting.getToPaintingInfo());
- context.commitChanges();
- }
-
- public void testCascadeToMany() {
- // Artist artistExhibitArray
- Artist anArtist = (Artist) context.newObject("Artist");
- anArtist.setArtistName("A Name");
- Exhibit anExhibit = (Exhibit) context.newObject("Exhibit");
- anExhibit.setClosingDate(new java.sql.Timestamp(System.currentTimeMillis()));
- anExhibit.setOpeningDate(new java.sql.Timestamp(System.currentTimeMillis()));
-
- // Needs a gallery... required for data integrity
- Gallery gallery = (Gallery) context.newObject("Gallery");
- gallery.setGalleryName("A Name");
-
- anExhibit.setToGallery(gallery);
-
- ArtistExhibit artistExhibit = (ArtistExhibit) context.newObject("ArtistExhibit");
-
- artistExhibit.setToArtist(anArtist);
- artistExhibit.setToExhibit(anExhibit);
- context.commitChanges();
-
- context.deleteObjects(anArtist);
-
- // Test that the link record was deleted, and removed from the relationship
- assertEquals(PersistenceState.DELETED, artistExhibit.getPersistenceState());
- assertFalse(anArtist.getArtistExhibitArray().contains(artistExhibit));
- context.commitChanges();
- }
-
- public void testDenyToMany() {
- // Gallery paintingArray
- Gallery gallery = (Gallery) context.newObject("Gallery");
- gallery.setGalleryName("A Name");
- Painting painting = (Painting) context.newObject("Painting");
- painting.setPaintingTitle("A Title");
- gallery.addToPaintingArray(painting);
- context.commitChanges();
-
- try {
- context.deleteObjects(gallery);
- fail("Should have thrown an exception");
- }
- catch (Exception e) {
- // GOOD!
- }
- context.commitChanges();
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java
new file mode 100644
index 0000000..0d91102
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchIT.java
@@ -0,0 +1,219 @@
+/*****************************************************************
+ * 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.cayenne.access;
+
+import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.PrefetchTreeNode;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.query.SortOrder;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.testdo.testmap.PaintingInfo;
+import org.apache.cayenne.unit.di.DataChannelInterceptor;
+import org.apache.cayenne.unit.di.UnitTestClosure;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.sql.Types;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataContextDisjointByIdPrefetchIT extends ServerCase {
+
+ @Inject
+ protected DataContext context;
+
+ @Inject
+ protected DBHelper dbHelper;
+
+ @Inject
+ protected DataChannelInterceptor queryInterceptor;
+
+ private TableHelper tArtist;
+ private TableHelper tPainting;
+ private TableHelper tPaintingInfo;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("PAINTING_INFO");
+ dbHelper.deleteAll("PAINTING");
+ dbHelper.deleteAll("ARTIST_EXHIBIT");
+ dbHelper.deleteAll("ARTIST_GROUP");
+ dbHelper.deleteAll("ARTIST");
+
+ tArtist = new TableHelper(dbHelper, "ARTIST");
+ tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
+
+ tPainting = new TableHelper(dbHelper, "PAINTING");
+ tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE").setColumnTypes(Types.INTEGER, Types.BIGINT,
+ Types.VARCHAR);
+
+ tPaintingInfo = new TableHelper(dbHelper, "PAINTING_INFO");
+ tPaintingInfo.setColumns("PAINTING_ID", "TEXT_REVIEW");
+ }
+
+ private void createArtistWithTwoPaintingsDataSet() throws Exception {
+ tArtist.insert(1, "X");
+
+ for (int i = 1; i <= 2; i++) {
+ tPainting.insert(i, 1, "Y" + i);
+ }
+ }
+
+ private void createThreeArtistsWithPlentyOfPaintingsDataSet() throws Exception {
+ tArtist.insert(1, "bag1");
+ tArtist.insert(2, "bag2");
+ tArtist.insert(3, "bag3");
+
+ tPainting.insert(1, 1, "box1");
+ tPainting.insert(2, 1, "box2");
+ tPainting.insert(3, 1, "box3");
+ tPainting.insert(4, 1, "box4");
+ tPainting.insert(5, 1, "box5");
+
+ tPainting.insert(6, 2, "box6");
+ tPainting.insert(7, 2, "box7");
+
+ tPainting.insert(8, 3, "box8");
+ tPainting.insert(9, 3, "box9");
+ tPainting.insert(10, 3, "box10");
+ }
+
+ private void createTwoPaintingsWithInfosDataSet() throws Exception {
+ tArtist.insert(1, "bag1");
+
+ tPainting.insert(1, 1, "big");
+ tPaintingInfo.insert(1, "red");
+ tPainting.insert(2, 1, "small");
+ tPaintingInfo.insert(2, "green");
+ }
+
+ public void testOneToMany() throws Exception {
+ createArtistWithTwoPaintingsDataSet();
+
+ SelectQuery query = new SelectQuery(Artist.class);
+ query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
+ PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+
+ final List<Artist> result = context.performQuery(query);
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+ assertFalse(result.isEmpty());
+ Artist b1 = result.get(0);
+ List<Painting> toMany = (List<Painting>) b1.readPropertyDirectly(Artist.PAINTING_ARRAY_PROPERTY);
+ assertNotNull(toMany);
+ assertFalse(((ValueHolder) toMany).isFault());
+ assertEquals(2, toMany.size());
+
+ List<String> names = new ArrayList<String>();
+ for (Painting b : toMany) {
+ assertEquals(PersistenceState.COMMITTED, b.getPersistenceState());
+ names.add(b.getPaintingTitle());
+ }
+
+ assertTrue(names.contains("Y1"));
+ assertTrue(names.contains("Y2"));
+ }
+ });
+ }
+
+ public void testManyToOne() throws Exception {
+ createArtistWithTwoPaintingsDataSet();
+
+ SelectQuery query = new SelectQuery(Painting.class);
+ query.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+
+ final List<Painting> result = context.performQuery(query);
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+ assertFalse(result.isEmpty());
+ Painting b1 = result.get(0);
+ assertNotNull(b1.getToArtist());
+ assertEquals(PersistenceState.COMMITTED, b1.getToArtist().getPersistenceState());
+ assertEquals("X", b1.getToArtist().getArtistName());
+ }
+ });
+ }
+
+ public void testFetchLimit() throws Exception {
+ createThreeArtistsWithPlentyOfPaintingsDataSet();
+
+ final SelectQuery query = new SelectQuery(Artist.class);
+ query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
+ PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+ query.addOrdering("db:" + Artist.ARTIST_ID_PK_COLUMN, SortOrder.ASCENDING);
+
+ query.setFetchLimit(2);
+
+ // There will be only 2 bags in a result. The first bag has 5 boxes and
+ // the second has 2. So we are expecting exactly 9 snapshots in the data
+ // row store after performing the query.
+ final List<Artist> bags = context.performQuery(query);
+
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+
+ assertEquals(2, bags.size());
+
+ assertEquals(5, bags.get(0).getPaintingArray().size());
+ assertEquals(2, bags.get(1).getPaintingArray().size());
+
+ for (Artist b : bags) {
+ b.getArtistName();
+ for (Painting bx : b.getPaintingArray()) {
+ bx.getPaintingTitle();
+ }
+ }
+ }
+ });
+ }
+
+ public void testOneToOneRelationship() throws Exception {
+ createTwoPaintingsWithInfosDataSet();
+
+ SelectQuery query = new SelectQuery(Painting.class);
+ query.addPrefetch(Painting.TO_PAINTING_INFO_PROPERTY).setSemantics(
+ PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+ final List<Painting> result = context.performQuery(query);
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+ assertFalse(result.isEmpty());
+ List<String> boxColors = new ArrayList<String>();
+ for (Painting box : result) {
+ PaintingInfo info = (PaintingInfo) box.readPropertyDirectly(Painting.TO_PAINTING_INFO_PROPERTY);
+ assertNotNull(info);
+ boxColors.add(info.getTextReview());
+ assertEquals(PersistenceState.COMMITTED, info.getPersistenceState());
+ }
+ assertTrue(boxColors.containsAll(Arrays.asList("red", "green")));
+ }
+ });
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java
deleted file mode 100644
index 296088a..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java
+++ /dev/null
@@ -1,219 +0,0 @@
-/*****************************************************************
- * 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.cayenne.access;
-
-import java.sql.Types;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.PrefetchTreeNode;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.query.SortOrder;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.testdo.testmap.PaintingInfo;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.UnitTestClosure;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataContextDisjointByIdPrefetchTest extends ServerCase {
-
- @Inject
- protected DataContext context;
-
- @Inject
- protected DBHelper dbHelper;
-
- @Inject
- protected DataChannelInterceptor queryInterceptor;
-
- private TableHelper tArtist;
- private TableHelper tPainting;
- private TableHelper tPaintingInfo;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("PAINTING_INFO");
- dbHelper.deleteAll("PAINTING");
- dbHelper.deleteAll("ARTIST_EXHIBIT");
- dbHelper.deleteAll("ARTIST_GROUP");
- dbHelper.deleteAll("ARTIST");
-
- tArtist = new TableHelper(dbHelper, "ARTIST");
- tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
-
- tPainting = new TableHelper(dbHelper, "PAINTING");
- tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE").setColumnTypes(Types.INTEGER, Types.BIGINT,
- Types.VARCHAR);
-
- tPaintingInfo = new TableHelper(dbHelper, "PAINTING_INFO");
- tPaintingInfo.setColumns("PAINTING_ID", "TEXT_REVIEW");
- }
-
- private void createArtistWithTwoPaintingsDataSet() throws Exception {
- tArtist.insert(1, "X");
-
- for (int i = 1; i <= 2; i++) {
- tPainting.insert(i, 1, "Y" + i);
- }
- }
-
- private void createThreeArtistsWithPlentyOfPaintingsDataSet() throws Exception {
- tArtist.insert(1, "bag1");
- tArtist.insert(2, "bag2");
- tArtist.insert(3, "bag3");
-
- tPainting.insert(1, 1, "box1");
- tPainting.insert(2, 1, "box2");
- tPainting.insert(3, 1, "box3");
- tPainting.insert(4, 1, "box4");
- tPainting.insert(5, 1, "box5");
-
- tPainting.insert(6, 2, "box6");
- tPainting.insert(7, 2, "box7");
-
- tPainting.insert(8, 3, "box8");
- tPainting.insert(9, 3, "box9");
- tPainting.insert(10, 3, "box10");
- }
-
- private void createTwoPaintingsWithInfosDataSet() throws Exception {
- tArtist.insert(1, "bag1");
-
- tPainting.insert(1, 1, "big");
- tPaintingInfo.insert(1, "red");
- tPainting.insert(2, 1, "small");
- tPaintingInfo.insert(2, "green");
- }
-
- public void testOneToMany() throws Exception {
- createArtistWithTwoPaintingsDataSet();
-
- SelectQuery query = new SelectQuery(Artist.class);
- query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
- PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
-
- final List<Artist> result = context.performQuery(query);
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
- Artist b1 = result.get(0);
- List<Painting> toMany = (List<Painting>) b1.readPropertyDirectly(Artist.PAINTING_ARRAY_PROPERTY);
- assertNotNull(toMany);
- assertFalse(((ValueHolder) toMany).isFault());
- assertEquals(2, toMany.size());
-
- List<String> names = new ArrayList<String>();
- for (Painting b : toMany) {
- assertEquals(PersistenceState.COMMITTED, b.getPersistenceState());
- names.add(b.getPaintingTitle());
- }
-
- assertTrue(names.contains("Y1"));
- assertTrue(names.contains("Y2"));
- }
- });
- }
-
- public void testManyToOne() throws Exception {
- createArtistWithTwoPaintingsDataSet();
-
- SelectQuery query = new SelectQuery(Painting.class);
- query.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
-
- final List<Painting> result = context.performQuery(query);
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
- Painting b1 = result.get(0);
- assertNotNull(b1.getToArtist());
- assertEquals(PersistenceState.COMMITTED, b1.getToArtist().getPersistenceState());
- assertEquals("X", b1.getToArtist().getArtistName());
- }
- });
- }
-
- public void testFetchLimit() throws Exception {
- createThreeArtistsWithPlentyOfPaintingsDataSet();
-
- final SelectQuery query = new SelectQuery(Artist.class);
- query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics(
- PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
- query.addOrdering("db:" + Artist.ARTIST_ID_PK_COLUMN, SortOrder.ASCENDING);
-
- query.setFetchLimit(2);
-
- // There will be only 2 bags in a result. The first bag has 5 boxes and
- // the second has 2. So we are expecting exactly 9 snapshots in the data
- // row store after performing the query.
- final List<Artist> bags = context.performQuery(query);
-
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
-
- assertEquals(2, bags.size());
-
- assertEquals(5, bags.get(0).getPaintingArray().size());
- assertEquals(2, bags.get(1).getPaintingArray().size());
-
- for (Artist b : bags) {
- b.getArtistName();
- for (Painting bx : b.getPaintingArray()) {
- bx.getPaintingTitle();
- }
- }
- }
- });
- }
-
- public void testOneToOneRelationship() throws Exception {
- createTwoPaintingsWithInfosDataSet();
-
- SelectQuery query = new SelectQuery(Painting.class);
- query.addPrefetch(Painting.TO_PAINTING_INFO_PROPERTY).setSemantics(
- PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
- final List<Painting> result = context.performQuery(query);
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
- List<String> boxColors = new ArrayList<String>();
- for (Painting box : result) {
- PaintingInfo info = (PaintingInfo) box.readPropertyDirectly(Painting.TO_PAINTING_INFO_PROPERTY);
- assertNotNull(info);
- boxColors.add(info.getTextReview());
- assertEquals(PersistenceState.COMMITTED, info.getPersistenceState());
- }
- assertTrue(boxColors.containsAll(Arrays.asList("red", "green")));
- }
- });
- }
-
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasIT.java
new file mode 100644
index 0000000..4c7057f
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasIT.java
@@ -0,0 +1,373 @@
+/*****************************************************************
+ * 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.cayenne.access;
+
+import org.apache.cayenne.Cayenne;
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.PersistenceState;
+import org.apache.cayenne.ValueHolder;
+import org.apache.cayenne.configuration.server.ServerRuntime;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.PrefetchTreeNode;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.testmap.Bag;
+import org.apache.cayenne.testdo.testmap.Ball;
+import org.apache.cayenne.testdo.testmap.Box;
+import org.apache.cayenne.testdo.testmap.BoxInfo;
+import org.apache.cayenne.testdo.testmap.Thing;
+import org.apache.cayenne.unit.di.DataChannelInterceptor;
+import org.apache.cayenne.unit.di.UnitTestClosure;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+
+import static org.apache.cayenne.exp.ExpressionFactory.matchExp;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataContextDisjointByIdPrefetch_ExtrasIT extends ServerCase {
+
+ @Inject
+ protected DataContext context;
+
+ @Inject
+ private ServerRuntime runtime;
+
+ @Inject
+ protected DBHelper dbHelper;
+
+ @Inject
+ protected DataChannelInterceptor queryInterceptor;
+
+ protected TableHelper tBag;
+ protected TableHelper tBox;
+ protected TableHelper tBoxInfo;
+ protected TableHelper tBall;
+ protected TableHelper tThing;
+ protected TableHelper tBoxThing;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("BALL");
+ dbHelper.deleteAll("BOX_THING");
+ dbHelper.deleteAll("THING");
+ dbHelper.deleteAll("BOX_INFO");
+ dbHelper.deleteAll("BOX");
+ dbHelper.deleteAll("BAG");
+
+ tBoxThing = new TableHelper(dbHelper, "BOX_THING");
+ tBoxThing.setColumns("BOX_ID", "THING_WEIGHT", "THING_VOLUME");
+ }
+
+ private void createBagWithTwoBoxesAndPlentyOfBallsDataSet() throws Exception {
+
+ // because of SQLServer need to enable identity inserts per transaction,
+ // inserting these objects via Cayenne, and then flushing the cache
+ // http://technet.microsoft.com/en-us/library/ms188059.aspx
+
+ Collection<Object> invalidate = new ArrayList<Object>();
+ ObjectContext context = runtime.newContext();
+
+ Bag b1 = context.newObject(Bag.class);
+ invalidate.add(b1);
+ b1.setName("b1");
+
+ Box bx1 = context.newObject(Box.class);
+ invalidate.add(bx1);
+ bx1.setName("big");
+ bx1.setBag(b1);
+
+ BoxInfo bi1 = context.newObject(BoxInfo.class);
+ invalidate.add(bi1);
+ bi1.setColor("red");
+ bi1.setBox(bx1);
+
+ Box bx2 = context.newObject(Box.class);
+ invalidate.add(bx2);
+ bx2.setName("small");
+ bx2.setBag(b1);
+
+ BoxInfo bi2 = context.newObject(BoxInfo.class);
+ invalidate.add(bi2);
+ bi2.setColor("green");
+ bi2.setBox(bx2);
+
+ Thing t1 = context.newObject(Thing.class);
+ invalidate.add(t1);
+ t1.setVolume(10);
+ t1.setWeight(10);
+
+ Ball bl1 = context.newObject(Ball.class);
+ invalidate.add(bl1);
+ bl1.setBox(bx1);
+ bl1.setThingVolume(10);
+ bl1.setThingWeight(10);
+
+ Thing t2 = context.newObject(Thing.class);
+ invalidate.add(t2);
+ t2.setVolume(20);
+ t2.setWeight(20);
+
+ Ball bl2 = context.newObject(Ball.class);
+ invalidate.add(bl2);
+ bl2.setBox(bx1);
+ bl2.setThingVolume(20);
+ bl2.setThingWeight(20);
+
+ Thing t3 = context.newObject(Thing.class);
+ invalidate.add(t3);
+ t3.setVolume(30);
+ t3.setWeight(30);
+
+ Ball bl3 = context.newObject(Ball.class);
+ invalidate.add(bl3);
+ bl3.setBox(bx2);
+ bl3.setThingVolume(30);
+ bl3.setThingWeight(30);
+
+ Thing t4 = context.newObject(Thing.class);
+ invalidate.add(t4);
+ t4.setVolume(40);
+ t4.setWeight(40);
+
+ Ball bl4 = context.newObject(Ball.class);
+ invalidate.add(bl4);
+ bl4.setBox(bx2);
+ bl4.setThingVolume(40);
+ bl4.setThingWeight(40);
+
+ Thing t5 = context.newObject(Thing.class);
+ invalidate.add(t5);
+ t5.setVolume(20);
+ t5.setWeight(10);
+
+ Ball bl5 = context.newObject(Ball.class);
+ invalidate.add(bl5);
+ bl5.setBox(bx2);
+ bl5.setThingVolume(20);
+ bl5.setThingWeight(10);
+
+ Thing t6 = context.newObject(Thing.class);
+ invalidate.add(t6);
+ t6.setVolume(40);
+ t6.setWeight(30);
+
+ Ball bl6 = context.newObject(Ball.class);
+ invalidate.add(bl6);
+ bl6.setBox(bx2);
+ bl6.setThingVolume(40);
+ bl6.setThingWeight(30);
+
+ context.commitChanges();
+
+ tBoxThing.insert(Cayenne.intPKForObject(bx1), t1.getWeight(), t1.getVolume());
+ tBoxThing.insert(Cayenne.intPKForObject(bx1), t2.getWeight(), t2.getVolume());
+ tBoxThing.insert(Cayenne.intPKForObject(bx2), t3.getWeight(), t3.getVolume());
+ tBoxThing.insert(Cayenne.intPKForObject(bx1), t4.getWeight(), t4.getVolume());
+ tBoxThing.insert(Cayenne.intPKForObject(bx1), t5.getWeight(), t5.getVolume());
+ tBoxThing.insert(Cayenne.intPKForObject(bx1), t6.getWeight(), t6.getVolume());
+
+ context.invalidateObjects(invalidate);
+ }
+
+ public void testFlattenedRelationship() throws Exception {
+ createBagWithTwoBoxesAndPlentyOfBallsDataSet();
+
+ SelectQuery query = new SelectQuery(Bag.class);
+ query.addPrefetch(Bag.BALLS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+ final List<Bag> result = context.performQuery(query);
+
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+ assertFalse(result.isEmpty());
+ Bag b1 = result.get(0);
+ List<Ball> balls = (List<Ball>) b1.readPropertyDirectly(Bag.BALLS_PROPERTY);
+ assertNotNull(balls);
+ assertFalse(((ValueHolder) balls).isFault());
+ assertEquals(6, balls.size());
+
+ List<Integer> volumes = new ArrayList<Integer>();
+ for (Ball b : balls) {
+ assertEquals(PersistenceState.COMMITTED, b.getPersistenceState());
+ volumes.add(b.getThingVolume());
+ }
+ assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40, 20, 40)));
+ }
+ });
+ }
+
+ public void testFlattenedMultiColumnRelationship() throws Exception {
+ createBagWithTwoBoxesAndPlentyOfBallsDataSet();
+
+ SelectQuery query = new SelectQuery(Box.class);
+ query.addPrefetch(Box.THINGS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+ final List<Box> result = context.performQuery(query);
+
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+ assertFalse(result.isEmpty());
+ List<Integer> volumes = new ArrayList<Integer>();
+ for (Box box : result) {
+ List<Thing> things = (List<Thing>) box.readPropertyDirectly(Box.THINGS_PROPERTY);
+ assertNotNull(things);
+ assertFalse(((ValueHolder) things).isFault());
+ for (Thing t : things) {
+ assertEquals(PersistenceState.COMMITTED, t.getPersistenceState());
+ volumes.add(t.getVolume());
+ }
+ }
+ assertEquals(6, volumes.size());
+ assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40)));
+ }
+ });
+ }
+
+ public void testLongFlattenedRelationship() throws Exception {
+ createBagWithTwoBoxesAndPlentyOfBallsDataSet();
+
+ SelectQuery query = new SelectQuery(Bag.class);
+ query.addPrefetch(Bag.THINGS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+ final List<Bag> result = context.performQuery(query);
+
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+ assertFalse(result.isEmpty());
+ Bag b1 = result.get(0);
+ List<Thing> things = (List<Thing>) b1.readPropertyDirectly(Bag.THINGS_PROPERTY);
+ assertNotNull(things);
+ assertFalse(((ValueHolder) things).isFault());
+ assertEquals(6, things.size());
+
+ List<Integer> volumes = new ArrayList<Integer>();
+ for (Thing t : things) {
+ assertEquals(PersistenceState.COMMITTED, t.getPersistenceState());
+ volumes.add(t.getVolume());
+ }
+ assertTrue(volumes.containsAll(Arrays.asList(10, 20, 20, 30, 40, 40)));
+ }
+ });
+ }
+
+ public void testMultiColumnRelationship() throws Exception {
+ createBagWithTwoBoxesAndPlentyOfBallsDataSet();
+
+ SelectQuery query = new SelectQuery(Ball.class);
+ query.orQualifier(matchExp(Ball.THING_VOLUME_PROPERTY, 40).andExp(matchExp(Ball.THING_WEIGHT_PROPERTY, 30)));
+ query.orQualifier(matchExp(Ball.THING_VOLUME_PROPERTY, 20).andExp(matchExp(Ball.THING_WEIGHT_PROPERTY, 10)));
+
+ query.addPrefetch(Ball.THING_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+
+ final List<Ball> balls = context.performQuery(query);
+
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+
+ assertEquals(2, balls.size());
+
+ balls.get(0).getThing().getVolume();
+ balls.get(1).getThing().getVolume();
+ }
+ });
+ }
+
+ public void testJointPrefetchInParent() throws Exception {
+ createBagWithTwoBoxesAndPlentyOfBallsDataSet();
+
+ SelectQuery query = new SelectQuery(Box.class);
+ query.addPrefetch(Box.BALLS_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
+ query.addPrefetch(Box.BALLS_PROPERTY + "." + Ball.THING_PROPERTY).setSemantics(
+ PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
+ final List<Box> result = context.performQuery(query);
+
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+ assertFalse(result.isEmpty());
+ List<Integer> volumes = new ArrayList<Integer>();
+ for (Box box : result) {
+ List<Ball> balls = (List<Ball>) box.readPropertyDirectly(Box.BALLS_PROPERTY);
+ assertNotNull(balls);
+ assertFalse(((ValueHolder) balls).isFault());
+ for (Ball ball : balls) {
+ Thing thing = (Thing) ball.readPropertyDirectly(Ball.THING_PROPERTY);
+ assertNotNull(thing);
+ assertEquals(PersistenceState.COMMITTED, thing.getPersistenceState());
+ volumes.add(thing.getVolume());
+ }
+ }
+ assertEquals(6, volumes.size());
+ assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40)));
+ }
+ });
+ }
+
+ public void testJointPrefetchInChild() throws Exception {
+ createBagWithTwoBoxesAndPlentyOfBallsDataSet();
+
+ SelectQuery<Bag> query = new SelectQuery<Bag>(Bag.class);
+ query.addPrefetch(Bag.BOXES.disjointById());
+ query.addPrefetch(Bag.BOXES.dot(Box.BALLS).joint());
+ final List<Bag> result = context.select(query);
+
+ queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
+
+ public void execute() {
+ assertFalse(result.isEmpty());
+
+ Bag bag = result.get(0);
+ List<Box> boxes = (List<Box>) bag.readPropertyDirectly(Bag.BOXES_PROPERTY);
+ assertNotNull(boxes);
+ assertFalse(((ValueHolder) boxes).isFault());
+ assertEquals(2, boxes.size());
+
+ Box big = null;
+ List<String> names = new ArrayList<String>();
+ for (Box box : boxes) {
+ assertEquals(PersistenceState.COMMITTED, box.getPersistenceState());
+ names.add(box.getName());
+ if (box.getName().equals("big")) {
+ big = box;
+ }
+ }
+ assertTrue(names.contains("big"));
+ assertTrue(names.contains("small"));
+
+ List<Ball> balls = (List<Ball>) big.readPropertyDirectly(Box.BALLS_PROPERTY);
+ assertNotNull(balls);
+ assertFalse(((ValueHolder) balls).isFault());
+ assertEquals(2, balls.size());
+ List<Integer> volumes = new ArrayList<Integer>();
+ for (Ball ball : balls) {
+ assertEquals(PersistenceState.COMMITTED, ball.getPersistenceState());
+ volumes.add(ball.getThingVolume());
+ }
+ assertTrue(volumes.containsAll(Arrays.asList(10, 20)));
+ }
+ });
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java
deleted file mode 100644
index 804f25c..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java
+++ /dev/null
@@ -1,373 +0,0 @@
-/*****************************************************************
- * 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.cayenne.access;
-
-import static org.apache.cayenne.exp.ExpressionFactory.matchExp;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.configuration.server.ServerRuntime;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.PrefetchTreeNode;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Bag;
-import org.apache.cayenne.testdo.testmap.Ball;
-import org.apache.cayenne.testdo.testmap.Box;
-import org.apache.cayenne.testdo.testmap.BoxInfo;
-import org.apache.cayenne.testdo.testmap.Thing;
-import org.apache.cayenne.unit.di.DataChannelInterceptor;
-import org.apache.cayenne.unit.di.UnitTestClosure;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataContextDisjointByIdPrefetch_ExtrasTest extends ServerCase {
-
- @Inject
- protected DataContext context;
-
- @Inject
- private ServerRuntime runtime;
-
- @Inject
- protected DBHelper dbHelper;
-
- @Inject
- protected DataChannelInterceptor queryInterceptor;
-
- protected TableHelper tBag;
- protected TableHelper tBox;
- protected TableHelper tBoxInfo;
- protected TableHelper tBall;
- protected TableHelper tThing;
- protected TableHelper tBoxThing;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("BALL");
- dbHelper.deleteAll("BOX_THING");
- dbHelper.deleteAll("THING");
- dbHelper.deleteAll("BOX_INFO");
- dbHelper.deleteAll("BOX");
- dbHelper.deleteAll("BAG");
-
- tBoxThing = new TableHelper(dbHelper, "BOX_THING");
- tBoxThing.setColumns("BOX_ID", "THING_WEIGHT", "THING_VOLUME");
- }
-
- private void createBagWithTwoBoxesAndPlentyOfBallsDataSet() throws Exception {
-
- // because of SQLServer need to enable identity inserts per transaction,
- // inserting these objects via Cayenne, and then flushing the cache
- // http://technet.microsoft.com/en-us/library/ms188059.aspx
-
- Collection<Object> invalidate = new ArrayList<Object>();
- ObjectContext context = runtime.newContext();
-
- Bag b1 = context.newObject(Bag.class);
- invalidate.add(b1);
- b1.setName("b1");
-
- Box bx1 = context.newObject(Box.class);
- invalidate.add(bx1);
- bx1.setName("big");
- bx1.setBag(b1);
-
- BoxInfo bi1 = context.newObject(BoxInfo.class);
- invalidate.add(bi1);
- bi1.setColor("red");
- bi1.setBox(bx1);
-
- Box bx2 = context.newObject(Box.class);
- invalidate.add(bx2);
- bx2.setName("small");
- bx2.setBag(b1);
-
- BoxInfo bi2 = context.newObject(BoxInfo.class);
- invalidate.add(bi2);
- bi2.setColor("green");
- bi2.setBox(bx2);
-
- Thing t1 = context.newObject(Thing.class);
- invalidate.add(t1);
- t1.setVolume(10);
- t1.setWeight(10);
-
- Ball bl1 = context.newObject(Ball.class);
- invalidate.add(bl1);
- bl1.setBox(bx1);
- bl1.setThingVolume(10);
- bl1.setThingWeight(10);
-
- Thing t2 = context.newObject(Thing.class);
- invalidate.add(t2);
- t2.setVolume(20);
- t2.setWeight(20);
-
- Ball bl2 = context.newObject(Ball.class);
- invalidate.add(bl2);
- bl2.setBox(bx1);
- bl2.setThingVolume(20);
- bl2.setThingWeight(20);
-
- Thing t3 = context.newObject(Thing.class);
- invalidate.add(t3);
- t3.setVolume(30);
- t3.setWeight(30);
-
- Ball bl3 = context.newObject(Ball.class);
- invalidate.add(bl3);
- bl3.setBox(bx2);
- bl3.setThingVolume(30);
- bl3.setThingWeight(30);
-
- Thing t4 = context.newObject(Thing.class);
- invalidate.add(t4);
- t4.setVolume(40);
- t4.setWeight(40);
-
- Ball bl4 = context.newObject(Ball.class);
- invalidate.add(bl4);
- bl4.setBox(bx2);
- bl4.setThingVolume(40);
- bl4.setThingWeight(40);
-
- Thing t5 = context.newObject(Thing.class);
- invalidate.add(t5);
- t5.setVolume(20);
- t5.setWeight(10);
-
- Ball bl5 = context.newObject(Ball.class);
- invalidate.add(bl5);
- bl5.setBox(bx2);
- bl5.setThingVolume(20);
- bl5.setThingWeight(10);
-
- Thing t6 = context.newObject(Thing.class);
- invalidate.add(t6);
- t6.setVolume(40);
- t6.setWeight(30);
-
- Ball bl6 = context.newObject(Ball.class);
- invalidate.add(bl6);
- bl6.setBox(bx2);
- bl6.setThingVolume(40);
- bl6.setThingWeight(30);
-
- context.commitChanges();
-
- tBoxThing.insert(Cayenne.intPKForObject(bx1), t1.getWeight(), t1.getVolume());
- tBoxThing.insert(Cayenne.intPKForObject(bx1), t2.getWeight(), t2.getVolume());
- tBoxThing.insert(Cayenne.intPKForObject(bx2), t3.getWeight(), t3.getVolume());
- tBoxThing.insert(Cayenne.intPKForObject(bx1), t4.getWeight(), t4.getVolume());
- tBoxThing.insert(Cayenne.intPKForObject(bx1), t5.getWeight(), t5.getVolume());
- tBoxThing.insert(Cayenne.intPKForObject(bx1), t6.getWeight(), t6.getVolume());
-
- context.invalidateObjects(invalidate);
- }
-
- public void testFlattenedRelationship() throws Exception {
- createBagWithTwoBoxesAndPlentyOfBallsDataSet();
-
- SelectQuery query = new SelectQuery(Bag.class);
- query.addPrefetch(Bag.BALLS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
- final List<Bag> result = context.performQuery(query);
-
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
- Bag b1 = result.get(0);
- List<Ball> balls = (List<Ball>) b1.readPropertyDirectly(Bag.BALLS_PROPERTY);
- assertNotNull(balls);
- assertFalse(((ValueHolder) balls).isFault());
- assertEquals(6, balls.size());
-
- List<Integer> volumes = new ArrayList<Integer>();
- for (Ball b : balls) {
- assertEquals(PersistenceState.COMMITTED, b.getPersistenceState());
- volumes.add(b.getThingVolume());
- }
- assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40, 20, 40)));
- }
- });
- }
-
- public void testFlattenedMultiColumnRelationship() throws Exception {
- createBagWithTwoBoxesAndPlentyOfBallsDataSet();
-
- SelectQuery query = new SelectQuery(Box.class);
- query.addPrefetch(Box.THINGS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
- final List<Box> result = context.performQuery(query);
-
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
- List<Integer> volumes = new ArrayList<Integer>();
- for (Box box : result) {
- List<Thing> things = (List<Thing>) box.readPropertyDirectly(Box.THINGS_PROPERTY);
- assertNotNull(things);
- assertFalse(((ValueHolder) things).isFault());
- for (Thing t : things) {
- assertEquals(PersistenceState.COMMITTED, t.getPersistenceState());
- volumes.add(t.getVolume());
- }
- }
- assertEquals(6, volumes.size());
- assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40)));
- }
- });
- }
-
- public void testLongFlattenedRelationship() throws Exception {
- createBagWithTwoBoxesAndPlentyOfBallsDataSet();
-
- SelectQuery query = new SelectQuery(Bag.class);
- query.addPrefetch(Bag.THINGS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
- final List<Bag> result = context.performQuery(query);
-
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
- Bag b1 = result.get(0);
- List<Thing> things = (List<Thing>) b1.readPropertyDirectly(Bag.THINGS_PROPERTY);
- assertNotNull(things);
- assertFalse(((ValueHolder) things).isFault());
- assertEquals(6, things.size());
-
- List<Integer> volumes = new ArrayList<Integer>();
- for (Thing t : things) {
- assertEquals(PersistenceState.COMMITTED, t.getPersistenceState());
- volumes.add(t.getVolume());
- }
- assertTrue(volumes.containsAll(Arrays.asList(10, 20, 20, 30, 40, 40)));
- }
- });
- }
-
- public void testMultiColumnRelationship() throws Exception {
- createBagWithTwoBoxesAndPlentyOfBallsDataSet();
-
- SelectQuery query = new SelectQuery(Ball.class);
- query.orQualifier(matchExp(Ball.THING_VOLUME_PROPERTY, 40).andExp(matchExp(Ball.THING_WEIGHT_PROPERTY, 30)));
- query.orQualifier(matchExp(Ball.THING_VOLUME_PROPERTY, 20).andExp(matchExp(Ball.THING_WEIGHT_PROPERTY, 10)));
-
- query.addPrefetch(Ball.THING_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
-
- final List<Ball> balls = context.performQuery(query);
-
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
-
- assertEquals(2, balls.size());
-
- balls.get(0).getThing().getVolume();
- balls.get(1).getThing().getVolume();
- }
- });
- }
-
- public void testJointPrefetchInParent() throws Exception {
- createBagWithTwoBoxesAndPlentyOfBallsDataSet();
-
- SelectQuery query = new SelectQuery(Box.class);
- query.addPrefetch(Box.BALLS_PROPERTY).setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS);
- query.addPrefetch(Box.BALLS_PROPERTY + "." + Ball.THING_PROPERTY).setSemantics(
- PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS);
- final List<Box> result = context.performQuery(query);
-
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
- List<Integer> volumes = new ArrayList<Integer>();
- for (Box box : result) {
- List<Ball> balls = (List<Ball>) box.readPropertyDirectly(Box.BALLS_PROPERTY);
- assertNotNull(balls);
- assertFalse(((ValueHolder) balls).isFault());
- for (Ball ball : balls) {
- Thing thing = (Thing) ball.readPropertyDirectly(Ball.THING_PROPERTY);
- assertNotNull(thing);
- assertEquals(PersistenceState.COMMITTED, thing.getPersistenceState());
- volumes.add(thing.getVolume());
- }
- }
- assertEquals(6, volumes.size());
- assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40)));
- }
- });
- }
-
- public void testJointPrefetchInChild() throws Exception {
- createBagWithTwoBoxesAndPlentyOfBallsDataSet();
-
- SelectQuery<Bag> query = new SelectQuery<Bag>(Bag.class);
- query.addPrefetch(Bag.BOXES.disjointById());
- query.addPrefetch(Bag.BOXES.dot(Box.BALLS).joint());
- final List<Bag> result = context.select(query);
-
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
-
- Bag bag = result.get(0);
- List<Box> boxes = (List<Box>) bag.readPropertyDirectly(Bag.BOXES_PROPERTY);
- assertNotNull(boxes);
- assertFalse(((ValueHolder) boxes).isFault());
- assertEquals(2, boxes.size());
-
- Box big = null;
- List<String> names = new ArrayList<String>();
- for (Box box : boxes) {
- assertEquals(PersistenceState.COMMITTED, box.getPersistenceState());
- names.add(box.getName());
- if (box.getName().equals("big")) {
- big = box;
- }
- }
- assertTrue(names.contains("big"));
- assertTrue(names.contains("small"));
-
- List<Ball> balls = (List<Ball>) big.readPropertyDirectly(Box.BALLS_PROPERTY);
- assertNotNull(balls);
- assertFalse(((ValueHolder) balls).isFault());
- assertEquals(2, balls.size());
- List<Integer> volumes = new ArrayList<Integer>();
- for (Ball ball : balls) {
- assertEquals(PersistenceState.COMMITTED, ball.getPersistenceState());
- volumes.add(ball.getThingVolume());
- }
- assertTrue(volumes.containsAll(Arrays.asList(10, 20)));
- }
- });
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLArrayResultIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLArrayResultIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLArrayResultIT.java
new file mode 100644
index 0000000..ab9a5b4
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLArrayResultIT.java
@@ -0,0 +1,125 @@
+/*****************************************************************
+ * 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.cayenne.access;
+
+import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.di.Inject;
+import org.apache.cayenne.query.EJBQLQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.test.jdbc.TableHelper;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.math.BigDecimal;
+import java.sql.Types;
+import java.util.List;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataContextEJBQLArrayResultIT extends ServerCase {
+
+ @Inject
+ protected ObjectContext context;
+
+ @Inject
+ protected DBHelper dbHelper;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("PAINTING_INFO");
+ dbHelper.deleteAll("PAINTING");
+ dbHelper.deleteAll("ARTIST_EXHIBIT");
+ dbHelper.deleteAll("ARTIST_GROUP");
+ dbHelper.deleteAll("ARTIST");
+
+ TableHelper tArtist = new TableHelper(dbHelper, "ARTIST");
+ tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
+ tArtist.insert(33001, "AA1");
+ tArtist.insert(33002, "AA2");
+ tArtist.insert(33003, "BB1");
+ tArtist.insert(33004, "BB2");
+
+ TableHelper tPainting = new TableHelper(dbHelper, "PAINTING");
+ tPainting.setColumns(
+ "PAINTING_ID",
+ "ARTIST_ID",
+ "PAINTING_TITLE",
+ "ESTIMATED_PRICE").setColumnTypes(
+ Types.INTEGER,
+ Types.BIGINT,
+ Types.VARCHAR,
+ Types.DECIMAL);
+ tPainting.insert(33001, 33001, "P1", 3000);
+ tPainting.insert(33002, 33002, "P2", 5000);
+ tPainting.insert(33003, null, "P3", 5000);
+ }
+
+ public void testSQLResultSetMappingScalar() throws Exception {
+
+ String ejbql = "SELECT count(p) FROM Painting p JOIN p.toArtist a";
+
+ EJBQLQuery query = new EJBQLQuery(ejbql);
+
+ List<?> objects = context.performQuery(query);
+ assertEquals(1, objects.size());
+
+ Object o1 = objects.get(0);
+ assertEquals(new Long(2), o1);
+ }
+
+ public void testSQLResultSetMappingScalars() throws Exception {
+
+ String ejbql = "SELECT count(p), sum(p.estimatedPrice) FROM Painting p JOIN p.toArtist a";
+
+ EJBQLQuery query = new EJBQLQuery(ejbql);
+
+ List<?> objects = context.performQuery(query);
+ assertEquals(1, objects.size());
+
+ Object o1 = objects.get(0);
+ assertTrue("Expected Object[]: " + o1, o1 instanceof Object[]);
+ Object[] array1 = (Object[]) o1;
+ assertEquals(2, array1.length);
+
+ assertEquals(new Long(2), array1[0]);
+ assertEquals(0, new BigDecimal(8000).compareTo((BigDecimal) array1[1]));
+ }
+
+ public void testSQLResultSetMappingMixed() throws Exception {
+
+ String ejbql = "SELECT count(p), a, sum(p.estimatedPrice) "
+ + "FROM Artist a LEFT JOIN a.paintingArray p "
+ + "GROUP BY a ORDER BY a.artistName";
+
+ EJBQLQuery query = new EJBQLQuery(ejbql);
+
+ List<?> objects = context.performQuery(query);
+ assertEquals(4, objects.size());
+
+ Object o1 = objects.get(0);
+ assertTrue("Expected Object[]: " + o1, o1 instanceof Object[]);
+ Object[] array1 = (Object[]) o1;
+ assertEquals(3, array1.length);
+
+ assertEquals(new Long(1), array1[0]);
+ assertTrue("Expected Artist, got: " + array1[1], array1[1] instanceof Artist);
+ assertEquals(0, new BigDecimal(3000).compareTo((BigDecimal) array1[2]));
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLArrayResultTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLArrayResultTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLArrayResultTest.java
deleted file mode 100644
index 7ecede3..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextEJBQLArrayResultTest.java
+++ /dev/null
@@ -1,125 +0,0 @@
-/*****************************************************************
- * 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.cayenne.access;
-
-import java.math.BigDecimal;
-import java.sql.Types;
-import java.util.List;
-
-import org.apache.cayenne.ObjectContext;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.EJBQLQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.test.jdbc.TableHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataContextEJBQLArrayResultTest extends ServerCase {
-
- @Inject
- protected ObjectContext context;
-
- @Inject
- protected DBHelper dbHelper;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("PAINTING_INFO");
- dbHelper.deleteAll("PAINTING");
- dbHelper.deleteAll("ARTIST_EXHIBIT");
- dbHelper.deleteAll("ARTIST_GROUP");
- dbHelper.deleteAll("ARTIST");
-
- TableHelper tArtist = new TableHelper(dbHelper, "ARTIST");
- tArtist.setColumns("ARTIST_ID", "ARTIST_NAME");
- tArtist.insert(33001, "AA1");
- tArtist.insert(33002, "AA2");
- tArtist.insert(33003, "BB1");
- tArtist.insert(33004, "BB2");
-
- TableHelper tPainting = new TableHelper(dbHelper, "PAINTING");
- tPainting.setColumns(
- "PAINTING_ID",
- "ARTIST_ID",
- "PAINTING_TITLE",
- "ESTIMATED_PRICE").setColumnTypes(
- Types.INTEGER,
- Types.BIGINT,
- Types.VARCHAR,
- Types.DECIMAL);
- tPainting.insert(33001, 33001, "P1", 3000);
- tPainting.insert(33002, 33002, "P2", 5000);
- tPainting.insert(33003, null, "P3", 5000);
- }
-
- public void testSQLResultSetMappingScalar() throws Exception {
-
- String ejbql = "SELECT count(p) FROM Painting p JOIN p.toArtist a";
-
- EJBQLQuery query = new EJBQLQuery(ejbql);
-
- List<?> objects = context.performQuery(query);
- assertEquals(1, objects.size());
-
- Object o1 = objects.get(0);
- assertEquals(new Long(2), o1);
- }
-
- public void testSQLResultSetMappingScalars() throws Exception {
-
- String ejbql = "SELECT count(p), sum(p.estimatedPrice) FROM Painting p JOIN p.toArtist a";
-
- EJBQLQuery query = new EJBQLQuery(ejbql);
-
- List<?> objects = context.performQuery(query);
- assertEquals(1, objects.size());
-
- Object o1 = objects.get(0);
- assertTrue("Expected Object[]: " + o1, o1 instanceof Object[]);
- Object[] array1 = (Object[]) o1;
- assertEquals(2, array1.length);
-
- assertEquals(new Long(2), array1[0]);
- assertEquals(0, new BigDecimal(8000).compareTo((BigDecimal) array1[1]));
- }
-
- public void testSQLResultSetMappingMixed() throws Exception {
-
- String ejbql = "SELECT count(p), a, sum(p.estimatedPrice) "
- + "FROM Artist a LEFT JOIN a.paintingArray p "
- + "GROUP BY a ORDER BY a.artistName";
-
- EJBQLQuery query = new EJBQLQuery(ejbql);
-
- List<?> objects = context.performQuery(query);
- assertEquals(4, objects.size());
-
- Object o1 = objects.get(0);
- assertTrue("Expected Object[]: " + o1, o1 instanceof Object[]);
- Object[] array1 = (Object[]) o1;
- assertEquals(3, array1.length);
-
- assertEquals(new Long(1), array1[0]);
- assertTrue("Expected Artist, got: " + array1[1], array1[1] instanceof Artist);
- assertEquals(0, new BigDecimal(3000).compareTo((BigDecimal) array1[2]));
- }
-
-}