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/02/08 21:03:08 UTC
svn commit: r1566114 - in
/cayenne/main/trunk/cayenne-server/src/test/java/org/apache/cayenne/access:
DataContextDisjointByIdPrefetchTest.java
DataContextDisjointByIdPrefetch_ExtrasTest.java
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<Bag> result = context.performQuery(query);
+ final List<Artist> result = context.performQuery(query);
queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
public void execute() {
assertFalse(result.isEmpty());
- Bag b1 = result.get(0);
- List<Box> toMany = (List<Box>) b1
- .readPropertyDirectly(Bag.BOXES_PROPERTY);
+ 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 (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<Box> result = context.performQuery(query);
+ final List<Painting> 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<Bag> bags = context.performQuery(query);
+ final List<Artist> 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<Box> result = context.performQuery(query);
+ final List<Painting> result = context.performQuery(query);
queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
public void execute() {
assertFalse(result.isEmpty());
List<String> boxColors = new ArrayList<String>();
- 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<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 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 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 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 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<Bag> result = context.performQuery(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)));
- }
- });
- }
}
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<Object> invalidate = new ArrayList<Object>();
+ 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<Bag> result = context.performQuery(query);
+
queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
public void execute() {
assertFalse(result.isEmpty());
Bag b1 = result.get(0);
- List<Box> toMany = (List<Box>) b1
- .readPropertyDirectly(Bag.BOXES_PROPERTY);
- assertNotNull(toMany);
- assertFalse(((ValueHolder) toMany).isFault());
- assertEquals(2, toMany.size());
+ List<Ball> balls = (List<Ball>) b1.readPropertyDirectly(Bag.BALLS_PROPERTY);
+ assertNotNull(balls);
+ assertFalse(((ValueHolder) balls).isFault());
+ assertEquals(6, balls.size());
- List<String> names = new ArrayList<String>();
- for (Box b : toMany) {
+ List<Integer> volumes = new ArrayList<Integer>();
+ 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<Box> 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<Bag> 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<Box> result = context.performQuery(query);
- queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() {
-
- public void execute() {
- assertFalse(result.isEmpty());
- List<String> boxColors = new ArrayList<String>();
- 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<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());
+ 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());
+ }
}
- 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<Bag> 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<Thing> things = (List<Thing>) b1
- .readPropertyDirectly(Bag.THINGS_PROPERTY);
+ List<Thing> things = (List<Thing>) 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<Ball> 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<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)));
+ 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<Box> result = context.performQuery(query);
@@ -386,17 +310,13 @@ public class DataContextDisjointByIdPref
assertFalse(result.isEmpty());
List<Integer> volumes = new ArrayList<Integer>();
for (Box box : result) {
- List<Ball> balls = (List<Ball>) box
- .readPropertyDirectly(Box.BALLS_PROPERTY);
+ 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);
+ 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<Bag> result = context.performQuery(query);
@@ -422,8 +341,7 @@ public class DataContextDisjointByIdPref
assertFalse(result.isEmpty());
Bag bag = result.get(0);
- List<Box> boxes = (List<Box>) bag
- .readPropertyDirectly(Bag.BOXES_PROPERTY);
+ List<Box> boxes = (List<Box>) 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<Ball> balls = (List<Ball>) big
- .readPropertyDirectly(Box.BALLS_PROPERTY);
+ List<Ball> balls = (List<Ball>) big.readPropertyDirectly(Box.BALLS_PROPERTY);
assertNotNull(balls);
assertFalse(((ValueHolder) balls).isFault());
assertEquals(2, balls.size());