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;