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 2010/01/12 14:31:08 UTC

svn commit: r898317 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/jdbc/ main/java/org/apache/cayenne/ejbql/parser/ test/java/org/apache/cayenne/access/ test/java/org/apache/cayenne/testdo/relatio...

Author: aadamchik
Date: Tue Jan 12 13:31:05 2010
New Revision: 898317

URL: http://svn.apache.org/viewvc?rev=898317&view=rev
Log:
CAY-1069 EJBQL: support paths across flattened relationships

patch by Ksenia Khailenko

Added:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/FlattenedTest4.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/Relationships.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest4.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_Relationships.java
Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLFlattenedRelationshipsTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesTest.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest1.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/access.DataContextEJBQLFlattenedRelationshipsTest.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/embeddable.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/generic.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/inheritance.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/locking.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db2.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/qualified.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/quotemap.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/relationships.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/sus-map.map.xml
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/testmap.map.xml

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLConditionTranslator.java Tue Jan 12 13:31:05 2010
@@ -46,6 +46,7 @@
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.map.DbJoin;
 import org.apache.cayenne.map.DbRelationship;
+import org.apache.cayenne.map.ObjRelationship;
 import org.apache.cayenne.reflect.AttributeProperty;
 import org.apache.cayenne.reflect.ClassDescriptor;
 import org.apache.cayenne.reflect.Property;
@@ -164,19 +165,39 @@
 
         String subqueryId = context.createIdAlias(id);
         ClassDescriptor targetDescriptor = context.getEntityDescriptor(subqueryId);
+       
+        if (expression.isNegated()) {
+            context.append(" NOT");
+        }
+
+        context.append(" EXISTS (SELECT 1 FROM ");
+
         String subqueryTableName = targetDescriptor
                 .getEntity()
                 .getDbEntity()
                 .getFullyQualifiedName();
         String subqueryRootAlias = context.getTableAlias(subqueryId, subqueryTableName);
 
-        context.append(" (SELECT COUNT(1) FROM ");
-        // not using "AS" to separate table name and alias name - OpenBase doesn't
-        // support "AS", and the rest of the databases do not care
-        context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
+        ObjRelationship relationship = (ObjRelationship) correlatedEntityDescriptor
+                .getEntity()
+                .getRelationship(path.getRelativePath());
+        
+        if (relationship.getDbRelationshipPath().contains(".")) {
+            // if the DbRelationshipPath contains '.', the relationship is flattened
+            subqueryRootAlias = processFlattenedRelationShip(
+                    subqueryRootAlias,
+                    relationship);
+        }
+        else {
+            // not using "AS" to separate table name and alias name - OpenBase doesn't
+            // support "AS", and the rest of the databases do not care
+            context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
+
+        }
         context.append(" WHERE");
 
         // TODO: andrus, 8/11/2007 flattened?
+        // 11/01/2010 flattened relationship are processing earlier
         DbRelationship correlatedJoinRelationship = context.getIncomingRelationships(
                 new EJBQLTableId(id)).get(0);
         Iterator<DbJoin> it = correlatedJoinRelationship.getJoins().iterator();
@@ -238,23 +259,40 @@
 
         String subqueryId = context.createIdAlias(id);
         ClassDescriptor targetDescriptor = context.getEntityDescriptor(subqueryId);
+
+        if (expression.isNegated()) {
+            context.append(" NOT");
+        }
+
+        context.append(" EXISTS (SELECT 1 FROM ");
+
         String subqueryTableName = targetDescriptor
                 .getEntity()
                 .getDbEntity()
                 .getFullyQualifiedName();
         String subqueryRootAlias = context.getTableAlias(subqueryId, subqueryTableName);
 
-        if (expression.isNegated()) {
-            context.append(" NOT");
+        ObjRelationship relationship = (ObjRelationship) correlatedEntityDescriptor
+                .getEntity()
+                .getRelationship(path.getRelativePath());
+        
+        if (relationship.getDbRelationshipPath().contains(".")) {
+            // if the DbRelationshipPath contains '.', the relationship is flattened
+            subqueryRootAlias = processFlattenedRelationShip(
+                    subqueryRootAlias,
+                    relationship);
+        }
+        else {
+            // not using "AS" to separate table name and alias name - OpenBase doesn't
+            // support "AS", and the rest of the databases do not care
+            context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
+
         }
 
-        context.append(" EXISTS (SELECT 1 FROM ");
-        // not using "AS" to separate table name and alias name - OpenBase doesn't
-        // support "AS", and the rest of the databases do not care
-        context.append(subqueryTableName).append(' ').append(subqueryRootAlias);
         context.append(" WHERE");
 
         // TODO: andrus, 8/11/2007 flattened?
+        // 11/01/2010 flattened relationship are processing earlier
         DbRelationship correlatedJoinRelationship = context.getIncomingRelationships(
                 new EJBQLTableId(id)).get(0);
 
@@ -278,6 +316,60 @@
         return false;
     }
 
