From 3de275fa8cc6781196b91f07bf83a201a0dd7433 Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Tue, 28 Jul 2015 23:19:17 +0800 Subject: [PATCH 1/2] improved odps sql formmatter --- .../odps/visitor/OdpsOutputVisitor.java | 14 ++++++++++++-- .../bvt/sql/odps/OdpsCreateTableTest.java | 2 +- .../bvt/sql/odps/OdpsCreateTableTest2.java | 2 +- .../bvt/sql/odps/OdpsCreateTableTest_1.java | 2 +- .../bvt/sql/odps/OdpsFormatCommentTest15.java | 8 ++++---- .../bvt/sql/odps/OdpsFormatCommentTest16.java | 14 ++++++-------- .../bvt/sql/odps/OdpsFormatCommentTest18.java | 8 ++++---- .../bvt/sql/odps/OdpsFormatCommentTest21.java | 18 ++++++++++++++++++ 8 files changed, 47 insertions(+), 21 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest21.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index 00cc464ec2..f8053931b7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.odps.visitor; import java.util.List; +import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLHint; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLSetQuantifier; @@ -62,8 +63,6 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis x.getName().accept(this); - x.getName().accept(this); - if (x.getLike() != null) { print(" LIKE "); x.getLike().accept(this); @@ -702,4 +701,15 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis print(JoinType.toString(joinType)); } } + + public boolean visit(SQLDataType x) { + print(x.getName().toUpperCase()); + if (x.getArguments().size() > 0) { + print("("); + printAndAccept(x.getArguments(), ", "); + print(")"); + } + + return false; + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest.java index 96905760d2..7fb7630ebf 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest.java @@ -25,7 +25,7 @@ public class OdpsCreateTableTest extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toOdpsString(stmt); - Assert.assertEquals("CREATE TABLE IF NOT EXISTS sale_detailsale_detail ("// + Assert.assertEquals("CREATE TABLE IF NOT EXISTS sale_detail ("// + "\n\tshop_name STRING,"// + "\n\tcustomer_id STRING,"// + "\n\ttotal_price DOUBLE"// diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest2.java index b33be6d2a8..8a71f46d3a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest2.java @@ -17,7 +17,7 @@ public class OdpsCreateTableTest2 extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toOdpsString(stmt); - Assert.assertEquals("CREATE TABLE sale_detailsale_detail" + Assert.assertEquals("CREATE TABLE sale_detail" + "\nSELECT *" // + "\nFROM dual", output); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest_1.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest_1.java index 037c51c10b..ee70e3c024 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsCreateTableTest_1.java @@ -17,6 +17,6 @@ public class OdpsCreateTableTest_1 extends TestCase { SQLStatement stmt = parser.parseStatementList().get(0); parser.match(Token.EOF); String output = SQLUtils.toOdpsString(stmt); - Assert.assertEquals("CREATE TABLE sale_detail_likesale_detail_like LIKE sale_detail", output); + Assert.assertEquals("CREATE TABLE sale_detail_like LIKE sale_detail", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest15.java index 3d20d95d2c..8e6de173e0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest15.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest15.java @@ -9,12 +9,12 @@ import junit.framework.TestCase; public class OdpsFormatCommentTest15 extends TestCase { public void test_column_comment() throws Exception { String sql = "create table t1 (f0 bigint) partitioned by (ds string, hh string);"; - Assert.assertEquals("CREATE TABLE t1t1 (" - + "\n\tf0 bigint" + Assert.assertEquals("CREATE TABLE t1 (" + + "\n\tf0 BIGINT" + "\n)" + "\nPARTITIONED BY (" - + "\n\tds string," - + "\n\thh string" + + "\n\tds STRING," + + "\n\thh STRING" + "\n);", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest16.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest16.java index e0f2779055..959c070598 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest16.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest16.java @@ -1,7 +1,5 @@ package com.alibaba.druid.bvt.sql.odps; -import java.net.URLDecoder; - import org.junit.Assert; import com.alibaba.druid.sql.SQLUtils; @@ -18,14 +16,14 @@ public class OdpsFormatCommentTest16 extends TestCase { + "ds string, -- c_1" + "\nhh string -- c_2" + "\n);"; - Assert.assertEquals("CREATE TABLE t1t1 (" - + "\n\tf0 bigint, -- fc_0" - + "\n\tf1 string, -- fc_1" - + "\n\tf2 string -- fc_2" + Assert.assertEquals("CREATE TABLE t1 (" + + "\n\tf0 BIGINT, -- fc_0" + + "\n\tf1 STRING, -- fc_1" + + "\n\tf2 STRING -- fc_2" + "\n)" + "\nPARTITIONED BY (" - + "\n\tds string, -- c_1" - + "\n\thh string -- c_2" + + "\n\tds STRING, -- c_1" + + "\n\thh STRING -- c_2" + "\n);", SQLUtils.formatOdps(sql)); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest18.java index d4e2a44f02..866cf394ca 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest18.java @@ -9,16 +9,16 @@ import junit.framework.TestCase; public class OdpsFormatCommentTest18 extends TestCase { public void test_column_comment() throws Exception { String sql = "create table t (f1 string comment \"xxx\")"; - Assert.assertEquals("CREATE TABLE tt (" - + "\n\tf1 string COMMENT 'xxx'" + Assert.assertEquals("CREATE TABLE t (" + + "\n\tf1 STRING COMMENT 'xxx'" + "\n)", SQLUtils.formatOdps(sql)); } public void test_column_comment_2() throws Exception { String sql = "create table t (f1 string comment \"xxx's\")"; - Assert.assertEquals("CREATE TABLE tt (" - + "\n\tf1 string COMMENT 'xxx''s'" + Assert.assertEquals("CREATE TABLE t (" + + "\n\tf1 STRING COMMENT 'xxx''s'" + "\n)", SQLUtils.formatOdps(sql)); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest21.java new file mode 100644 index 0000000000..2532a71680 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest21.java @@ -0,0 +1,18 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest21 extends TestCase { + public void test_column_comment() throws Exception { + String sql = "create table sales (f1 bigint)"; + Assert.assertEquals("CREATE TABLE sales (" + + "\n\tf1 BIGINT" + + "\n)", SQLUtils.formatOdps(sql)); + } + + +} From 9d45ec9d128a903ac47d2f5cb5ddba06d41dba8f Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Tue, 28 Jul 2015 23:33:01 +0800 Subject: [PATCH 2/2] improved odps sql formmatter --- .../odps/visitor/OdpsOutputVisitor.java | 32 +++++++++++++++++-- .../sql/visitor/SQLASTOutputVisitor.java | 6 +++- .../bvt/sql/odps/OdpsFormatCommentTest22.java | 28 ++++++++++++++++ .../druid/bvt/sql/odps/OdpsIfTest.java | 2 +- 4 files changed, 64 insertions(+), 4 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest22.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index f8053931b7..7a8e90a7c6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -15,7 +15,9 @@ */ package com.alibaba.druid.sql.dialect.odps.visitor; +import java.util.HashSet; import java.util.List; +import java.util.Set; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLHint; @@ -49,7 +51,24 @@ import com.alibaba.druid.sql.dialect.odps.ast.OdpsUDTFSQLSelectItem; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVisitor { - + + private Set builtInFunctions = new HashSet(); + + { + builtInFunctions.add("IF"); + builtInFunctions.add("COALESCE"); + builtInFunctions.add("TO_DATE"); + builtInFunctions.add("SUBSTR"); + builtInFunctions.add("INSTR"); + builtInFunctions.add("LENGTH"); + builtInFunctions.add("SPLIT"); + builtInFunctions.add("TOLOWER"); + builtInFunctions.add("TOUPPER"); + builtInFunctions.add("EXPLODE"); + builtInFunctions.add("LEAST"); + builtInFunctions.add("GREATEST"); + } + public OdpsOutputVisitor(Appendable appender){ super(appender); } @@ -683,7 +702,7 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis x.getOwner().accept(this); print(":"); } - print(x.getMethodName()); + printFunctionName(x.getMethodName()); print("("); printAndAccept(x.getParameters(), ", "); print(")"); @@ -712,4 +731,13 @@ public class OdpsOutputVisitor extends SQLASTOutputVisitor implements OdpsASTVis return false; } + + protected void printFunctionName(String name) { + String upperName = name.toUpperCase(); + if (builtInFunctions.contains(upperName)) { + print(upperName); + } else { + print(name); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 1d50a24f61..f555b041b9 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -562,12 +562,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab x.getOwner().accept(this); print("."); } - print(x.getMethodName()); + printFunctionName(x.getMethodName()); print("("); printAndAccept(x.getParameters(), ", "); print(")"); return false; } + + protected void printFunctionName(String name) { + print(name); + } public boolean visit(SQLAggregateExpr x) { print(x.getMethodName()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest22.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest22.java new file mode 100644 index 0000000000..36112f4a61 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsFormatCommentTest22.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.bvt.sql.odps; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; + +import junit.framework.TestCase; + +public class OdpsFormatCommentTest22 extends TestCase { + public void test_if() throws Exception { + String sql = "select if(a>0,1, 0) from dual"; + Assert.assertEquals("SELECT IF(a > 0, 1, 0)" + + "\nFROM dual", SQLUtils.formatOdps(sql)); + } + + public void test_coalesce() throws Exception { + String sql = "select coalesce(f1,f2) from dual"; + Assert.assertEquals("SELECT COALESCE(f1, f2)" + + "\nFROM dual", SQLUtils.formatOdps(sql)); + } + public void test_count() throws Exception { + String sql = "select count(*) from dual"; + Assert.assertEquals("SELECT COUNT(*)" + + "\nFROM dual", SQLUtils.formatOdps(sql)); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java index 28ec943d85..53e53bb095 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/odps/OdpsIfTest.java @@ -10,7 +10,7 @@ public class OdpsIfTest extends TestCase { public void test_if() throws Exception { String sql = "select sum(if(a > 0, 1, 0)) from t1"; - Assert.assertEquals("SELECT SUM(if(a > 0, 1, 0))" // + Assert.assertEquals("SELECT SUM(IF(a > 0, 1, 0))" // + "\nFROM t1", SQLUtils.formatOdps(sql)); } }