Return-Path: X-Original-To: apmail-db-torque-dev-archive@www.apache.org Delivered-To: apmail-db-torque-dev-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 0205510280 for ; Tue, 27 Aug 2013 21:32:05 +0000 (UTC) Received: (qmail 360 invoked by uid 500); 27 Aug 2013 21:32:04 -0000 Delivered-To: apmail-db-torque-dev-archive@db.apache.org Received: (qmail 338 invoked by uid 500); 27 Aug 2013 21:32:04 -0000 Mailing-List: contact torque-dev-help@db.apache.org; run by ezmlm Precedence: bulk List-Unsubscribe: List-Help: List-Post: List-Id: "Apache Torque Developers List" Reply-To: "Apache Torque Developers List" Delivered-To: mailing list torque-dev@db.apache.org Received: (qmail 330 invoked by uid 500); 27 Aug 2013 21:32:04 -0000 Received: (qmail 327 invoked by uid 99); 27 Aug 2013 21:32:04 -0000 Received: from nike.apache.org (HELO nike.apache.org) (192.87.106.230) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 27 Aug 2013 21:32:04 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Tue, 27 Aug 2013 21:31:59 +0000 Received: from eris.apache.org (localhost [127.0.0.1]) by eris.apache.org (Postfix) with ESMTP id 79B272388860; Tue, 27 Aug 2013 21:31:37 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1518002 - in /db/torque/torque4/trunk: torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/ torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/ torque-test/src/test/java/org/ap... Date: Tue, 27 Aug 2013 21:31:37 -0000 To: torque-commits@db.apache.org From: tfischer@apache.org X-Mailer: svnmailer-1.0.9 Message-Id: <20130827213137.79B272388860@eris.apache.org> X-Virus-Checked: Checked by ClamAV on apache.org Author: tfischer Date: Tue Aug 27 21:31:36 2013 New Revision: 1518002 URL: http://svn.apache.org/r1518002 Log: TORQUE-299 In the getRelatedObject... methods in the Data objects, fill the reference to the current object Also fix NPE when using getRelatedObject methods with initialized caches add tests for both fixes Added: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/backreferenceToReferencingObject.vm Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/getterReferencingObject.vm db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/templates/dbObject/base/joinGetterReferencingObject.vm db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/dataobject/GetRelatedObjectsJoinTest.java db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/dataobject/GetRelatedObjectsTest.java Modified: db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml?rev=1518002&r1=1518001&r2=1518002&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml (original) +++ db/torque/torque4/trunk/torque-templates/src/main/resources/org/apache/torque/templates/om/outlets/dbObject.xml Tue Aug 27 21:31:36 2013 @@ -366,6 +366,14 @@ + + + + + + + + + multiRefs = baseObject.getMultiRefs(); // switch silent fetching off @@ -88,9 +94,61 @@ public class GetRelatedObjectsJoinTest e public void testJoinGetter() throws Exception { OIntegerPk baseObject = testData.getOIntegerPkList().get(0); + baseObject = OIntegerPkPeer.doSelectSingleRecord(baseObject); List multiRefs = baseObject.getMultiRefsJoinPIntegerPk( new Criteria().addAscendingOrderByColumn(MultiRefPeer.ID)); + + // verify + assertEquals(3, multiRefs.size()); + assertEquals("multiRef111a", multiRefs.get(0).getName()); + assertEquals("multiRef111b", multiRefs.get(1).getName()); + assertEquals("multiRef120", multiRefs.get(2).getName()); + // switch silent fetching off + Adapter adapter = Torque.getOrCreateDatabase(Torque.getDefaultDB()).getAdapter(); + try + { + Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(null); + // check that the join has worked + assertEquals( + testData.getPIntegerPkList().get(0), + multiRefs.get(0).getPIntegerPk()); + assertEquals( + testData.getPIntegerPkList().get(0), + multiRefs.get(1).getPIntegerPk()); + assertEquals( + testData.getPIntegerPkList().get(1), + multiRefs.get(2).getPIntegerPk()); + // check that the back reference to the base object + // is set in the joined objects + assertEquals(baseObject, multiRefs.get(0).getOIntegerPk()); + assertEquals(baseObject, multiRefs.get(1).getOIntegerPk()); + assertEquals(baseObject, multiRefs.get(2).getOIntegerPk()); + assertFalse(multiRefs.get(0).isModified()); + assertFalse(multiRefs.get(1).isModified()); + assertFalse(multiRefs.get(2).isModified()); + } + finally + { + Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(adapter); + } + } + + /** + * Checks that the joinGetter works if different tables are joined. + * + * @throws Exception if the database fails + */ + public void testJoinGetterAfterInit() throws Exception + { + OIntegerPk baseObject = testData.getOIntegerPkList().get(0); + baseObject = OIntegerPkPeer.doSelectSingleRecord(baseObject); + baseObject.initMultiRefs(); + List multiRefs + = baseObject.getMultiRefsJoinPIntegerPk( + new Criteria().addAscendingOrderByColumn(MultiRefPeer.ID)); + + // verify assertEquals(3, multiRefs.size()); assertEquals("multiRef111a", multiRefs.get(0).getName()); assertEquals("multiRef111b", multiRefs.get(1).getName()); @@ -100,6 +158,7 @@ public class GetRelatedObjectsJoinTest e try { Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(null); + // check that the join has worked assertEquals( testData.getPIntegerPkList().get(0), multiRefs.get(0).getPIntegerPk()); @@ -109,6 +168,61 @@ public class GetRelatedObjectsJoinTest e assertEquals( testData.getPIntegerPkList().get(1), multiRefs.get(2).getPIntegerPk()); + // check that the back reference to the base object + // is set in the joined objects + assertEquals(baseObject, multiRefs.get(0).getOIntegerPk()); + assertEquals(baseObject, multiRefs.get(1).getOIntegerPk()); + assertEquals(baseObject, multiRefs.get(2).getOIntegerPk()); + assertFalse(multiRefs.get(0).isModified()); + assertFalse(multiRefs.get(1).isModified()); + assertFalse(multiRefs.get(2).isModified()); + } + finally + { + Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(adapter); + } + } + + /** + * Checks that the joinGetter works if different tables are joined + * and the collection was already loaded with another criteria. + * + * @throws Exception if the database fails + */ + public void testJoinGetterWithOtherCriteria() throws Exception + { + OIntegerPk baseObject = testData.getOIntegerPkList().get(0); + baseObject = OIntegerPkPeer.doSelectSingleRecord(baseObject); + baseObject.getMultiRefsJoinPIntegerPk( + new Criteria().addAscendingOrderByColumn(MultiRefPeer.ID)); + List multiRefs + = baseObject.getMultiRefsJoinPIntegerPk( + new Criteria().addAscendingOrderByColumn(MultiRefPeer.ID) + .where(PIntegerPkPeer.ID, + testData.getPIntegerPkList().get(0).getId())); + + // verify + assertEquals(2, multiRefs.size()); + assertEquals("multiRef111a", multiRefs.get(0).getName()); + assertEquals("multiRef111b", multiRefs.get(1).getName()); + // switch silent fetching off + Adapter adapter = Torque.getOrCreateDatabase(Torque.getDefaultDB()).getAdapter(); + try + { + Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(null); + // check that the join has worked + assertEquals( + testData.getPIntegerPkList().get(0), + multiRefs.get(0).getPIntegerPk()); + assertEquals( + testData.getPIntegerPkList().get(0), + multiRefs.get(1).getPIntegerPk()); + // check that the back reference to the base object + // is set in the joined objects + assertEquals(baseObject, multiRefs.get(0).getOIntegerPk()); + assertEquals(baseObject, multiRefs.get(1).getOIntegerPk()); + assertFalse(multiRefs.get(0).isModified()); + assertFalse(multiRefs.get(1).isModified()); } finally { @@ -124,6 +238,7 @@ public class GetRelatedObjectsJoinTest e public void testJoinGetterSameObject() throws Exception { OIntegerPk baseObject = testData.getOIntegerPkList().get(0); + baseObject = OIntegerPkPeer.doSelectSingleRecord(baseObject); List multiRefSameTables = baseObject.getMultiRefSameTableRelatedByReference1sJoinOIntegerPkRelatedByReference2( new Criteria().addAscendingOrderByColumn(MultiRefSameTablePeer.ID)); @@ -145,6 +260,21 @@ public class GetRelatedObjectsJoinTest e assertEquals( testData.getOIntegerPkList().get(1), multiRefSameTables.get(2).getOIntegerPkRelatedByReference2()); + // check that the back reference to the base object + // is set in the joined objects + assertEquals( + baseObject, + multiRefSameTables.get(0).getOIntegerPkRelatedByReference1()); + assertEquals( + baseObject, + multiRefSameTables.get(1).getOIntegerPkRelatedByReference1()); + assertEquals( + baseObject, + multiRefSameTables.get(2).getOIntegerPkRelatedByReference1()); + // check that adding the backreference did not lead to changed objects + assertFalse(multiRefSameTables.get(0).isModified()); + assertFalse(multiRefSameTables.get(1).isModified()); + assertFalse(multiRefSameTables.get(2).isModified()); } finally { Modified: db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/dataobject/GetRelatedObjectsTest.java URL: http://svn.apache.org/viewvc/db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/dataobject/GetRelatedObjectsTest.java?rev=1518002&r1=1518001&r2=1518002&view=diff ============================================================================== --- db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/dataobject/GetRelatedObjectsTest.java (original) +++ db/torque/torque4/trunk/torque-test/src/test/java/org/apache/torque/generated/dataobject/GetRelatedObjectsTest.java Tue Aug 27 21:31:36 2013 @@ -19,14 +19,19 @@ package org.apache.torque.generated.data * under the License. */ +import java.sql.Connection; import java.util.List; import org.apache.torque.BaseDatabaseTestCase; +import org.apache.torque.Torque; +import org.apache.torque.TorqueException; +import org.apache.torque.adapter.Adapter; import org.apache.torque.criteria.Criteria; import org.apache.torque.test.dbobject.Author; import org.apache.torque.test.dbobject.Book; import org.apache.torque.test.peer.AuthorPeer; import org.apache.torque.test.peer.BookPeer; +import org.apache.torque.util.Transaction; /** * Tests whether the getRelatedObjects methods works @@ -46,6 +51,37 @@ public class GetRelatedObjectsTest exten } /** + * Checks that the test principle for switching silent db fetch works. + * This test does not check the functionality to test, but rather ensures + * that we can switch of silent db fetching to check whether objects + * are already loaded or not. + */ + public void testSwitchSilentFetchingOff() throws Exception + { + Author baseObject = authorList.get(0); + baseObject = AuthorPeer.doSelectSingleRecord(baseObject); + // switch silent fetching off + Adapter adapter = Torque.getOrCreateDatabase(Torque.getDefaultDB()).getAdapter(); + try + { + Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(null); + try + { + baseObject.getBooks(); + fail("Exception excpected"); + } + catch (Exception e) + { + // expected + } + } + finally + { + Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(adapter); + } + } + + /** * Tests getters of related objects. * * @throws Exception if the test fails @@ -63,6 +99,7 @@ public class GetRelatedObjectsTest exten // verify assertEquals(10, books.size()); assertTrue(books.get(0).getTitle().endsWith("- Author 1")); + checkBackreferenceExists(author, books); } /** @@ -106,6 +143,7 @@ public class GetRelatedObjectsTest exten // verify assertEquals(1, books.size()); assertEquals(book.getBookId(), books.get(0).getBookId()); + checkBackreferenceExists(author, books); } /** @@ -130,6 +168,7 @@ public class GetRelatedObjectsTest exten // verify assertEquals(1, books.size()); assertEquals(book.getBookId(), books.get(0).getBookId()); + checkBackreferenceExists(author, books); } /** @@ -154,5 +193,162 @@ public class GetRelatedObjectsTest exten // verify assertEquals(1, books.size()); assertEquals(book.getBookId(), books.get(0).getBookId()); + checkBackreferenceExists(author, books); + } + + /** + * Tests getters of related objects. + * + * @throws Exception if the test fails + */ + public void testGetRelatedObjectsWithConnection() throws Exception + { + Criteria criteria = new Criteria().where( + AuthorPeer.AUTHOR_ID, + authorList.get(0).getAuthorId()); + Author author = AuthorPeer.doSelect(criteria).get(0); + + // execute loading books + Connection connection = Transaction.begin(); + List books = author.getBooks(connection); + Transaction.commit(connection); + + // verify + assertEquals(10, books.size()); + assertTrue(books.get(0).getTitle().endsWith("- Author 1")); + checkBackreferenceExists(author, books); + } + + /** + * Tests getters of related objects, after the collection was initialized. + * + * @throws Exception if the test fails + */ + public void testGetRelatedObjectsWithConnectionAfterInit() throws Exception + { + Criteria criteria = new Criteria().where( + AuthorPeer.AUTHOR_ID, + authorList.get(0).getAuthorId()); + Author author = AuthorPeer.doSelect(criteria).get(0); + + // execute : init, then load books + author.initBooks(); + Connection connection = Transaction.begin(); + List books = author.getBooks(connection); + Transaction.commit(connection); + + // verify + // Books should not be loaded from db but cache should be used + assertEquals(0, books.size()); } + + /** + * Tests getters of related objects with a Criteria object + * + * @throws Exception if the test fails + */ + public void testGetRelatedObjectsWithConnectionAndCriteria() throws Exception + { + Criteria criteria = new Criteria().where( + AuthorPeer.AUTHOR_ID, + authorList.get(0).getAuthorId()); + Author author = AuthorPeer.doSelect(criteria).get(0); + Book book = authorList.get(0).getBooks().get(2); + + // execute : load books + criteria = new Criteria().where(BookPeer.BOOK_ID, book.getBookId()); + Connection connection = Transaction.begin(); + List books = author.getBooks(criteria, connection); + Transaction.commit(connection); + + // verify + assertEquals(1, books.size()); + assertEquals(book.getBookId(), books.get(0).getBookId()); + checkBackreferenceExists(author, books); + } + + /** + * Tests getters of related objects with a Criteria object + * after the related objects were loaded with another criteria. + * + * @throws Exception if the test fails + */ + public void testGetRelatedObjectsWithConneectionAndOtherCriteria() throws Exception + { + Criteria criteria = new Criteria().where( + AuthorPeer.AUTHOR_ID, + authorList.get(0).getAuthorId()); + Author author = AuthorPeer.doSelect(criteria).get(0); + author.getBooks(); + Book book = authorList.get(0).getBooks().get(2); + + // execute : load books + criteria = new Criteria().where(BookPeer.BOOK_ID, book.getBookId()); + Connection connection = Transaction.begin(); + List books = author.getBooks(criteria, connection); + Transaction.commit(connection); + + // verify + assertEquals(1, books.size()); + assertEquals(book.getBookId(), books.get(0).getBookId()); + checkBackreferenceExists(author, books); + } + + /** + * Tests getters of related objects with a Criteria object + * after the init method was called on the collection. + * + * @throws Exception if the test fails + */ + public void testGetRelatedObjectsWithConnectionAndCriteriaAfterInit() throws Exception + { + Criteria criteria = new Criteria().where( + AuthorPeer.AUTHOR_ID, + authorList.get(0).getAuthorId()); + Author author = AuthorPeer.doSelect(criteria).get(0); + author.initBooks(); + Book book = authorList.get(0).getBooks().get(2); + + // execute : load books + criteria = new Criteria().where(BookPeer.BOOK_ID, book.getBookId()); + Connection connection = Transaction.begin(); + List books = author.getBooks(criteria, connection); + Transaction.commit(connection); + + // verify + assertEquals(1, books.size()); + assertEquals(book.getBookId(), books.get(0).getBookId()); + checkBackreferenceExists(author, books); + } + + + /** + * Switches silent fetching off and checks that a backreference + * to the author is set on each book in the list. + * + * @param author the author to which the backreference should be made + * @param books the books to check. + * + * @throws TorqueException if a database operation fails + */ + private void checkBackreferenceExists(final Author author, final List books) + throws TorqueException + { + Adapter adapter = Torque.getOrCreateDatabase(Torque.getDefaultDB()).getAdapter(); + try + { + Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(null); + for (Book book : books) + { + assertEquals(author, book.getAuthor()); + // check that adding the backreference did not lead to changed objects + assertFalse(book.isModified()); + } + } + finally + { + Torque.getOrCreateDatabase(Torque.getDefaultDB()).setAdapter(adapter); + } + } + } --------------------------------------------------------------------- To unsubscribe, e-mail: torque-dev-unsubscribe@db.apache.org For additional commands, e-mail: torque-dev-help@db.apache.org