Example #1
0
 /**
  * @brief Visit the statement. This is the function that should be called in the first place.
  * @param statement A SQL statement.
  */
 public void visit(Statement statement) throws Exception {
   if (statement instanceof Select) {
     Select select = (Select) statement;
     if (select.getWithItemsList() != null) {
       for (WithItem withItem : ((Select) statement).getWithItemsList()) {
         withItem.accept(this);
       }
     }
     if (select.getSelectBody() != null) {
       select.getSelectBody().accept(this);
     }
   } else if (statement instanceof DescribeTable) {
     ((DescribeTable) statement).accept(this);
   }
   // TODO: Add more type support here.
 }
 /**
  * convert to order by sql
  *
  * @param sql
  * @param orderBy
  * @return
  */
 public static String converToOrderBySql(String sql, String orderBy) {
   // 解析SQL
   Statement stmt = null;
   try {
     stmt = CCJSqlParserUtil.parse(sql);
     Select select = (Select) stmt;
     SelectBody selectBody = select.getSelectBody();
     // 处理body-去最外层order by
     List<OrderByElement> orderByElements = extraOrderBy(selectBody);
     String defaultOrderBy = PlainSelect.orderByToString(orderByElements);
     if (defaultOrderBy.indexOf('?') != -1) {
       throw new RuntimeException("原SQL[" + sql + "]中的order by包含参数,因此不能使用OrderBy插件进行修改!");
     }
     // 新的sql
     sql = select.toString();
   } catch (Throwable e) {
     e.printStackTrace();
   }
   return sql + " order by " + orderBy;
 }