You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by ev...@apache.org on 2009/12/10 11:47:59 UTC

svn commit: r889177 - in /cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src: cayenne/java/org/apache/cayenne/access/jdbc/BindDirective.java tests/java/org/apache/cayenne/access/jdbc/BindDirectiveTst.java

Author: evgeny
Date: Thu Dec 10 10:47:48 2009
New Revision: 889177

URL: http://svn.apache.org/viewvc?rev=889177&view=rev
Log:
CAY-1306 Binding Collection in Parameters for SQLTemplate is not working

* fixed and add test

Modified:
    cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/jdbc/BindDirective.java
    cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/jdbc/BindDirectiveTst.java

Modified: cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/jdbc/BindDirective.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/jdbc/BindDirective.java?rev=889177&r1=889176&r2=889177&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/jdbc/BindDirective.java (original)
+++ cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/cayenne/java/org/apache/cayenne/access/jdbc/BindDirective.java Thu Dec 10 10:47:48 2009
@@ -89,9 +89,14 @@
         int jdbcType = TypesMapping.NOT_DEFINED;
         if (type != null) {
             jdbcType = TypesMapping.getSqlTypeByName(type.toString());
-        }
-        else if (value != null) {
-            jdbcType = TypesMapping.getSqlTypeByJava(value.getClass());
+        } else if (value != null) {
+            if (value instanceof Collection) {
+                // fixing CAY-1306. In 3.0 rendering is overridden
+                // binding collection, set type to any value that is not TypesMapping.NOT_DEFINED
+                jdbcType = Integer.MIN_VALUE; //for example min value.
+            } else {
+                jdbcType = TypesMapping.getSqlTypeByJava(value.getClass());
+            }
         } else {
             // value is null, set JDBC type to NULL
         	jdbcType = TypesMapping.getSqlTypeByName(TypesMapping.SQL_NULL);

Modified: cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/jdbc/BindDirectiveTst.java
URL: http://svn.apache.org/viewvc/cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/jdbc/BindDirectiveTst.java?rev=889177&r1=889176&r2=889177&view=diff
==============================================================================
--- cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/jdbc/BindDirectiveTst.java (original)
+++ cayenne/main/branches/STABLE-2.0/cayenne/cayenne-java/src/tests/java/org/apache/cayenne/access/jdbc/BindDirectiveTst.java Thu Dec 10 10:47:48 2009
@@ -19,6 +19,7 @@
 package org.apache.cayenne.access.jdbc;
 
 import java.sql.Connection;
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
@@ -43,6 +44,27 @@
         deleteTestData();
     }
 
+    public void testBindingForCollection() throws Exception {
+        // insert 3 artists
+        Map parameters;
+        for (int i = 1; i < 4; i++) {
+            parameters = new HashMap();
+            parameters.put("id", new Long(i));
+            parameters.put("name", "Artist" + i);
+            performInsertForParameters(parameters, true, i);
+        }
+
+        // now select only with names: Artist1 and Artist3
+        List artistNames = new ArrayList();
+        artistNames.add("Artist1");
+        artistNames.add("Artist3");
+        String sql = "SELECT * FROM ARTIST WHERE ARTIST_NAME in (#bind($ARTISTNAMES))";
+        SQLTemplate query = new SQLTemplate(Artist.class, sql);
+        query.setParameters(Collections.singletonMap("ARTISTNAMES", artistNames));
+        List result = getDomain().createDataContext().performQuery(query);
+        assertEquals(2, result.size());
+    }
+
     public void testBindForPassedNullParam() throws Exception {
         Map parameters = new HashMap();
         parameters.put("id", new Integer(1));
@@ -51,7 +73,7 @@
         parameters.put("dob", null);
         
         //without JDBC usage
-        Map row = performInsertForParameters(parameters, false);
+        Map row = performInsertForParameters(parameters, false, 1);
         assertEquals(parameters.get("id"), row.get("ARTIST_ID"));
         assertEquals(parameters.get("name"), row.get("ARTIST_NAME"));
         assertEquals(parameters.get("dob"), row.get("DATE_OF_BIRTH"));
@@ -66,7 +88,7 @@
         parameters.put("dob", null);
         
         //use JDBC
-        Map row = performInsertForParameters(parameters, true);
+        Map row = performInsertForParameters(parameters, true, 1);
         assertEquals(parameters.get("id"), row.get("ARTIST_ID"));
         assertEquals(parameters.get("name"), row.get("ARTIST_NAME"));
         assertEquals(parameters.get("dob"), row.get("DATE_OF_BIRTH"));
@@ -80,7 +102,7 @@
         // not passing parameter parameters.put("dob", not passed!);
        
         //without JDBC usage
-        Map row = performInsertForParameters(parameters, false);
+        Map row = performInsertForParameters(parameters, false, 1);
         assertEquals(parameters.get("id"), row.get("ARTIST_ID"));
         assertEquals(parameters.get("name"), row.get("ARTIST_NAME"));
         //parameter should be passed as null
@@ -94,7 +116,7 @@
         // not passing parameter parameters.put("dob", not passed!);
        
         //use JDBC
-        Map row = performInsertForParameters(parameters, true);
+        Map row = performInsertForParameters(parameters, true, 1);
         assertEquals(parameters.get("id"), row.get("ARTIST_ID"));
         assertEquals(parameters.get("name"), row.get("ARTIST_NAME"));
         //parameter should be passed as null
@@ -106,7 +128,7 @@
      * Inserts row for given parameters
      * @return inserted row
      */
-    private Map performInsertForParameters(Map parameters, boolean useJDBCType) throws Exception {
+    private Map performInsertForParameters(Map parameters, boolean useJDBCType, int expectedRowCount) throws Exception {
         String templateString;
         if(useJDBCType){
             templateString = "INSERT INTO ARTIST (ARTIST_ID, ARTIST_NAME, DATE_OF_BIRTH) "
@@ -143,7 +165,7 @@
         getDomain().performQueries(Collections.singletonList(query), observer);
 
         List data = observer.rowsForQuery(query);
-        assertEquals(1, data.size());
+        assertEquals(expectedRowCount, data.size());
         Map row = (Map) data.get(0);
         return row;
     }