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]));
-    }
-
-}