You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2008/12/02 17:33:25 UTC
svn commit: r722516 - in /cayenne/main/trunk: docs/doc/src/main/resources/
framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/
framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/
Author: aadamchik
Date: Tue Dec 2 08:33:24 2008
New Revision: 722516
URL: http://svn.apache.org/viewvc?rev=722516&view=rev
Log:
CAY-1142 (Single table) Inheritance and Paginated lists
implementing a more lax check for object types added to incremental fault list.
This should address inheritance related failures, and make things just a bit faster for paginated queries
Added:
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SingleTableInheritanceTest.java
Modified:
cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListDataRowsTest.java
Modified: cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt?rev=722516&r1=722515&r2=722516&view=diff
==============================================================================
--- cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt (original)
+++ cayenne/main/trunk/docs/doc/src/main/resources/RELEASE-NOTES.txt Tue Dec 2 08:33:24 2008
@@ -15,6 +15,7 @@
Changes/New Features Since M5:
CAY-1140 Store ObjEntity name in the DataRow
+CAY-1142 (Single table) Inheritance and Paginated lists
----------------------------------
Release: 3.0M5
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java?rev=722516&r1=722515&r2=722516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java Tue Dec 2 08:33:24 2008
@@ -323,7 +323,7 @@
List<Object> ids = new ArrayList<Object>(pageSize);
for (int i = fromIndex; i < toIndex; i++) {
Object object = elements.get(i);
- if (helper.incorrectObjectType(object)) {
+ if (helper.unresolvedSuspect(object)) {
quals.add(buildIdQualifier(object));
ids.add(object);
}
@@ -601,7 +601,7 @@
synchronized (elements) {
Object o = elements.get(index);
- if (helper.incorrectObjectType(o)) {
+ if (helper.unresolvedSuspect(o)) {
// read this page
int pageStart = pageIndex(index) * pageSize;
resolveInterval(pageStart, pageStart + pageSize);
@@ -710,7 +710,7 @@
abstract class IncrementalListHelper {
int indexOfObject(Object object) {
- if (incorrectObjectType(object)) {
+ if (unresolvedSuspect(object)) {
return -1;
}
@@ -725,7 +725,7 @@
}
int lastIndexOfObject(Object object) {
- if (incorrectObjectType(object)) {
+ if (unresolvedSuspect(object)) {
return -1;
}
@@ -759,7 +759,15 @@
}
}
- abstract boolean incorrectObjectType(Object object);
+ /**
+ * Returns true if an object is not the type of object expected in the list. This
+ * method is not expected to perform thorough checking of the object type. What's
+ * important is the guarantee that an unresolved object representation will always
+ * return true for this method, and resolved will return false. Other types of
+ * objects that users may choose to add to the list will not be analyzed in
+ * detail.
+ */
+ abstract boolean unresolvedSuspect(Object object);
abstract boolean objectsAreEqual(Object object, Object objectInTheList);
@@ -769,21 +777,16 @@
class PersistentListHelper extends IncrementalListHelper {
@Override
- boolean incorrectObjectType(Object object) {
+ boolean unresolvedSuspect(Object object) {
if (!(object instanceof Persistent)) {
return true;
}
- Persistent persistent = (Persistent) object;
- // NULL ObjectContext can be a result of a delete/commit operation
- if (persistent.getObjectContext() != null
- && persistent.getObjectContext() != dataContext) {
- return true;
- }
-
- if (!persistent.getObjectId().getEntityName().equals(rootEntity.getName())) {
- return true;
- }
+ // don't do a full check for object type matching the type of objects in the
+ // list... what's important is a quick "false" return if the object is of type
+ // representing unresolved objects.. furthermore, if inheritance is involved,
+ // we'll need an even more extensive check (see CAY-1142 on inheritance
+ // issues).
return false;
}
@@ -815,13 +818,12 @@
class DataRowListHelper extends IncrementalListHelper {
@Override
- boolean incorrectObjectType(Object object) {
+ boolean unresolvedSuspect(Object object) {
if (!(object instanceof Map)) {
return true;
}
- Map<?, ?> map = (Map<?, ?>) object;
- return map.size() != rowWidth;
+ return false;
}
@Override
@@ -834,6 +836,10 @@
Map<?, ?> id = (Map<?, ?>) objectInTheList;
Map<?, ?> map = (Map<?, ?>) object;
+
+ if(id.size() != map.size()) {
+ return false;
+ }
// id must be a subset of this map
for (Map.Entry<?, ?> entry : id.entrySet()) {
Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListDataRowsTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListDataRowsTest.java?rev=722516&r1=722515&r2=722516&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListDataRowsTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SimpleIdIncrementalFaultListDataRowsTest.java Tue Dec 2 08:33:24 2008
@@ -24,6 +24,7 @@
import java.util.Map;
import org.apache.art.Artist;
+import org.apache.cayenne.DataRow;
import org.apache.cayenne.exp.Expression;
import org.apache.cayenne.exp.ExpressionFactory;
import org.apache.cayenne.query.Ordering;
@@ -83,8 +84,11 @@
Map row = (Map) artists.get(0);
assertEquals(19, list.indexOf(row));
+
+ DataRow clone = new DataRow(row);
+ assertEquals(19, list.indexOf(clone));
- row.remove("ARTIST_NAME");
+ row.remove("ARTIST_ID");
assertEquals(-1, list.indexOf(row));
}
@@ -135,7 +139,7 @@
Map row = (Map) artists.get(0);
assertEquals(19, list.lastIndexOf(row));
- row.remove("ARTIST_NAME");
+ row.remove("ARTIST_ID");
assertEquals(-1, list.lastIndexOf(row));
}
Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SingleTableInheritanceTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SingleTableInheritanceTest.java?rev=722516&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SingleTableInheritanceTest.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/SingleTableInheritanceTest.java Tue Dec 2 08:33:24 2008
@@ -0,0 +1,79 @@
+/*****************************************************************
+ * 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.query.QueryChain;
+import org.apache.cayenne.query.SQLTemplate;
+import org.apache.cayenne.query.SelectQuery;
+import org.apache.cayenne.testdo.inherit.AbstractPerson;
+import org.apache.cayenne.testdo.inherit.Employee;
+import org.apache.cayenne.testdo.inherit.Manager;
+import org.apache.cayenne.unit.PeopleCase;
+
+public class SingleTableInheritanceTest extends PeopleCase {
+
+ @Override
+ protected void setUp() throws Exception {
+ super.setUp();
+ deleteTestData();
+ }
+
+ public void testPaginatedQueries() {
+
+ QueryChain insert = new QueryChain();
+ insert
+ .addQuery(new SQLTemplate(
+ AbstractPerson.class,
+ "INSERT INTO PERSON (PERSON_ID, NAME, PERSON_TYPE) VALUES (1, 'E1', 'EE')"));
+ insert
+ .addQuery(new SQLTemplate(
+ AbstractPerson.class,
+ "INSERT INTO PERSON (PERSON_ID, NAME, PERSON_TYPE) VALUES (2, 'E2', 'EM')"));
+ insert
+ .addQuery(new SQLTemplate(
+ AbstractPerson.class,
+ "INSERT INTO PERSON (PERSON_ID, NAME, PERSON_TYPE) VALUES (3, 'E3', 'EE')"));
+ insert
+ .addQuery(new SQLTemplate(
+ AbstractPerson.class,
+ "INSERT INTO PERSON (PERSON_ID, NAME, PERSON_TYPE) VALUES (4, 'E4', 'EM')"));
+ insert
+ .addQuery(new SQLTemplate(
+ AbstractPerson.class,
+ "INSERT INTO PERSON (PERSON_ID, NAME, PERSON_TYPE) VALUES (5, 'E5', 'EE')"));
+ createDataContext().performGenericQuery(insert);
+
+ SelectQuery select = new SelectQuery(AbstractPerson.class);
+ select.addOrdering("db:" + AbstractPerson.PERSON_ID_PK_COLUMN, true);
+ select.setPageSize(3);
+
+ List<AbstractPerson> results = createDataContext().performQuery(select);
+ assertEquals(5, results.size());
+
+ assertTrue(results.get(0) instanceof Employee);
+
+ // this is where things would blow up per CAY-1142
+ assertTrue(results.get(1) instanceof Manager);
+
+ assertTrue(results.get(3) instanceof Manager);
+ assertTrue(results.get(4) instanceof Employee);
+ }
+}