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/07/27 06:06:02 UTC
svn commit: r798017 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src:
main/java/org/apache/ibatis/builder/xml/
main/java/org/apache/ibatis/builder/xml/dynamic/
test/java/org/apache/ibatis/builder/
test/java/org/apache/ibatis/builder/xml/dynamic/ test...
Author: cbegin
Date: Mon Jul 27 04:06:02 2009
New Revision: 798017
URL: http://svn.apache.org/viewvc?rev=798017&view=rev
Log:
implemented suffix override support in trim tag.
Modified:
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/SetSqlNode.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/TrimSqlNode.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/WhereSqlNode.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/ibatis-3-mapper.dtd
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java
ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java?rev=798017&r1=798016&r2=798017&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/XMLStatementBuilder.java Mon Jul 27 04:06:02 2009
@@ -166,9 +166,11 @@
public void handleNode(XNode nodeToHandle, List<SqlNode> targetContents) {
List<SqlNode> contents = parseDynamicTags(nodeToHandle);
MixedSqlNode mixedSqlNode = new MixedSqlNode(contents);
- String with = nodeToHandle.getStringAttribute("with");
- String overrides = nodeToHandle.getStringAttribute("overrides");
- TrimSqlNode trim = new TrimSqlNode(mixedSqlNode, with, overrides);
+ String prefix = nodeToHandle.getStringAttribute("prefix");
+ String prefixOverrides = nodeToHandle.getStringAttribute("prefixOverrides");
+ String suffix= nodeToHandle.getStringAttribute("suffix");
+ String suffixOverrides = nodeToHandle.getStringAttribute("suffixOverrides");
+ TrimSqlNode trim = new TrimSqlNode(mixedSqlNode, prefix, prefixOverrides, suffix, suffixOverrides);
targetContents.add(trim);
}
}
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/SetSqlNode.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/SetSqlNode.java?rev=798017&r1=798016&r2=798017&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/SetSqlNode.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/SetSqlNode.java Mon Jul 27 04:06:02 2009
@@ -3,7 +3,7 @@
public class SetSqlNode extends TrimSqlNode {
public SetSqlNode(SqlNode contents) {
- super(contents, "SET", ",");
+ super(contents, "SET", null, null, ",");
}
}
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/TrimSqlNode.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/TrimSqlNode.java?rev=798017&r1=798016&r2=798017&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/TrimSqlNode.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/TrimSqlNode.java Mon Jul 27 04:06:02 2009
@@ -5,17 +5,24 @@
public class TrimSqlNode implements SqlNode {
private SqlNode contents;
- private String stringToPrefixWith;
- private List<String> stringsToOverride = new ArrayList<String>();
+ private String prefix;
+ private String suffix;
+ private List<String> prefixesToOverride = new ArrayList<String>();
+ private List<String> suffixesToOverride = new ArrayList<String>();
- public TrimSqlNode(SqlNode contents, String with, String overrides) {
+ public TrimSqlNode(SqlNode contents, String prefix, String prefixesToOverride, String suffix, String suffixesToOverride) {
this.contents = contents;
- this.stringToPrefixWith = with;
- this.stringsToOverride = parseOverrides(overrides);
+ this.prefix = prefix;
+ this.prefixesToOverride = parseOverrides(prefixesToOverride);
+ this.suffix = suffix;
+ this.suffixesToOverride = parseOverrides(suffixesToOverride);
}
public boolean apply(DynamicContext context) {
- return contents.apply(new FilteredDynamicContext(context));
+ FilteredDynamicContext filteredDynamicContext = new FilteredDynamicContext(context);
+ boolean result = contents.apply(filteredDynamicContext);
+ filteredDynamicContext.applyAll();
+ return result;
}
private List<String> parseOverrides(String overrides) {
@@ -23,7 +30,7 @@
final StringTokenizer parser = new StringTokenizer(overrides, "|", false);
return new ArrayList<String>() {{
while (parser.hasMoreTokens()) {
- add(parser.nextToken());
+ add(parser.nextToken().toUpperCase());
}}
};
}
@@ -33,11 +40,25 @@
private class FilteredDynamicContext extends DynamicContext {
private DynamicContext delegate;
private boolean prefixApplied;
+ private boolean suffixApplied;
+ private StringBuilder sqlBuffer;
public FilteredDynamicContext(DynamicContext delegate) {
super(null);
this.delegate = delegate;
this.prefixApplied = false;
+ this.suffixApplied = false;
+ this.sqlBuffer = new StringBuilder();
+ }
+
+ public void applyAll(){
+ sqlBuffer = new StringBuilder(sqlBuffer.toString().trim());
+ String trimmedUppercaseSql = sqlBuffer.toString().toUpperCase();
+ if (trimmedUppercaseSql.length() > 0) {
+ applyPrefix(sqlBuffer, trimmedUppercaseSql);
+ applySuffix(sqlBuffer, trimmedUppercaseSql);
+ }
+ delegate.appendSql(sqlBuffer.toString());
}
public Map<String, Object> getBindings() {
@@ -48,35 +69,52 @@
delegate.bind(name, value);
}
+ public int getUniqueNumber() {
+ return delegate.getUniqueNumber();
+ }
+
public void appendSql(String sql) {
+ sqlBuffer.append(sql);
+ }
+
+ public String getSql() {
+ return delegate.getSql();
+ }
+
+ private void applyPrefix(StringBuilder sql, String trimmedUppercaseSql) {
if (!prefixApplied) {
- String filteredSql = sql.trim().toUpperCase();
- if (filteredSql.length() > 0) {
- prefixApplied = true;
- for (String toRemove : stringsToOverride) {
- if (filteredSql.startsWith(toRemove) || filteredSql.startsWith(toRemove.trim())) {
- sql = sql.trim().substring(toRemove.trim().length()).trim();
- break;
- }
- }
- if (stringToPrefixWith != null) {
- delegate.appendSql(stringToPrefixWith);
+ prefixApplied = true;
+ for (String toRemove : prefixesToOverride) {
+ if (trimmedUppercaseSql.startsWith(toRemove) || trimmedUppercaseSql.startsWith(toRemove.trim())) {
+ sql.delete(0, toRemove.trim().length());
+ break;
}
- delegate.appendSql(sql);
}
- } else {
- delegate.appendSql(sql);
+ if (prefix != null) {
+ sql.insert(0," ");
+ sql.insert(0,prefix);
+ }
}
}
- public String getSql() {
- return delegate.getSql();
+ private void applySuffix(StringBuilder sql, String trimmedUppercaseSql) {
+ if (!suffixApplied) {
+ suffixApplied = true;
+ for (String toRemove : suffixesToOverride) {
+ if (trimmedUppercaseSql.endsWith(toRemove) || trimmedUppercaseSql.endsWith(toRemove.trim())) {
+ int start = sql.length() - toRemove.trim().length();
+ int end = sql.length();
+ sql.delete(start, end);
+ break;
+ }
+ }
+ if (suffix != null) {
+ sql.append(" ");
+ sql.append(suffix);
+ }
+ }
}
- @Override
- public int getUniqueNumber() {
- return delegate.getUniqueNumber();
- }
}
}
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/WhereSqlNode.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/WhereSqlNode.java?rev=798017&r1=798016&r2=798017&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/WhereSqlNode.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/dynamic/WhereSqlNode.java Mon Jul 27 04:06:02 2009
@@ -3,7 +3,7 @@
public class WhereSqlNode extends TrimSqlNode {
public WhereSqlNode(SqlNode contents) {
- super(contents, "WHERE", "AND |OR ");
+ super(contents, "WHERE", "AND |OR ", null, null);
}
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/ibatis-3-mapper.dtd
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/ibatis-3-mapper.dtd?rev=798017&r1=798016&r2=798017&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/ibatis-3-mapper.dtd (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/builder/xml/ibatis-3-mapper.dtd Mon Jul 27 04:06:02 2009
@@ -199,8 +199,10 @@
<!ELEMENT trim (#PCDATA | include | trim | where | set | foreach | choose | if)*>
<!ATTLIST trim
-with CDATA #IMPLIED
-overrides CDATA #IMPLIED
+prefix CDATA #IMPLIED
+prefixOverrides CDATA #IMPLIED
+suffix CDATA #IMPLIED
+suffixOverrides CDATA #IMPLIED
>
<!ELEMENT where (#PCDATA | include | trim | where | set | foreach | choose | if)*>
<!ELEMENT set (#PCDATA | include | trim | where | set | foreach | choose | if)*>
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml?rev=798017&r1=798016&r2=798017&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/PostMapper.xml Mon Jul 27 04:06:02 2009
@@ -22,7 +22,7 @@
AND id IN
<foreach item="item_id" index="index" open="(" close=")" separator="," collection="ids">#{ids[${index}]}</foreach>
</if>
- <trim with="AND">
+ <trim prefix="AND">
<include refid="byBlogId"/>
</trim>
</otherwise>
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java?rev=798017&r1=798016&r2=798017&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/builder/xml/dynamic/DynamicSqlSourceTest.java Mon Jul 27 04:06:02 2009
@@ -101,7 +101,7 @@
@Test
public void shouldTrimWHEREInsteadOfANDForFirstCondition() throws Exception {
- final String expected = "SELECT * FROM BLOG WHERE ID = ?";
+ final String expected = "SELECT * FROM BLOG WHERE ID = ?";
DynamicSqlSource source = createDynamicSqlSource(
new TextSqlNode("SELECT * FROM BLOG"),
new WhereSqlNode(mixedContents(
@@ -116,7 +116,7 @@
@Test
public void shouldTrimWHEREInsteadOfORForSecondCondition() throws Exception {
- final String expected = "SELECT * FROM BLOG WHERE NAME = ?";
+ final String expected = "SELECT * FROM BLOG WHERE NAME = ?";
DynamicSqlSource source = createDynamicSqlSource(
new TextSqlNode("SELECT * FROM BLOG"),
new WhereSqlNode(mixedContents(
@@ -131,7 +131,7 @@
@Test
public void shouldTrimWHEREInsteadOfANDForBothConditions() throws Exception {
- final String expected = "SELECT * FROM BLOG WHERE ID = ? OR NAME = ?";
+ final String expected = "SELECT * FROM BLOG WHERE ID = ? OR NAME = ?";
DynamicSqlSource source = createDynamicSqlSource(
new TextSqlNode("SELECT * FROM BLOG"),
new WhereSqlNode(mixedContents(
@@ -161,13 +161,13 @@
@Test
public void shouldTrimSETInsteadOfCOMMAForBothConditions() throws Exception {
- final String expected = "UPDATE BLOG SET ID = ? , NAME = ?";
+ final String expected = "UPDATE BLOG SET ID = ?, NAME = ?";
DynamicSqlSource source = createDynamicSqlSource(
new TextSqlNode("UPDATE BLOG"),
new SetSqlNode(mixedContents(
- new IfSqlNode(mixedContents(new TextSqlNode(" , ID = ? ")), "true"
+ new IfSqlNode(mixedContents(new TextSqlNode(" ID = ?, ")), "true"
),
- new IfSqlNode(mixedContents(new TextSqlNode(", NAME = ? ")), "true"
+ new IfSqlNode(mixedContents(new TextSqlNode(" NAME = ?, ")), "true"
)
)));
BoundSql boundSql = source.getBoundSql(null);
Modified: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java?rev=798017&r1=798016&r2=798017&view=diff
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java (original)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/session/SqlSessionTest.java Mon Jul 27 04:06:02 2009
@@ -151,7 +151,7 @@
}
}
- @Test @Ignore
+ @Test
public void shouldUpdateAuthorIfNecessary() throws Exception {
SqlSession session = sqlMapper.openSession();
Author original;