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();
+ }
+ }
+
}