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/03/15 06:29:09 UTC

svn commit: r754618 - in /ibatis/trunk/java/ibatis-3/ibatis-3-core/src: main/java/org/apache/ibatis/jdbc/SelectBuilder.java test/java/org/apache/ibatis/jdbc/SelectBuilderTest.java

Author: cbegin
Date: Sun Mar 15 05:29:08 2009
New Revision: 754618

URL: http://svn.apache.org/viewvc?rev=754618&view=rev
Log:
Added Select builder

Added:
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java
    ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SelectBuilderTest.java

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java?rev=754618&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/main/java/org/apache/ibatis/jdbc/SelectBuilder.java Sun Mar 15 05:29:08 2009
@@ -0,0 +1,130 @@
+package org.apache.ibatis.jdbc;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class SelectBuilder {
+  private static final String AND = ") \nAND (";
+  private static final String OR = ") \nOR (";
+
+
+  private static final ThreadLocal<Query> localQuery = new ThreadLocal<Query>();
+
+  static {
+    localQuery.set(new Query());
+  }
+
+  private static class Query {
+    List<String> select = new ArrayList<String>();
+    List<String> from = 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>();
+  }
+
+  private static Query query() {
+    return localQuery.get();
+  }
+
+  public static String SQL() {
+    try {
+      StringBuilder builder = new StringBuilder();
+      sqlClause(builder, "SELECT", query().select, "", "", ", ");
+      sqlClause(builder, "FROM", query().from, "", "", ", ");
+      sqlClause(builder, "JOIN", query().join, "", "", "JOIN");
+      sqlClause(builder, "INNER JOIN", query().innerJoin, "", "", "\nINNER JOIN ");
+      sqlClause(builder, "OUTER JOIN", query().outerJoin, "", "", "\nOUTER JOIN ");
+      sqlClause(builder, "LEFT OUTER JOIN", query().leftOuterJoin, "", "", "\nLEFT OUTER JOIN ");
+      sqlClause(builder, "RIGHT OUTER JOIN", query().rightOuterJoin, "", "", "\nRIGHT OUTER JOIN ");
+      sqlClause(builder, "WHERE", query().where, "(", ")", " AND ");
+      sqlClause(builder, "GROUP BY", query().groupBy, "", "", ", ");
+      sqlClause(builder, "HAVING", query().having, "(", ")", " AND ");
+      sqlClause(builder, "ORDER BY", query().orderBy, "", "", ", ");
+      return builder.toString();
+    } finally {
+      localQuery.set(new Query());
+    }
+  }
+
+  private static 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);
+    }
+  }
+
+  public static void SELECT(String columns) {
+    query().select.add(columns);
+  }
+
+  public static void FROM(String table) {
+    query().from.add(table);
+  }
+
+  public static void JOIN(String join) {
+    query().join.add(join);
+  }
+
+  public static void INNER_JOIN(String join) {
+    query().innerJoin.add(join);
+  }
+
+  public static void LEFT_OUTER_JOIN(String join) {
+    query().leftOuterJoin.add(join);
+  }
+
+  public static void RIGHT_OUTER_JOIN(String join) {
+    query().rightOuterJoin.add(join);
+  }
+
+  public static void OUTER_JOIN(String join) {
+    query().outerJoin.add(join);
+  }
+
+  public static void WHERE(String conditions) {
+    query().where.add(conditions);
+    query().lastList = query().where;
+  }
+
+  public static void OR() {
+    query().lastList.add(OR);
+  }
+
+  public static void AND() {
+    query().lastList.add(AND);
+  }
+
+  public static void GROUP_BY(String columns) {
+    query().groupBy.add(columns);
+  }
+
+  public static void HAVING(String conditions) {
+    query().having.add(conditions);
+    query().lastList = query().having;
+  }
+
+  public static void ORDER_BY(String columns) {
+    query().orderBy.add(columns);
+  }
+
+
+}