+    private String processFlattenedRelationShip(
+            String subqueryRootAlias,
+            ObjRelationship relationship) {
+        List<DbRelationship> dbRelationships = relationship
+                .getDbRelationships();
+        // reverse order to get the nearest to the correlated of the direct relation
+        for (int i = dbRelationships.size() - 1; i > 0; i--) {
+            DbRelationship dbRelationship = dbRelationships.get(i);
+            String subqueryTargetTableName = dbRelationship.getTargetEntityName();
+            String subqueryTargetAlias;
+            if (i == dbRelationships.size() - 1) {
+                subqueryTargetAlias = subqueryRootAlias;
+                context.append(subqueryTargetTableName).append(' ').append(
+                        subqueryTargetAlias);
+            }
+            else {
+                subqueryTargetAlias = context.getTableAlias(
+                        subqueryTargetTableName,
+                        subqueryTargetTableName);
+            }
+           
+
+            context.append(" JOIN ");
+
+            String subquerySourceTableName = dbRelationship
+                    .getSourceEntity()
+                    .getName();
+            String subquerySourceAlias = context.getTableAlias(
+                    subquerySourceTableName,
+                    subquerySourceTableName);
+
+            context.append(subquerySourceTableName).append(' ').append(subquerySourceAlias);
+
+            context.append(" ON (");
+
+            List<DbJoin> joins = dbRelationship.getJoins();
+            Iterator<DbJoin> it = joins.iterator();
+            while (it.hasNext()) {
+                DbJoin join = it.next();
+                context.append(' ').append(subqueryTargetAlias).append('.').append(
+                        join.getTargetName()).append(" = ");
+                context.append(subquerySourceAlias).append('.').append(
+                        join.getSourceName());
+                if (it.hasNext()) {
+                    context.append(" AND");
+                }
+            }
+            context.append(" )");
+            subqueryRootAlias = subquerySourceAlias;
+
+        }
+        return subqueryRootAlias;
+    }
+
     @Override
     public boolean visitAll(EJBQLExpression expression) {
         context.append(" ALL");

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLFromTranslator.java Tue Jan 12 13:31:05 2010
@@ -53,7 +53,7 @@
     public boolean visitFromItem(EJBQLFromItem expression, int finishedChildIndex) {
 
         String id = expression.getId();
-
+        
         if (lastId != null) {
             context.append(',');
             context.markCurrentPosition(EJBQLJoinAppender.makeJoinTailMarker(lastId));

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLJoinAppender.java Tue Jan 12 13:31:05 2010
@@ -99,6 +99,7 @@
         }
 
         // TODO: andrus, 4/8/2007 - support for flattened relationships
+        // 11/01/2010 support for flattened relationships is represented below 
         DbRelationship incomingDB = joinRelationships.get(0);
 
         // TODO: andrus, 1/6/2008 - move reusable join check here...
@@ -107,9 +108,10 @@
         String tableName;
 
         if (sourceEntity instanceof DbEntity) {
-           tableName = ((DbEntity) sourceEntity).getFullyQualifiedName();
-        } else {
-           tableName = sourceEntity.getName();
+            tableName = ((DbEntity) sourceEntity).getFullyQualifiedName();
+        }
+        else {
+            tableName = sourceEntity.getName();
         }
 
         String sourceAlias = context.getTableAlias(lhsId.getEntityId(), tableName);
@@ -121,47 +123,110 @@
         try {
 
             context.append(" ").append(semantics);
-            String targetAlias = appendTable(rhsId);
-            context.append(" ON (");
+            String targetAlias = "";
+            if (joinRelationships.size() > 1) {
+                // if size of relationship list greater than 1,
+                // it's a flattened relationship
+                context.append(" ");
+
+                for (int i = 1; i < joinRelationships.size(); i++) {
+                    DbRelationship dbRelationship = joinRelationships.get(i);
+
+                    String subquerySourceTableName = dbRelationship
+                            .getSourceEntity()
+                            .getName();
+                    String subquerySourceAlias = context.getTableAlias(
+                            subquerySourceTableName,
+                            subquerySourceTableName);
+
+                    String subqueryTargetTableName = dbRelationship.getTargetEntityName();
+                    
+                    String subqueryTargetAlias = "";
+                    if(i==joinRelationships.size()-1){
+                        // it's the last table alias
+                        subqueryTargetAlias = context.getTableAlias(rhsId.getEntityId(), subqueryTargetTableName);
+                    } else {
+                        subqueryTargetAlias = context.getTableAlias(
+                                subqueryTargetTableName,
+                                subqueryTargetTableName);
+                    }
+                    if (i == 1) {
+                        // first apply the joins defined in query
+                        context.append(subquerySourceTableName).append(' ').append(
+                                subquerySourceAlias);
+
+                        generateJoiningExpression(
+                                incomingDB,
+                                sourceAlias,
+                                subquerySourceAlias);
+
+                    }
+
+                    context.append(" JOIN ");
+                    context.append(subqueryTargetTableName).append(' ').append(
+                            subqueryTargetAlias);
+                    generateJoiningExpression(
+                            dbRelationship,
+                            subquerySourceAlias,
+                            subqueryTargetAlias);
+                }
 
-            Iterator<DbJoin> it = incomingDB.getJoins().iterator();
-            if (it.hasNext()) {
-                DbJoin dbJoin = it.next();
-                context
-                        .append(sourceAlias)
-                        .append('.')
-                        .append(dbJoin.getSourceName())
-                        .append(" = ")
-                        .append(targetAlias)
-                        .append('.')
-                        .append(dbJoin.getTargetName());
             }
-
-            while (it.hasNext()) {
-                context.append(", ");
-                DbJoin dbJoin = it.next();
-                context
-                        .append(sourceAlias)
-                        .append('.')
-                        .append(dbJoin.getSourceName())
-                        .append(" = ")
-                        .append(targetAlias)
-                        .append('.')
-                        .append(dbJoin.getTargetName());
+            else {
+                // non-flattened relationship
+                targetAlias = appendTable(rhsId);
+                // apply the joins defined in query
+                generateJoiningExpression(incomingDB, sourceAlias, targetAlias);
             }
 
-            context.append(")");
         }
         finally {
             if (marker != null) {
                 context.popMarker();
             }
         }
+
+    }
+
+    private void generateJoiningExpression(
+            DbRelationship incomingDB,
+            String sourceAlias,
+            String targetAlias) {
+        context.append(" ON (");
+
+        Iterator<DbJoin> it = incomingDB.getJoins().iterator();
+        if (it.hasNext()) {
+            DbJoin dbJoin = it.next();
+            context
+                    .append(sourceAlias)
+                    .append('.')
+                    .append(dbJoin.getSourceName())
+                    .append(" = ")
+                    .append(targetAlias)
+                    .append('.')
+                    .append(dbJoin.getTargetName());
+        }
+
+        while (it.hasNext()) {
+            context.append(", ");
+            DbJoin dbJoin = it.next();
+            context
+                    .append(sourceAlias)
+                    .append('.')
+                    .append(dbJoin.getSourceName())
+                    .append(" = ")
+                    .append(targetAlias)
+                    .append('.')
+                    .append(dbJoin.getTargetName());
+        }
+
+        context.append(")");
     }
 
     public String appendTable(EJBQLTableId id) {
 
-        String tableName = id.getDbEntity(context).getFullyQualifiedName();
+        DbEntity dbEntity = id.getDbEntity(context);
+        String tableName = dbEntity.getFullyQualifiedName();
         String alias;
 
         if (context.isUsingAliases()) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/jdbc/EJBQLPathTranslator.java Tue Jan 12 13:31:05 2010
@@ -120,8 +120,21 @@
 
         if (oldPath != null) {
             this.idPath = oldPath;
-            this.lastAlias = context.getTableAlias(oldPath, currentEntity
-                    .getDbEntity().getFullyQualifiedName());
+            Relationship lastRelationship = currentEntity
+                    .getRelationship(lastPathComponent);
+            if (lastRelationship != null) {
+                ObjEntity targetEntity = (ObjEntity) lastRelationship.getTargetEntity();
+
+                this.lastAlias = context.getTableAlias(fullPath, targetEntity
+                        .getDbEntity()
+                        .getFullyQualifiedName());
+            }
+            else {
+                this.lastAlias = context.getTableAlias(oldPath, currentEntity
+                        .getDbEntity()
+                        .getFullyQualifiedName());
+
+            }
         }
         else {
 
@@ -217,13 +230,15 @@
             resolveJoin(false);
 
             // TODO: andrus, 6/21/2007 - flattened support
-            DbRelationship dbRelationship = relationship.getDbRelationships().get(0);
+            // 11/01/2010 flattened support added in chooseDbRelationship
+            DbRelationship dbRelationship = chooseDbRelationship(relationship);
             DbEntity table = (DbEntity) dbRelationship.getTargetEntity();
 
             String alias = this.lastAlias != null ? lastAlias : context.getTableAlias(
                     idPath,
                     table.getFullyQualifiedName());
-
+           
+            
             Collection<DbAttribute> pks = table.getPrimaryKeys();
 
             if (pks.size() == 1) {
@@ -238,12 +253,14 @@
                 throw new EJBQLException(
                         "Multi-column PK to-many matches are not yet supported.");
             }
+            
         }
         else {
             // match FK against the target object
 
             // TODO: andrus, 6/21/2007 - flattened support
-            DbRelationship dbRelationship = relationship.getDbRelationships().get(0);
+            // 11/01/2010 flattened support added in chooseDbRelationship
+            DbRelationship dbRelationship = chooseDbRelationship(relationship);
             DbEntity table = (DbEntity) dbRelationship.getSourceEntity();
 
             String alias = this.lastAlias != null ? lastAlias : context.getTableAlias(
@@ -278,6 +295,34 @@
             }
         }
     }
+    
+    /**
+     * Checks if the object relationship is flattened and then chooses
+     * the corresponding db relationship. The last in idPath if isFlattened and
+     * the first in list otherwise.
+     * 
+     * @param relationship the object relationship
+     * 
+     * @return {@link DbRelationship}
+     */
+    protected DbRelationship chooseDbRelationship(ObjRelationship relationship) {
+
+        List<DbRelationship> dbRelationships = relationship.getDbRelationships();
+        String dbRelationshipPath = relationship.getDbRelationshipPath();
+
+        if (dbRelationshipPath.contains(".")) {
+            String dbRelName = dbRelationshipPath.substring(dbRelationshipPath
+                    .lastIndexOf(".") + 1);
+            for (DbRelationship dbR : dbRelationships) {
+                if (dbR.getName().equals(dbRelName)) {
+                    return dbR;
+                }
+
+            }
+        }
+        return relationship.getDbRelationships().get(0);
+
+    }
 
     public boolean isUsingAliases() {
         return usingAliases;

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/ejbql/parser/Compiler.java Tue Jan 12 13:31:05 2010
@@ -172,9 +172,12 @@
                     EJBQLIdentifier ident = new EJBQLIdentifier(0);
                     ident.text = pathRelationshipString;
                     
-                    resultComponents.remove(pathsInSelect.get(path).intValue());
-                    resultComponents.add(pathsInSelect.get(path).intValue(), ident);
-                    rootId = pathRelationshipString;
+                    Integer integer = pathsInSelect.get(path);
+                    if(integer!=null){
+                        resultComponents.remove(integer.intValue());
+                        resultComponents.add(pathsInSelect.get(path).intValue(), ident);
+                        rootId = pathRelationshipString;
+                    }
                 };
                 elenent++;
             }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLFlattenedRelationshipsTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLFlattenedRelationshipsTest.java?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLFlattenedRelationshipsTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextEJBQLFlattenedRelationshipsTest.java Tue Jan 12 13:31:05 2010
@@ -18,8 +18,14 @@
  ****************************************************************/
 package org.apache.cayenne.access;
 
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
 import org.apache.cayenne.Cayenne;
 import org.apache.cayenne.ObjectContext;
+import org.apache.cayenne.Persistent;
 import org.apache.cayenne.query.EJBQLQuery;
 import org.apache.cayenne.testdo.relationship.FlattenedTest1;
 import org.apache.cayenne.unit.RelationshipCase;
@@ -33,23 +39,223 @@
                 + "WHERE f MEMBER OF ft.ft3Array AND ft = :ft";
 
         ObjectContext context = createDataContext();
+        FlattenedTest1 ft = Cayenne.objectForPK(context, FlattenedTest1.class, 2);
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        query.setParameter("ft", ft);
+
+        List<?> objects = context.performQuery(query);
+        assertEquals(2, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+
+        assertTrue(ids.contains(new Integer(2)));
+        assertTrue(ids.contains(new Integer(3)));
+    }
+    
+    public void testCollectionMemberOfThetaJoinLongRelationshipSequence() throws Exception {
+        String ejbql = "SELECT f FROM FlattenedTest4 f, FlattenedTest1 ft "
+                + "WHERE f MEMBER OF ft.ft4ArrayFor1 AND ft = :ft";
+
+        ObjectContext context = createDataContext();
+        FlattenedTest1 ft = Cayenne.objectForPK(context, FlattenedTest1.class, 1);
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        query.setParameter("ft", ft);
+
+        List<?> objects = context.performQuery(query);
+        assertEquals(1, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+
+        assertTrue(ids.contains(new Integer(1)));
+        
+        
+        ft = Cayenne.objectForPK(context, FlattenedTest1.class, 2);
+        query = new EJBQLQuery(ejbql);
+        query.setParameter("ft", ft);
+
+        objects = context.performQuery(query);
+        assertEquals(0, objects.size());
+    }
+
+    public void testCollectionInnerJoin() throws Exception {
+        String ejbql = "SELECT ft FROM FlattenedTest1 ft INNER JOIN ft.ft3Array f WHERE ft = :ft";
+
+        ObjectContext context = createDataContext();
+        FlattenedTest1 ft = Cayenne.objectForPK(context, FlattenedTest1.class, 1);
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        query.setParameter("ft", ft);
+
+        List<?> objects = context.performQuery(query);
+        assertNotNull(objects);
+        assertFalse(objects.isEmpty());
+        assertEquals(1, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+
+        assertTrue(ids.contains(new Integer(1)));
+        
+    }
+
+    
+    public void testCollectionAsInnerJoin() throws Exception {
+        // this query is equivalent to the previous INNER JOIN example
+        String ejbql = "SELECT OBJECT(ft) FROM FlattenedTest1 ft, IN(ft.ft3Array) f WHERE ft = :ft";
+
+        ObjectContext context = createDataContext();
+        FlattenedTest1 ft = Cayenne.objectForPK(context, FlattenedTest1.class, 1);
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        query.setParameter("ft", ft);
+        
+        List<?> objects = context.performQuery(query);
+        assertNotNull(objects);
+        assertFalse(objects.isEmpty());
+        assertEquals(1, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+
+        assertTrue(ids.contains(new Integer(1)));
+        
+    }
+
+    public void testCollectionThetaJoin() throws Exception {
+        String ejbql = "SELECT DISTINCT ft FROM FlattenedTest1 ft , FlattenedTest3 f3 WHERE f3.toFT1 = ft";
+
+        ObjectContext context = createDataContext();
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        
+        List<?> objects = context.performQuery(query);
+        assertNotNull(objects);
+        assertFalse(objects.isEmpty());
+        assertEquals(2, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+        assertTrue(ids.contains(new Integer(1)));
+        assertTrue(ids.contains(new Integer(2)));
+
+    }
+
+    public void testCollectionIdentificationVariable() throws Exception {
+        String ejbql = "SELECT ft.ft3Array FROM FlattenedTest1 ft WHERE ft = :ft";
+
+        ObjectContext context = createDataContext();
+        FlattenedTest1 ft = Cayenne.objectForPK(context, FlattenedTest1.class, 2);
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        query.setParameter("ft", ft);
+
+        List<?> objects = context.performQuery(query);
+        assertNotNull(objects);
+        assertFalse(objects.isEmpty());
+        assertEquals(2, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+
+        assertTrue(ids.contains(new Integer(2)));
+        assertTrue(ids.contains(new Integer(3)));
+
+    }
+
+    public void testAssociationFieldSelect() throws Exception {
+        
+        String ejbql = "SELECT ft3.toFT1 FROM FlattenedTest3 ft3 WHERE ft3.toFT1 = :ft";
+        
+        ObjectContext context = createDataContext();
         FlattenedTest1 ft = Cayenne.objectForPK(context, FlattenedTest1.class, 1);
         EJBQLQuery query = new EJBQLQuery(ejbql);
         query.setParameter("ft", ft);
 
-        // TODO: andrus 2008/06/09 - this fails until we fix CAY-1069 (for correlated join
-        // case see EJBQLConditionTranslator.visitMemberOf(..)
-        // List<?> objects = context.performQuery(query);
-        // assertEquals(2, objects.size());
-        //
-        // Set<Object> ids = new HashSet<Object>();
-        // Iterator<?> it = objects.iterator();
-        // while (it.hasNext()) {
-        // Object id = Cayenne.pkForObject((Persistent) it.next());
-        // ids.add(id);
-        // }
-        //
-        // assertTrue(ids.contains(new Integer(2)));
-        // assertTrue(ids.contains(new Integer(3)));
+        List<?> objects = context.performQuery(query);
+        assertEquals(1, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+
+        assertTrue(ids.contains(new Integer(1)));
+
+    }
+    
+    public void testCollectionSubquery() throws Exception {
+        String ejbql = "SELECT ft FROM FlattenedTest1 ft "
+        + "WHERE (SELECT COUNT(f) FROM ft.ft3Array f) = 1";
+
+        ObjectContext context = createDataContext();
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        
+        // TODO fails but not because of flattened relationship,
+        // the reason is that property "ft3Array" inside the subquery 
+        // parses as unmapped
+        /*List<?> objects = context.performQuery(query);
+        assertNotNull(objects);
+        assertFalse(objects.isEmpty());
+        assertEquals(1, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+
+        assertTrue(ids.contains(new Integer(2)));*/
+        
+
+    }
+    
+    public void testCollectionSubquery1() throws Exception {
+        String ejbql = "SELECT ft FROM FlattenedTest1 ft "
+        + "WHERE (SELECT COUNT(f3) FROM FlattenedTest3 f3 WHERE f3 MEMBER OF ft.ft3Array) > 1";
+
+        ObjectContext context = createDataContext();
+        EJBQLQuery query = new EJBQLQuery(ejbql);
+        
+        List<?> objects = context.performQuery(query);
+        
+        assertNotNull(objects);
+        assertFalse(objects.isEmpty());
+        assertEquals(1, objects.size());
+
+        Set<Object> ids = new HashSet<Object>();
+        Iterator<?> it = objects.iterator();
+        while (it.hasNext()) {
+            Object id = Cayenne.pkForObject((Persistent) it.next());
+            ids.add(id);
+        }
+
+        assertTrue(ids.contains(new Integer(2)));
+
     }
+   
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesTest.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesTest.java?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesTest.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/access/DataContextFlattenedAttributesTest.java Tue Jan 12 13:31:05 2010
@@ -200,7 +200,105 @@
             assertEquals(PersistenceState.COMMITTED, painting.getPersistenceState());
         }
     }
-
+    
+    public void testSelectEJQBQLCollectionTheta() throws Exception {
+        populateTables();
+        EJBQLQuery query = new EJBQLQuery("SELECT a FROM CompoundPainting cp, Artist a "
+                + "WHERE a.artistName=cp.artistName ORDER BY a.artistName");
+               
+        //TODO fails while the support for flattened attributes would not be added
+        /*List<?> objects = context.performQuery(query);
+
+        assertNotNull(objects);
+        assertEquals(4, objects.size());
+        Iterator<?> i = objects.iterator();
+        int index=1;
+        while (i.hasNext()) {
+            Artist artist = (Artist) i.next();
+            assertEquals("artist" + index, artist.getArtistName());
+            index++;
+        }*/
+    }
+    
+    public void testSelectEJQBQLLike() throws Exception {
+        populateTables();
+        EJBQLQuery query = new EJBQLQuery(
+                "SELECT a FROM CompoundPainting a WHERE a.artistName LIKE 'artist%'");
+               
+        List<?> objects = context.performQuery(query);
+
+        assertNotNull(objects);
+        assertEquals(8, objects.size());
+        Iterator<?> i = objects.iterator();
+        int index=1;
+        while (i.hasNext()) {
+            CompoundPainting painting = (CompoundPainting) i.next();
+            assertEquals("painting" + index, painting.getPaintingTitle());
+            index++;
+        }
+    }
+    
+    public void testSelectEJQBQLBetween() throws Exception {
+        populateTables();
+        EJBQLQuery query = new EJBQLQuery(
+                "SELECT a FROM CompoundPainting a WHERE a.artistName BETWEEN 'artist1' AND 'artist4'");
+               
+        List<?> objects = context.performQuery(query);
+
+        assertNotNull(objects);
+        assertEquals(8, objects.size());
+        Iterator<?> i = objects.iterator();
+        int index=1;
+        while (i.hasNext()) {
+            CompoundPainting painting = (CompoundPainting) i.next();
+            assertEquals("painting" + index, painting.getPaintingTitle());
+            index++;
+        }
+    }
+    
+    public void testSelectEJQBQLSubquery() throws Exception {
+        populateTables();
+        EJBQLQuery query = new EJBQLQuery(
+                "SELECT g FROM Gallery g WHERE " +
+                "(SELECT COUNT(cp) FROM CompoundPainting cp WHERE g.galleryName=cp.galleryName) = 4");
+                
+               
+        // TODO fails while the support for flattened attributes would not be added
+        /*List<?> objects = context.performQuery(query);
+
+        assertNotNull(objects);
+        assertEquals(2, objects.size());
+        Iterator<?> i = objects.iterator();
+        int index=1;
+        while (i.hasNext()) {
+            Gallery gallery = (Gallery) i.next();
+            assertEquals("gallery" + index, gallery.getGalleryName());
+            index++;
+        }*/
+    }
+    
+    public void testSelectEJQBQLHaving() throws Exception {
+        populateTables();
+        EJBQLQuery query = new EJBQLQuery(
+                "SELECT cp.artistName FROM CompoundPainting cp " +
+                "GROUP BY cp.artistName " +
+                "HAVING cp.artistName IN ('artist1')");
+                
+               
+        // TODO fails while the support for flattened attributes would not be added
+        /* List<?> objects = context.performQuery(query);
+
+        assertNotNull(objects);
+        assertEquals(2, objects.size());
+        Iterator<?> i = objects.iterator();
+        int index=1;
+        while (i.hasNext()) {
+            CompoundPainting painting = (CompoundPainting) i.next();
+            assertEquals("painting" + index, painting.getPaintingTitle());
+            index++;
+        }*/
+    }
+    
     public void testInsert() {
         CompoundPainting o1 = context.newObject(CompoundPainting.class);
         o1.setArtistName("A1");

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/FlattenedTest4.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/FlattenedTest4.java?rev=898317&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/FlattenedTest4.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/FlattenedTest4.java Tue Jan 12 13:31:05 2010
@@ -0,0 +1,7 @@
+package org.apache.cayenne.testdo.relationship;
+
+import org.apache.cayenne.testdo.relationship.auto._FlattenedTest4;
+
+public class FlattenedTest4 extends _FlattenedTest4 {
+
+}

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/Relationships.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/Relationships.java?rev=898317&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/Relationships.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/Relationships.java Tue Jan 12 13:31:05 2010
@@ -0,0 +1,18 @@
+package org.apache.cayenne.testdo.relationship;
+
+import org.apache.cayenne.testdo.relationship.auto._Relationships;
+
+public class Relationships extends _Relationships {
+
+    private static Relationships instance;
+
+    private Relationships() {}
+
+    public static Relationships getInstance() {
+        if(instance == null) {
+            instance = new Relationships();
+        }
+
+        return instance;
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest1.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest1.java?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest1.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest1.java Tue Jan 12 13:31:05 2010
@@ -2,19 +2,25 @@
 
 import java.util.List;
 
-/** Class _FlattenedTest1 was generated by Cayenne.
-  * It is probably a good idea to avoid changing this class manually, 
-  * since it may be overwritten next time code is regenerated. 
-  * If you need to make any customizations, please use subclass. 
-  */
-public class _FlattenedTest1 extends org.apache.cayenne.CayenneDataObject {
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.relationship.FlattenedTest2;
+import org.apache.cayenne.testdo.relationship.FlattenedTest3;
+import org.apache.cayenne.testdo.relationship.FlattenedTest4;
+
+/**
+ * Class _FlattenedTest1 was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _FlattenedTest1 extends CayenneDataObject {
 
     public static final String NAME_PROPERTY = "name";
     public static final String FT2ARRAY_PROPERTY = "ft2Array";
     public static final String FT3ARRAY_PROPERTY = "ft3Array";
     public static final String FT3OVER_COMPLEX_PROPERTY = "ft3OverComplex";
+    public static final String FT4ARRAY_FOR1_PROPERTY = "ft4ArrayFor1";
 
-    public static final String FT1_ID_PK_COLUMN = "FT1_ID";
 
     public void setName(String name) {
         writeProperty("name", name);
@@ -22,39 +28,41 @@
     public String getName() {
         return (String)readProperty("name");
     }
-    
-    
-    public void addToFt2Array(org.apache.cayenne.testdo.relationship.FlattenedTest2 obj) {
+
+    public void addToFt2Array(FlattenedTest2 obj) {
         addToManyTarget("ft2Array", obj, true);
     }
-    public void removeFromFt2Array(org.apache.cayenne.testdo.relationship.FlattenedTest2 obj) {
+    public void removeFromFt2Array(FlattenedTest2 obj) {
         removeToManyTarget("ft2Array", obj, true);
     }
-    public List getFt2Array() {
-        return (List)readProperty("ft2Array");
+    @SuppressWarnings("unchecked")
+    public List<FlattenedTest2> getFt2Array() {
+        return (List<FlattenedTest2>)readProperty("ft2Array");
+    }
+
+
+    @SuppressWarnings("unchecked")
+    public List<FlattenedTest3> getFt3Array() {
+        return (List<FlattenedTest3>)readProperty("ft3Array");
     }
-    
-    
-    public void addToFt3Array(org.apache.cayenne.testdo.relationship.FlattenedTest3 obj) {
-        addToManyTarget("ft3Array", obj, true);
-    }
-    public void removeFromFt3Array(org.apache.cayenne.testdo.relationship.FlattenedTest3 obj) {
-        removeToManyTarget("ft3Array", obj, true);
-    }
-    public List getFt3Array() {
-        return (List)readProperty("ft3Array");
-    }
-    
-    
-    public void addToFt3OverComplex(org.apache.cayenne.testdo.relationship.FlattenedTest3 obj) {
+
+
+    public void addToFt3OverComplex(FlattenedTest3 obj) {
         addToManyTarget("ft3OverComplex", obj, true);
     }
-    public void removeFromFt3OverComplex(org.apache.cayenne.testdo.relationship.FlattenedTest3 obj) {
+    public void removeFromFt3OverComplex(FlattenedTest3 obj) {
         removeToManyTarget("ft3OverComplex", obj, true);
     }
-    public List getFt3OverComplex() {
-        return (List)readProperty("ft3OverComplex");
+    @SuppressWarnings("unchecked")
+    public List<FlattenedTest3> getFt3OverComplex() {
+        return (List<FlattenedTest3>)readProperty("ft3OverComplex");
+    }
+
+
+    @SuppressWarnings("unchecked")
+    public List<FlattenedTest4> getFt4ArrayFor1() {
+        return (List<FlattenedTest4>)readProperty("ft4ArrayFor1");
     }
-    
-    
+
+
 }

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest4.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest4.java?rev=898317&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest4.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_FlattenedTest4.java Tue Jan 12 13:31:05 2010
@@ -0,0 +1,34 @@
+package org.apache.cayenne.testdo.relationship.auto;
+
+import org.apache.cayenne.CayenneDataObject;
+import org.apache.cayenne.testdo.relationship.FlattenedTest3;
+
+/**
+ * Class _FlattenedTest4 was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public abstract class _FlattenedTest4 extends CayenneDataObject {
+
+    public static final String NAME_PROPERTY = "name";
+    public static final String TO_FT3_PROPERTY = "toFT3";
+
+
+    public void setName(String name) {
+        writeProperty("name", name);
+    }
+    public String getName() {
+        return (String)readProperty("name");
+    }
+
+    public void setToFT3(FlattenedTest3 toFT3) {
+        setToOneTarget("toFT3", toFT3, true);
+    }
+
+    public FlattenedTest3 getToFT3() {
+        return (FlattenedTest3)readProperty("toFT3");
+    }
+
+
+}

Added: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_Relationships.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_Relationships.java?rev=898317&view=auto
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_Relationships.java (added)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/testdo/relationship/auto/_Relationships.java Tue Jan 12 13:31:05 2010
@@ -0,0 +1,12 @@
+package org.apache.cayenne.testdo.relationship.auto;
+
+
+
+/**
+ * This class was generated by Cayenne.
+ * It is probably a good idea to avoid changing this class manually,
+ * since it may be overwritten next time code is regenerated.
+ * If you need to make any customizations, please use subclass.
+ */
+public class _Relationships {
+}
\ No newline at end of file

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/access.DataContextEJBQLFlattenedRelationshipsTest.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/access.DataContextEJBQLFlattenedRelationshipsTest.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/access.DataContextEJBQLFlattenedRelationshipsTest.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/dml/access.DataContextEJBQLFlattenedRelationshipsTest.xml Tue Jan 12 13:31:05 2010
@@ -45,6 +45,12 @@
 		insert into FLATTENED_TEST_3 (FT3_ID, FT2_ID, NAME) values (3, 2, 'ft3-b')
 		</value></constructor-arg>
 	</bean>
+	<bean id="FT41" class="org.apache.cayenne.unit.util.UpdatingSQLTemplate">
+		<constructor-arg type="java.lang.Class"><value>org.apache.cayenne.testdo.relationship.FlattenedTest4</value></constructor-arg>
+		<constructor-arg><value>
+		insert into FLATTENED_TEST_4 (FT4_ID, FT3_ID, NAME) values (1, 1, 'ft4')
+		</value></constructor-arg>
+	</bean>
 
 	<bean id="testCollectionMemberOfThetaJoin" class="java.util.ArrayList">
 		<constructor-arg>
@@ -56,6 +62,7 @@
 				<ref bean="FT31"/>
 				<ref bean="FT32"/>
 				<ref bean="FT33"/>
+				<ref bean="FT41"/>
 			</list>
 		</constructor-arg>
 	</bean>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/embeddable.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/embeddable.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/embeddable.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/embeddable.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.embeddable"/>
 	<embeddable className="org.apache.cayenne.testdo.embeddable.Embeddable1">
 		<embeddable-attribute name="embedded10" type="java.lang.String" db-attribute-name="EMBEDDED10"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/generic.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/generic.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/generic.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/generic.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.generic"/>
 	<db-entity name="GENERIC1">
 		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/inheritance.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/inheritance.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/inheritance.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/inheritance.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.horizontalinherit"/>
 	<db-entity name="INHERITANCE_SUB_ENTITY1">
 		<db-attribute name="ID" type="BIGINT" isPrimaryKey="true" isMandatory="true"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/locking.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/locking.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/locking.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/locking.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.locking"/>
 	<db-entity name="DATE_LOCKING_TEST">
 		<db-attribute name="DATE_LOCK" type="DATE"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db1.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.db1"/>
 	<db-entity name="CROSSDB_M1E1">
 		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db2.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db2.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db2.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/map-db2.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.db2"/>
 	<db-entity name="CROSSDB_M2E1">
 		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/multi-tier.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.mt"/>
 	<property name="clientSupported" value="true"/>
 	<property name="defaultClientPackage" value="org.apache.cayenne.testdo.mt"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/people.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.inherit"/>
 	<db-entity name="ADDRESS">
 		<db-attribute name="ADDRESS_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/qualified.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/qualified.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/qualified.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/qualified.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.qualified"/>
 	<db-entity name="QUALIFIED1">
 		<db-attribute name="DELETED" type="BOOLEAN"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/quotemap.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/quotemap.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/quotemap.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/quotemap.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.quotemap"/>
 	<property name="quoteSqlIdentifiers" value="true"/>
 	<db-entity name="QUOTE_ADRESS">

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/relationships.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/relationships.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/relationships.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/relationships.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.cayenne.testdo.relationship"/>
 	<db-entity name="CLOB_DETAIL">
 		<db-attribute name="CLOB_DETAIL_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
@@ -73,6 +73,11 @@
 		<db-attribute name="FT3_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 		<db-attribute name="NAME" type="VARCHAR" isMandatory="true" length="100"/>
 	</db-entity>
+	<db-entity name="FLATTENED_TEST_4">
+		<db-attribute name="FT3_ID" type="INTEGER"/>
+		<db-attribute name="FT4_ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
+		<db-attribute name="NAME" type="VARCHAR" isMandatory="true" length="100"/>
+	</db-entity>
 	<db-entity name="ID_MAP_TO_MANY">
 		<db-attribute name="ID" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 	</db-entity>
@@ -164,6 +169,9 @@
 	<obj-entity name="FlattenedTest3" className="org.apache.cayenne.testdo.relationship.FlattenedTest3" dbEntityName="FLATTENED_TEST_3">
 		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
 	</obj-entity>
+	<obj-entity name="FlattenedTest4" className="org.apache.cayenne.testdo.relationship.FlattenedTest4" dbEntityName="FLATTENED_TEST_4">
+		<obj-attribute name="name" type="java.lang.String" db-attribute-path="NAME"/>
+	</obj-entity>
 	<obj-entity name="IdMapToMany" className="org.apache.cayenne.testdo.relationship.IdMapToMany" dbEntityName="ID_MAP_TO_MANY">
 	</obj-entity>
 	<obj-entity name="IdMapToManyTarget" className="org.apache.cayenne.testdo.relationship.IdMapToManyTarget" dbEntityName="ID_MAP_TO_MANY_TARGET">
@@ -276,9 +284,15 @@
 	<db-relationship name="complexJoins" source="FLATTENED_TEST_3" target="COMPLEX_JOIN" toMany="true">
 		<db-attribute-pair source="FT3_ID" target="FT3_FK"/>
 	</db-relationship>
+	<db-relationship name="ft4Array" source="FLATTENED_TEST_3" target="FLATTENED_TEST_4" toMany="true">
+		<db-attribute-pair source="FT3_ID" target="FT3_ID"/>
+	</db-relationship>
 	<db-relationship name="toFT2" source="FLATTENED_TEST_3" target="FLATTENED_TEST_2" toMany="false">
 		<db-attribute-pair source="FT2_ID" target="FT2_ID"/>
 	</db-relationship>
+	<db-relationship name="toFT3" source="FLATTENED_TEST_4" target="FLATTENED_TEST_3" toMany="false">
+		<db-attribute-pair source="FT3_ID" target="FT3_ID"/>
+	</db-relationship>
 	<db-relationship name="targets" source="ID_MAP_TO_MANY" target="ID_MAP_TO_MANY_TARGET" toMany="true">
 		<db-attribute-pair source="ID" target="MAP_TO_MANY_ID"/>
 	</db-relationship>
@@ -352,10 +366,13 @@
 	<obj-relationship name="ft2Array" source="FlattenedTest1" target="FlattenedTest2" db-relationship-path="ft2Array"/>
 	<obj-relationship name="ft3Array" source="FlattenedTest1" target="FlattenedTest3" db-relationship-path="ft2Array.ft3Array"/>
 	<obj-relationship name="ft3OverComplex" source="FlattenedTest1" target="FlattenedTest3" db-relationship-path="complexJoins.toFT3"/>
+	<obj-relationship name="ft4ArrayFor1" source="FlattenedTest1" target="FlattenedTest4" db-relationship-path="ft2Array.ft3Array.ft4Array"/>
 	<obj-relationship name="ft3Array" source="FlattenedTest2" target="FlattenedTest3" db-relationship-path="ft3Array"/>
 	<obj-relationship name="toFT1" source="FlattenedTest2" target="FlattenedTest1" db-relationship-path="toFT1"/>
+	<obj-relationship name="ft4Array" source="FlattenedTest3" target="FlattenedTest4" db-relationship-path="ft4Array"/>
 	<obj-relationship name="toFT1" source="FlattenedTest3" target="FlattenedTest1" db-relationship-path="toFT2.toFT1"/>
 	<obj-relationship name="toFT2" source="FlattenedTest3" target="FlattenedTest2" db-relationship-path="toFT2"/>
+	<obj-relationship name="toFT3" source="FlattenedTest4" target="FlattenedTest3" db-relationship-path="toFT3"/>
 	<obj-relationship name="targets" source="IdMapToMany" target="IdMapToManyTarget" collection-type="java.util.Map" db-relationship-path="targets"/>
 	<obj-relationship name="mapToMany" source="IdMapToManyTarget" target="IdMapToMany" db-relationship-path="mapToMany"/>
 	<obj-relationship name="targets" source="MapToMany" target="MapToManyTarget" collection-type="java.util.Map" map-key="name" db-relationship-path="targets"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/sus-map.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/sus-map.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/sus-map.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/sus-map.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<db-entity name="SUS1">
 		<db-attribute name="id" type="INTEGER" isPrimaryKey="true" isMandatory="true"/>
 		<db-attribute name="strNoMandatory" type="VARCHAR" length="200"/>

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/testmap.map.xml
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/testmap.map.xml?rev=898317&r1=898316&r2=898317&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/testmap.map.xml (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/resources/testmap.map.xml Tue Jan 12 13:31:05 2010
@@ -1,8 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <data-map xmlns="http://cayenne.apache.org/schema/3.0/modelMap"
-  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-  xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
-  project-version="3.0.0.1">
+	 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	 xsi:schemaLocation="http://cayenne.apache.org/schema/3.0/modelMap http://cayenne.apache.org/schema/3.0/modelMap.xsd"
+	>
 	<property name="defaultPackage" value="org.apache.art"/>
 	<property name="defaultSuperclass" value="org.apache.cayenne.CayenneDataObject"/>
 	<property name="clientSupported" value="true"/>
@@ -633,6 +633,10 @@
 	<query name="QueryWithSharedCache" factory="org.apache.cayenne.map.SelectQueryBuilder" root="obj-entity" root-name="Artist">
 		<property name="cayenne.GenericSelectQuery.cacheStrategy" value="SHARED_CACHE"/>
 	</query>
+	<query name="SelectDateTest" factory="org.apache.cayenne.map.SQLTemplateBuilder" root="data-map" root-name="testmap">
+		<property name="cayenne.GenericSelectQuery.fetchingDataRows" value="true"/>
+		<sql><![CDATA[SELECT * FROM DATE_TEST]]></sql>
+	</query>
 	<query name="SelectTestLower" factory="org.apache.cayenne.map.SQLTemplateBuilder" root="data-map" root-name="testmap">
 		<property name="cayenne.GenericSelectQuery.fetchingDataRows" value="true"/>
 		<property name="cayenne.SQLTemplate.columnNameCapitalization" value="LOWER"/>
@@ -643,10 +647,6 @@
 		<property name="cayenne.SQLTemplate.columnNameCapitalization" value="UPPER"/>
 		<sql><![CDATA[select * from ARTIST]]></sql>
 	</query>
-	<query name="SelectDateTest" factory="org.apache.cayenne.map.SQLTemplateBuilder" root="data-map" root-name="testmap">
-		<property name="cayenne.GenericSelectQuery.fetchingDataRows" value="true"/>
-		<sql><![CDATA[SELECT * FROM DATE_TEST]]></sql>
-	</query>
 	<entity-listener class="org.apache.art.EntityListenerDataMap">
 		<post-add method-name="prePersistDataMap1"/>
 		<post-add method-name="prePersistDataMap2"/>