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 2009/10/15 20:03:47 UTC

svn commit: r825594 - in /cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src: main/java/org/apache/cayenne/access/ main/java/org/apache/cayenne/dba/db2/ main/java/org/apache/cayenne/dba/derby/ main/java/org/apache/cayenne/dba/h2/ main/java/org...

Author: aadamchik
Date: Thu Oct 15 18:03:46 2009
New Revision: 825594

URL: http://svn.apache.org/viewvc?rev=825594&view=rev
Log:
CAY-1293 Beta 1 Test Failures

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/h2/H2MergerFactory.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLMergerFactory.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectTranslator.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseMergerFactory.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java
    cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/access/FlattenedArcKey.java Thu Oct 15 18:03:46 2009
@@ -165,7 +165,9 @@
 
         int i = pk.size();
         for (DbAttribute attribute : joinEntity.getPrimaryKeys()) {
+            sql.append("#result('");
             sql.append(attribute.getName());
+            sql.append("')");
             if (--i > 0) {
                 sql.append(", ");
             }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/db2/DB2Adapter.java Thu Oct 15 18:03:46 2009
@@ -20,6 +20,8 @@
 package org.apache.cayenne.dba.db2;
 
 import java.sql.PreparedStatement;
+import java.sql.SQLException;
+import java.sql.Types;
 import java.util.Iterator;
 
 import org.apache.cayenne.CayenneRuntimeException;
@@ -37,28 +39,25 @@
 import org.apache.cayenne.map.DbEntity;
 import org.apache.cayenne.merge.MergerFactory;
 
-
 /**
  * DbAdapter implementation for the <a href="http://www.ibm.com/db2/"> DB2 RDBMS </a>.
  * Sample connection settings to use with DB2 are shown below:
  * 
  * <pre>
- *  
+ * 
  *       test-db2.cayenne.adapter = org.apache.cayenne.dba.db2.DB2Adapter
  *       test-db2.jdbc.username = test
  *       test-db2.jdbc.password = secret
  *       test-db2.jdbc.url = jdbc:db2://servername:50000/databasename
  *       test-db2.jdbc.driver = com.ibm.db2.jcc.DB2Driver
- *   
- * </pre>
  * 
+ * </pre>
  */
 public class DB2Adapter extends JdbcAdapter {
 
-    
     /**
-     * Creates a DB2 specific PK Generator.    
-     */   
+     * Creates a DB2 specific PK Generator.
+     */
     protected PkGenerator createPkGenerator() {
         return new DB2PkGenerator(this);
     }
@@ -83,16 +82,17 @@
     @Override
     public String createTable(DbEntity ent) {
         boolean status;
-        if(ent.getDataMap()!=null && ent.getDataMap().isQuotingSQLIdentifiers()){ 
-            status= true;
-        } else {
+        if (ent.getDataMap() != null && ent.getDataMap().isQuotingSQLIdentifiers()) {
+            status = true;
+        }
+        else {
             status = false;
         }
         QuotingStrategy context = getQuotingStrategy(status);
-        
+
         StringBuilder buf = new StringBuilder();
         buf.append("CREATE TABLE ");
-        buf.append(context.quoteFullyQualifiedName(ent)); 
+        buf.append(context.quoteFullyQualifiedName(ent));
 
         buf.append(" (");
 
@@ -206,8 +206,26 @@
             }
         }
     }
+
     @Override
     public MergerFactory mergerFactory() {
         return new DB2MergerFactory();
     }
+
+    @Override
+    public void bindParameter(
+            PreparedStatement statement,
+            Object object,
+            int pos,
+            int sqlType,
+            int precision) throws SQLException, Exception {
+
+        if (object == null && (sqlType == 0 || sqlType == Types.BOOLEAN)) {
+            statement.setNull(pos, Types.VARCHAR);
+        }
+        else {
+            super.bindParameter(statement, object, pos, sqlType, precision);
+        }
+    }
+
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/derby/DerbyAdapter.java Thu Oct 15 18:03:46 2009
@@ -20,6 +20,8 @@
 
 package org.apache.cayenne.dba.derby;
 
+import java.sql.PreparedStatement;
+import java.sql.SQLException;
 import java.sql.Types;
 
 import org.apache.cayenne.CayenneRuntimeException;
@@ -191,5 +193,22 @@
     public MergerFactory mergerFactory() {
         return new DerbyMergerFactory();
     }
+    
+    @Override
+    public void bindParameter(
+        PreparedStatement statement,
+        Object object,
+        int pos,
+        int sqlType,
+        int precision)
+        throws SQLException, Exception {
+
+        if (object == null && sqlType==0) {
+            statement.setNull(pos, Types.VARCHAR);
+        }
+        else {
+            super.bindParameter(statement, object, pos, sqlType, precision);
+        }
+    }
 
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/h2/H2MergerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/h2/H2MergerFactory.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/h2/H2MergerFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/h2/H2MergerFactory.java Thu Oct 15 18:03:46 2009
@@ -19,6 +19,7 @@
 
 package org.apache.cayenne.dba.h2;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
@@ -30,6 +31,7 @@
 import org.apache.cayenne.merge.MergerToken;
 import org.apache.cayenne.merge.SetAllowNullToDb;
 import org.apache.cayenne.merge.SetColumnTypeToDb;
+import org.apache.cayenne.merge.SetPrimaryKeyToDb;
 
 /**
  * @since 3.0
@@ -73,4 +75,29 @@
 
         };
     }
+    
+    @Override
+    public MergerToken createSetPrimaryKeyToDb(
+            DbEntity entity,
+            Collection<DbAttribute> primaryKeyOriginal,
+            Collection<DbAttribute> primaryKeyNew,
+            String detectedPrimaryKeyName) {
+        return new SetPrimaryKeyToDb(
+                entity,
+                primaryKeyOriginal,
+                primaryKeyNew,
+                detectedPrimaryKeyName) {
+
+            @Override
+            protected void appendDropOriginalPrimaryKeySQL(
+                    DbAdapter adapter,
+                    List<String> sqls) {
+                sqls.add("ALTER TABLE "
+                        + getQuotingStrategy(adapter)
+                                .quoteFullyQualifiedName(getEntity())
+                        + " DROP PRIMARY KEY");
+            }
+
+        };
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLAdapter.java Thu Oct 15 18:03:46 2009
@@ -45,8 +45,8 @@
 import org.apache.cayenne.query.SQLAction;
 
 /**
- * DbAdapter implementation for <a href="http://www.mysql.com">MySQL RDBMS</a>.
- * <h3>Foreign Key Constraint Handling</h3>
+ * DbAdapter implementation for <a href="http://www.mysql.com">MySQL RDBMS</a>. <h3>
+ * Foreign Key Constraint Handling</h3>
  * <p>
  * Foreign key constraints are supported by InnoDB engine and NOT supported by MyISAM
  * engine. This adapter by default assumes MyISAM, so
@@ -54,41 +54,40 @@
  * Users can manually change this by calling <em>setSupportsFkConstraints(true)</em> or
  * better by using an {@link org.apache.cayenne.dba.AutoAdapter}, i.e. not entering the
  * adapter name at all for the DataNode, letting Cayenne guess it in runtime. In the later
- * case Cayenne will check the <em>table_type</em> MySQL variable to detect whether
- * InnoDB is the default, and configure the adapter accordingly.
+ * case Cayenne will check the <em>table_type</em> MySQL variable to detect whether InnoDB
+ * is the default, and configure the adapter accordingly.
  * <h3>Sample Connection Settings</h3>
  * <ul>
  * <li>Adapter name: org.apache.cayenne.dba.mysql.MySQLAdapter</li>
  * <li>DB URL: jdbc:mysql://serverhostname/dbname</li>
  * <li>Driver Class: com.mysql.jdbc.Driver</li>
  * </ul>
- * 
  */
 public class MySQLAdapter extends JdbcAdapter {
-    
+
     final static String DEFAULT_STORAGE_ENGINE = "InnoDB";
     final static String MYSQL_QUOTE_SQL_IDENTIFIERS_CHAR_START = "`";
     final static String MYSQL_QUOTE_SQL_IDENTIFIERS_CHAR_END = "`";
 
     protected String storageEngine;
- 
+
     public MySQLAdapter() {
 
         // init defaults
         this.storageEngine = DEFAULT_STORAGE_ENGINE;
-        
+
         setSupportsFkConstraints(true);
         setSupportsUniqueConstraints(true);
-        setSupportsGeneratedKeys(true); 
-        initIdentifiersQuotes(); 
+        setSupportsGeneratedKeys(true);
+        initIdentifiersQuotes();
     }
- 
+
     @Override
-    public void initIdentifiersQuotes(){
+    public void initIdentifiersQuotes() {
         this.identifiersStartQuote = MYSQL_QUOTE_SQL_IDENTIFIERS_CHAR_START;
         this.identifiersEndQuote = MYSQL_QUOTE_SQL_IDENTIFIERS_CHAR_END;
     }
-    
+
     /**
      * Uses special action builder to create the right action.
      * 
@@ -105,9 +104,11 @@
      */
     @Override
     public String dropTable(DbEntity table) {
-        QuotingStrategy context = getQuotingStrategy(table.getDataMap().isQuotingSQLIdentifiers()); 
+        QuotingStrategy context = getQuotingStrategy(table
+                .getDataMap()
+                .isQuotingSQLIdentifiers());
         StringBuffer buf = new StringBuffer("DROP TABLE IF EXISTS ");
-        buf.append(context.quoteFullyQualifiedName(table));            
+        buf.append(context.quoteFullyQualifiedName(table));
         buf.append(" CASCADE");
         return buf.toString();
     }
@@ -120,9 +121,11 @@
         // note that CASCADE is a noop as of MySQL 5.0, so we have to use FK checks
         // statement
         StringBuffer buf = new StringBuffer();
-        QuotingStrategy context = getQuotingStrategy(table.getDataMap().isQuotingSQLIdentifiers());
-        buf.append(context.quoteFullyQualifiedName(table));            
-        
+        QuotingStrategy context = getQuotingStrategy(table
+                .getDataMap()
+                .isQuotingSQLIdentifiers());
+        buf.append(context.quoteFullyQualifiedName(table));
+
         return Arrays.asList("SET FOREIGN_KEY_CHECKS=0", "DROP TABLE IF EXISTS "
                 + buf.toString()
                 + " CASCADE", "SET FOREIGN_KEY_CHECKS=1");
@@ -225,7 +228,7 @@
     @Override
     public String createTable(DbEntity entity) {
         String ddlSQL = super.createTable(entity);
-        
+
         if (storageEngine != null) {
             ddlSQL += " ENGINE=" + storageEngine;
         }
@@ -244,11 +247,12 @@
     @Override
     protected void createTableAppendPKClause(StringBuffer sqlBuffer, DbEntity entity) {
         boolean status;
-            if(entity.getDataMap()!=null && entity.getDataMap().isQuotingSQLIdentifiers()){ 
-                status= true;
-            } else {
-                status = false;
-            }
+        if (entity.getDataMap() != null && entity.getDataMap().isQuotingSQLIdentifiers()) {
+            status = true;
+        }
+        else {
+            status = false;
+        }
         QuotingStrategy context = getQuotingStrategy(status);
         // must move generated to the front...
         List<DbAttribute> pkList = new ArrayList<DbAttribute>(entity.getPrimaryKeys());
@@ -291,7 +295,8 @@
 
                     while (columns.hasNext()) {
                         column = columns.next();
-                        sqlBuffer.append(", ").append( context.quoteString(column.getName()));
+                        sqlBuffer.append(", ").append(
+                                context.quoteString(column.getName()));
                     }
 
                     sqlBuffer.append(")");

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLMergerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLMergerFactory.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLMergerFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/mysql/MySQLMergerFactory.java Thu Oct 15 18:03:46 2009
@@ -18,6 +18,7 @@
  ****************************************************************/
 package org.apache.cayenne.dba.mysql;
 
+import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
@@ -32,6 +33,7 @@
 import org.apache.cayenne.merge.SetAllowNullToDb;
 import org.apache.cayenne.merge.SetColumnTypeToDb;
 import org.apache.cayenne.merge.SetNotNullToDb;
+import org.apache.cayenne.merge.SetPrimaryKeyToDb;
 
 public class MySQLMergerFactory extends MergerFactory {
 
@@ -138,4 +140,29 @@
             }
         };
     }
+    
+    @Override
+    public MergerToken createSetPrimaryKeyToDb(
+            DbEntity entity,
+            Collection<DbAttribute> primaryKeyOriginal,
+            Collection<DbAttribute> primaryKeyNew,
+            String detectedPrimaryKeyName) {
+        return new SetPrimaryKeyToDb(
+                entity,
+                primaryKeyOriginal,
+                primaryKeyNew,
+                detectedPrimaryKeyName) {
+
+            @Override
+            protected void appendDropOriginalPrimaryKeySQL(
+                    DbAdapter adapter,
+                    List<String> sqls) {
+                sqls.add("ALTER TABLE "
+                        + getQuotingStrategy(adapter)
+                                .quoteFullyQualifiedName(getEntity())
+                        + " DROP PRIMARY KEY");
+            }
+
+        };
+    }
 }

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleQualifierTranslator.java Thu Oct 15 18:03:46 2009
@@ -1,99 +1,111 @@
-/*****************************************************************
- *   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.dba.oracle;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.cayenne.access.trans.QueryAssembler;
-import org.apache.cayenne.access.trans.TrimmingQualifierTranslator;
-import org.apache.cayenne.exp.Expression;
-import org.apache.cayenne.exp.parser.ASTIn;
-import org.apache.cayenne.exp.parser.ASTList;
-import org.apache.cayenne.exp.parser.ASTNegate;
-import org.apache.cayenne.exp.parser.ASTNotIn;
-import org.apache.cayenne.exp.parser.ASTPath;
-import org.apache.commons.collections.Transformer;
-
-/**
- * Oracle qualifier translator. In particular, trims INs with more than 1000 elements 
- * to an OR-set of INs with <= 1000 elements 
- */
-public class OracleQualifierTranslator extends TrimmingQualifierTranslator {
-
-    public OracleQualifierTranslator(QueryAssembler queryAssembler) {
-        super(queryAssembler, OracleAdapter.TRIM_FUNCTION);
-    }
-
-    @Override
-    protected void doAppendPart(Expression rootNode) throws IOException {
-        if (rootNode == null) {
-            return;
-        }
-        
-        //trimming INs
-        rootNode = rootNode.transform(new INTrimmer());
-        
-        rootNode.traverse(this);
-    }
-    
-    public static class INTrimmer implements Transformer {
-        public Expression trimmedInExpression(Expression exp, int maxInSize) {
-            Expression list = (Expression) exp.getOperand(1);
-            Object[] objects = (Object[]) list.evaluate(null);
-            
-            if (objects.length <= maxInSize) {
-                return exp;
-            }
-            
-            Expression trimmed = trimmedInExpression((ASTPath) exp.getOperand(0), objects, maxInSize);
-            if (exp instanceof ASTNotIn) {
-                return new ASTNegate(trimmed);
-            }
-            return trimmed;
-        }
-        
-        Expression trimmedInExpression(ASTPath path, Object[] values, int maxInSize) {
-            Expression res = null;
-            
-            List<Object> in = new ArrayList<Object>(maxInSize);
-            for (Object v : values) {
-                in.add(v);
-                if (in.size() == maxInSize) {
-                    Expression inExp = new ASTIn(path, new ASTList(in));
-                    res = res != null ? res.orExp(inExp) : inExp;
-                    in = new ArrayList<Object>(maxInSize);
-                }
-            }
-            if (in.size() > 0) {
-                Expression inExp = new ASTIn(path, new ASTList(in));
-                res = res != null ? res.orExp(inExp) : inExp;
-            }
-            return res;
-        }
-
-        public Object transform(Object input) {
-            if (input instanceof ASTIn || input instanceof ASTNotIn) {
-                return trimmedInExpression((Expression) input, 1000);
-            }
-            return input;
-        }
-    }
-}
+/*****************************************************************
+ *   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.dba.oracle;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cayenne.access.trans.QueryAssembler;
+import org.apache.cayenne.access.trans.TrimmingQualifierTranslator;
+import org.apache.cayenne.exp.Expression;
+import org.apache.cayenne.exp.parser.ASTIn;
+import org.apache.cayenne.exp.parser.ASTList;
+import org.apache.cayenne.exp.parser.ASTNegate;
+import org.apache.cayenne.exp.parser.ASTNot;
+import org.apache.cayenne.exp.parser.ASTNotIn;
+import org.apache.cayenne.exp.parser.ASTPath;
+import org.apache.commons.collections.Transformer;
+
+/**
+ * Oracle qualifier translator. In particular, trims INs with more than 1000 elements 
+ * to an OR-set of INs with <= 1000 elements 
+ */
+public class OracleQualifierTranslator extends TrimmingQualifierTranslator {
+
+    public OracleQualifierTranslator(QueryAssembler queryAssembler) {
+        super(queryAssembler, OracleAdapter.TRIM_FUNCTION);
+    }
+
+    @Override
+    protected void doAppendPart(Expression rootNode) throws IOException {
+        if (rootNode == null) {
+            return;
+        }
+
+        boolean isNot = false;
+        if (rootNode instanceof ASTNot) {
+            if (rootNode.getOperandCount() == 1) {
+                rootNode = ((Expression) rootNode.getOperand(0));
+                isNot = true;
+            }
+        }
+
+        rootNode = rootNode.transform(new INTrimmer());
+
+        if (isNot) {
+            rootNode = rootNode.notExp();
+        }
+
+        rootNode.traverse(this);
+    }
+    
+    public static class INTrimmer implements Transformer {
+        public Expression trimmedInExpression(Expression exp, int maxInSize) {
+            Expression list = (Expression) exp.getOperand(1);
+            Object[] objects = (Object[]) list.evaluate(null);
+            
+            if (objects.length <= maxInSize) {
+                return exp;
+            }
+            
+            Expression trimmed = trimmedInExpression((ASTPath) exp.getOperand(0), objects, maxInSize);
+            if (exp instanceof ASTNotIn) {
+                return new ASTNegate(trimmed);
+            }
+            return trimmed;
+        }
+        
+        Expression trimmedInExpression(ASTPath path, Object[] values, int maxInSize) {
+            Expression res = null;
+            
+            List<Object> in = new ArrayList<Object>(maxInSize);
+            for (Object v : values) {
+                in.add(v);
+                if (in.size() == maxInSize) {
+                    Expression inExp = new ASTIn(path, new ASTList(in));
+                    res = res != null ? res.orExp(inExp) : inExp;
+                    in = new ArrayList<Object>(maxInSize);
+                }
+            }
+            if (in.size() > 0) {
+                Expression inExp = new ASTIn(path, new ASTList(in));
+                res = res != null ? res.orExp(inExp) : inExp;
+            }
+            return res;
+        }
+
+        public Object transform(Object input) {
+            if (input instanceof ASTIn || input instanceof ASTNotIn) {
+                return trimmedInExpression((Expression) input, 1000);
+            }
+            return input;
+        }
+    }
+}

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectTranslator.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectTranslator.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectTranslator.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/oracle/OracleSelectTranslator.java Thu Oct 15 18:03:46 2009
@@ -23,7 +23,6 @@
 
 import org.apache.cayenne.access.QueryLogger;
 import org.apache.cayenne.access.trans.SelectTranslator;
-import org.apache.cayenne.query.QueryMetadata;
 
 /**
  * Select translator that implements Oracle-specific optimizations.

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseAdapter.java Thu Oct 15 18:03:46 2009
@@ -117,8 +117,13 @@
                 sqlType = Types.VARBINARY;
             }
         }
-
-        super.bindParameter(statement, object, pos, sqlType, precision);
+        
+        if (object == null && sqlType==0) {
+            statement.setNull(pos, Types.VARCHAR);
+        }
+        else {
+            super.bindParameter(statement, object, pos, sqlType, precision);
+        }
     }
     
     @Override

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseMergerFactory.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseMergerFactory.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseMergerFactory.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/dba/sybase/SybaseMergerFactory.java Thu Oct 15 18:03:46 2009
@@ -55,8 +55,12 @@
                 sqlBuffer.append("ALTER TABLE ");
                 sqlBuffer.append(context.quoteFullyQualifiedName(getEntity()));
                 sqlBuffer.append(" ADD ");
-
+                boolean magnatory = column.isMandatory();
+                column.setMandatory(false);
                 adapter.createTableAppendColumn(sqlBuffer, column);
+                if(magnatory){
+                    column.setMandatory(magnatory);
+                }
                 return Collections.singletonList(sqlBuffer.toString());
             }
 

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/main/java/org/apache/cayenne/map/DataMap.java Thu Oct 15 18:03:46 2009
@@ -191,14 +191,15 @@
         Object clientEntities = properties.get(CLIENT_SUPPORTED_PROPERTY);
         Object clientPackageName = properties.get(DEFAULT_CLIENT_PACKAGE_PROPERTY);
         Object clientSuperclass = properties.get(DEFAULT_CLIENT_SUPERCLASS_PROPERTY);
-        Object quoteSqlIdentifier = properties.get(DEFAULT_QUOTE_SQL_IDENTIFIERS_PROPERTY);
+        Object quoteSqlIdentifier = properties
+                .get(DEFAULT_QUOTE_SQL_IDENTIFIERS_PROPERTY);
 
         this.defaultLockType = "optimistic".equals(lockType)
                 ? ObjEntity.LOCK_TYPE_OPTIMISTIC
                 : ObjEntity.LOCK_TYPE_NONE;
 
         this.defaultPackage = (packageName != null) ? packageName.toString() : null;
-        this.quotingSQLIdentifiers = (quoteSqlIdentifier!=null) ? "true"
+        this.quotingSQLIdentifiers = (quoteSqlIdentifier != null) ? "true"
                 .equalsIgnoreCase(quoteSqlIdentifier.toString()) : false;
         this.defaultSchema = (schema != null) ? schema.toString() : null;
         this.defaultSuperclass = (superclass != null) ? superclass.toString() : null;
@@ -264,9 +265,14 @@
      * @since 1.1
      */
     public void encodeAsXML(XMLEncoder encoder) {
-        encoder.println("<data-map xmlns=\"http://cayenne.apache.org/schema/3.0/modelMap\"");
+        encoder
+                .println("<data-map xmlns=\"http://cayenne.apache.org/schema/3.0/modelMap\"");
         encoder.println("  xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"");
-        encoder.println("  xsi:schemaLocation=\"" + SCHEMA_XSD + " " + SCHEMA_XSD + ".xsd\"");
+        encoder.println("  xsi:schemaLocation=\""
+                + SCHEMA_XSD
+                + " "
+                + SCHEMA_XSD
+                + ".xsd\"");
         encoder.println("  project-version=\"" + Project.CURRENT_PROJECT_VERSION + "\">");
 
         encoder.indent(1);
@@ -287,9 +293,11 @@
         if (!Util.isEmptyString(defaultSuperclass)) {
             encoder.printProperty(DEFAULT_SUPERCLASS_PROPERTY, defaultSuperclass);
         }
-        
+
         if (quotingSQLIdentifiers) {
-            encoder.printProperty(DEFAULT_QUOTE_SQL_IDENTIFIERS_PROPERTY, quotingSQLIdentifiers);
+            encoder.printProperty(
+                    DEFAULT_QUOTE_SQL_IDENTIFIERS_PROPERTY,
+                    quotingSQLIdentifiers);
         }
 
         if (clientSupported) {
@@ -904,11 +912,16 @@
 
             // Remove all obj relationships referencing removed DbRelationships.
             for (ObjEntity objEnt : this.getObjEntities()) {
-                if (objEnt.getDbEntity() == dbEntityToDelete) {
+                if (dbEntityToDelete.getName().equals(objEnt.getDbEntityName())) {
                     objEnt.clearDbMapping();
                 }
                 else {
                     for (Relationship rel : objEnt.getRelationships()) {
+                                               
+                        if (getObjEntity(rel.getTargetEntityName()).getDbEntityName() == null) {
+                            objEnt.clearDbMapping();
+                            break;
+                        }
                         for (DbRelationship dbRel : ((ObjRelationship) rel)
                                 .getDbRelationships()) {
                             if (dbRel.getTargetEntity() == dbEntityToDelete) {

Modified: cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java?rev=825594&r1=825593&r2=825594&view=diff
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.5-unpublished/src/test/java/org/apache/cayenne/merge/MergeCase.java Thu Oct 15 18:03:46 2009
@@ -117,18 +117,15 @@
      */
     private void filterDataMap(DataNode node, DataMap map) {
         // copied from AbstractAccessStack.dbEntitiesInInsertOrder
-        boolean excludeLOB = !getAccessStackAdapter().supportsLobs();
-        boolean excludeBinPK = !getAccessStackAdapter().supportsBinaryPK();
+        boolean excludeBinPK = getAccessStackAdapter().supportsBinaryPK();
 
-        if (!(excludeLOB || excludeBinPK)) {
+        if (!excludeBinPK) { 
             return;
         }
 
         List<DbEntity> entitiesToRemove = new ArrayList<DbEntity>();
 
         for (DbEntity ent : map.getDbEntities()) {
-
-            if (excludeBinPK) {
                 for (DbAttribute attr : ent.getAttributes()) {
                     // check for BIN PK or FK to BIN Pk
                     if (attr.getType() == Types.BINARY
@@ -140,8 +137,6 @@
                             break;
                         }
                     }
-                }
-
             }
         }