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";