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:18 UTC
[30/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/DataContextRefreshQueryTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshQueryTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshQueryTest.java
deleted file mode 100644
index 7ad23ce..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshQueryTest.java
+++ /dev/null
@@ -1,440 +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.util.List;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.ValueHolder;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.ExpressionFactory;
-import org.apache.cayenne.query.QueryCacheStrategy;
-import org.apache.cayenne.query.RefreshQuery;
-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.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataContextRefreshQueryTest extends ServerCase {
-
- @Inject
- protected DataContext context;
-
- @Inject
- protected DBHelper dbHelper;
-
- protected TableHelper tArtist;
- protected TableHelper tPainting;
-
- @Override
- public 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",
- "PAINTING_TITLE",
- "ARTIST_ID",
- "ESTIMATED_PRICE");
- }
-
- protected void createRefreshCollectionDataSet() throws Exception {
- tArtist.insert(33001, "c");
- tArtist.insert(33002, "b");
- tPainting.insert(33001, "P1", 33001, 3000);
- tPainting.insert(33002, "P2", 33001, 4000);
- }
-
- protected void createRefreshCollectionToOneUpdateDataSet() throws Exception {
- tPainting.update().set("ARTIST_ID", 33002).execute();
- }
-
- protected void createRefreshObjectToManyDataSet() throws Exception {
- tArtist.insert(33001, "c");
- tPainting.insert(33001, "P1", 33001, 3000);
- tPainting.insert(33002, "P2", 33001, 4000);
- }
-
- protected void createRefreshObjectToManyUpdateDataSet() throws Exception {
- tPainting.delete().where("PAINTING_ID", 33001).execute();
- }
-
- public void testRefreshCollection() throws Exception {
- createRefreshCollectionDataSet();
-
- SelectQuery q = new SelectQuery(Artist.class);
- q.addOrdering("db:ARTIST_ID", SortOrder.ASCENDING);
- List<?> artists = context.performQuery(q);
-
- Artist a1 = (Artist) artists.get(0);
- Artist a2 = (Artist) artists.get(1);
-
- assertEquals(2, a1.getPaintingArray().size());
- assertEquals(0, a2.getPaintingArray().size());
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a1.getObjectId()));
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a2.getObjectId()));
-
- RefreshQuery refresh = new RefreshQuery(artists);
- context.performQuery(refresh);
-
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a1.getObjectId()));
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a2.getObjectId()));
-
- assertEquals(PersistenceState.HOLLOW, a1.getPersistenceState());
- assertEquals(PersistenceState.HOLLOW, a2.getPersistenceState());
-
- assertTrue(((ValueHolder) a1.readProperty(Artist.PAINTING_ARRAY_PROPERTY))
- .isFault());
- assertTrue(((ValueHolder) a2.readProperty(Artist.PAINTING_ARRAY_PROPERTY))
- .isFault());
- }
-
- public void testRefreshCollectionToOne() throws Exception {
- createRefreshCollectionDataSet();
-
- SelectQuery q = new SelectQuery(Painting.class);
- q.addOrdering("db:PAINTING_ID", SortOrder.ASCENDING);
- List<?> paints = context.performQuery(q);
-
- Painting p1 = (Painting) paints.get(0);
- Painting p2 = (Painting) paints.get(1);
-
- Artist a1 = p1.getToArtist();
- assertSame(a1, p2.getToArtist());
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- createRefreshCollectionToOneUpdateDataSet();
-
- RefreshQuery refresh = new RefreshQuery(paints);
- context.performQuery(refresh);
-
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- assertEquals(PersistenceState.HOLLOW, p1.getPersistenceState());
- assertEquals(PersistenceState.HOLLOW, p2.getPersistenceState());
-
- assertNotSame(a1, p1.getToArtist());
- assertNotSame(a1, p2.getToArtist());
- assertEquals("b", p1.getToArtist().getArtistName());
- }
-
- public void testRefreshSingleObject() throws Exception {
- createRefreshCollectionDataSet();
-
- SelectQuery q = new SelectQuery(Artist.class);
- q.addOrdering("db:ARTIST_ID", SortOrder.ASCENDING);
- List<?> artists = context.performQuery(q);
-
- Artist a1 = (Artist) artists.get(0);
-
- assertEquals(2, a1.getPaintingArray().size());
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a1.getObjectId()));
-
- RefreshQuery refresh = new RefreshQuery(a1);
- context.performQuery(refresh);
-
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a1.getObjectId()));
-
- assertEquals(PersistenceState.HOLLOW, a1.getPersistenceState());
-
- assertTrue(((ValueHolder) a1.readProperty(Artist.PAINTING_ARRAY_PROPERTY))
- .isFault());
- }
-
- public void testRefreshObjectToMany() throws Exception {
- createRefreshObjectToManyDataSet();
-
- Artist a = Cayenne.objectForPK(context, Artist.class, 33001l);
- assertEquals(2, a.getPaintingArray().size());
-
- createRefreshObjectToManyUpdateDataSet();
-
- RefreshQuery refresh = new RefreshQuery(a);
- context.performQuery(refresh);
- assertEquals(PersistenceState.HOLLOW, a.getPersistenceState());
- assertEquals(1, a.getPaintingArray().size());
- }
-
- public void testRefreshQueryResultsLocalCache() throws Exception {
- createRefreshCollectionDataSet();
-
- Expression qual = ExpressionFactory.matchExp(
- Painting.PAINTING_TITLE_PROPERTY,
- "P2");
- SelectQuery q = new SelectQuery(Painting.class, qual);
- q.addOrdering("db:PAINTING_ID", SortOrder.ASCENDING);
- q.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
- q.setCacheGroups("X");
- List<?> paints = context.performQuery(q);
-
- // fetch P1 separately from cached query
- Painting p1 = Cayenne.objectForPK(context, Painting.class, 33001);
-
- Painting p2 = (Painting) paints.get(0);
- Artist a1 = p2.getToArtist();
- assertSame(a1, p1.getToArtist());
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- createRefreshCollectionToOneUpdateDataSet();
-
- RefreshQuery refresh = new RefreshQuery(q);
- context.performQuery(refresh);
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
-
- // probably refreshed eagerly
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- assertEquals(PersistenceState.COMMITTED, p1.getPersistenceState());
- assertEquals(PersistenceState.COMMITTED, p2.getPersistenceState());
-
- assertSame(a1, p1.getToArtist());
- assertNotSame(a1, p2.getToArtist());
- assertEquals("c", p1.getToArtist().getArtistName());
- assertEquals("b", p2.getToArtist().getArtistName());
- }
-
- public void testRefreshQueryResultsSharedCache() throws Exception {
- createRefreshCollectionDataSet();
-
- Expression qual = ExpressionFactory.matchExp(
- Painting.PAINTING_TITLE_PROPERTY,
- "P2");
- SelectQuery q = new SelectQuery(Painting.class, qual);
- q.addOrdering("db:PAINTING_ID", SortOrder.ASCENDING);
- q.setCacheStrategy(QueryCacheStrategy.SHARED_CACHE);
- q.setCacheGroups("X");
- List<?> paints = context.performQuery(q);
-
- // fetch P1 separately from cached query
- Painting p1 = Cayenne.objectForPK(context, Painting.class, 33001);
-
- Painting p2 = (Painting) paints.get(0);
- Artist a1 = p2.getToArtist();
- assertSame(a1, p1.getToArtist());
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- createRefreshCollectionToOneUpdateDataSet();
-
- RefreshQuery refresh = new RefreshQuery(q);
- context.performQuery(refresh);
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
-
- // probably refreshed eagerly
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- assertEquals(PersistenceState.COMMITTED, p1.getPersistenceState());
- assertEquals(PersistenceState.COMMITTED, p2.getPersistenceState());
-
- assertSame(a1, p1.getToArtist());
- assertNotSame(a1, p2.getToArtist());
- assertEquals("c", p1.getToArtist().getArtistName());
- assertEquals("b", p2.getToArtist().getArtistName());
- }
-
- public void testRefreshQueryResultGroupLocal() throws Exception {
- createRefreshCollectionDataSet();
-
- Expression qual = ExpressionFactory.matchExp(
- Painting.PAINTING_TITLE_PROPERTY,
- "P2");
- SelectQuery q = new SelectQuery(Painting.class, qual);
- q.addOrdering("db:PAINTING_ID", SortOrder.ASCENDING);
- q.setCacheStrategy(QueryCacheStrategy.LOCAL_CACHE);
- q.setCacheGroups("X");
- List<?> paints = context.performQuery(q);
-
- // fetch P1 separately from cached query
- Painting p1 = Cayenne.objectForPK(context, Painting.class, 33001);
-
- Painting p2 = (Painting) paints.get(0);
- Artist a1 = p2.getToArtist();
- assertSame(a1, p1.getToArtist());
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- createRefreshCollectionToOneUpdateDataSet();
-
- // results are served from cache and therefore are not refreshed
- context.performQuery(q);
- assertSame(a1, p1.getToArtist());
- assertSame(a1, p2.getToArtist());
- assertEquals("c", p1.getToArtist().getArtistName());
- assertEquals("c", p2.getToArtist().getArtistName());
-
- RefreshQuery refresh = new RefreshQuery("X");
-
- // this should invalidate results for the next query run
- context.performQuery(refresh);
-
- // this should force a refresh
- context.performQuery(q);
-
- assertEquals(PersistenceState.COMMITTED, p1.getPersistenceState());
- assertEquals(PersistenceState.COMMITTED, p2.getPersistenceState());
-
- assertSame(a1, p1.getToArtist());
- assertNotSame(a1, p2.getToArtist());
- assertEquals("c", p1.getToArtist().getArtistName());
- assertEquals("b", p2.getToArtist().getArtistName());
- }
-
- public void testRefreshAll() throws Exception {
- createRefreshCollectionDataSet();
-
- SelectQuery q = new SelectQuery(Artist.class);
- q.addOrdering("db:ARTIST_ID", SortOrder.ASCENDING);
- List<?> artists = context.performQuery(q);
-
- Artist a1 = (Artist) artists.get(0);
- Artist a2 = (Artist) artists.get(1);
- Painting p1 = a1.getPaintingArray().get(0);
- Painting p2 = a1.getPaintingArray().get(0);
-
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a1.getObjectId()));
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a2.getObjectId()));
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
- assertNotNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- RefreshQuery refresh = new RefreshQuery();
- context.performQuery(refresh);
-
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a1.getObjectId()));
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(a2.getObjectId()));
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p1.getObjectId()));
- assertNull(context
- .getParentDataDomain()
- .getSharedSnapshotCache()
- .getCachedSnapshot(p2.getObjectId()));
-
- assertEquals(PersistenceState.HOLLOW, a1.getPersistenceState());
- assertEquals(PersistenceState.HOLLOW, a2.getPersistenceState());
- assertEquals(PersistenceState.HOLLOW, p1.getPersistenceState());
- assertEquals(PersistenceState.HOLLOW, p2.getPersistenceState());
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java
new file mode 100644
index 0000000..91fb0ef
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingIT.java
@@ -0,0 +1,371 @@
+/*****************************************************************
+ * 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.exp.ExpressionFactory;
+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.Artist;
+import org.apache.cayenne.testdo.testmap.Painting;
+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.Date;
+import java.util.List;
+
+/**
+ * Test suite covering possible scenarios of refreshing updated objects. This includes
+ * refreshing relationships and attributes changed outside of Cayenne with and without
+ * prefetching.
+ */
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataContextRefreshingIT extends ServerCase {
+
+ @Inject
+ protected DataContext context;
+
+ @Inject
+ protected DBHelper dbHelper;
+
+ @Inject
+ protected DataChannelInterceptor queryInterceptor;
+
+ protected TableHelper tArtist;
+ protected TableHelper tPainting;
+
+ @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",
+ "PAINTING_TITLE",
+ "ARTIST_ID",
+ "ESTIMATED_PRICE").setColumnTypes(
+ Types.INTEGER,
+ Types.VARCHAR,
+ Types.BIGINT,
+ Types.DECIMAL);
+ }
+
+ protected void createSingleArtistDataSet() throws Exception {
+ tArtist.insert(5, "artist2");
+ }
+
+ protected void createSingleArtistAndPaintingDataSet() throws Exception {
+ createSingleArtistDataSet();
+ tPainting.insert(4, "p", 5, 1000);
+ }
+
+ protected void createSingleArtistAndUnrelatedPaintingDataSet() throws Exception {
+ createSingleArtistDataSet();
+ tPainting.insert(4, "p", null, 1000);
+ }
+
+ protected void createTwoArtistsAndPaintingDataSet() throws Exception {
+ tArtist.insert(5, "artist2");
+ tArtist.insert(6, "artist3");
+ tPainting.insert(4, "p", 5, 1000);
+ }
+
+ public void testRefetchRootWithUpdatedAttributes() throws Exception {
+
+ createSingleArtistDataSet();
+
+ String nameBefore = "artist2";
+ String nameAfter = "not an artist";
+
+ SelectQuery queryBefore = new SelectQuery(
+ Artist.class,
+ ExpressionFactory.matchExp("artistName", nameBefore));
+
+ Artist artist = (Artist) context.performQuery(queryBefore).get(0);
+ assertEquals(nameBefore, artist.getArtistName());
+
+ assertEquals(1, tArtist.update().set("ARTIST_NAME", nameAfter).execute());
+
+ // fetch into the same context
+ List<Artist> artists = context.performQuery(queryBefore);
+ assertEquals(0, artists.size());
+
+ SelectQuery queryAfter = new SelectQuery(
+ Artist.class,
+ ExpressionFactory.matchExp("artistName", nameAfter));
+
+ artist = (Artist) context.performQuery(queryAfter).get(0);
+ assertNotNull(artist);
+ assertEquals(nameAfter, artist.getArtistName());
+ }
+
+ public void testRefetchRootWithNullifiedToOne() throws Exception {
+ createSingleArtistAndPaintingDataSet();
+
+ Painting painting = (Painting) context.performQuery(
+ new SelectQuery(Painting.class)).get(0);
+
+ assertNotNull(painting.getToArtist());
+ assertEquals("artist2", painting.getToArtist().getArtistName());
+
+ assertEquals(1, tPainting.update().set("ARTIST_ID", null, Types.BIGINT).execute());
+
+ // select without prefetch
+ painting = (Painting) context
+ .performQuery(new SelectQuery(Painting.class))
+ .get(0);
+ assertNotNull(painting);
+ assertNull(painting.getToArtist());
+ }
+
+ public void testRefetchRootWithChangedToOneTarget() throws Exception {
+ createTwoArtistsAndPaintingDataSet();
+
+ Painting painting = (Painting) context.performQuery(
+ new SelectQuery(Painting.class)).get(0);
+
+ Artist artistBefore = painting.getToArtist();
+ assertNotNull(artistBefore);
+ assertEquals("artist2", artistBefore.getArtistName());
+
+ assertEquals(1, tPainting.update().set("ARTIST_ID", 6).execute());
+
+ // select without prefetch
+ painting = (Painting) context
+ .performQuery(new SelectQuery(Painting.class))
+ .get(0);
+ assertNotNull(painting);
+ assertEquals("artist3", painting.getToArtist().getArtistName());
+ }
+
+ public void testRefetchRootWithNullToOneTargetChangedToNotNull() throws Exception {
+ createSingleArtistAndUnrelatedPaintingDataSet();
+
+ Painting painting = (Painting) context.performQuery(
+ new SelectQuery(Painting.class)).get(0);
+
+ assertNull(painting.getToArtist());
+
+ assertEquals(1, tPainting.update().set("ARTIST_ID", 5).execute());
+
+ // select without prefetch
+ painting = (Painting) context
+ .performQuery(new SelectQuery(Painting.class))
+ .get(0);
+ assertNotNull(painting);
+ assertEquals("artist2", painting.getToArtist().getArtistName());
+ }
+
+ public void testRefetchRootWithDeletedToMany() throws Exception {
+ createSingleArtistAndPaintingDataSet();
+
+ Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
+ 0);
+ assertEquals(artist.getPaintingArray().size(), 1);
+
+ assertEquals(1, tPainting
+ .delete()
+ .where(Painting.PAINTING_ID_PK_COLUMN, 4)
+ .execute());
+
+ // select without prefetch
+ artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(0);
+ assertEquals(artist.getPaintingArray().size(), 1);
+
+ // select using relationship prefetching
+ SelectQuery query = new SelectQuery(Artist.class);
+ query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+ artist = (Artist) context.performQuery(query).get(0);
+ assertEquals(0, artist.getPaintingArray().size());
+ }
+
+ public void testRefetchRootWithAddedToMany() throws Exception {
+
+ createSingleArtistDataSet();
+
+ Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
+ 0);
+ assertEquals(artist.getPaintingArray().size(), 0);
+
+ tPainting.insert(5, "p", 5, 1000);
+
+ // select without prefetch
+ SelectQuery query = new SelectQuery(Artist.class);
+ artist = (Artist) context.performQuery(query).get(0);
+ assertEquals(artist.getPaintingArray().size(), 0);
+
+ // select using relationship prefetching
+ query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
+ artist = (Artist) context.performQuery(query).get(0);
+ assertEquals(artist.getPaintingArray().size(), 1);
+ }
+
+ public void testInvalidateRootWithUpdatedAttributes() throws Exception {
+ createSingleArtistDataSet();
+
+ String nameBefore = "artist2";
+ String nameAfter = "not an artist";
+
+ Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
+ 0);
+ assertNotNull(artist);
+ assertEquals(nameBefore, artist.getArtistName());
+
+ // update via DataNode directly
+ assertEquals(1, tArtist.update().set("ARTIST_NAME", nameAfter).execute());
+
+ context.invalidateObjects(artist);
+ assertEquals(nameAfter, artist.getArtistName());
+ }
+
+ public void testInvalidateRootWithNullifiedToOne() throws Exception {
+
+ createSingleArtistAndPaintingDataSet();
+
+ Painting painting = (Painting) context.performQuery(
+ new SelectQuery(Painting.class)).get(0);
+
+ assertNotNull(painting.getToArtist());
+ assertEquals("artist2", painting.getToArtist().getArtistName());
+
+ assertEquals(1, tPainting.update().set("ARTIST_ID", null, Types.BIGINT).execute());
+
+ context.invalidateObjects(painting);
+ assertNull(painting.getToArtist());
+ }
+
+ public void testInvalidateRootWithChangedToOneTarget() throws Exception {
+ createTwoArtistsAndPaintingDataSet();
+
+ Painting painting = (Painting) context.performQuery(
+ new SelectQuery(Painting.class)).get(0);
+ Artist artistBefore = painting.getToArtist();
+ assertNotNull(artistBefore);
+ assertEquals("artist2", artistBefore.getArtistName());
+
+ assertEquals(1, tPainting.update().set("ARTIST_ID", 6).execute());
+
+ context.invalidateObjects(painting);
+ assertNotSame(artistBefore, painting.getToArtist());
+ assertEquals("artist3", painting.getToArtist().getArtistName());
+ }
+
+ public void testInvalidateRootWithNullToOneTargetChangedToNotNull() throws Exception {
+ createSingleArtistAndUnrelatedPaintingDataSet();
+
+ Painting painting = (Painting) context.performQuery(
+ new SelectQuery(Painting.class)).get(0);
+ assertNull(painting.getToArtist());
+
+ assertEquals(1, tPainting.update().set("ARTIST_ID", 5).execute());
+
+ context.invalidateObjects(painting);
+ assertNotNull(painting.getToArtist());
+ assertEquals("artist2", painting.getToArtist().getArtistName());
+ }
+
+ public void testInvalidateRootWithDeletedToMany() throws Exception {
+ createSingleArtistAndPaintingDataSet();
+
+ Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
+ 0);
+ assertEquals(artist.getPaintingArray().size(), 1);
+
+ assertEquals(1, tPainting.delete().execute());
+
+ context.invalidateObjects(artist);
+ assertEquals(artist.getPaintingArray().size(), 0);
+ }
+
+ public void testInvaliateRootWithAddedToMany() throws Exception {
+
+ createSingleArtistDataSet();
+
+ Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
+ 0);
+ assertEquals(artist.getPaintingArray().size(), 0);
+
+ tPainting.insert(4, "p", 5, 1000);
+
+ assertEquals(artist.getPaintingArray().size(), 0);
+ context.invalidateObjects(artist);
+ assertEquals(artist.getPaintingArray().size(), 1);
+ }
+
+ public void testInvalidateThenModify() throws Exception {
+
+ createSingleArtistDataSet();
+
+ final Artist artist = (Artist) context
+ .performQuery(new SelectQuery(Artist.class))
+ .get(0);
+ assertNotNull(artist);
+
+ context.invalidateObjects(artist);
+ assertEquals(PersistenceState.HOLLOW, artist.getPersistenceState());
+
+ int queries = queryInterceptor.runWithQueryCounter(new UnitTestClosure() {
+
+ public void execute() {
+ // this must trigger a fetch
+ artist.setArtistName("new name");
+ }
+ });
+
+ assertEquals(1, queries);
+ assertEquals(PersistenceState.MODIFIED, artist.getPersistenceState());
+ }
+
+ public void testModifyHollow() throws Exception {
+
+ createSingleArtistAndPaintingDataSet();
+
+ Painting painting = (Painting) context.performQuery(
+ new SelectQuery(Painting.class)).get(0);
+ final Artist artist = painting.getToArtist();
+ assertEquals(PersistenceState.HOLLOW, artist.getPersistenceState());
+ assertNull(artist.readPropertyDirectly("artistName"));
+
+ int queries = queryInterceptor.runWithQueryCounter(new UnitTestClosure() {
+
+ public void execute() {
+ // this must trigger a fetch
+ artist.setDateOfBirth(new Date());
+ }
+ });
+
+ assertEquals(1, queries);
+
+ assertEquals(PersistenceState.MODIFIED, artist.getPersistenceState());
+ assertNotNull(artist.readPropertyDirectly("artistName"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingTest.java
deleted file mode 100644
index 8e83be6..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRefreshingTest.java
+++ /dev/null
@@ -1,371 +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.Date;
-import java.util.List;
-
-import org.apache.cayenne.PersistenceState;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.exp.ExpressionFactory;
-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.Artist;
-import org.apache.cayenne.testdo.testmap.Painting;
-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;
-
-/**
- * Test suite covering possible scenarios of refreshing updated objects. This includes
- * refreshing relationships and attributes changed outside of Cayenne with and without
- * prefetching.
- */
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataContextRefreshingTest extends ServerCase {
-
- @Inject
- protected DataContext context;
-
- @Inject
- protected DBHelper dbHelper;
-
- @Inject
- protected DataChannelInterceptor queryInterceptor;
-
- protected TableHelper tArtist;
- protected TableHelper tPainting;
-
- @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",
- "PAINTING_TITLE",
- "ARTIST_ID",
- "ESTIMATED_PRICE").setColumnTypes(
- Types.INTEGER,
- Types.VARCHAR,
- Types.BIGINT,
- Types.DECIMAL);
- }
-
- protected void createSingleArtistDataSet() throws Exception {
- tArtist.insert(5, "artist2");
- }
-
- protected void createSingleArtistAndPaintingDataSet() throws Exception {
- createSingleArtistDataSet();
- tPainting.insert(4, "p", 5, 1000);
- }
-
- protected void createSingleArtistAndUnrelatedPaintingDataSet() throws Exception {
- createSingleArtistDataSet();
- tPainting.insert(4, "p", null, 1000);
- }
-
- protected void createTwoArtistsAndPaintingDataSet() throws Exception {
- tArtist.insert(5, "artist2");
- tArtist.insert(6, "artist3");
- tPainting.insert(4, "p", 5, 1000);
- }
-
- public void testRefetchRootWithUpdatedAttributes() throws Exception {
-
- createSingleArtistDataSet();
-
- String nameBefore = "artist2";
- String nameAfter = "not an artist";
-
- SelectQuery queryBefore = new SelectQuery(
- Artist.class,
- ExpressionFactory.matchExp("artistName", nameBefore));
-
- Artist artist = (Artist) context.performQuery(queryBefore).get(0);
- assertEquals(nameBefore, artist.getArtistName());
-
- assertEquals(1, tArtist.update().set("ARTIST_NAME", nameAfter).execute());
-
- // fetch into the same context
- List<Artist> artists = context.performQuery(queryBefore);
- assertEquals(0, artists.size());
-
- SelectQuery queryAfter = new SelectQuery(
- Artist.class,
- ExpressionFactory.matchExp("artistName", nameAfter));
-
- artist = (Artist) context.performQuery(queryAfter).get(0);
- assertNotNull(artist);
- assertEquals(nameAfter, artist.getArtistName());
- }
-
- public void testRefetchRootWithNullifiedToOne() throws Exception {
- createSingleArtistAndPaintingDataSet();
-
- Painting painting = (Painting) context.performQuery(
- new SelectQuery(Painting.class)).get(0);
-
- assertNotNull(painting.getToArtist());
- assertEquals("artist2", painting.getToArtist().getArtistName());
-
- assertEquals(1, tPainting.update().set("ARTIST_ID", null, Types.BIGINT).execute());
-
- // select without prefetch
- painting = (Painting) context
- .performQuery(new SelectQuery(Painting.class))
- .get(0);
- assertNotNull(painting);
- assertNull(painting.getToArtist());
- }
-
- public void testRefetchRootWithChangedToOneTarget() throws Exception {
- createTwoArtistsAndPaintingDataSet();
-
- Painting painting = (Painting) context.performQuery(
- new SelectQuery(Painting.class)).get(0);
-
- Artist artistBefore = painting.getToArtist();
- assertNotNull(artistBefore);
- assertEquals("artist2", artistBefore.getArtistName());
-
- assertEquals(1, tPainting.update().set("ARTIST_ID", 6).execute());
-
- // select without prefetch
- painting = (Painting) context
- .performQuery(new SelectQuery(Painting.class))
- .get(0);
- assertNotNull(painting);
- assertEquals("artist3", painting.getToArtist().getArtistName());
- }
-
- public void testRefetchRootWithNullToOneTargetChangedToNotNull() throws Exception {
- createSingleArtistAndUnrelatedPaintingDataSet();
-
- Painting painting = (Painting) context.performQuery(
- new SelectQuery(Painting.class)).get(0);
-
- assertNull(painting.getToArtist());
-
- assertEquals(1, tPainting.update().set("ARTIST_ID", 5).execute());
-
- // select without prefetch
- painting = (Painting) context
- .performQuery(new SelectQuery(Painting.class))
- .get(0);
- assertNotNull(painting);
- assertEquals("artist2", painting.getToArtist().getArtistName());
- }
-
- public void testRefetchRootWithDeletedToMany() throws Exception {
- createSingleArtistAndPaintingDataSet();
-
- Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
- 0);
- assertEquals(artist.getPaintingArray().size(), 1);
-
- assertEquals(1, tPainting
- .delete()
- .where(Painting.PAINTING_ID_PK_COLUMN, 4)
- .execute());
-
- // select without prefetch
- artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(0);
- assertEquals(artist.getPaintingArray().size(), 1);
-
- // select using relationship prefetching
- SelectQuery query = new SelectQuery(Artist.class);
- query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
- artist = (Artist) context.performQuery(query).get(0);
- assertEquals(0, artist.getPaintingArray().size());
- }
-
- public void testRefetchRootWithAddedToMany() throws Exception {
-
- createSingleArtistDataSet();
-
- Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
- 0);
- assertEquals(artist.getPaintingArray().size(), 0);
-
- tPainting.insert(5, "p", 5, 1000);
-
- // select without prefetch
- SelectQuery query = new SelectQuery(Artist.class);
- artist = (Artist) context.performQuery(query).get(0);
- assertEquals(artist.getPaintingArray().size(), 0);
-
- // select using relationship prefetching
- query.addPrefetch(Artist.PAINTING_ARRAY_PROPERTY);
- artist = (Artist) context.performQuery(query).get(0);
- assertEquals(artist.getPaintingArray().size(), 1);
- }
-
- public void testInvalidateRootWithUpdatedAttributes() throws Exception {
- createSingleArtistDataSet();
-
- String nameBefore = "artist2";
- String nameAfter = "not an artist";
-
- Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
- 0);
- assertNotNull(artist);
- assertEquals(nameBefore, artist.getArtistName());
-
- // update via DataNode directly
- assertEquals(1, tArtist.update().set("ARTIST_NAME", nameAfter).execute());
-
- context.invalidateObjects(artist);
- assertEquals(nameAfter, artist.getArtistName());
- }
-
- public void testInvalidateRootWithNullifiedToOne() throws Exception {
-
- createSingleArtistAndPaintingDataSet();
-
- Painting painting = (Painting) context.performQuery(
- new SelectQuery(Painting.class)).get(0);
-
- assertNotNull(painting.getToArtist());
- assertEquals("artist2", painting.getToArtist().getArtistName());
-
- assertEquals(1, tPainting.update().set("ARTIST_ID", null, Types.BIGINT).execute());
-
- context.invalidateObjects(painting);
- assertNull(painting.getToArtist());
- }
-
- public void testInvalidateRootWithChangedToOneTarget() throws Exception {
- createTwoArtistsAndPaintingDataSet();
-
- Painting painting = (Painting) context.performQuery(
- new SelectQuery(Painting.class)).get(0);
- Artist artistBefore = painting.getToArtist();
- assertNotNull(artistBefore);
- assertEquals("artist2", artistBefore.getArtistName());
-
- assertEquals(1, tPainting.update().set("ARTIST_ID", 6).execute());
-
- context.invalidateObjects(painting);
- assertNotSame(artistBefore, painting.getToArtist());
- assertEquals("artist3", painting.getToArtist().getArtistName());
- }
-
- public void testInvalidateRootWithNullToOneTargetChangedToNotNull() throws Exception {
- createSingleArtistAndUnrelatedPaintingDataSet();
-
- Painting painting = (Painting) context.performQuery(
- new SelectQuery(Painting.class)).get(0);
- assertNull(painting.getToArtist());
-
- assertEquals(1, tPainting.update().set("ARTIST_ID", 5).execute());
-
- context.invalidateObjects(painting);
- assertNotNull(painting.getToArtist());
- assertEquals("artist2", painting.getToArtist().getArtistName());
- }
-
- public void testInvalidateRootWithDeletedToMany() throws Exception {
- createSingleArtistAndPaintingDataSet();
-
- Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
- 0);
- assertEquals(artist.getPaintingArray().size(), 1);
-
- assertEquals(1, tPainting.delete().execute());
-
- context.invalidateObjects(artist);
- assertEquals(artist.getPaintingArray().size(), 0);
- }
-
- public void testInvaliateRootWithAddedToMany() throws Exception {
-
- createSingleArtistDataSet();
-
- Artist artist = (Artist) context.performQuery(new SelectQuery(Artist.class)).get(
- 0);
- assertEquals(artist.getPaintingArray().size(), 0);
-
- tPainting.insert(4, "p", 5, 1000);
-
- assertEquals(artist.getPaintingArray().size(), 0);
- context.invalidateObjects(artist);
- assertEquals(artist.getPaintingArray().size(), 1);
- }
-
- public void testInvalidateThenModify() throws Exception {
-
- createSingleArtistDataSet();
-
- final Artist artist = (Artist) context
- .performQuery(new SelectQuery(Artist.class))
- .get(0);
- assertNotNull(artist);
-
- context.invalidateObjects(artist);
- assertEquals(PersistenceState.HOLLOW, artist.getPersistenceState());
-
- int queries = queryInterceptor.runWithQueryCounter(new UnitTestClosure() {
-
- public void execute() {
- // this must trigger a fetch
- artist.setArtistName("new name");
- }
- });
-
- assertEquals(1, queries);
- assertEquals(PersistenceState.MODIFIED, artist.getPersistenceState());
- }
-
- public void testModifyHollow() throws Exception {
-
- createSingleArtistAndPaintingDataSet();
-
- Painting painting = (Painting) context.performQuery(
- new SelectQuery(Painting.class)).get(0);
- final Artist artist = painting.getToArtist();
- assertEquals(PersistenceState.HOLLOW, artist.getPersistenceState());
- assertNull(artist.readPropertyDirectly("artistName"));
-
- int queries = queryInterceptor.runWithQueryCounter(new UnitTestClosure() {
-
- public void execute() {
- // this must trigger a fetch
- artist.setDateOfBirth(new Date());
- }
- });
-
- assertEquals(1, queries);
-
- assertEquals(PersistenceState.MODIFIED, artist.getPersistenceState());
- assertNotNull(artist.readPropertyDirectly("artistName"));
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQueryIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQueryIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQueryIT.java
new file mode 100644
index 0000000..bb38882
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQueryIT.java
@@ -0,0 +1,137 @@
+/*****************************************************************
+ * 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.di.Inject;
+import org.apache.cayenne.query.RelationshipQuery;
+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.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+import java.util.List;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataContextRelationshipQueryIT extends ServerCase {
+
+ @Inject
+ private DataContext context;
+
+ @Inject
+ private DBHelper dbHelper;
+
+ private TableHelper tArtist;
+ private TableHelper tPainting;
+
+ @Override
+ protected void setUpAfterInjection() throws Exception {
+ dbHelper.deleteAll("PAINTING_INFO");
+ dbHelper.deleteAll("PAINTING");
+ dbHelper.deleteAll("PAINTING1");
+ 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", "PAINTING_TITLE", "ARTIST_ID");
+ }
+
+ private void createOneArtistOnePaintingDataSet() throws Exception {
+
+ tArtist.insert(1, "a1");
+ tPainting.insert(1, "p1", 1);
+ }
+
+ public void testUnrefreshingToOne() throws Exception {
+
+ createOneArtistOnePaintingDataSet();
+
+ Painting p = Cayenne.objectForPK(context, Painting.class, 1);
+
+ // resolve artist once before running non-refreshing query, to check that we do
+ // not refresh the object
+
+ Artist a = Cayenne.objectForPK(context, Artist.class, 1);
+ long v = a.getSnapshotVersion();
+ int writeCalls = a.getPropertyWrittenDirectly();
+ assertEquals("a1", a.getArtistName());
+
+ assertEquals(1, tArtist
+ .update()
+ .set("ARTIST_NAME", "a2")
+ .where("ARTIST_ID", 1)
+ .execute());
+
+ RelationshipQuery toOne = new RelationshipQuery(
+ p.getObjectId(),
+ Painting.TO_ARTIST_PROPERTY,
+ false);
+
+ List<Artist> related = context.performQuery(toOne);
+ assertEquals(1, related.size());
+ assertTrue(related.contains(a));
+ assertEquals("a1", a.getArtistName());
+ assertEquals(v, a.getSnapshotVersion());
+ assertEquals(
+ "Looks like relationship query caused snapshot refresh",
+ writeCalls,
+ a.getPropertyWrittenDirectly());
+ }
+
+ public void testRefreshingToOne() throws Exception {
+
+ createOneArtistOnePaintingDataSet();
+
+ Painting p = Cayenne.objectForPK(context, Painting.class, 1);
+
+ // resolve artist once before running non-refreshing query, to check that we do
+ // not refresh the object
+
+ Artist a = Cayenne.objectForPK(context, Artist.class, 1);
+ long v = a.getSnapshotVersion();
+ int writeCalls = a.getPropertyWrittenDirectly();
+ assertEquals("a1", a.getArtistName());
+
+ assertEquals(1, tArtist
+ .update()
+ .set("ARTIST_NAME", "a2")
+ .where("ARTIST_ID", 1)
+ .execute());
+
+ RelationshipQuery toOne = new RelationshipQuery(
+ p.getObjectId(),
+ Painting.TO_ARTIST_PROPERTY,
+ true);
+
+ List<Artist> related = context.performQuery(toOne);
+ assertEquals(1, related.size());
+ assertTrue(related.contains(a));
+ assertEquals("a2", a.getArtistName());
+ assertTrue("Looks like relationship query didn't cause a snapshot refresh", v < a
+ .getSnapshotVersion());
+ assertTrue(
+ "Looks like relationship query didn't cause a snapshot refresh",
+ writeCalls < a.getPropertyWrittenDirectly());
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQueryTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQueryTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQueryTest.java
deleted file mode 100644
index 55309b3..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRelationshipQueryTest.java
+++ /dev/null
@@ -1,137 +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.util.List;
-
-import org.apache.cayenne.Cayenne;
-import org.apache.cayenne.di.Inject;
-import org.apache.cayenne.query.RelationshipQuery;
-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.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataContextRelationshipQueryTest extends ServerCase {
-
- @Inject
- private DataContext context;
-
- @Inject
- private DBHelper dbHelper;
-
- private TableHelper tArtist;
- private TableHelper tPainting;
-
- @Override
- protected void setUpAfterInjection() throws Exception {
- dbHelper.deleteAll("PAINTING_INFO");
- dbHelper.deleteAll("PAINTING");
- dbHelper.deleteAll("PAINTING1");
- 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", "PAINTING_TITLE", "ARTIST_ID");
- }
-
- private void createOneArtistOnePaintingDataSet() throws Exception {
-
- tArtist.insert(1, "a1");
- tPainting.insert(1, "p1", 1);
- }
-
- public void testUnrefreshingToOne() throws Exception {
-
- createOneArtistOnePaintingDataSet();
-
- Painting p = Cayenne.objectForPK(context, Painting.class, 1);
-
- // resolve artist once before running non-refreshing query, to check that we do
- // not refresh the object
-
- Artist a = Cayenne.objectForPK(context, Artist.class, 1);
- long v = a.getSnapshotVersion();
- int writeCalls = a.getPropertyWrittenDirectly();
- assertEquals("a1", a.getArtistName());
-
- assertEquals(1, tArtist
- .update()
- .set("ARTIST_NAME", "a2")
- .where("ARTIST_ID", 1)
- .execute());
-
- RelationshipQuery toOne = new RelationshipQuery(
- p.getObjectId(),
- Painting.TO_ARTIST_PROPERTY,
- false);
-
- List<Artist> related = context.performQuery(toOne);
- assertEquals(1, related.size());
- assertTrue(related.contains(a));
- assertEquals("a1", a.getArtistName());
- assertEquals(v, a.getSnapshotVersion());
- assertEquals(
- "Looks like relationship query caused snapshot refresh",
- writeCalls,
- a.getPropertyWrittenDirectly());
- }
-
- public void testRefreshingToOne() throws Exception {
-
- createOneArtistOnePaintingDataSet();
-
- Painting p = Cayenne.objectForPK(context, Painting.class, 1);
-
- // resolve artist once before running non-refreshing query, to check that we do
- // not refresh the object
-
- Artist a = Cayenne.objectForPK(context, Artist.class, 1);
- long v = a.getSnapshotVersion();
- int writeCalls = a.getPropertyWrittenDirectly();
- assertEquals("a1", a.getArtistName());
-
- assertEquals(1, tArtist
- .update()
- .set("ARTIST_NAME", "a2")
- .where("ARTIST_ID", 1)
- .execute());
-
- RelationshipQuery toOne = new RelationshipQuery(
- p.getObjectId(),
- Painting.TO_ARTIST_PROPERTY,
- true);
-
- List<Artist> related = context.performQuery(toOne);
- assertEquals(1, related.size());
- assertTrue(related.contains(a));
- assertEquals("a2", a.getArtistName());
- assertTrue("Looks like relationship query didn't cause a snapshot refresh", v < a
- .getSnapshotVersion());
- assertTrue(
- "Looks like relationship query didn't cause a snapshot refresh",
- writeCalls < a.getPropertyWrittenDirectly());
- }
-}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRollbackIT.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRollbackIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRollbackIT.java
new file mode 100644
index 0000000..8b512f5
--- /dev/null
+++ b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRollbackIT.java
@@ -0,0 +1,224 @@
+/*****************************************************************
+ * 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.util.List;
+
+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.exp.ExpressionFactory;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.test.jdbc.DBHelper;
+import org.apache.cayenne.testdo.testmap.Artist;
+import org.apache.cayenne.testdo.testmap.Painting;
+import org.apache.cayenne.unit.di.server.ServerCase;
+import org.apache.cayenne.unit.di.server.UseServerRuntime;
+
+@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
+public class DataContextRollbackIT extends ServerCase {
+
+ @Inject
+ private DataContext context;
+
+ @Inject
+ private ServerRuntime serverRuntime;
+
+ @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.deleteAll("ARTIST");
+ }
+
+ public void testRollbackNew() {
+ Artist artist = (Artist) context.newObject("Artist");
+ artist.setArtistName("a");
+
+ Painting p1 = (Painting) context.newObject("Painting");
+ p1.setPaintingTitle("p1");
+ p1.setToArtist(artist);
+
+ Painting p2 = (Painting) context.newObject("Painting");
+ p2.setPaintingTitle("p2");
+ p2.setToArtist(artist);
+
+ Painting p3 = (Painting) context.newObject("Painting");
+ p3.setPaintingTitle("p3");
+ p3.setToArtist(artist);
+
+ // before:
+ assertEquals(artist, p1.getToArtist());
+ assertEquals(3, artist.getPaintingArray().size());
+
+ context.rollbackChanges();
+
+ // after:
+ assertEquals(PersistenceState.TRANSIENT, artist.getPersistenceState());
+ }
+
+ public void testRollbackNewObject() {
+ String artistName = "revertTestArtist";
+ Artist artist = (Artist) context.newObject("Artist");
+ artist.setArtistName(artistName);
+
+ context.rollbackChanges();
+
+ assertEquals(PersistenceState.TRANSIENT, artist.getPersistenceState());
+ context.commitChanges();
+ // The commit should have made no changes, so
+ // perform a fetch to ensure that this artist hasn't been persisted to the db
+
+ DataContext freshContext = (DataContext) serverRuntime.newContext();
+ assertNotSame(this.context, freshContext);
+
+ SelectQuery query = new SelectQuery(Artist.class);
+ query.setQualifier(ExpressionFactory.matchExp("artistName", artistName));
+ List<?> queryResults = freshContext.performQuery(query);
+
+ assertEquals(0, queryResults.size());
+ }
+
+ // Catches a bug where new objects were unregistered within an object iterator, thus
+ // modifying the collection the iterator was iterating over
+ // (ConcurrentModificationException)
+ public void testRollbackWithMultipleNewObjects() {
+ String artistName = "rollbackTestArtist";
+ String paintingTitle = "rollbackTestPainting";
+ Artist artist = (Artist) context.newObject("Artist");
+ artist.setArtistName(artistName);
+
+ Painting painting = (Painting) context.newObject("Painting");
+ painting.setPaintingTitle(paintingTitle);
+ painting.setToArtist(artist);
+
+ context.rollbackChanges();
+
+ assertEquals(PersistenceState.TRANSIENT, artist.getPersistenceState());
+ context.commitChanges();
+
+ // The commit should have made no changes, so
+ // perform a fetch to ensure that this artist hasn't been persisted to the db
+
+ DataContext freshContext = (DataContext) serverRuntime.newContext();
+ assertNotSame(this.context, freshContext);
+
+ SelectQuery query = new SelectQuery(Artist.class);
+ query.setQualifier(ExpressionFactory.matchExp("artistName", artistName));
+ List<?> queryResults = freshContext.performQuery(query);
+
+ assertEquals(0, queryResults.size());
+ }
+
+ public void testRollbackRelationshipModification() {
+ String artistName = "relationshipModArtist";
+ String paintingTitle = "relationshipTestPainting";
+ Artist artist = (Artist) context.newObject("Artist");
+ artist.setArtistName(artistName);
+ Painting painting = (Painting) context.newObject("Painting");
+ painting.setPaintingTitle(paintingTitle);
+ painting.setToArtist(artist);
+ context.commitChanges();
+
+ painting.setToArtist(null);
+ assertEquals(0, artist.getPaintingArray().size());
+ context.rollbackChanges();
+
+ assertTrue(((ValueHolder) artist.getPaintingArray()).isFault());
+ assertEquals(1, artist.getPaintingArray().size());
+ assertEquals(artist, painting.getToArtist());
+
+ // Check that the reverse relationship was handled
+ assertEquals(1, artist.getPaintingArray().size());
+ context.commitChanges();
+
+ DataContext freshContext = (DataContext) serverRuntime.newContext();
+ assertNotSame(this.context, freshContext);
+
+ SelectQuery query = new SelectQuery(Painting.class);
+ query.setQualifier(ExpressionFactory.matchExp("paintingTitle", paintingTitle));
+ List<?> queryResults = freshContext.performQuery(query);
+
+ assertEquals(1, queryResults.size());
+ Painting queriedPainting = (Painting) queryResults.get(0);
+
+ // NB: This is an easier comparison than manually fetching artist
+ assertEquals(artistName, queriedPainting.getToArtist().getArtistName());
+ }
+
+ public void testRollbackDeletedObject() {
+ String artistName = "deleteTestArtist";
+ Artist artist = (Artist) context.newObject("Artist");
+ artist.setArtistName(artistName);
+ context.commitChanges();
+
+ context.deleteObjects(artist);
+ context.rollbackChanges();
+
+ // Now check everything is as it should be
+ assertEquals(PersistenceState.HOLLOW, artist.getPersistenceState());
+
+ context.commitChanges();
+ // The commit should have made no changes, so
+ // perform a fetch to ensure that this artist hasn't been deleted from the db
+
+ DataContext freshContext = (DataContext) serverRuntime.newContext();
+ assertNotSame(this.context, freshContext);
+
+ SelectQuery query = new SelectQuery(Artist.class);
+ query.setQualifier(ExpressionFactory.matchExp("artistName", artistName));
+ List<?> queryResults = freshContext.performQuery(query);
+
+ assertEquals(1, queryResults.size());
+ }
+
+ public void testRollbackModifiedObject() {
+ String artistName = "initialTestArtist";
+ Artist artist = (Artist) context.newObject("Artist");
+ artist.setArtistName(artistName);
+ context.commitChanges();
+
+ artist.setArtistName("a new value");
+
+ context.rollbackChanges();
+
+ // Make sure the inmemory changes have been rolled back
+ assertEquals(artistName, artist.getArtistName());
+
+ // Commit what's in memory...
+ context.commitChanges();
+
+ // .. and ensure that the correct data is in the db
+ DataContext freshContext = (DataContext) serverRuntime.newContext();
+ assertNotSame(this.context, freshContext);
+
+ SelectQuery query = new SelectQuery(Artist.class);
+ query.setQualifier(ExpressionFactory.matchExp("artistName", artistName));
+ List<?> queryResults = freshContext.performQuery(query);
+
+ assertEquals(1, queryResults.size());
+ }
+}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRollbackTest.java
----------------------------------------------------------------------
diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRollbackTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRollbackTest.java
deleted file mode 100644
index 1c56eec..0000000
--- a/cayenne-server/src/test/java/org/apache/cayenne/access/DataContextRollbackTest.java
+++ /dev/null
@@ -1,224 +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.util.List;
-
-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.exp.ExpressionFactory;
-import org.apache.cayenne.query.SelectQuery;
-import org.apache.cayenne.test.jdbc.DBHelper;
-import org.apache.cayenne.testdo.testmap.Artist;
-import org.apache.cayenne.testdo.testmap.Painting;
-import org.apache.cayenne.unit.di.server.ServerCase;
-import org.apache.cayenne.unit.di.server.UseServerRuntime;
-
-@UseServerRuntime(ServerCase.TESTMAP_PROJECT)
-public class DataContextRollbackTest extends ServerCase {
-
- @Inject
- private DataContext context;
-
- @Inject
- private ServerRuntime serverRuntime;
-
- @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.deleteAll("ARTIST");
- }
-
- public void testRollbackNew() {
- Artist artist = (Artist) context.newObject("Artist");
- artist.setArtistName("a");
-
- Painting p1 = (Painting) context.newObject("Painting");
- p1.setPaintingTitle("p1");
- p1.setToArtist(artist);
-
- Painting p2 = (Painting) context.newObject("Painting");
- p2.setPaintingTitle("p2");
- p2.setToArtist(artist);
-
- Painting p3 = (Painting) context.newObject("Painting");
- p3.setPaintingTitle("p3");
- p3.setToArtist(artist);
-
- // before:
- assertEquals(artist, p1.getToArtist());
- assertEquals(3, artist.getPaintingArray().size());
-
- context.rollbackChanges();
-
- // after:
- assertEquals(PersistenceState.TRANSIENT, artist.getPersistenceState());
- }
-
- public void testRollbackNewObject() {
- String artistName = "revertTestArtist";
- Artist artist = (Artist) context.newObject("Artist");
- artist.setArtistName(artistName);
-
- context.rollbackChanges();
-
- assertEquals(PersistenceState.TRANSIENT, artist.getPersistenceState());
- context.commitChanges();
- // The commit should have made no changes, so
- // perform a fetch to ensure that this artist hasn't been persisted to the db
-
- DataContext freshContext = (DataContext) serverRuntime.newContext();
- assertNotSame(this.context, freshContext);
-
- SelectQuery query = new SelectQuery(Artist.class);
- query.setQualifier(ExpressionFactory.matchExp("artistName", artistName));
- List<?> queryResults = freshContext.performQuery(query);
-
- assertEquals(0, queryResults.size());
- }
-
- // Catches a bug where new objects were unregistered within an object iterator, thus
- // modifying the collection the iterator was iterating over
- // (ConcurrentModificationException)
- public void testRollbackWithMultipleNewObjects() {
- String artistName = "rollbackTestArtist";
- String paintingTitle = "rollbackTestPainting";
- Artist artist = (Artist) context.newObject("Artist");
- artist.setArtistName(artistName);
-
- Painting painting = (Painting) context.newObject("Painting");
- painting.setPaintingTitle(paintingTitle);
- painting.setToArtist(artist);
-
- context.rollbackChanges();
-
- assertEquals(PersistenceState.TRANSIENT, artist.getPersistenceState());
- context.commitChanges();
-
- // The commit should have made no changes, so
- // perform a fetch to ensure that this artist hasn't been persisted to the db
-
- DataContext freshContext = (DataContext) serverRuntime.newContext();
- assertNotSame(this.context, freshContext);
-
- SelectQuery query = new SelectQuery(Artist.class);
- query.setQualifier(ExpressionFactory.matchExp("artistName", artistName));
- List<?> queryResults = freshContext.performQuery(query);
-
- assertEquals(0, queryResults.size());
- }
-
- public void testRollbackRelationshipModification() {
- String artistName = "relationshipModArtist";
- String paintingTitle = "relationshipTestPainting";
- Artist artist = (Artist) context.newObject("Artist");
- artist.setArtistName(artistName);
- Painting painting = (Painting) context.newObject("Painting");
- painting.setPaintingTitle(paintingTitle);
- painting.setToArtist(artist);
- context.commitChanges();
-
- painting.setToArtist(null);
- assertEquals(0, artist.getPaintingArray().size());
- context.rollbackChanges();
-
- assertTrue(((ValueHolder) artist.getPaintingArray()).isFault());
- assertEquals(1, artist.getPaintingArray().size());
- assertEquals(artist, painting.getToArtist());
-
- // Check that the reverse relationship was handled
- assertEquals(1, artist.getPaintingArray().size());
- context.commitChanges();
-
- DataContext freshContext = (DataContext) serverRuntime.newContext();
- assertNotSame(this.context, freshContext);
-
- SelectQuery query = new SelectQuery(Painting.class);
- query.setQualifier(ExpressionFactory.matchExp("paintingTitle", paintingTitle));
- List<?> queryResults = freshContext.performQuery(query);
-
- assertEquals(1, queryResults.size());
- Painting queriedPainting = (Painting) queryResults.get(0);
-
- // NB: This is an easier comparison than manually fetching artist
- assertEquals(artistName, queriedPainting.getToArtist().getArtistName());
- }
-
- public void testRollbackDeletedObject() {
- String artistName = "deleteTestArtist";
- Artist artist = (Artist) context.newObject("Artist");
- artist.setArtistName(artistName);
- context.commitChanges();
-
- context.deleteObjects(artist);
- context.rollbackChanges();
-
- // Now check everything is as it should be
- assertEquals(PersistenceState.HOLLOW, artist.getPersistenceState());
-
- context.commitChanges();
- // The commit should have made no changes, so
- // perform a fetch to ensure that this artist hasn't been deleted from the db
-
- DataContext freshContext = (DataContext) serverRuntime.newContext();
- assertNotSame(this.context, freshContext);
-
- SelectQuery query = new SelectQuery(Artist.class);
- query.setQualifier(ExpressionFactory.matchExp("artistName", artistName));
- List<?> queryResults = freshContext.performQuery(query);
-
- assertEquals(1, queryResults.size());
- }
-
- public void testRollbackModifiedObject() {
- String artistName = "initialTestArtist";
- Artist artist = (Artist) context.newObject("Artist");
- artist.setArtistName(artistName);
- context.commitChanges();
-
- artist.setArtistName("a new value");
-
- context.rollbackChanges();
-
- // Make sure the inmemory changes have been rolled back
- assertEquals(artistName, artist.getArtistName());
-
- // Commit what's in memory...
- context.commitChanges();
-
- // .. and ensure that the correct data is in the db
- DataContext freshContext = (DataContext) serverRuntime.newContext();
- assertNotSame(this.context, freshContext);
-
- SelectQuery query = new SelectQuery(Artist.class);
- query.setQualifier(ExpressionFactory.matchExp("artistName", artistName));
- List<?> queryResults = freshContext.performQuery(query);
-
- assertEquals(1, queryResults.size());
- }
-}