Author: jgbutler
Date: Mon May  3 14:13:58 2010
New Revision: 940463

URL: http://svn.apache.org/viewvc?rev=940463&view=rev
Log:
Add general SqlBuilder

Added:
    
ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/jdbc/SqlBuilder.java

Added: 
ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/jdbc/SqlBuilder.java
URL: 
http://svn.apache.org/viewvc/ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/jdbc/SqlBuilder.java?rev=940463&view=auto
==============================================================================
--- 
ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/jdbc/SqlBuilder.java 
(added)
+++ 
ibatis/java/ibatis-3/trunk/src/main/java/org/apache/ibatis/jdbc/SqlBuilder.java 
Mon May  3 14:13:58 2010
@@ -0,0 +1,244 @@
+package org.apache.ibatis.jdbc;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SqlBuilder {
+  private static final String AND = ") \nAND (";
+  private static final String OR = ") \nOR (";
+
+  private static final ThreadLocal<SQL> localSQL = new ThreadLocal<SQL>();
+
+  public static void BEGIN() {
+    RESET();
+  }
+
+  public static void RESET() {
+    localSQL.set(new SQL());
+  }
+
+  public static void UPDATE(String table) {
+    sql().statementType = SQL.StatementType.UPDATE;
+    sql().tables.add(table);
+  }
+
+  public static void SET(String sets) {
+    sql().sets.add(sets);
+  }
+
+  public static String SQL() {
+    try {
+      return sql().sql();
+    } finally {
+        RESET();
+    }
+  }
+
+  public static void INSERT_INTO(String tableName) {
+    sql().statementType = SQL.StatementType.INSERT;
+    sql().tables.add(tableName);
+  }
+
+  public static void VALUES(String columns, String values) {
+    sql().columns.add(columns);
+    sql().values.add(values);
+  }
+
+  public static void SELECT(String columns) {
+    sql().statementType = SQL.StatementType.SELECT;
+    sql().select.add(columns);
+  }
+
+  public static void SELECT_DISTINCT(String columns) {
+    sql().distinct = true;
+    SELECT(columns);
+  }
+
+  public static void DELETE_FROM(String table) {
+    sql().statementType = SQL.StatementType.DELETE;
+    sql().tables.add(table);
+  }
+
+  public static void FROM(String table) {
+    sql().tables.add(table);
+  }
+
+  public static void JOIN(String join) {
+    sql().join.add(join);
+  }
+
+  public static void INNER_JOIN(String join) {
+    sql().innerJoin.add(join);
+  }
+
+  public static void LEFT_OUTER_JOIN(String join) {
+    sql().leftOuterJoin.add(join);
+  }
+
+  public static void RIGHT_OUTER_JOIN(String join) {
+    sql().rightOuterJoin.add(join);
+  }
+
+  public static void OUTER_JOIN(String join) {
+    sql().outerJoin.add(join);
+  }
+
+  public static void WHERE(String conditions) {
+    sql().where.add(conditions);
+    sql().lastList = sql().where;
+  }
+
+  public static void OR() {
+    sql().lastList.add(OR);
+  }
+
+  public static void AND() {
+    sql().lastList.add(AND);
+  }
+
+  public static void GROUP_BY(String columns) {
+    sql().groupBy.add(columns);
+  }
+
+  public static void HAVING(String conditions) {
+    sql().having.add(conditions);
+    sql().lastList = sql().having;
+  }
+
+  public static void ORDER_BY(String columns) {
+    sql().orderBy.add(columns);
+  }
+
+  private static SQL sql() {
+    SQL sql = localSQL.get();
+    if (sql == null) {
+      RESET();
+      sql = localSQL.get();
+    }
+    return sql;
+  }
+
+  private static class SQL {
+    public enum StatementType {
+        DELETE,
+        INSERT,
+        SELECT,
+        UPDATE
+    }
+    
+    StatementType statementType;
+    List<String> sets = new ArrayList<String>();
+    List<String> select = new ArrayList<String>();
+    List<String> tables = new ArrayList<String>();
+    List<String> join = new ArrayList<String>();
+    List<String> innerJoin = new ArrayList<String>();
+    List<String> outerJoin = new ArrayList<String>();
+    List<String> leftOuterJoin = new ArrayList<String>();
+    List<String> rightOuterJoin = new ArrayList<String>();
+    List<String> where = new ArrayList<String>();
+    List<String> having = new ArrayList<String>();
+    List<String> groupBy = new ArrayList<String>();
+    List<String> orderBy = new ArrayList<String>();
+    List<String> lastList = new ArrayList<String>();
+    List<String> columns = new ArrayList<String>();
+    List<String> values = new ArrayList<String>();
+    boolean distinct;
+
+    private void sqlClause(StringBuilder builder, String keyword, List<String> 
parts, String open, String close, String conjunction) {
+      if (!parts.isEmpty()) {
+        if (builder.length() > 0) builder.append("\n");
+        builder.append(keyword);
+        builder.append(" ");
+        builder.append(open);
+        String last = "________";
+        for (int i = 0, n = parts.size(); i < n; i++) {
+          String part = parts.get(i);
+          if (i > 0 && !part.equals(AND) && !part.equals(OR) && 
!last.equals(AND) && !last.equals(OR)) {
+            builder.append(conjunction);
+          }
+          builder.append(part);
+          last = part;
+        }
+        builder.append(close);
+      }
+    }
+
+    private String selectSQL() {
+      StringBuilder builder = new StringBuilder();
+      if (distinct) {
+        sqlClause(builder, "SELECT DISTINCT", select, "", "", ", ");
+      } else {
+        sqlClause(builder, "SELECT", select, "", "", ", ");
+      }
+
+      sqlClause(builder, "FROM", tables, "", "", ", ");
+      sqlClause(builder, "JOIN", join, "", "", "JOIN");
+      sqlClause(builder, "INNER JOIN", innerJoin, "", "", "\nINNER JOIN ");
+      sqlClause(builder, "OUTER JOIN", outerJoin, "", "", "\nOUTER JOIN ");
+      sqlClause(builder, "LEFT OUTER JOIN", leftOuterJoin, "", "", "\nLEFT 
OUTER JOIN ");
+      sqlClause(builder, "RIGHT OUTER JOIN", rightOuterJoin, "", "", "\nRIGHT 
OUTER JOIN ");
+      sqlClause(builder, "WHERE", where, "(", ")", " AND ");
+      sqlClause(builder, "GROUP BY", groupBy, "", "", ", ");
+      sqlClause(builder, "HAVING", having, "(", ")", " AND ");
+      sqlClause(builder, "ORDER BY", orderBy, "", "", ", ");
+      return builder.toString();
+    }
+
+    private String insertSQL() {
+      StringBuilder builder = new StringBuilder();
+
+      sqlClause(builder, "INSERT INTO", tables, "", "", "");
+      sqlClause(builder, "", columns, "(", ")", ", ");
+      sqlClause(builder, "VALUES", values, "(", ")", ", ");
+      return builder.toString();
+    }
+
+    private String deleteSQL() {
+      StringBuilder builder = new StringBuilder();
+
+      sqlClause(builder, "DELETE FROM", tables, "", "", "");
+      sqlClause(builder, "WHERE", where, "(", ")", " AND ");
+      return builder.toString();
+    }
+
+    private String updateSQL() {
+      StringBuilder builder = new StringBuilder();
+
+      sqlClause(builder, "UPDATE", tables, "", "", "");
+      sqlClause(builder, "SET", sets, "", "", ", ");
+      sqlClause(builder, "WHERE", where, "(", ")", " AND ");
+      return builder.toString();
+    }
+
+    public String sql() {
+      if (statementType == null) {
+        return null;
+      }
+      
+      String answer;
+      
+      switch (statementType) {
+      case DELETE:
+        answer = deleteSQL();
+        break;
+          
+      case INSERT:
+        answer = insertSQL();
+        break;
+      
+      case SELECT:
+        answer = selectSQL();
+        break;
+          
+      case UPDATE:
+        answer = updateSQL();
+        break;
+          
+      default:
+        answer = null;
+      }
+
+      return answer;
+    }
+  }
+}


Reply via email to