You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ibatis.apache.org by cb...@apache.org on 2009/10/08 07:40:02 UTC

svn commit: r823030 - in /ibatis/java/ibatis-3/trunk/ibatis-3-core/src: main/java/org/apache/ibatis/builder/xml/dynamic/ test/java/org/apache/ibatis/builder/ test/java/org/apache/ibatis/builder/xml/dynamic/ test/java/org/apache/ibatis/session/

Author: cbegin
Date: Thu Oct  8 05:40:01 2009
New Revision: 823030

URL: http://svn.apache.org/viewvc?rev=823030&view=rev
Log:
IBATIS-640 Foreach tag should not add separator when its contents only contains whitespaces

Modified:
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java
    ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java?rev=823030&r1=823029&r2=823030&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/ForEachSqlNode.java Thu Oct  8 05:40:01 2009
@@ -34,11 +34,21 @@
     applyOpen(context);
     int i = 0;
     for (Object o : iterable) {
-      first = applySeparator(context, first);
+      DynamicContext oldContext = context;
+      if (first) {
+        first = false;
+        context = new PrefixedContext(context, "");
+      } else {
+        if (separator != null) {
+          context = new PrefixedContext(context, separator);
+        }
+      }
       int uniqueNumber = context.getUniqueNumber();
       applyItem(context, o, uniqueNumber);
       applyIndex(context, i);
       contents.apply(new FilteredDynamicContext(context, item, uniqueNumber));
+      first = !((PrefixedContext)context).isPrefixApplied();
+      context = oldContext;
       i++;
     }
     applyClose(context);
@@ -64,17 +74,6 @@
     }
   }
 
-  private boolean applySeparator(DynamicContext context, boolean first) {
-    if (first) {
-      first = false;
-    } else {
-      if (separator != null) {
-        context.appendSql(separator);
-      }
-    }
-    return first;
-  }
-
   private void applyClose(DynamicContext context) {
     if (close != null) {
       context.appendSql(close);
@@ -127,4 +126,41 @@
 
   }
 
+
+  private class PrefixedContext extends DynamicContext {
+    private DynamicContext delegate;
+    private String prefix;
+    private boolean prefixApplied;
+    public PrefixedContext (DynamicContext delegate, String prefix) {
+      super(null);
+      this.delegate = delegate;
+      this.prefix = prefix;
+      this.prefixApplied = false;
+    }
+
+    public boolean isPrefixApplied() {
+      return prefixApplied;
+    }
+
+    public Map<String, Object> getBindings() {
+      return delegate.getBindings();
+    }
+    public void bind(String name, Object value) {
+      delegate.bind(name, value);
+    }
+    public void appendSql(String sql) {
+      if (!prefixApplied && sql != null && sql.trim().length() > 0) {
+        delegate.appendSql(prefix);
+        prefixApplied = true;
+      }
+      delegate.appendSql(sql);
+    }
+    public String getSql() {
+      return delegate.getSql();
+    }
+    public int getUniqueNumber() {
+      return delegate.getUniqueNumber();
+    }
+  }
+
 }

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml?rev=823030&r1=823029&r2=823030&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml Thu Oct  8 05:40:01 2009
@@ -39,4 +39,16 @@
           #{item}
     </foreach>
   </select>
+
+  <select id="selectOddPostsIn" resultType="domain.blog.Post">
+    SELECT *
+    FROM POST P
+    WHERE ID in
+    <foreach item="item" index="index" collection="list"
+        open="(" separator="," close=")">
+        <if test="index / 2 != 0">
+          #{item}          
+        </if>
+    </foreach>
+  </select>
 </mapper>
\ No newline at end of file

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java?rev=823030&r1=823029&r2=823030&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java Thu Oct  8 05:40:01 2009
@@ -194,7 +194,7 @@
     final HashMap<String,String[]> parameterObject = new HashMap() {{
         put("array", new String[]{"one", "two", "three"});
       }};
-    final String expected = "SELECT * FROM BLOG WHERE ID in ( one = ? AND two = ? AND three = ? )";
+    final String expected = "SELECT * FROM BLOG WHERE ID in (  one = ? AND two = ? AND three = ? )";
     DynamicSqlSource source = createDynamicSqlSource(
         new TextSqlNode("SELECT * FROM BLOG WHERE ID in"),
         new ForEachSqlNode(mixedContents(new TextSqlNode("${item} = #{item}")),"array","index","item","(",")","AND"));

Modified: ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java
URL: http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java?rev=823030&r1=823029&r2=823030&view=diff
==============================================================================
--- ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java (original)
+++ ibatis/java/ibatis-3/trunk/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java Thu Oct  8 05:40:01 2009
@@ -582,4 +582,22 @@
     }
   }
 
+  @Test
+  public void shouldFindOddPostsInList() throws Exception {
+    SqlSession session = sqlMapper.openSession();
+    try {
+      List<Post> posts = session.selectList("domain.blog.mappers.PostMapper.selectOddPostsIn",
+          new ArrayList(){{
+              add(1);
+              add(2);
+              add(3);
+              add(4);
+              add(5);
+            }});
+      assertEquals(3, posts.size());
+    } finally {
+      session.close();
+    }
+  }
+
 }