Author: cbegin
Date: Sat Apr 11 07:00:46 2009
New Revision: 764173

URL: http://svn.apache.org/viewvc?rev=764173&view=rev
Log:
added support for item and index variables

Modified:
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/DynamicContext.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/ForEachSqlNode.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/IfSqlNode.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java
    
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/xml/dynamic/DynamicSqlSourceTest.java

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/DynamicContext.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/DynamicContext.java?rev=764173&r1=764172&r2=764173&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/DynamicContext.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/DynamicContext.java
 Sat Apr 11 07:00:46 2009
@@ -1,16 +1,34 @@
 package org.apache.ibatis.parser.xml.dynamic;
 
+import org.apache.ibatis.reflection.MetaObject;
+
+import java.util.*;
+
 public class DynamicContext {
 
+  private Map<String,Object> bindings = new HashMap<String,Object>();
   private Object parameterObject;
   private StringBuilder sqlBuilder = new StringBuilder();
 
   public DynamicContext(Object parameterObject) {
+    if (parameterObject instanceof Map) {
+      bindings = (Map<String,Object>)parameterObject;
+    } else if (parameterObject != null) {
+      MetaObject metaObject = MetaObject.forObject(parameterObject);
+      String[] names = metaObject.getGetterNames();
+      for(String name : names) {
+        bindings.put(name,metaObject.getValue(name));
+      }
+    }
     this.parameterObject = parameterObject;
   }
 
-  public Object getParameterObject() {
-    return parameterObject;
+  public Map<String, Object> getBindings() {
+    return bindings;
+  }
+
+  public void bind(String name, Object value) {
+    bindings.put(name,value);
   }
 
   public void appendSql(String sql) {

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/ForEachSqlNode.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/ForEachSqlNode.java?rev=764173&r1=764172&r2=764173&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/ForEachSqlNode.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/ForEachSqlNode.java
 Sat Apr 11 07:00:46 2009
@@ -7,28 +7,48 @@
   private String open;
   private String close;
   private String separator;
+  private String item;
+  private String index;
 
-  public ForEachSqlNode(String collectionExpression, String open, String 
close, String separator, MixedSqlNode contents) {
+  public ForEachSqlNode(String collectionExpression, String index, String 
item, String open, String close, String separator, MixedSqlNode contents) {
     this.evaluator = new ExpressionEvaluator();
     this.collectionExpression = collectionExpression;
     this.contents = contents;
     this.open = open;
     this.close = close;
     this.separator = separator;
+    this.index = index;
+    this.item = item;
   }
 
   public boolean apply(DynamicContext builder) {
-    final Iterable iterable = evaluator.evaluateIterable(collectionExpression, 
builder.getParameterObject());
+    final Iterable iterable = evaluator.evaluateIterable(collectionExpression, 
builder.getBindings());
     boolean first = true;
     applyOpen(builder);
+    int i = 0;
     for (Object o : iterable) {
       first = applySeparator(builder, first);
+      i = applyIndex(builder, i);
+      applyItem(builder, o);
       contents.apply(builder);
     }
     applyClose(builder);
     return true;
   }
 
+  private int applyIndex(DynamicContext builder, int i) {
+    if (index != null) {
+      builder.bind(index, i++);
+    }
+    return i;
+  }
+
+  private void applyItem(DynamicContext builder, Object o) {
+    if (item != null) {
+      builder.bind(item, o);
+    }
+  }
+
   private void applyOpen(DynamicContext builder) {
     if (open != null) {
       builder.appendSql(open);

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/IfSqlNode.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/IfSqlNode.java?rev=764173&r1=764172&r2=764173&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/IfSqlNode.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/IfSqlNode.java
 Sat Apr 11 07:00:46 2009
@@ -12,7 +12,7 @@
   }
 
   public boolean apply(DynamicContext builder) {
-    if (evaluator.evaluateBoolean(test, builder.getParameterObject())) {
+    if (evaluator.evaluateBoolean(test, builder.getBindings())) {
       contents.apply(builder);
       return true;
     }

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java?rev=764173&r1=764172&r2=764173&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/parser/xml/dynamic/TextSqlNode.java
 Sat Apr 11 07:00:46 2009
@@ -1,5 +1,7 @@
 package org.apache.ibatis.parser.xml.dynamic;
 
+import org.apache.ibatis.xml.GenericTokenParser;
+
 public class TextSqlNode implements SqlNode {
   private String text;
 
@@ -7,9 +9,25 @@
     this.text = text;
   }
 
-  public boolean apply(DynamicContext builder) {
-    builder.appendSql(text);
+  public boolean apply(DynamicContext context) {
+    GenericTokenParser parser = new GenericTokenParser("${", "}", new 
BindingTokenParser(context));
+    context.appendSql(parser.parse(text));
     return true;
   }
+
+  private static class BindingTokenParser implements 
GenericTokenParser.TokenHandler {
+
+    private DynamicContext context;
+
+    public BindingTokenParser (DynamicContext context) {
+      this.context = context;
+    }
+
+    public String handleToken(String content) {
+      return String.valueOf(context.getBindings().get(content));
+    }
+  }
+
+
 }
 

Modified: 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/xml/dynamic/DynamicSqlSourceTest.java
URL: 
http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/xml/dynamic/DynamicSqlSourceTest.java?rev=764173&r1=764172&r2=764173&view=diff
==============================================================================
--- 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/xml/dynamic/DynamicSqlSourceTest.java
 (original)
+++ 
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/parser/xml/dynamic/DynamicSqlSourceTest.java
 Sat Apr 11 07:00:46 2009
@@ -103,17 +103,17 @@
   @Test
   public void shouldIterateOnceForEachItemInCollection() throws Exception {
     final HashMap<String,String[]> parameterObject = new HashMap() {{
-        put("array", new String[]{"1", "2", "3"});
+        put("array", new String[]{"one", "two", "three"});
       }};
-    final String expected = "SELECT * FROM BLOG WHERE ID in [ ? , ? , ? ]";
+    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("array","[","]",",",mixedContents(new 
TextSqlNode("?"))));
+        new 
ForEachSqlNode("array","index","item","(",")","AND",mixedContents(new 
TextSqlNode("${item} = #{id[${index}]}"))));
     BoundSql boundSql = source.getBoundSql(parameterObject);
     assertEquals(expected, boundSql.getSql());
+    assertEquals(3, boundSql.getParameterMappings().size());
   }
 
-
   private DynamicSqlSource createDynamicSqlSource(SqlNode... contents) throws 
IOException, SQLException {
     createBlogDataSource();
     final String resource = "org/apache/ibatis/parser/MapperConfig.xml";


Reply via email to