Return-Path: X-Original-To: apmail-cayenne-commits-archive@www.apache.org Delivered-To: apmail-cayenne-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 88D6510979 for ; Sat, 8 Feb 2014 20:03:38 +0000 (UTC) Received: (qmail 47232 invoked by uid 500); 8 Feb 2014 20:03:38 -0000 Delivered-To: apmail-cayenne-commits-archive@cayenne.apache.org Received: (qmail 47212 invoked by uid 500); 8 Feb 2014 20:03:38 -0000 Mailing-List: contact commits-help@cayenne.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@cayenne.apache.org Delivered-To: mailing list commits@cayenne.apache.org Received: (qmail 47205 invoked by uid 99); 8 Feb 2014 20:03:37 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 08 Feb 2014 20:03:37 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Sat, 08 Feb 2014 20:03:30 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 7D7B8238883D; Sat, 8 Feb 2014 20:03:08 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1566114 - in /cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access: DataContextDisjointByIdPrefetchTest.java DataContextDisjointByIdPrefetch_ExtrasTest.java Date: Sat, 08 Feb 2014 20:03:08 -0000 To: commits@cayenne.apache.org From: aadamchik@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20140208200308.7D7B8238883D@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: aadamchik Date: Sat Feb 8 20:03:08 2014 New Revision: 1566114 URL: http://svn.apache.org/r1566114 Log: failing SQLServer unit tests replacing with entities that don't use autoincrement... autoincrement PK is irrelevant for the test at hand where we can't, using Cayenne to INSERT new objects Added: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java - copied, changed from r1566068, cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java Modified: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java?rev=1566114&r1=1566113&r2=1566114&view=diff ============================================================================== --- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java (original) +++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java Sat Feb 8 20:03:08 2014 @@ -18,8 +18,7 @@ ****************************************************************/ package org.apache.cayenne.access; -import static org.apache.cayenne.exp.ExpressionFactory.matchExp; - +import java.sql.Types; import java.util.ArrayList; import java.util.Arrays; import java.util.List; @@ -32,11 +31,9 @@ import org.apache.cayenne.query.SelectQu 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.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.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; @@ -54,165 +51,128 @@ public class DataContextDisjointByIdPref @Inject protected DataChannelInterceptor queryInterceptor; - protected TableHelper tBag; - protected TableHelper tBox; - protected TableHelper tBoxInfo; - protected TableHelper tBall; - protected TableHelper tThing; - protected TableHelper tBoxThing; + private TableHelper tArtist; + private TableHelper tPainting; + private TableHelper tPaintingInfo; @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"); - - tBag = new TableHelper(dbHelper, "BAG"); - tBag.setColumns("ID", "NAME"); - - tBox = new TableHelper(dbHelper, "BOX"); - tBox.setColumns("ID", "BAG_ID", "NAME"); - - tBoxInfo = new TableHelper(dbHelper, "BOX_INFO"); - tBoxInfo.setColumns("ID", "BOX_ID", "COLOR"); + dbHelper.deleteAll("PAINTING_INFO"); + dbHelper.deleteAll("PAINTING"); + dbHelper.deleteAll("ARTIST_EXHIBIT"); + dbHelper.deleteAll("ARTIST_GROUP"); + dbHelper.deleteAll("ARTIST"); - tBall = new TableHelper(dbHelper, "BALL"); - tBall.setColumns("ID", "BOX_ID", "THING_WEIGHT", "THING_VOLUME"); + tArtist = new TableHelper(dbHelper, "ARTIST"); + tArtist.setColumns("ARTIST_ID", "ARTIST_NAME"); - tThing = new TableHelper(dbHelper, "THING"); - tThing.setColumns("ID", "WEIGHT", "VOLUME"); + tPainting = new TableHelper(dbHelper, "PAINTING"); + tPainting.setColumns("PAINTING_ID", "ARTIST_ID", "PAINTING_TITLE").setColumnTypes(Types.INTEGER, Types.BIGINT, + Types.VARCHAR); - tBoxThing = new TableHelper(dbHelper, "BOX_THING"); - tBoxThing.setColumns("BOX_ID", "THING_WEIGHT", "THING_VOLUME"); + tPaintingInfo = new TableHelper(dbHelper, "PAINTING_INFO"); + tPaintingInfo.setColumns("PAINTING_ID", "TEXT_REVIEW"); } - private void createBagWithTwoBoxesDataSet() throws Exception { - tBag.insert(1, "X"); - tBox.insert(1, 1, "Y"); - tBox.insert(2, 1, "Z"); + private void createArtistWithTwoPaintingsDataSet() throws Exception { + tArtist.insert(1, "X"); + + for (int i = 1; i <= 2; i++) { + tPainting.insert(i, 1, "Y" + i); + } } - private void createThreeBagsWithPlentyOfBoxesDataSet() throws Exception { - tBag.insert(1, "bag1"); - tBag.insert(2, "bag2"); - tBag.insert(3, "bag3"); - - tBox.insert(1, 1, "box1"); - tBox.insert(2, 1, "box2"); - tBox.insert(3, 1, "box3"); - tBox.insert(4, 1, "box4"); - tBox.insert(5, 1, "box5"); - - tBox.insert(6, 2, "box6"); - tBox.insert(7, 2, "box7"); - - tBox.insert(8, 3, "box8"); - tBox.insert(9, 3, "box9"); - tBox.insert(10, 3, "box10"); + 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 createBagWithTwoBoxesAndPlentyOfBallsDataSet() throws Exception { - tBag.insert(1, "bag1"); - tBox.insert(1, 1, "big"); - tBoxInfo.insert(1, 1, "red"); - tBox.insert(2, 1, "small"); - tBoxInfo.insert(2, 2, "green"); - - tThing.insert(1, 10, 10); - tBoxThing.insert(1, 10, 10); - tBall.insert(1, 1, 10, 10); - - tThing.insert(2, 20, 20); - tBoxThing.insert(1, 20, 20); - tBall.insert(2, 1, 20, 20); - - tThing.insert(3, 30, 30); - tBoxThing.insert(2, 30, 30); - tBall.insert(3, 2, 30, 30); - - tThing.insert(4, 40, 40); - tBoxThing.insert(2, 40, 40); - tBall.insert(4, 2, 40, 40); - - tThing.insert(5, 10, 20); - tBoxThing.insert(2, 10, 20); - tBall.insert(5, 2, 10, 20); - - tThing.insert(6, 30, 40); - tBoxThing.insert(2, 30, 40); - tBall.insert(6, 2, 30, 40); + 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 { - createBagWithTwoBoxesDataSet(); + createArtistWithTwoPaintingsDataSet(); - SelectQuery query = new SelectQuery(Bag.class); - query.addPrefetch(Bag.BOXES_PROPERTY).setSemantics( + SelectQuery query = new SelectQuery(Artist.class); + query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics( PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - final List result = context.performQuery(query); + final List result = context.performQuery(query); queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { public void execute() { assertFalse(result.isEmpty()); - Bag b1 = result.get(0); - List toMany = (List) b1 - .readPropertyDirectly(Bag.BOXES_PROPERTY); + Artist b1 = result.get(0); + List toMany = (List) b1.readPropertyDirectly(Artist.PAINTING_ARRAY_PROPERTY); assertNotNull(toMany); assertFalse(((ValueHolder) toMany).isFault()); assertEquals(2, toMany.size()); List names = new ArrayList(); - for (Box b : toMany) { + for (Painting b : toMany) { assertEquals(PersistenceState.COMMITTED, b.getPersistenceState()); - names.add(b.getName()); + names.add(b.getPaintingTitle()); } - assertTrue(names.contains("Y")); - assertTrue(names.contains("Z")); + assertTrue(names.contains("Y1")); + assertTrue(names.contains("Y2")); } }); } public void testManyToOne() throws Exception { - createBagWithTwoBoxesDataSet(); + createArtistWithTwoPaintingsDataSet(); - SelectQuery query = new SelectQuery(Box.class); - query.addPrefetch(Box.BAG_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); + SelectQuery query = new SelectQuery(Painting.class); + query.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - final List result = context.performQuery(query); + final List result = context.performQuery(query); queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { public void execute() { assertFalse(result.isEmpty()); - Box b1 = result.get(0); - assertNotNull(b1.getBag()); - assertEquals(PersistenceState.COMMITTED, b1 - .getBag() - .getPersistenceState()); - assertEquals("X", b1.getBag().getName()); + Painting b1 = result.get(0); + assertNotNull(b1.getToArtist()); + assertEquals(PersistenceState.COMMITTED, b1.getToArtist().getPersistenceState()); + assertEquals("X", b1.getToArtist().getArtistName()); } }); } public void testFetchLimit() throws Exception { - createThreeBagsWithPlentyOfBoxesDataSet(); + createThreeArtistsWithPlentyOfPaintingsDataSet(); - final SelectQuery query = new SelectQuery(Bag.class); - query.addPrefetch(Bag.BOXES_PROPERTY).setSemantics( + final SelectQuery query = new SelectQuery(Artist.class); + query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY).setSemantics( PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - query.addOrdering("db:" + Bag.ID_PK_COLUMN, SortOrder.ASCENDING); + 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 bags = context.performQuery(query); + final List bags = context.performQuery(query); queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { @@ -220,13 +180,13 @@ public class DataContextDisjointByIdPref assertEquals(2, bags.size()); - assertEquals(5, bags.get(0).getBoxes().size()); - assertEquals(2, bags.get(1).getBoxes().size()); + assertEquals(5, bags.get(0).getPaintingArray().size()); + assertEquals(2, bags.get(1).getPaintingArray().size()); - for (Bag b : bags) { - b.getName(); - for (Box bx : b.getBoxes()) { - bx.getName(); + for (Artist b : bags) { + b.getArtistName(); + for (Painting bx : b.getPaintingArray()) { + bx.getPaintingTitle(); } } } @@ -234,22 +194,21 @@ public class DataContextDisjointByIdPref } public void testOneToOneRelationship() throws Exception { - createBagWithTwoBoxesAndPlentyOfBallsDataSet(); + createTwoPaintingsWithInfosDataSet(); - SelectQuery query = new SelectQuery(Box.class); - query.addPrefetch(Box.BOX_INFO_PROPERTY).setSemantics( + SelectQuery query = new SelectQuery(Painting.class); + query.addPrefetch(Painting.TO_PAINTING_INFO_PROPERTY).setSemantics( PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - final List result = context.performQuery(query); + final List result = context.performQuery(query); queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { public void execute() { assertFalse(result.isEmpty()); List boxColors = new ArrayList(); - for (Box box : result) { - BoxInfo info = (BoxInfo) box - .readPropertyDirectly(Box.BOX_INFO_PROPERTY); + for (Painting box : result) { + PaintingInfo info = (PaintingInfo) box.readPropertyDirectly(Painting.TO_PAINTING_INFO_PROPERTY); assertNotNull(info); - boxColors.add(info.getColor()); + boxColors.add(info.getTextReview()); assertEquals(PersistenceState.COMMITTED, info.getPersistenceState()); } assertTrue(boxColors.containsAll(Arrays.asList("red", "green"))); @@ -257,202 +216,4 @@ public class DataContextDisjointByIdPref }); } - 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 result = context.performQuery(query); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertFalse(result.isEmpty()); - Bag b1 = result.get(0); - List balls = (List) b1 - .readPropertyDirectly(Bag.BALLS_PROPERTY); - assertNotNull(balls); - assertFalse(((ValueHolder) balls).isFault()); - assertEquals(6, balls.size()); - - List volumes = new ArrayList(); - 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 testLongFlattenedRelationship() throws Exception { - createBagWithTwoBoxesAndPlentyOfBallsDataSet(); - - SelectQuery query = new SelectQuery(Bag.class); - query.addPrefetch(Bag.THINGS_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - final List result = context.performQuery(query); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertFalse(result.isEmpty()); - Bag b1 = result.get(0); - List things = (List) b1 - .readPropertyDirectly(Bag.THINGS_PROPERTY); - assertNotNull(things); - assertFalse(((ValueHolder) things).isFault()); - assertEquals(6, things.size()); - - List volumes = new ArrayList(); - 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 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 testFlattenedMultiColumnRelationship() throws Exception { - createBagWithTwoBoxesAndPlentyOfBallsDataSet(); - - SelectQuery query = new SelectQuery(Box.class); - query.addPrefetch(Box.THINGS_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - final List result = context.performQuery(query); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertFalse(result.isEmpty()); - List volumes = new ArrayList(); - for (Box box : result) { - List things = (List) 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 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 result = context.performQuery(query); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertFalse(result.isEmpty()); - List volumes = new ArrayList(); - for (Box box : result) { - List balls = (List) 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 query = new SelectQuery(Bag.class); - query.addPrefetch(Bag.BOXES_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - query.addPrefetch(Bag.BOXES_PROPERTY + "." + Box.BALLS_PROPERTY).setSemantics( - PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); - final List result = context.performQuery(query); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertFalse(result.isEmpty()); - - Bag bag = result.get(0); - List boxes = (List) bag - .readPropertyDirectly(Bag.BOXES_PROPERTY); - assertNotNull(boxes); - assertFalse(((ValueHolder) boxes).isFault()); - assertEquals(2, boxes.size()); - - Box big = null; - List names = new ArrayList(); - 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 balls = (List) big - .readPropertyDirectly(Box.BALLS_PROPERTY); - assertNotNull(balls); - assertFalse(((ValueHolder) balls).isFault()); - assertEquals(2, balls.size()); - List volumes = new ArrayList(); - for (Ball ball : balls) { - assertEquals(PersistenceState.COMMITTED, ball.getPersistenceState()); - volumes.add(ball.getThingVolume()); - } - assertTrue(volumes.containsAll(Arrays.asList(10, 20))); - } - }); - } } Copied: cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java (from r1566068, cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java) URL: http://svn.apache.org/viewvc/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java?p2=cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java&p1=cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java&r1=1566068&r2=1566114&rev=1566114&view=diff ============================================================================== --- cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetchTest.java (original) +++ cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextDisjointByIdPrefetch_ExtrasTest.java Sat Feb 8 20:03:08 2014 @@ -22,14 +22,17 @@ import static org.apache.cayenne.exp.Exp 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.query.SortOrder; import org.apache.cayenne.test.jdbc.DBHelper; import org.apache.cayenne.test.jdbc.TableHelper; import org.apache.cayenne.testdo.testmap.Bag; @@ -43,12 +46,15 @@ import org.apache.cayenne.unit.di.server import org.apache.cayenne.unit.di.server.UseServerRuntime; @UseServerRuntime(ServerCase.TESTMAP_PROJECT) -public class DataContextDisjointByIdPrefetchTest extends ServerCase { +public class DataContextDisjointByIdPrefetch_ExtrasTest extends ServerCase { @Inject protected DataContext context; @Inject + private ServerRuntime runtime; + + @Inject protected DBHelper dbHelper; @Inject @@ -70,218 +76,171 @@ public class DataContextDisjointByIdPref dbHelper.deleteAll("BOX"); dbHelper.deleteAll("BAG"); - tBag = new TableHelper(dbHelper, "BAG"); - tBag.setColumns("ID", "NAME"); - - tBox = new TableHelper(dbHelper, "BOX"); - tBox.setColumns("ID", "BAG_ID", "NAME"); - - tBoxInfo = new TableHelper(dbHelper, "BOX_INFO"); - tBoxInfo.setColumns("ID", "BOX_ID", "COLOR"); - - tBall = new TableHelper(dbHelper, "BALL"); - tBall.setColumns("ID", "BOX_ID", "THING_WEIGHT", "THING_VOLUME"); - - tThing = new TableHelper(dbHelper, "THING"); - tThing.setColumns("ID", "WEIGHT", "VOLUME"); - tBoxThing = new TableHelper(dbHelper, "BOX_THING"); tBoxThing.setColumns("BOX_ID", "THING_WEIGHT", "THING_VOLUME"); } - private void createBagWithTwoBoxesDataSet() throws Exception { - tBag.insert(1, "X"); - tBox.insert(1, 1, "Y"); - tBox.insert(2, 1, "Z"); - } + private void createBagWithTwoBoxesAndPlentyOfBallsDataSet() throws Exception { - private void createThreeBagsWithPlentyOfBoxesDataSet() throws Exception { - tBag.insert(1, "bag1"); - tBag.insert(2, "bag2"); - tBag.insert(3, "bag3"); - - tBox.insert(1, 1, "box1"); - tBox.insert(2, 1, "box2"); - tBox.insert(3, 1, "box3"); - tBox.insert(4, 1, "box4"); - tBox.insert(5, 1, "box5"); - - tBox.insert(6, 2, "box6"); - tBox.insert(7, 2, "box7"); - - tBox.insert(8, 3, "box8"); - tBox.insert(9, 3, "box9"); - tBox.insert(10, 3, "box10"); - } + // 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 invalidate = new ArrayList(); + ObjectContext context = runtime.getContext(); + + 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()); - private void createBagWithTwoBoxesAndPlentyOfBallsDataSet() throws Exception { - tBag.insert(1, "bag1"); - tBox.insert(1, 1, "big"); - tBoxInfo.insert(1, 1, "red"); - tBox.insert(2, 1, "small"); - tBoxInfo.insert(2, 2, "green"); - - tThing.insert(1, 10, 10); - tBoxThing.insert(1, 10, 10); - tBall.insert(1, 1, 10, 10); - - tThing.insert(2, 20, 20); - tBoxThing.insert(1, 20, 20); - tBall.insert(2, 1, 20, 20); - - tThing.insert(3, 30, 30); - tBoxThing.insert(2, 30, 30); - tBall.insert(3, 2, 30, 30); - - tThing.insert(4, 40, 40); - tBoxThing.insert(2, 40, 40); - tBall.insert(4, 2, 40, 40); - - tThing.insert(5, 10, 20); - tBoxThing.insert(2, 10, 20); - tBall.insert(5, 2, 10, 20); - - tThing.insert(6, 30, 40); - tBoxThing.insert(2, 30, 40); - tBall.insert(6, 2, 30, 40); + context.invalidateObjects(invalidate); } - public void testOneToMany() throws Exception { - createBagWithTwoBoxesDataSet(); + public void testFlattenedRelationship() throws Exception { + createBagWithTwoBoxesAndPlentyOfBallsDataSet(); SelectQuery query = new SelectQuery(Bag.class); - query.addPrefetch(Bag.BOXES_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - + query.addPrefetch(Bag.BALLS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); final List result = context.performQuery(query); + queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { public void execute() { assertFalse(result.isEmpty()); Bag b1 = result.get(0); - List toMany = (List) b1 - .readPropertyDirectly(Bag.BOXES_PROPERTY); - assertNotNull(toMany); - assertFalse(((ValueHolder) toMany).isFault()); - assertEquals(2, toMany.size()); + List balls = (List) b1.readPropertyDirectly(Bag.BALLS_PROPERTY); + assertNotNull(balls); + assertFalse(((ValueHolder) balls).isFault()); + assertEquals(6, balls.size()); - List names = new ArrayList(); - for (Box b : toMany) { + List volumes = new ArrayList(); + for (Ball b : balls) { assertEquals(PersistenceState.COMMITTED, b.getPersistenceState()); - names.add(b.getName()); - } - - assertTrue(names.contains("Y")); - assertTrue(names.contains("Z")); - } - }); - } - - public void testManyToOne() throws Exception { - createBagWithTwoBoxesDataSet(); - - SelectQuery query = new SelectQuery(Box.class); - query.addPrefetch(Box.BAG_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - - final List result = context.performQuery(query); - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertFalse(result.isEmpty()); - Box b1 = result.get(0); - assertNotNull(b1.getBag()); - assertEquals(PersistenceState.COMMITTED, b1 - .getBag() - .getPersistenceState()); - assertEquals("X", b1.getBag().getName()); - } - }); - } - - public void testFetchLimit() throws Exception { - createThreeBagsWithPlentyOfBoxesDataSet(); - - final SelectQuery query = new SelectQuery(Bag.class); - query.addPrefetch(Bag.BOXES_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); - query.addOrdering("db:" + Bag.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 bags = context.performQuery(query); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - - assertEquals(2, bags.size()); - - assertEquals(5, bags.get(0).getBoxes().size()); - assertEquals(2, bags.get(1).getBoxes().size()); - - for (Bag b : bags) { - b.getName(); - for (Box bx : b.getBoxes()) { - bx.getName(); - } + volumes.add(b.getThingVolume()); } + assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40, 20, 40))); } }); } - public void testOneToOneRelationship() throws Exception { + public void testFlattenedMultiColumnRelationship() throws Exception { createBagWithTwoBoxesAndPlentyOfBallsDataSet(); SelectQuery query = new SelectQuery(Box.class); - query.addPrefetch(Box.BOX_INFO_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); + query.addPrefetch(Box.THINGS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); final List result = context.performQuery(query); - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertFalse(result.isEmpty()); - List boxColors = new ArrayList(); - for (Box box : result) { - BoxInfo info = (BoxInfo) box - .readPropertyDirectly(Box.BOX_INFO_PROPERTY); - assertNotNull(info); - boxColors.add(info.getColor()); - assertEquals(PersistenceState.COMMITTED, info.getPersistenceState()); - } - assertTrue(boxColors.containsAll(Arrays.asList("red", "green"))); - } - }); - } - - 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 result = context.performQuery(query); queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { public void execute() { assertFalse(result.isEmpty()); - Bag b1 = result.get(0); - List balls = (List) b1 - .readPropertyDirectly(Bag.BALLS_PROPERTY); - assertNotNull(balls); - assertFalse(((ValueHolder) balls).isFault()); - assertEquals(6, balls.size()); - List volumes = new ArrayList(); - for (Ball b : balls) { - assertEquals(PersistenceState.COMMITTED, b.getPersistenceState()); - volumes.add(b.getThingVolume()); + for (Box box : result) { + List things = (List) box.readPropertyDirectly(Box.THINGS_PROPERTY); + assertNotNull(things); + assertFalse(((ValueHolder) things).isFault()); + for (Thing t : things) { + assertEquals(PersistenceState.COMMITTED, t.getPersistenceState()); + volumes.add(t.getVolume()); + } } - assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40, 20, 40))); + assertEquals(6, volumes.size()); + assertTrue(volumes.containsAll(Arrays.asList(10, 20, 30, 40))); } }); } @@ -290,8 +249,7 @@ public class DataContextDisjointByIdPref createBagWithTwoBoxesAndPlentyOfBallsDataSet(); SelectQuery query = new SelectQuery(Bag.class); - query.addPrefetch(Bag.THINGS_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); + query.addPrefetch(Bag.THINGS_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); final List result = context.performQuery(query); queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { @@ -299,8 +257,7 @@ public class DataContextDisjointByIdPref public void execute() { assertFalse(result.isEmpty()); Bag b1 = result.get(0); - List things = (List) b1 - .readPropertyDirectly(Bag.THINGS_PROPERTY); + List things = (List) b1.readPropertyDirectly(Bag.THINGS_PROPERTY); assertNotNull(things); assertFalse(((ValueHolder) things).isFault()); assertEquals(6, things.size()); @@ -319,13 +276,10 @@ public class DataContextDisjointByIdPref 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.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); + query.addPrefetch(Ball.THING_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); final List balls = context.performQuery(query); @@ -335,37 +289,8 @@ public class DataContextDisjointByIdPref assertEquals(2, balls.size()); - balls.get(0).getThing().getVolume(); - balls.get(1).getThing().getVolume(); - } - }); - } - - 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 result = context.performQuery(query); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertFalse(result.isEmpty()); - List volumes = new ArrayList(); - for (Box box : result) { - List things = (List) 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))); + balls.get(0).getThing().getVolume(); + balls.get(1).getThing().getVolume(); } }); } @@ -374,8 +299,7 @@ public class DataContextDisjointByIdPref createBagWithTwoBoxesAndPlentyOfBallsDataSet(); SelectQuery query = new SelectQuery(Box.class); - query.addPrefetch(Box.BALLS_PROPERTY).setSemantics( - PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); + 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 result = context.performQuery(query); @@ -386,17 +310,13 @@ public class DataContextDisjointByIdPref assertFalse(result.isEmpty()); List volumes = new ArrayList(); for (Box box : result) { - List balls = (List) box - .readPropertyDirectly(Box.BALLS_PROPERTY); + List balls = (List) box.readPropertyDirectly(Box.BALLS_PROPERTY); assertNotNull(balls); assertFalse(((ValueHolder) balls).isFault()); for (Ball ball : balls) { - Thing thing = (Thing) ball - .readPropertyDirectly(Ball.THING_PROPERTY); + Thing thing = (Thing) ball.readPropertyDirectly(Ball.THING_PROPERTY); assertNotNull(thing); - assertEquals( - PersistenceState.COMMITTED, - thing.getPersistenceState()); + assertEquals(PersistenceState.COMMITTED, thing.getPersistenceState()); volumes.add(thing.getVolume()); } } @@ -410,8 +330,7 @@ public class DataContextDisjointByIdPref createBagWithTwoBoxesAndPlentyOfBallsDataSet(); SelectQuery query = new SelectQuery(Bag.class); - query.addPrefetch(Bag.BOXES_PROPERTY).setSemantics( - PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); + query.addPrefetch(Bag.BOXES_PROPERTY).setSemantics(PrefetchTreeNode.DISJOINT_BY_ID_PREFETCH_SEMANTICS); query.addPrefetch(Bag.BOXES_PROPERTY + "." + Box.BALLS_PROPERTY).setSemantics( PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); final List result = context.performQuery(query); @@ -422,8 +341,7 @@ public class DataContextDisjointByIdPref assertFalse(result.isEmpty()); Bag bag = result.get(0); - List boxes = (List) bag - .readPropertyDirectly(Bag.BOXES_PROPERTY); + List boxes = (List) bag.readPropertyDirectly(Bag.BOXES_PROPERTY); assertNotNull(boxes); assertFalse(((ValueHolder) boxes).isFault()); assertEquals(2, boxes.size()); @@ -440,9 +358,7 @@ public class DataContextDisjointByIdPref assertTrue(names.contains("big")); assertTrue(names.contains("small")); - - List balls = (List) big - .readPropertyDirectly(Box.BALLS_PROPERTY); + List balls = (List) big.readPropertyDirectly(Box.BALLS_PROPERTY); assertNotNull(balls); assertFalse(((ValueHolder) balls).isFault()); assertEquals(2, balls.size());