Added: ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SelectBuilderTest.java
URL: http://svn.apache.org/viewvc/ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SelectBuilderTest.java?rev=754618&view=auto
==============================================================================
--- ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SelectBuilderTest.java (added)
+++ ibatis/trunk/java/ibatis-3/ibatis-3-core/src/test/java/org/apache/ibatis/jdbc/SelectBuilderTest.java Sun Mar 15 05:29:08 2009
@@ -0,0 +1,102 @@
+package org.apache.ibatis.jdbc;
+
+import org.junit.Test;
+import static org.junit.Assert.*;
+import static org.apache.ibatis.jdbc.SelectBuilder.*;
+
+public class SelectBuilderTest {
+
+  @Test
+  public void shouldProduceExpectedSimpleSelectStatement() {
+    String expected =
+        "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" +
+        "FROM PERSON P\n" +
+        "WHERE (P.ID like #id# AND P.FIRST_NAME like #firstName# AND P.LAST_NAME like #lastName#)\n" +
+        "ORDER BY P.LAST_NAME";
+    assertEquals(expected, example2("a","b","c"));
+  }
+
+  @Test
+  public void shouldProduceExpectedSimpleSelectStatementMissingFirstParam() {
+    String expected =
+        "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" +
+        "FROM PERSON P\n" +
+        "WHERE (P.FIRST_NAME like #firstName# AND P.LAST_NAME like #lastName#)\n" +
+        "ORDER BY P.LAST_NAME";
+    assertEquals(expected, example2(null,"b","c"));
+  }
+
+  @Test
+  public void shouldProduceExpectedSimpleSelectStatementMissingFirstTwoParams() {
+    String expected =
+        "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" +
+        "FROM PERSON P\n" +
+        "WHERE (P.LAST_NAME like #lastName#)\n" +
+        "ORDER BY P.LAST_NAME";
+    assertEquals(expected, example2(null,null,"c"));
+  }
+
+  @Test
+  public void shouldProduceExpectedSimpleSelectStatementMissingAllParams() {
+    String expected =
+        "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME\n" +
+        "FROM PERSON P\n" +
+        "ORDER BY P.LAST_NAME";
+    assertEquals(expected, example2(null,null,null));
+  }
+
+  @Test
+  public void shouldProduceExpectedComplexSelectStatement() {
+    String expected =
+        "SELECT P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME, P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON\n" +
+            "FROM PERSON P, ACCOUNT A\n" +
+            "INNER JOIN DEPARTMENT D on D.ID = P.DEPARTMENT_ID\n" +
+            "INNER JOIN COMPANY C on D.COMPANY_ID = C.ID\n" +
+            "WHERE (P.ID = A.ID AND P.FIRST_NAME like ?) \n" +
+            "OR (P.LAST_NAME like ?)\n" +
+            "GROUP BY P.ID\n" +
+            "HAVING (P.LAST_NAME like ?) \n" +
+            "OR (P.FIRST_NAME like ?)\n" +
+            "ORDER BY P.ID, P.FULL_NAME";
+    assertEquals(expected, example1());
+  }
+
+  private static String example1() {
+    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
+    SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
+    FROM("PERSON P");
+    FROM("ACCOUNT A");
+    INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
+    INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
+    WHERE("P.ID = A.ID");
+    WHERE("P.FIRST_NAME like ?");
+    OR();
+    WHERE("P.LAST_NAME like ?");
+    GROUP_BY("P.ID");
+    HAVING("P.LAST_NAME like ?");
+    OR();
+    HAVING("P.FIRST_NAME like ?");
+    ORDER_BY("P.ID");
+    ORDER_BY("P.FULL_NAME");
+    return SQL();
+  }
+
+  private static String example2(String id, String firstName, String lastName) {
+    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME");
+    FROM("PERSON P");
+    if (id != null) {
+      WHERE("P.ID like #id#");
+    }
+    if (firstName != null) {
+      WHERE("P.FIRST_NAME like #firstName#");
+    }
+    if (lastName != null) {
+      WHERE("P.LAST_NAME like #lastName#");
+    }
+    ORDER_BY("P.LAST_NAME");
+    return SQL();
+  }
+
+
+
+}