http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java deleted file mode 100644 index def09fe..0000000 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/DeleteRulesTest.java +++ /dev/null @@ -1,374 +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.ArrayList; -import java.util.Collection; -import java.util.Iterator; - -import org.apache.cayenne.DeleteDenyException; -import org.apache.cayenne.PersistenceState; -import org.apache.cayenne.access.ObjectDiff.ArcOperation; -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.graph.NodeDiff; -import org.apache.cayenne.map.DeleteRule; -import org.apache.cayenne.map.ObjEntity; -import org.apache.cayenne.map.ObjRelationship; -import org.apache.cayenne.test.jdbc.DBHelper; -import org.apache.cayenne.testdo.relationship.DeleteRuleFlatA; -import org.apache.cayenne.testdo.relationship.DeleteRuleFlatB; -import org.apache.cayenne.testdo.relationship.DeleteRuleTest1; -import org.apache.cayenne.testdo.relationship.DeleteRuleTest2; -import org.apache.cayenne.testdo.relationship.DeleteRuleTest3; -import org.apache.cayenne.unit.di.server.ServerCase; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -@UseServerRuntime(ServerCase.RELATIONSHIPS_PROJECT) -public class DeleteRulesTest extends ServerCase { - - @Inject - private DataContext context; - - @Inject - private DBHelper dbHelper; - - @Override - protected void setUpAfterInjection() throws Exception { - dbHelper.deleteAll("DELETE_RULE_TEST3"); - dbHelper.deleteAll("DELETE_RULE_TEST1"); - dbHelper.deleteAll("DELETE_RULE_TEST2"); - dbHelper.deleteAll("DELETE_RULE_JOIN"); - dbHelper.deleteAll("DELETE_RULE_FLATB"); - dbHelper.deleteAll("DELETE_RULE_FLATA"); - } - - public void testDenyToOne() { - - DeleteRuleTest1 test1 = context.newObject(DeleteRuleTest1.class); - DeleteRuleTest2 test2 = context.newObject(DeleteRuleTest2.class); - test1.setTest2(test2); - context.commitChanges(); - - try { - context.deleteObjects(test1); - fail("Should have thrown an exception"); - } catch (Exception e) { - // GOOD! - } - context.commitChanges(); - - } - - public void testNoActionToOne() { - DeleteRuleTest2 test2 = context.newObject(DeleteRuleTest2.class); - DeleteRuleTest3 test3 = context.newObject(DeleteRuleTest3.class); - test3.setToDeleteRuleTest2(test2); - context.commitChanges(); - - // must go on without exceptions... - context.deleteObjects(test3); - context.commitChanges(); - } - - public void testNoActionToMany() { - DeleteRuleTest2 test2 = context.newObject(DeleteRuleTest2.class); - DeleteRuleTest3 test3 = context.newObject(DeleteRuleTest3.class); - test3.setToDeleteRuleTest2(test2); - context.commitChanges(); - - // must go on without exceptions... - context.deleteObjects(test2); - - // don't commit, since this will cause a constraint exception - } - - public void testNoActionFlattened() { - // temporarily set delete rule to NOACTION... - int oldRule = changeDeleteRule(DeleteRule.NO_ACTION); - - try { - DeleteRuleFlatA a = context.newObject(DeleteRuleFlatA.class); - DeleteRuleFlatB b = context.newObject(DeleteRuleFlatB.class); - - a.addToFlatB(b); - context.commitChanges(); - - // must go on without exceptions... - context.deleteObjects(a); - - // assert that join is deleted - assertJoinDeleted(a, b); - assertEquals(PersistenceState.DELETED, a.getPersistenceState()); - assertEquals(PersistenceState.COMMITTED, b.getPersistenceState()); - assertTrue(b.getUntitledRel().contains(a)); - context.commitChanges(); - - } finally { - changeDeleteRule(oldRule); - } - } - - public void testNoActionFlattenedNoReverse() { - // temporarily set delete rule to NOACTION... - int oldRule = changeDeleteRule(DeleteRule.NO_ACTION); - ObjRelationship reverse = unsetReverse(); - - try { - DeleteRuleFlatA a = context.newObject(DeleteRuleFlatA.class); - DeleteRuleFlatB b = context.newObject(DeleteRuleFlatB.class); - - a.addToFlatB(b); - context.commitChanges(); - - // must go on without exceptions... - context.deleteObjects(a); - - // assert that join is deleted - assertJoinDeleted(a, b); - assertEquals(PersistenceState.DELETED, a.getPersistenceState()); - assertEquals(PersistenceState.COMMITTED, b.getPersistenceState()); - context.commitChanges(); - } finally { - changeDeleteRule(oldRule); - restoreReverse(reverse); - } - } - - public void testCascadeFlattened() { - // temporarily set delete rule to CASCADE... - int oldRule = changeDeleteRule(DeleteRule.CASCADE); - - try { - DeleteRuleFlatA a = context.newObject(DeleteRuleFlatA.class); - DeleteRuleFlatB b = context.newObject(DeleteRuleFlatB.class); - a.addToFlatB(b); - context.commitChanges(); - - // must go on without exceptions... - context.deleteObjects(a); - - // assert that join is deleted - assertJoinDeleted(a, b); - context.commitChanges(); - - assertEquals(PersistenceState.TRANSIENT, a.getPersistenceState()); - assertEquals(PersistenceState.TRANSIENT, b.getPersistenceState()); - } finally { - changeDeleteRule(oldRule); - } - } - - public void testCascadeFlattenedNoReverse() { - // temporarily set delete rule to CASCADE... - int oldRule = changeDeleteRule(DeleteRule.CASCADE); - ObjRelationship reverse = unsetReverse(); - - try { - DeleteRuleFlatA a = context.newObject(DeleteRuleFlatA.class); - DeleteRuleFlatB b = context.newObject(DeleteRuleFlatB.class); - a.addToFlatB(b); - context.commitChanges(); - - // must go on without exceptions... - context.deleteObjects(a); - - // assert that join is deleted - assertJoinDeleted(a, b); - context.commitChanges(); - assertEquals(PersistenceState.TRANSIENT, a.getPersistenceState()); - assertEquals(PersistenceState.TRANSIENT, b.getPersistenceState()); - } finally { - changeDeleteRule(oldRule); - restoreReverse(reverse); - } - } - - public void testNullifyFlattened() { - // temporarily set delete rule to NULLIFY... - int oldRule = changeDeleteRule(DeleteRule.NULLIFY); - - try { - DeleteRuleFlatA a = context.newObject(DeleteRuleFlatA.class); - DeleteRuleFlatB b = context.newObject(DeleteRuleFlatB.class); - a.addToFlatB(b); - context.commitChanges(); - - // must go on without exceptions... - context.deleteObjects(a); - - // assert that join is deleted - assertJoinDeleted(a, b); - assertEquals(PersistenceState.DELETED, a.getPersistenceState()); - assertEquals(PersistenceState.MODIFIED, b.getPersistenceState()); - assertFalse(b.getUntitledRel().contains(a)); - context.commitChanges(); - } finally { - changeDeleteRule(oldRule); - } - } - - public void testNullifyFlattenedNoReverse() { - // temporarily set delete rule to NULLIFY... - int oldRule = changeDeleteRule(DeleteRule.NULLIFY); - ObjRelationship reverse = unsetReverse(); - - try { - DeleteRuleFlatA a = context.newObject(DeleteRuleFlatA.class); - DeleteRuleFlatB b = context.newObject(DeleteRuleFlatB.class); - a.addToFlatB(b); - context.commitChanges(); - - // must go on without exceptions... - context.deleteObjects(a); - - // assert that join is deleted - assertJoinDeleted(a, b); - assertEquals(PersistenceState.DELETED, a.getPersistenceState()); - assertEquals(PersistenceState.COMMITTED, b.getPersistenceState()); - context.commitChanges(); - } finally { - changeDeleteRule(oldRule); - restoreReverse(reverse); - } - } - - public void testDenyFlattened() { - // temporarily set delete rule to DENY... - int oldRule = changeDeleteRule(DeleteRule.DENY); - - try { - DeleteRuleFlatA a = context.newObject(DeleteRuleFlatA.class); - DeleteRuleFlatB b = context.newObject(DeleteRuleFlatB.class); - a.addToFlatB(b); - context.commitChanges(); - - try { - context.deleteObjects(a); - fail("Must have thrown a deny exception.."); - } catch (DeleteDenyException ex) { - // expected... but check further - assertJoinNotDeleted(a, b); - } - } finally { - changeDeleteRule(oldRule); - } - } - - public void testDenyFlattenedNoReverse() { - // temporarily set delete rule to DENY... - int oldRule = changeDeleteRule(DeleteRule.DENY); - ObjRelationship reverse = unsetReverse(); - - try { - DeleteRuleFlatA a = context.newObject(DeleteRuleFlatA.class); - DeleteRuleFlatB b = context.newObject(DeleteRuleFlatB.class); - a.addToFlatB(b); - context.commitChanges(); - - try { - context.deleteObjects(a); - fail("Must have thrown a deny exception.."); - } catch (DeleteDenyException ex) { - // expected... but check further - assertJoinNotDeleted(a, b); - } - } finally { - changeDeleteRule(oldRule); - restoreReverse(reverse); - } - } - - private int changeDeleteRule(int deleteRule) { - ObjEntity entity = context.getEntityResolver().getObjEntity(DeleteRuleFlatA.class); - - ObjRelationship relationship = entity.getRelationship(DeleteRuleFlatA.FLAT_B_PROPERTY); - int oldRule = relationship.getDeleteRule(); - relationship.setDeleteRule(deleteRule); - return oldRule; - } - - private ObjRelationship unsetReverse() { - ObjEntity entity = context.getEntityResolver().getObjEntity(DeleteRuleFlatA.class); - - ObjRelationship relationship = entity.getRelationship(DeleteRuleFlatA.FLAT_B_PROPERTY); - ObjRelationship reverse = relationship.getReverseRelationship(); - - if (reverse != null) { - reverse.getSourceEntity().removeRelationship(reverse.getName()); - context.getEntityResolver().getClassDescriptorMap().removeDescriptor("DeleteRuleFlatA"); - context.getEntityResolver().getClassDescriptorMap().removeDescriptor("DeleteRuleFlatB"); - } - - return reverse; - } - - private void restoreReverse(ObjRelationship reverse) { - ObjEntity entity = context.getEntityResolver().getObjEntity(DeleteRuleFlatA.class); - - ObjRelationship relationship = entity.getRelationship(DeleteRuleFlatA.FLAT_B_PROPERTY); - relationship.getTargetEntity().addRelationship(reverse); - context.getEntityResolver().getClassDescriptorMap().removeDescriptor("DeleteRuleFlatA"); - context.getEntityResolver().getClassDescriptorMap().removeDescriptor("DeleteRuleFlatB"); - } - - private void assertJoinDeleted(DeleteRuleFlatA a, DeleteRuleFlatB b) { - - ObjectDiff changes = context.getObjectStore().changes.get(a.getObjectId()); - - assertNotNull(changes); - Collection<NodeDiff> diffs = new ArrayList<NodeDiff>(); - changes.appendDiffs(diffs); - Iterator<?> it = diffs.iterator(); - while (it.hasNext()) { - Object diff = it.next(); - if (diff instanceof ArcOperation) { - ArcOperation arcDelete = (ArcOperation) diff; - if (arcDelete.getNodeId().equals(a.getObjectId()) - && arcDelete.getTargetNodeId().equals(b.getObjectId()) - && arcDelete.getArcId().equals(DeleteRuleFlatA.FLAT_B_PROPERTY) && arcDelete.isDelete()) { - return; - } - } - } - - fail("Join was not deleted for flattened relationship"); - } - - private void assertJoinNotDeleted(DeleteRuleFlatA a, DeleteRuleFlatB b) { - ObjectDiff changes = context.getObjectStore().changes.get(a.getObjectId()); - - if (changes != null) { - Collection<NodeDiff> diffs = new ArrayList<NodeDiff>(); - changes.appendDiffs(diffs); - Iterator<?> it = diffs.iterator(); - while (it.hasNext()) { - Object diff = it.next(); - if (diff instanceof ArcOperation) { - ArcOperation arcDelete = (ArcOperation) diff; - if (arcDelete.getNodeId().equals(a.getObjectId()) - && arcDelete.getTargetNodeId().equals(b.getObjectId()) - && arcDelete.getArcId().equals(DeleteRuleFlatA.FLAT_B_PROPERTY) && !arcDelete.isDelete()) { - fail("Join was deleted for flattened relationship"); - } - } - } - } - } -}
http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/EmbeddingIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/EmbeddingIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/EmbeddingIT.java new file mode 100644 index 0000000..8e9a3db --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/EmbeddingIT.java @@ -0,0 +1,179 @@ +/***************************************************************** + * 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.DataRow; +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.PersistenceState; +import org.apache.cayenne.di.Inject; +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.embeddable.EmbedEntity1; +import org.apache.cayenne.testdo.embeddable.Embeddable1; +import org.apache.cayenne.unit.di.server.ServerCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +import java.util.List; + +@UseServerRuntime(ServerCase.DEFAULT_PROJECT) +public class EmbeddingIT extends ServerCase { + + @Inject + protected ObjectContext context; + + @Inject + protected DBHelper dbHelper; + + protected TableHelper tEmbedEntity1; + + @Override + protected void setUpAfterInjection() throws Exception { + dbHelper.deleteAll("EMBED_ENTITY1"); + + tEmbedEntity1 = new TableHelper(dbHelper, "EMBED_ENTITY1"); + tEmbedEntity1.setColumns("ID", "NAME", "EMBEDDED10", "EMBEDDED20", "EMBEDDED30", "EMBEDDED40"); + } + + protected void createSelectDataSet() throws Exception { + tEmbedEntity1.delete().execute(); + tEmbedEntity1.insert(1, "n1", "e1", "e2", "e3", "e4"); + tEmbedEntity1.insert(2, "n2", "ex1", "ex2", "ex3", "ex4"); + } + + protected void createUpdateDataSet() throws Exception { + tEmbedEntity1.delete().execute(); + tEmbedEntity1.insert(1, "n1", "e1", "e2", "e3", "e4"); + } + + public void testSelect() throws Exception { + createSelectDataSet(); + + SelectQuery query = new SelectQuery(EmbedEntity1.class); + query.addOrdering(EmbedEntity1.NAME_PROPERTY, SortOrder.ASCENDING); + + List<?> results = context.performQuery(query); + assertEquals(2, results.size()); + + EmbedEntity1 o1 = (EmbedEntity1) results.get(0); + + assertEquals("n1", o1.getName()); + Embeddable1 e11 = o1.getEmbedded1(); + Embeddable1 e12 = o1.getEmbedded2(); + + assertNotNull(e11); + assertNotNull(e12); + assertEquals("e1", e11.getEmbedded10()); + assertEquals("e2", e11.getEmbedded20()); + assertEquals("e3", e12.getEmbedded10()); + assertEquals("e4", e12.getEmbedded20()); + + EmbedEntity1 o2 = (EmbedEntity1) results.get(1); + + assertEquals("n2", o2.getName()); + Embeddable1 e21 = o2.getEmbedded1(); + Embeddable1 e22 = o2.getEmbedded2(); + + assertNotNull(e21); + assertNotNull(e22); + assertEquals("ex1", e21.getEmbedded10()); + assertEquals("ex2", e21.getEmbedded20()); + assertEquals("ex3", e22.getEmbedded10()); + assertEquals("ex4", e22.getEmbedded20()); + } + + public void testInsert() throws Exception { + + EmbedEntity1 o1 = context.newObject(EmbedEntity1.class); + o1.setName("NAME"); + + Embeddable1 e1 = new Embeddable1(); + + // init before the embeddable was set on an owning object + e1.setEmbedded10("E11"); + e1.setEmbedded20("E12"); + o1.setEmbedded1(e1); + + Embeddable1 e2 = new Embeddable1(); + o1.setEmbedded2(e2); + + // init after it was set on the owning object + e2.setEmbedded10("E21"); + e2.setEmbedded20("E22"); + + context.commitChanges(); + + SelectQuery query = new SelectQuery(EmbedEntity1.class); + query.setFetchingDataRows(true); + DataRow row = (DataRow) Cayenne.objectForQuery(context, query); + assertNotNull(row); + assertEquals("E11", row.get("EMBEDDED10")); + assertEquals("E12", row.get("EMBEDDED20")); + assertEquals("E21", row.get("EMBEDDED30")); + assertEquals("E22", row.get("EMBEDDED40")); + } + + public void testUpdateEmbeddedProperties() throws Exception { + createUpdateDataSet(); + + SelectQuery query = new SelectQuery(EmbedEntity1.class); + query.addOrdering(EmbedEntity1.NAME_PROPERTY, SortOrder.ASCENDING); + + List<?> results = context.performQuery(query); + EmbedEntity1 o1 = (EmbedEntity1) results.get(0); + + Embeddable1 e11 = o1.getEmbedded1(); + e11.setEmbedded10("x1"); + + assertEquals(PersistenceState.MODIFIED, o1.getPersistenceState()); + + context.commitChanges(); + SelectQuery query1 = new SelectQuery(EmbedEntity1.class); + query1.setFetchingDataRows(true); + DataRow row = (DataRow) Cayenne.objectForQuery(context, query1); + assertNotNull(row); + assertEquals("x1", row.get("EMBEDDED10")); + } + + public void testUpdateEmbedded() throws Exception { + createUpdateDataSet(); + + SelectQuery query = new SelectQuery(EmbedEntity1.class); + query.addOrdering(EmbedEntity1.NAME_PROPERTY, SortOrder.ASCENDING); + + List<?> results = context.performQuery(query); + EmbedEntity1 o1 = (EmbedEntity1) results.get(0); + + Embeddable1 e11 = new Embeddable1(); + e11.setEmbedded10("x1"); + e11.setEmbedded20("x2"); + o1.setEmbedded1(e11); + + assertEquals(PersistenceState.MODIFIED, o1.getPersistenceState()); + + context.commitChanges(); + SelectQuery query1 = new SelectQuery(EmbedEntity1.class); + query1.setFetchingDataRows(true); + DataRow row = (DataRow) Cayenne.objectForQuery(context, query1); + assertNotNull(row); + assertEquals("x1", row.get("EMBEDDED10")); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/EmbeddingTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/EmbeddingTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/EmbeddingTest.java deleted file mode 100644 index 65e3d66..0000000 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/EmbeddingTest.java +++ /dev/null @@ -1,179 +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.DataRow; -import org.apache.cayenne.ObjectContext; -import org.apache.cayenne.PersistenceState; -import org.apache.cayenne.di.Inject; -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.embeddable.EmbedEntity1; -import org.apache.cayenne.testdo.embeddable.Embeddable1; -import org.apache.cayenne.unit.di.server.ServerCase; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -@UseServerRuntime(ServerCase.DEFAULT_PROJECT) -public class EmbeddingTest extends ServerCase { - - @Inject - protected ObjectContext context; - - @Inject - protected DBHelper dbHelper; - - protected TableHelper tEmbedEntity1; - - @Override - protected void setUpAfterInjection() throws Exception { - dbHelper.deleteAll("EMBED_ENTITY1"); - - tEmbedEntity1 = new TableHelper(dbHelper, "EMBED_ENTITY1"); - tEmbedEntity1.setColumns("ID", "NAME", "EMBEDDED10", "EMBEDDED20", "EMBEDDED30", "EMBEDDED40"); - } - - protected void createSelectDataSet() throws Exception { - tEmbedEntity1.delete().execute(); - tEmbedEntity1.insert(1, "n1", "e1", "e2", "e3", "e4"); - tEmbedEntity1.insert(2, "n2", "ex1", "ex2", "ex3", "ex4"); - } - - protected void createUpdateDataSet() throws Exception { - tEmbedEntity1.delete().execute(); - tEmbedEntity1.insert(1, "n1", "e1", "e2", "e3", "e4"); - } - - public void testSelect() throws Exception { - createSelectDataSet(); - - SelectQuery query = new SelectQuery(EmbedEntity1.class); - query.addOrdering(EmbedEntity1.NAME_PROPERTY, SortOrder.ASCENDING); - - List<?> results = context.performQuery(query); - assertEquals(2, results.size()); - - EmbedEntity1 o1 = (EmbedEntity1) results.get(0); - - assertEquals("n1", o1.getName()); - Embeddable1 e11 = o1.getEmbedded1(); - Embeddable1 e12 = o1.getEmbedded2(); - - assertNotNull(e11); - assertNotNull(e12); - assertEquals("e1", e11.getEmbedded10()); - assertEquals("e2", e11.getEmbedded20()); - assertEquals("e3", e12.getEmbedded10()); - assertEquals("e4", e12.getEmbedded20()); - - EmbedEntity1 o2 = (EmbedEntity1) results.get(1); - - assertEquals("n2", o2.getName()); - Embeddable1 e21 = o2.getEmbedded1(); - Embeddable1 e22 = o2.getEmbedded2(); - - assertNotNull(e21); - assertNotNull(e22); - assertEquals("ex1", e21.getEmbedded10()); - assertEquals("ex2", e21.getEmbedded20()); - assertEquals("ex3", e22.getEmbedded10()); - assertEquals("ex4", e22.getEmbedded20()); - } - - public void testInsert() throws Exception { - - EmbedEntity1 o1 = context.newObject(EmbedEntity1.class); - o1.setName("NAME"); - - Embeddable1 e1 = new Embeddable1(); - - // init before the embeddable was set on an owning object - e1.setEmbedded10("E11"); - e1.setEmbedded20("E12"); - o1.setEmbedded1(e1); - - Embeddable1 e2 = new Embeddable1(); - o1.setEmbedded2(e2); - - // init after it was set on the owning object - e2.setEmbedded10("E21"); - e2.setEmbedded20("E22"); - - context.commitChanges(); - - SelectQuery query = new SelectQuery(EmbedEntity1.class); - query.setFetchingDataRows(true); - DataRow row = (DataRow) Cayenne.objectForQuery(context, query); - assertNotNull(row); - assertEquals("E11", row.get("EMBEDDED10")); - assertEquals("E12", row.get("EMBEDDED20")); - assertEquals("E21", row.get("EMBEDDED30")); - assertEquals("E22", row.get("EMBEDDED40")); - } - - public void testUpdateEmbeddedProperties() throws Exception { - createUpdateDataSet(); - - SelectQuery query = new SelectQuery(EmbedEntity1.class); - query.addOrdering(EmbedEntity1.NAME_PROPERTY, SortOrder.ASCENDING); - - List<?> results = context.performQuery(query); - EmbedEntity1 o1 = (EmbedEntity1) results.get(0); - - Embeddable1 e11 = o1.getEmbedded1(); - e11.setEmbedded10("x1"); - - assertEquals(PersistenceState.MODIFIED, o1.getPersistenceState()); - - context.commitChanges(); - SelectQuery query1 = new SelectQuery(EmbedEntity1.class); - query1.setFetchingDataRows(true); - DataRow row = (DataRow) Cayenne.objectForQuery(context, query1); - assertNotNull(row); - assertEquals("x1", row.get("EMBEDDED10")); - } - - public void testUpdateEmbedded() throws Exception { - createUpdateDataSet(); - - SelectQuery query = new SelectQuery(EmbedEntity1.class); - query.addOrdering(EmbedEntity1.NAME_PROPERTY, SortOrder.ASCENDING); - - List<?> results = context.performQuery(query); - EmbedEntity1 o1 = (EmbedEntity1) results.get(0); - - Embeddable1 e11 = new Embeddable1(); - e11.setEmbedded10("x1"); - e11.setEmbedded20("x2"); - o1.setEmbedded1(e11); - - assertEquals(PersistenceState.MODIFIED, o1.getPersistenceState()); - - context.commitChanges(); - SelectQuery query1 = new SelectQuery(EmbedEntity1.class); - query1.setFetchingDataRows(true); - DataRow row = (DataRow) Cayenne.objectForQuery(context, query1); - assertNotNull(row); - assertEquals("x1", row.get("EMBEDDED10")); - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java new file mode 100644 index 0000000..45e15fd --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumIT.java @@ -0,0 +1,89 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ +package org.apache.cayenne.access; + +import org.apache.cayenne.Cayenne; +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.exp.ExpressionFactory; +import org.apache.cayenne.query.CapsStrategy; +import org.apache.cayenne.query.SQLTemplate; +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.Enum1; +import org.apache.cayenne.testdo.testmap.EnumEntity; +import org.apache.cayenne.unit.di.server.ServerCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +@UseServerRuntime(ServerCase.TESTMAP_PROJECT) +public class EnumIT extends ServerCase { + + @Inject + private ObjectContext context; + + @Inject + private DBHelper dbHelper; + + @Override + protected void setUpAfterInjection() throws Exception { + dbHelper.deleteAll("ENUM_ENTITY"); + + } + + private void createDataSet() throws Exception { + TableHelper tEnumEntity = new TableHelper(dbHelper, "ENUM_ENTITY"); + tEnumEntity.setColumns("ID", "ENUM_ATTRIBUTE"); + + tEnumEntity.insert(1, "two"); + tEnumEntity.insert(2, "one"); + } + + public void testInsert() { + EnumEntity e = context.newObject(EnumEntity.class); + e.setEnumAttribute(Enum1.one); + context.commitChanges(); + } + + public void testSelectQuery() throws Exception { + createDataSet(); + + SelectQuery q = new SelectQuery(EnumEntity.class); + q.andQualifier(ExpressionFactory.matchExp( + EnumEntity.ENUM_ATTRIBUTE_PROPERTY, + Enum1.one)); + + EnumEntity e = (EnumEntity) Cayenne.objectForQuery(context, q); + assertNotNull(e); + assertSame(Enum1.one, e.getEnumAttribute()); + } + + public void testSQLTemplate() throws Exception { + createDataSet(); + + SQLTemplate q = new SQLTemplate( + EnumEntity.class, + "SELECT * FROM ENUM_ENTITY WHERE ENUM_ATTRIBUTE = 'one'"); + q.setColumnNamesCapitalization(CapsStrategy.UPPER); + + EnumEntity e = (EnumEntity) Cayenne.objectForQuery(context, q); + assertNotNull(e); + assertSame(Enum1.one, e.getEnumAttribute()); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/EnumTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/EnumTest.java deleted file mode 100644 index cce7090..0000000 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/EnumTest.java +++ /dev/null @@ -1,89 +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 org.apache.cayenne.Cayenne; -import org.apache.cayenne.ObjectContext; -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.exp.ExpressionFactory; -import org.apache.cayenne.query.CapsStrategy; -import org.apache.cayenne.query.SQLTemplate; -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.Enum1; -import org.apache.cayenne.testdo.testmap.EnumEntity; -import org.apache.cayenne.unit.di.server.ServerCase; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -@UseServerRuntime(ServerCase.TESTMAP_PROJECT) -public class EnumTest extends ServerCase { - - @Inject - private ObjectContext context; - - @Inject - private DBHelper dbHelper; - - @Override - protected void setUpAfterInjection() throws Exception { - dbHelper.deleteAll("ENUM_ENTITY"); - - } - - private void createDataSet() throws Exception { - TableHelper tEnumEntity = new TableHelper(dbHelper, "ENUM_ENTITY"); - tEnumEntity.setColumns("ID", "ENUM_ATTRIBUTE"); - - tEnumEntity.insert(1, "two"); - tEnumEntity.insert(2, "one"); - } - - public void testInsert() { - EnumEntity e = context.newObject(EnumEntity.class); - e.setEnumAttribute(Enum1.one); - context.commitChanges(); - } - - public void testSelectQuery() throws Exception { - createDataSet(); - - SelectQuery q = new SelectQuery(EnumEntity.class); - q.andQualifier(ExpressionFactory.matchExp( - EnumEntity.ENUM_ATTRIBUTE_PROPERTY, - Enum1.one)); - - EnumEntity e = (EnumEntity) Cayenne.objectForQuery(context, q); - assertNotNull(e); - assertSame(Enum1.one, e.getEnumAttribute()); - } - - public void testSQLTemplate() throws Exception { - createDataSet(); - - SQLTemplate q = new SQLTemplate( - EnumEntity.class, - "SELECT * FROM ENUM_ENTITY WHERE ENUM_ATTRIBUTE = 'one'"); - q.setColumnNamesCapitalization(CapsStrategy.UPPER); - - EnumEntity e = (EnumEntity) Cayenne.objectForQuery(context, q); - assertNotNull(e); - assertSame(Enum1.one, e.getEnumAttribute()); - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyIT.java new file mode 100644 index 0000000..96c0191 --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyIT.java @@ -0,0 +1,89 @@ +/***************************************************************** + * 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.ObjectId; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.map.EntityResolver; +import org.apache.cayenne.map.ObjRelationship; +import org.apache.cayenne.testdo.relationship.FlattenedTest1; +import org.apache.cayenne.testdo.relationship.FlattenedTest3; +import org.apache.cayenne.unit.di.server.ServerCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +@UseServerRuntime(ServerCase.RELATIONSHIPS_PROJECT) +public class FlattenedArcKeyIT extends ServerCase { + + @Inject + private EntityResolver entityResolver; + + public void testAttributes() { + ObjectId src = new ObjectId("X"); + ObjectId target = new ObjectId("Y"); + ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship( + FlattenedTest3.TO_FT1_PROPERTY); + + FlattenedArcKey update = new FlattenedArcKey(src, target, r1); + + assertSame(src, update.id1.getSourceId()); + assertSame(target, update.id2.getSourceId()); + assertSame(r1, update.relationship); + } + + public void testHashCode() { + ObjectId src = new ObjectId("X"); + ObjectId target = new ObjectId("Y"); + ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship( + FlattenedTest3.TO_FT1_PROPERTY); + + FlattenedArcKey update = new FlattenedArcKey(src, target, r1); + FlattenedArcKey update1 = new FlattenedArcKey(target, src, r1.getReverseRelationship()); + + ObjRelationship r3 = entityResolver.getObjEntity(FlattenedTest1.class).getRelationship( + FlattenedTest1.FT3OVER_COMPLEX_PROPERTY); + + FlattenedArcKey update2 = new FlattenedArcKey(target, src, r3); + + int h = update.hashCode(); + int h1 = update1.hashCode(); + int h2 = update2.hashCode(); + assertTrue(h == h1); + assertTrue(h == update.hashCode()); + assertFalse(h == h2); + } + + public void testEquals() { + ObjectId src = new ObjectId("X"); + ObjectId target = new ObjectId("Y"); + ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship( + FlattenedTest3.TO_FT1_PROPERTY); + + FlattenedArcKey update = new FlattenedArcKey(src, target, r1); + FlattenedArcKey update1 = new FlattenedArcKey(target, src, r1.getReverseRelationship()); + + ObjRelationship r3 = entityResolver.getObjEntity(FlattenedTest1.class).getRelationship( + FlattenedTest1.FT3OVER_COMPLEX_PROPERTY); + + FlattenedArcKey update2 = new FlattenedArcKey(target, src, r3); + + assertTrue(update.equals(update1)); + assertFalse(update.equals(update2)); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyTest.java deleted file mode 100644 index a0c5714..0000000 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedArcKeyTest.java +++ /dev/null @@ -1,89 +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 org.apache.cayenne.ObjectId; -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.map.EntityResolver; -import org.apache.cayenne.map.ObjRelationship; -import org.apache.cayenne.testdo.relationship.FlattenedTest1; -import org.apache.cayenne.testdo.relationship.FlattenedTest3; -import org.apache.cayenne.unit.di.server.ServerCase; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -@UseServerRuntime(ServerCase.RELATIONSHIPS_PROJECT) -public class FlattenedArcKeyTest extends ServerCase { - - @Inject - private EntityResolver entityResolver; - - public void testAttributes() { - ObjectId src = new ObjectId("X"); - ObjectId target = new ObjectId("Y"); - ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship( - FlattenedTest3.TO_FT1_PROPERTY); - - FlattenedArcKey update = new FlattenedArcKey(src, target, r1); - - assertSame(src, update.id1.getSourceId()); - assertSame(target, update.id2.getSourceId()); - assertSame(r1, update.relationship); - } - - public void testHashCode() { - ObjectId src = new ObjectId("X"); - ObjectId target = new ObjectId("Y"); - ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship( - FlattenedTest3.TO_FT1_PROPERTY); - - FlattenedArcKey update = new FlattenedArcKey(src, target, r1); - FlattenedArcKey update1 = new FlattenedArcKey(target, src, r1.getReverseRelationship()); - - ObjRelationship r3 = entityResolver.getObjEntity(FlattenedTest1.class).getRelationship( - FlattenedTest1.FT3OVER_COMPLEX_PROPERTY); - - FlattenedArcKey update2 = new FlattenedArcKey(target, src, r3); - - int h = update.hashCode(); - int h1 = update1.hashCode(); - int h2 = update2.hashCode(); - assertTrue(h == h1); - assertTrue(h == update.hashCode()); - assertFalse(h == h2); - } - - public void testEquals() { - ObjectId src = new ObjectId("X"); - ObjectId target = new ObjectId("Y"); - ObjRelationship r1 = entityResolver.getObjEntity(FlattenedTest3.class).getRelationship( - FlattenedTest3.TO_FT1_PROPERTY); - - FlattenedArcKey update = new FlattenedArcKey(src, target, r1); - FlattenedArcKey update1 = new FlattenedArcKey(target, src, r1.getReverseRelationship()); - - ObjRelationship r3 = entityResolver.getObjEntity(FlattenedTest1.class).getRelationship( - FlattenedTest1.FT3OVER_COMPLEX_PROPERTY); - - FlattenedArcKey update2 = new FlattenedArcKey(target, src, r3); - - assertTrue(update.equals(update1)); - assertFalse(update.equals(update2)); - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java new file mode 100644 index 0000000..92cea2f --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchIT.java @@ -0,0 +1,267 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +package org.apache.cayenne.access; + +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.PersistenceState; +import org.apache.cayenne.ValueHolder; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.query.PrefetchTreeNode; +import org.apache.cayenne.query.SelectQuery; +import org.apache.cayenne.test.jdbc.DBHelper; +import org.apache.cayenne.test.jdbc.TableHelper; +import org.apache.cayenne.testdo.testmap.ArtGroup; +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.HashSet; +import java.util.List; +import java.util.Set; + +@UseServerRuntime(ServerCase.TESTMAP_PROJECT) +public class FlattenedPrefetchIT extends ServerCase { + + @Inject + protected DataChannelInterceptor queryInterceptor; + + @Inject + protected ObjectContext context; + + @Inject + protected DBHelper dbHelper; + + protected TableHelper tArtist; + protected TableHelper tPainting; + protected TableHelper tArtgroup; + protected TableHelper tArtistGroup; + + @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"); + dbHelper.update("ARTGROUP").set("PARENT_GROUP_ID", null, Types.INTEGER).execute(); + dbHelper.deleteAll("ARTGROUP"); + + 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"); + + tArtgroup = new TableHelper(dbHelper, "ARTGROUP"); + tArtgroup.setColumns("GROUP_ID", "NAME"); + + tArtistGroup = new TableHelper(dbHelper, "ARTIST_GROUP"); + tArtistGroup.setColumns("ARTIST_ID", "GROUP_ID"); + } + + protected void createPrefetchDataSet1() throws Exception { + tArtist.insert(33001, "artist1"); + tArtist.insert(33002, "artist2"); + tArtist.insert(33003, "artist3"); + + tArtgroup.insert(33001, "group1"); + tArtgroup.insert(33002, "group2"); + + tArtistGroup.insert(33001, 33001); + tArtistGroup.insert(33001, 33002); + tArtistGroup.insert(33002, 33002); + tArtistGroup.insert(33003, 33002); + } + + protected void createPrefetchDataSet2() throws Exception { + tArtist.insert(33001, "artist1"); + tArtist.insert(33002, "artist2"); + tArtist.insert(33003, "artist3"); + + tArtgroup.insert(33001, "group1"); + tArtgroup.insert(33002, "group2"); + + tArtistGroup.insert(33001, 33001); + tArtistGroup.insert(33001, 33002); + tArtistGroup.insert(33002, 33002); + tArtistGroup.insert(33003, 33002); + tPainting.insert(33001, "P_artist11", 33001, 1000); + tPainting.insert(33002, "P_artist12", 33001, 2000); + tPainting.insert(33003, "P_artist21", 33002, 3000); + } + + public void testManyToMany() throws Exception { + createPrefetchDataSet1(); + + SelectQuery q = new SelectQuery(Artist.class); + q.addPrefetch(Artist.GROUP_ARRAY_PROPERTY); + + final List<Artist> objects = context.performQuery(q); + + queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { + + public void execute() { + assertEquals(3, objects.size()); + + for (Artist a : objects) { + List<ArtGroup> list = a.getGroupArray(); + + assertNotNull(list); + assertFalse( + "artist's groups not resolved: " + a, + ((ValueHolder) list).isFault()); + assertTrue(list.size() > 0); + + for (ArtGroup g : list) { + assertEquals(PersistenceState.COMMITTED, g.getPersistenceState()); + } + + // assert no duplicates + Set<ArtGroup> s = new HashSet<ArtGroup>(list); + assertEquals(s.size(), list.size()); + } + } + }); + } + + public void testMultiPrefetch() throws Exception { + createPrefetchDataSet2(); + + SelectQuery q = new SelectQuery(Painting.class); + q.addPrefetch(Painting.TO_ARTIST_PROPERTY); + q.addPrefetch(Painting.TO_ARTIST_PROPERTY + '.' + Artist.GROUP_ARRAY_PROPERTY); + + final List<Painting> objects = context.performQuery(q); + + queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { + + public void execute() { + assertEquals(3, objects.size()); + + for (Painting p : objects) { + Artist a = p.getToArtist(); + assertEquals(PersistenceState.COMMITTED, a.getPersistenceState()); + + List<ArtGroup> list = a.getGroupArray(); + assertNotNull(list); + assertFalse( + "artist's groups not resolved: " + a, + ((ValueHolder) list).isFault()); + assertTrue(list.size() > 0); + + for (ArtGroup g : list) { + assertEquals(PersistenceState.COMMITTED, g.getPersistenceState()); + } + + // assert no duplicates + Set<ArtGroup> s = new HashSet<ArtGroup>(list); + assertEquals(s.size(), list.size()); + } + } + }); + } + + public void testJointManyToMany() throws Exception { + createPrefetchDataSet1(); + + SelectQuery q = new SelectQuery(Artist.class); + q.addPrefetch(Artist.GROUP_ARRAY_PROPERTY).setSemantics( + PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); + + final List<Artist> objects = context.performQuery(q); + + queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { + + public void execute() { + assertEquals(3, objects.size()); + + for (Artist a : objects) { + List<ArtGroup> list = a.getGroupArray(); + + assertNotNull(list); + assertFalse( + "artist's groups not resolved: " + a, + ((ValueHolder) list).isFault()); + assertTrue(list.size() > 0); + + for (ArtGroup g : list) { + assertEquals(PersistenceState.COMMITTED, g.getPersistenceState()); + } + + // assert no duplicates + Set<ArtGroup> s = new HashSet<ArtGroup>(list); + assertEquals(s.size(), list.size()); + } + } + }); + + } + + public void testJointMultiPrefetch() throws Exception { + createPrefetchDataSet2(); + + SelectQuery q = new SelectQuery(Painting.class); + q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics( + PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); + q + .addPrefetch( + Painting.TO_ARTIST_PROPERTY + '.' + Artist.GROUP_ARRAY_PROPERTY) + .setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); + + final List<Painting> objects = context.performQuery(q); + + queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { + + public void execute() { + assertEquals(3, objects.size()); + + for (Painting p : objects) { + Artist a = p.getToArtist(); + assertEquals(PersistenceState.COMMITTED, a.getPersistenceState()); + + List<ArtGroup> list = a.getGroupArray(); + assertNotNull(list); + assertFalse( + "artist's groups not resolved: " + a, + ((ValueHolder) list).isFault()); + assertTrue(list.size() > 0); + + for (ArtGroup g : list) { + assertEquals(PersistenceState.COMMITTED, g.getPersistenceState()); + } + + // assert no duplicates + + Set<ArtGroup> s = new HashSet<ArtGroup>(list); + assertEquals(s.size(), list.size()); + } + } + }); + } +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchTest.java deleted file mode 100644 index 2bbba64..0000000 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedPrefetchTest.java +++ /dev/null @@ -1,267 +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.HashSet; -import java.util.List; -import java.util.Set; -import java.sql.Types; - -import org.apache.cayenne.ObjectContext; -import org.apache.cayenne.PersistenceState; -import org.apache.cayenne.ValueHolder; -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.query.PrefetchTreeNode; -import org.apache.cayenne.query.SelectQuery; -import org.apache.cayenne.test.jdbc.DBHelper; -import org.apache.cayenne.test.jdbc.TableHelper; -import org.apache.cayenne.testdo.testmap.ArtGroup; -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; - -@UseServerRuntime(ServerCase.TESTMAP_PROJECT) -public class FlattenedPrefetchTest extends ServerCase { - - @Inject - protected DataChannelInterceptor queryInterceptor; - - @Inject - protected ObjectContext context; - - @Inject - protected DBHelper dbHelper; - - protected TableHelper tArtist; - protected TableHelper tPainting; - protected TableHelper tArtgroup; - protected TableHelper tArtistGroup; - - @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"); - dbHelper.update("ARTGROUP").set("PARENT_GROUP_ID", null, Types.INTEGER).execute(); - dbHelper.deleteAll("ARTGROUP"); - - 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"); - - tArtgroup = new TableHelper(dbHelper, "ARTGROUP"); - tArtgroup.setColumns("GROUP_ID", "NAME"); - - tArtistGroup = new TableHelper(dbHelper, "ARTIST_GROUP"); - tArtistGroup.setColumns("ARTIST_ID", "GROUP_ID"); - } - - protected void createPrefetchDataSet1() throws Exception { - tArtist.insert(33001, "artist1"); - tArtist.insert(33002, "artist2"); - tArtist.insert(33003, "artist3"); - - tArtgroup.insert(33001, "group1"); - tArtgroup.insert(33002, "group2"); - - tArtistGroup.insert(33001, 33001); - tArtistGroup.insert(33001, 33002); - tArtistGroup.insert(33002, 33002); - tArtistGroup.insert(33003, 33002); - } - - protected void createPrefetchDataSet2() throws Exception { - tArtist.insert(33001, "artist1"); - tArtist.insert(33002, "artist2"); - tArtist.insert(33003, "artist3"); - - tArtgroup.insert(33001, "group1"); - tArtgroup.insert(33002, "group2"); - - tArtistGroup.insert(33001, 33001); - tArtistGroup.insert(33001, 33002); - tArtistGroup.insert(33002, 33002); - tArtistGroup.insert(33003, 33002); - tPainting.insert(33001, "P_artist11", 33001, 1000); - tPainting.insert(33002, "P_artist12", 33001, 2000); - tPainting.insert(33003, "P_artist21", 33002, 3000); - } - - public void testManyToMany() throws Exception { - createPrefetchDataSet1(); - - SelectQuery q = new SelectQuery(Artist.class); - q.addPrefetch(Artist.GROUP_ARRAY_PROPERTY); - - final List<Artist> objects = context.performQuery(q); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertEquals(3, objects.size()); - - for (Artist a : objects) { - List<ArtGroup> list = a.getGroupArray(); - - assertNotNull(list); - assertFalse( - "artist's groups not resolved: " + a, - ((ValueHolder) list).isFault()); - assertTrue(list.size() > 0); - - for (ArtGroup g : list) { - assertEquals(PersistenceState.COMMITTED, g.getPersistenceState()); - } - - // assert no duplicates - Set<ArtGroup> s = new HashSet<ArtGroup>(list); - assertEquals(s.size(), list.size()); - } - } - }); - } - - public void testMultiPrefetch() throws Exception { - createPrefetchDataSet2(); - - SelectQuery q = new SelectQuery(Painting.class); - q.addPrefetch(Painting.TO_ARTIST_PROPERTY); - q.addPrefetch(Painting.TO_ARTIST_PROPERTY + '.' + Artist.GROUP_ARRAY_PROPERTY); - - final List<Painting> objects = context.performQuery(q); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertEquals(3, objects.size()); - - for (Painting p : objects) { - Artist a = p.getToArtist(); - assertEquals(PersistenceState.COMMITTED, a.getPersistenceState()); - - List<ArtGroup> list = a.getGroupArray(); - assertNotNull(list); - assertFalse( - "artist's groups not resolved: " + a, - ((ValueHolder) list).isFault()); - assertTrue(list.size() > 0); - - for (ArtGroup g : list) { - assertEquals(PersistenceState.COMMITTED, g.getPersistenceState()); - } - - // assert no duplicates - Set<ArtGroup> s = new HashSet<ArtGroup>(list); - assertEquals(s.size(), list.size()); - } - } - }); - } - - public void testJointManyToMany() throws Exception { - createPrefetchDataSet1(); - - SelectQuery q = new SelectQuery(Artist.class); - q.addPrefetch(Artist.GROUP_ARRAY_PROPERTY).setSemantics( - PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); - - final List<Artist> objects = context.performQuery(q); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertEquals(3, objects.size()); - - for (Artist a : objects) { - List<ArtGroup> list = a.getGroupArray(); - - assertNotNull(list); - assertFalse( - "artist's groups not resolved: " + a, - ((ValueHolder) list).isFault()); - assertTrue(list.size() > 0); - - for (ArtGroup g : list) { - assertEquals(PersistenceState.COMMITTED, g.getPersistenceState()); - } - - // assert no duplicates - Set<ArtGroup> s = new HashSet<ArtGroup>(list); - assertEquals(s.size(), list.size()); - } - } - }); - - } - - public void testJointMultiPrefetch() throws Exception { - createPrefetchDataSet2(); - - SelectQuery q = new SelectQuery(Painting.class); - q.addPrefetch(Painting.TO_ARTIST_PROPERTY).setSemantics( - PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); - q - .addPrefetch( - Painting.TO_ARTIST_PROPERTY + '.' + Artist.GROUP_ARRAY_PROPERTY) - .setSemantics(PrefetchTreeNode.JOINT_PREFETCH_SEMANTICS); - - final List<Painting> objects = context.performQuery(q); - - queryInterceptor.runWithQueriesBlocked(new UnitTestClosure() { - - public void execute() { - assertEquals(3, objects.size()); - - for (Painting p : objects) { - Artist a = p.getToArtist(); - assertEquals(PersistenceState.COMMITTED, a.getPersistenceState()); - - List<ArtGroup> list = a.getGroupArray(); - assertNotNull(list); - assertFalse( - "artist's groups not resolved: " + a, - ((ValueHolder) list).isFault()); - assertTrue(list.size() > 0); - - for (ArtGroup g : list) { - assertEquals(PersistenceState.COMMITTED, g.getPersistenceState()); - } - - // assert no duplicates - - Set<ArtGroup> s = new HashSet<ArtGroup>(list); - assertEquals(s.size(), list.size()); - } - } - }); - } -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedRelationshipInContextIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedRelationshipInContextIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedRelationshipInContextIT.java new file mode 100644 index 0000000..b3fbc2e --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedRelationshipInContextIT.java @@ -0,0 +1,100 @@ +/***************************************************************** + * 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.Fault; +import org.apache.cayenne.PersistenceState; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.query.SelectQuery; +import org.apache.cayenne.reflect.ArcProperty; +import org.apache.cayenne.reflect.ClassDescriptor; +import org.apache.cayenne.test.jdbc.DBHelper; +import org.apache.cayenne.test.jdbc.TableHelper; +import org.apache.cayenne.testdo.relationship.FlattenedTest3; +import org.apache.cayenne.unit.di.server.ServerCase; +import org.apache.cayenne.unit.di.server.UseServerRuntime; + +import java.util.List; + +@UseServerRuntime(ServerCase.RELATIONSHIPS_PROJECT) +public class FlattenedRelationshipInContextIT extends ServerCase { + + @Inject + protected DataContext context; + + @Inject + protected DBHelper dbHelper; + + private TableHelper tFlattenedTest1; + private TableHelper tFlattenedTest2; + private TableHelper tFlattenedTest3; + + @Override + protected void setUpAfterInjection() throws Exception { + dbHelper.deleteAll("COMPLEX_JOIN"); + dbHelper.deleteAll("FLATTENED_TEST_4"); + dbHelper.deleteAll("FLATTENED_TEST_3"); + dbHelper.deleteAll("FLATTENED_TEST_2"); + dbHelper.deleteAll("FLATTENED_TEST_1"); + + tFlattenedTest1 = new TableHelper(dbHelper, "FLATTENED_TEST_1"); + tFlattenedTest1.setColumns("FT1_ID", "NAME"); + + tFlattenedTest2 = new TableHelper(dbHelper, "FLATTENED_TEST_2"); + tFlattenedTest2.setColumns("FT2_ID", "FT1_ID", "NAME"); + + tFlattenedTest3 = new TableHelper(dbHelper, "FLATTENED_TEST_3"); + tFlattenedTest3.setColumns("FT3_ID", "FT2_ID", "NAME"); + } + + protected void createFlattenedTestDataSet() throws Exception { + tFlattenedTest1.insert(1, "ft1"); + tFlattenedTest1.insert(2, "ft12"); + tFlattenedTest2.insert(1, 1, "ft2"); + tFlattenedTest3.insert(1, 1, "ft3"); + } + + public void testIsToOneTargetModifiedFlattenedFault1() throws Exception { + + createFlattenedTestDataSet(); + + // fetch + List<?> ft3s = context.performQuery(new SelectQuery(FlattenedTest3.class)); + assertEquals(1, ft3s.size()); + FlattenedTest3 ft3 = (FlattenedTest3) ft3s.get(0); + + // mark as dirty for the purpose of the test... + ft3.setPersistenceState(PersistenceState.MODIFIED); + + assertTrue(ft3.readPropertyDirectly("toFT1") instanceof Fault); + + // test that checking for modifications does not trigger a fault, and generally + // works well + + ClassDescriptor d = context.getEntityResolver().getClassDescriptor( + "FlattenedTest3"); + ArcProperty flattenedRel = (ArcProperty) d.getProperty("toFT1"); + + ObjectDiff diff = context.getObjectStore().registerDiff(ft3.getObjectId(), null); + assertFalse(DataRowUtils.isToOneTargetModified(flattenedRel, ft3, diff)); + assertTrue(ft3.readPropertyDirectly("toFT1") instanceof Fault); + } + +} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedRelationshipInContextTest.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedRelationshipInContextTest.java b/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedRelationshipInContextTest.java deleted file mode 100644 index afe7030..0000000 --- a/cayenne-server/src/test/java/org/apache/cayenne/access/FlattenedRelationshipInContextTest.java +++ /dev/null @@ -1,100 +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.Fault; -import org.apache.cayenne.PersistenceState; -import org.apache.cayenne.di.Inject; -import org.apache.cayenne.query.SelectQuery; -import org.apache.cayenne.reflect.ArcProperty; -import org.apache.cayenne.reflect.ClassDescriptor; -import org.apache.cayenne.test.jdbc.DBHelper; -import org.apache.cayenne.test.jdbc.TableHelper; -import org.apache.cayenne.testdo.relationship.FlattenedTest3; -import org.apache.cayenne.unit.di.server.ServerCase; -import org.apache.cayenne.unit.di.server.UseServerRuntime; - -@UseServerRuntime(ServerCase.RELATIONSHIPS_PROJECT) -public class FlattenedRelationshipInContextTest extends ServerCase { - - @Inject - protected DataContext context; - - @Inject - protected DBHelper dbHelper; - - private TableHelper tFlattenedTest1; - private TableHelper tFlattenedTest2; - private TableHelper tFlattenedTest3; - - @Override - protected void setUpAfterInjection() throws Exception { - dbHelper.deleteAll("COMPLEX_JOIN"); - dbHelper.deleteAll("FLATTENED_TEST_4"); - dbHelper.deleteAll("FLATTENED_TEST_3"); - dbHelper.deleteAll("FLATTENED_TEST_2"); - dbHelper.deleteAll("FLATTENED_TEST_1"); - - tFlattenedTest1 = new TableHelper(dbHelper, "FLATTENED_TEST_1"); - tFlattenedTest1.setColumns("FT1_ID", "NAME"); - - tFlattenedTest2 = new TableHelper(dbHelper, "FLATTENED_TEST_2"); - tFlattenedTest2.setColumns("FT2_ID", "FT1_ID", "NAME"); - - tFlattenedTest3 = new TableHelper(dbHelper, "FLATTENED_TEST_3"); - tFlattenedTest3.setColumns("FT3_ID", "FT2_ID", "NAME"); - } - - protected void createFlattenedTestDataSet() throws Exception { - tFlattenedTest1.insert(1, "ft1"); - tFlattenedTest1.insert(2, "ft12"); - tFlattenedTest2.insert(1, 1, "ft2"); - tFlattenedTest3.insert(1, 1, "ft3"); - } - - public void testIsToOneTargetModifiedFlattenedFault1() throws Exception { - - createFlattenedTestDataSet(); - - // fetch - List<?> ft3s = context.performQuery(new SelectQuery(FlattenedTest3.class)); - assertEquals(1, ft3s.size()); - FlattenedTest3 ft3 = (FlattenedTest3) ft3s.get(0); - - // mark as dirty for the purpose of the test... - ft3.setPersistenceState(PersistenceState.MODIFIED); - - assertTrue(ft3.readPropertyDirectly("toFT1") instanceof Fault); - - // test that checking for modifications does not trigger a fault, and generally - // works well - - ClassDescriptor d = context.getEntityResolver().getClassDescriptor( - "FlattenedTest3"); - ArcProperty flattenedRel = (ArcProperty) d.getProperty("toFT1"); - - ObjectDiff diff = context.getObjectStore().registerDiff(ft3.getObjectId(), null); - assertFalse(DataRowUtils.isToOneTargetModified(flattenedRel, ft3, diff)); - assertTrue(ft3.readPropertyDirectly("toFT1") instanceof Fault); - } - -} http://git-wip-us.apache.org/repos/asf/cayenne/blob/e42c376c/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java ---------------------------------------------------------------------- diff --git a/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java b/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java new file mode 100644 index 0000000..b637efd --- /dev/null +++ b/cayenne-server/src/test/java/org/apache/cayenne/access/IdentityColumnsIT.java @@ -0,0 +1,331 @@ +/***************************************************************** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + ****************************************************************/ + +package org.apache.cayenne.access; + +import org.apache.cayenne.Cayenne; +import org.apache.cayenne.ObjectContext; +import org.apache.cayenne.ObjectId; +import org.apache.cayenne.Persistent; +import org.apache.cayenne.dba.DbAdapter; +import org.apache.cayenne.di.Inject; +import org.apache.cayenne.map.DbAttribute; +import org.apache.cayenne.map.DbEntity; +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.GeneratedColumnCompKey; +import org.apache.cayenne.testdo.testmap.GeneratedColumnCompMaster; +import org.apache.cayenne.testdo.testmap.GeneratedColumnDep; +import org.apache.cayenne.testdo.testmap.GeneratedColumnTest2; +import org.apache.cayenne.testdo.testmap.GeneratedColumnTestEntity; +import org.apache.cayenne.testdo.testmap.GeneratedF1; +import org.apache.cayenne.testdo.testmap.GeneratedF2; +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 IdentityColumnsIT extends ServerCase { + + @Inject + protected ObjectContext context; + + @Inject + protected DBHelper dbHelper; + + @Inject + protected DbAdapter adapter; + + @Inject + protected DataNode node; + + protected TableHelper joinTable; + + @Override + protected void setUpAfterInjection() throws Exception { + // TODO: extract in a separate DataMap? + dbHelper.deleteAll("GENERATED_JOIN"); + dbHelper.deleteAll("GENERATED_F1"); + dbHelper.deleteAll("GENERATED_F2"); + dbHelper.deleteAll("GENERATED_COLUMN_DEP"); + dbHelper.deleteAll("GENERATED_COLUMN_TEST"); + + joinTable = new TableHelper(dbHelper, "GENERATED_JOIN"); + } + + /** + * Tests a bug casued by the ID Java type mismatch vs the default JDBC type + * of the ID column. + */ + public void testCAY823() throws Exception { + + GeneratedColumnTestEntity idObject = context.newObject(GeneratedColumnTestEntity.class); + + String name = "n_" + System.currentTimeMillis(); + idObject.setName(name); + + idObject.getObjectContext().commitChanges(); + + ObjectId id = idObject.getObjectId(); + context.invalidateObjects(idObject); + + SelectQuery q = new SelectQuery(GeneratedColumnTestEntity.class); + q.setPageSize(10); + List<?> results = context.performQuery(q); + assertEquals(1, results.size()); + + // per CAY-823 an attempt to resolve an object results in an exception + assertEquals(id, ((Persistent) results.get(0)).getObjectId()); + } + + public void testNewObject() throws Exception { + + GeneratedColumnTestEntity idObject = context.newObject(GeneratedColumnTestEntity.class); + + String name = "n_" + System.currentTimeMillis(); + idObject.setName(name); + + idObject.getObjectContext().commitChanges(); + + // this will throw an exception if id wasn't generated one way or + // another + int id = Cayenne.intPKForObject(idObject); + assertTrue(id >= 0); + + // make sure that id is the same as id in the DB + context.invalidateObjects(idObject); + GeneratedColumnTestEntity object = Cayenne.objectForPK(context, GeneratedColumnTestEntity.class, id); + assertNotNull(object); + assertEquals(name, object.getName()); + } + + public void testGeneratedJoinInFlattenedRelationship() throws Exception { + + // before saving objects, let's manually access PKGenerator to get a + // base PK value + // for comparison + DbEntity joinTableEntity = context.getEntityResolver().getDbEntity(joinTable.getTableName()); + DbAttribute pkAttribute = joinTableEntity.getAttribute("ID"); + Number pk = (Number) adapter.getPkGenerator().generatePk(node, pkAttribute); + + GeneratedF1 f1 = context.newObject(GeneratedF1.class); + GeneratedF2 f2 = context.newObject(GeneratedF2.class); + f1.addToF2(f2); + + context.commitChanges(); + + int id = joinTable.getInt("ID"); + assertTrue(id > 0); + + // this is a leap of faith that autoincrement-based IDs will not match + // PkGenertor provided ids... This sorta works though if pk generator + // has a 200 + // base value + if (adapter.supportsGeneratedKeys()) { + assertFalse("Looks like auto-increment wasn't used for the join table. ID: " + id, id == pk.intValue() + 1); + } else { + assertEquals(id, pk.intValue() + 1); + } + } + + /** + * Tests CAY-422 bug. + */ + public void testUnrelatedUpdate() throws Exception { + + GeneratedColumnTestEntity m = context.newObject(GeneratedColumnTestEntity.class); + + m.setName("m"); + + GeneratedColumnDep d = context.newObject(GeneratedColumnDep.class); + d.setName("d"); + d.setToMaster(m); + context.commitChanges(); + + context.invalidateObjects(m, d); + + context.prepareForAccess(d, null, false); + + // this line caused CAY-422 error + d.getToMaster(); + + d.setName("new name"); + context.commitChanges(); + } + + /** + * Tests that insert in two tables with identity pk does not generate a + * conflict. See CAY-341 for the original bug. + */ + public void testMultipleNewObjectsSeparateTables() throws Exception { + + GeneratedColumnTestEntity idObject1 = context.newObject(GeneratedColumnTestEntity.class); + idObject1.setName("o1"); + + GeneratedColumnTest2 idObject2 = context.newObject(GeneratedColumnTest2.class); + idObject2.setName("o2"); + + context.commitChanges(); + } + + public void testMultipleNewObjects() throws Exception { + + String[] names = new String[] { "n1_" + System.currentTimeMillis(), "n2_" + System.currentTimeMillis(), + "n3_" + System.currentTimeMillis() }; + + GeneratedColumnTestEntity[] idObjects = new GeneratedColumnTestEntity[] { + context.newObject(GeneratedColumnTestEntity.class), context.newObject(GeneratedColumnTestEntity.class), + context.newObject(GeneratedColumnTestEntity.class) }; + + for (int i = 0; i < idObjects.length; i++) { + idObjects[i].setName(names[i]); + } + + context.commitChanges(); + + int[] ids = new int[idObjects.length]; + for (int i = 0; i < idObjects.length; i++) { + ids[i] = Cayenne.intPKForObject(idObjects[i]); + assertTrue(ids[i] > 0); + } + + context.invalidateObjects(idObjects); + + for (int i = 0; i < ids.length; i++) { + GeneratedColumnTestEntity object = Cayenne.objectForPK(context, GeneratedColumnTestEntity.class, ids[i]); + assertNotNull(object); + assertEquals(names[i], object.getName()); + } + } + + public void testCompoundPKWithGeneratedColumn() throws Exception { + if (adapter.supportsGeneratedKeys()) { + // only works for generated keys, as the entity tested has one + // Cayenne + // auto-pk and one generated key + + String masterName = "m_" + System.currentTimeMillis(); + String depName1 = "dep1_" + System.currentTimeMillis(); + String depName2 = "dep2_" + System.currentTimeMillis(); + + GeneratedColumnCompMaster master = context.newObject(GeneratedColumnCompMaster.class); + master.setName(masterName); + + GeneratedColumnCompKey dep1 = context.newObject(GeneratedColumnCompKey.class); + dep1.setName(depName1); + dep1.setToMaster(master); + + GeneratedColumnCompKey dep2 = context.newObject(GeneratedColumnCompKey.class); + dep2.setName(depName2); + dep2.setToMaster(master); + + context.commitChanges(); + + int masterId = Cayenne.intPKForObject(master); + + ObjectId id2 = dep2.getObjectId(); + + // check propagated id + Number propagatedID2 = (Number) id2.getIdSnapshot().get(GeneratedColumnCompKey.PROPAGATED_PK_PK_COLUMN); + assertNotNull(propagatedID2); + assertEquals(masterId, propagatedID2.intValue()); + + // check Cayenne-generated ID + Number cayenneGeneratedID2 = (Number) id2.getIdSnapshot().get(GeneratedColumnCompKey.AUTO_PK_PK_COLUMN); + assertNotNull(cayenneGeneratedID2); + + // check DB-generated ID + Number dbGeneratedID2 = (Number) id2.getIdSnapshot().get(GeneratedColumnCompKey.GENERATED_COLUMN_PK_COLUMN); + assertNotNull(dbGeneratedID2); + + context.invalidateObjects(master, dep1, dep2); + + Object fetchedDep2 = Cayenne.objectForPK(context, id2); + assertNotNull(fetchedDep2); + } + } + + public void testUpdateDependentWithNewMaster() throws Exception { + + GeneratedColumnTestEntity master1 = context.newObject(GeneratedColumnTestEntity.class); + master1.setName("aaa"); + + GeneratedColumnDep dependent = context.newObject(GeneratedColumnDep.class); + dependent.setName("aaa"); + dependent.setToMaster(master1); + + context.commitChanges(); + + // change master + GeneratedColumnTestEntity master2 = context.newObject(GeneratedColumnTestEntity.class); + master2.setName("bbb"); + + // TESTING THIS + dependent.setToMaster(master2); + context.commitChanges(); + + int id1 = Cayenne.intPKForObject(master2); + assertTrue(id1 >= 0); + + int id2 = Cayenne.intPKForObject(dependent); + assertTrue(id2 >= 0); + assertEquals(id1, id2); + + context.invalidateObjects(master2, dependent); + + assertNotNull(Cayenne.objectForPK(context, GeneratedColumnTestEntity.class, id1)); + assertNotNull(Cayenne.objectForPK(context, GeneratedColumnDep.class, id2)); + } + + public void testGeneratedDefaultValue() throws Exception { + + // fail("TODO: test insert with DEFAULT generated column...need custom + // SQL to + // build such table"); + } + + public void testPropagateToDependent() throws Exception { + + GeneratedColumnTestEntity idObject = context.newObject(GeneratedColumnTestEntity.class); + idObject.setName("aaa"); + + GeneratedColumnDep dependent = idObject.getObjectContext().newObject(GeneratedColumnDep.class); + dependent.setName("aaa"); + dependent.setToMaster(idObject); + + context.commitChanges(); + + // this will throw an exception if id wasn't generated + int id1 = Cayenne.intPKForObject(idObject); + assertTrue(id1 >= 0); + + int id2 = Cayenne.intPKForObject(dependent); + assertTrue(id2 >= 0); + + assertEquals(id1, id2); + + // refetch from DB + context.invalidateObjects(idObject, dependent); + + assertNotNull(Cayenne.objectForPK(context, GeneratedColumnTestEntity.class, id1)); + assertNotNull(Cayenne.objectForPK(context, GeneratedColumnDep.class, id2)); + } +}
