minor, fix getFromNode  when SQL has limit/order by clause


Project: http://git-wip-us.apache.org/repos/asf/kylin/repo
Commit: http://git-wip-us.apache.org/repos/asf/kylin/commit/2eca43c4
Tree: http://git-wip-us.apache.org/repos/asf/kylin/tree/2eca43c4
Diff: http://git-wip-us.apache.org/repos/asf/kylin/diff/2eca43c4

Branch: refs/heads/master
Commit: 2eca43c40723cce0f12a56a1299894bbf5803d03
Parents: c8bab3d
Author: Jiatao Tao <245915...@qq.com>
Authored: Mon Aug 14 05:05:31 2017 -0500
Committer: GitHub <nore...@github.com>
Committed: Mon Aug 14 05:05:31 2017 -0500

----------------------------------------------------------------------
 .../metadata/model/tool/CalciteParser.java      | 20 ++++++++++++++------
 .../apache/kylin/query/util/PushDownUtil.java   |  4 ++++
 .../kylin/query/util/PushDownUtilTest.java      | 10 +++++-----
 3 files changed, 23 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/kylin/blob/2eca43c4/core-metadata/src/main/java/org/apache/kylin/metadata/model/tool/CalciteParser.java
----------------------------------------------------------------------
diff --git 
a/core-metadata/src/main/java/org/apache/kylin/metadata/model/tool/CalciteParser.java
 
b/core-metadata/src/main/java/org/apache/kylin/metadata/model/tool/CalciteParser.java
index a48abae..01f0b19 100644
--- 
a/core-metadata/src/main/java/org/apache/kylin/metadata/model/tool/CalciteParser.java
+++ 
b/core-metadata/src/main/java/org/apache/kylin/metadata/model/tool/CalciteParser.java
@@ -29,6 +29,7 @@ import org.apache.calcite.sql.SqlIdentifier;
 import org.apache.calcite.sql.SqlLiteral;
 import org.apache.calcite.sql.SqlNode;
 import org.apache.calcite.sql.SqlNodeList;
+import org.apache.calcite.sql.SqlOrderBy;
 import org.apache.calcite.sql.SqlSelect;
 import org.apache.calcite.sql.parser.SqlParseException;
 import org.apache.calcite.sql.parser.SqlParser;
@@ -69,14 +70,21 @@ public class CalciteParser {
     }
 
     public static SqlNode getFromNode(String sql) {
-        //When the sql have limit clause, calcite will parse it as a SqlOrder 
Object.
-        sql = sql.split("LIMIT")[0];
-        SqlNode fromNode = null;
+        SqlNode node = null;
         try {
-            fromNode = ((SqlSelect) (CalciteParser.parse(sql))).getFrom();
+            node = CalciteParser.parse(sql);
         } catch (SqlParseException e) {
-            throw new RuntimeException("Failed to parse expression \'" + sql
-                    + "\', please make sure the expression is valid");
+            throw new RuntimeException(
+                    "Failed to parse expression \'" + sql + "\', please make 
sure the expression is valid");
+        }
+        //When the sql have limit clause, calcite will parse it as a SqlOrder 
Object.
+        SqlNode fromNode = null;
+        if (node instanceof SqlOrderBy) {
+            SqlOrderBy orderBy = (SqlOrderBy) node;
+            fromNode = ((SqlSelect) orderBy.query).getFrom();
+        } else {
+            SqlSelect sqlSelect = (SqlSelect) node;
+            fromNode = sqlSelect.getFrom();
         }
         return fromNode;
     }

http://git-wip-us.apache.org/repos/asf/kylin/blob/2eca43c4/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java
----------------------------------------------------------------------
diff --git a/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java 
b/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java
index b2248f8..51352d2 100644
--- a/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java
+++ b/query/src/main/java/org/apache/kylin/query/util/PushDownUtil.java
@@ -112,6 +112,10 @@ public class PushDownUtil {
         FromTablesVisitor ftv = new FromTablesVisitor();
         fromNode.accept(ftv);
         List<SqlNode> tablesWithoutSchema = ftv.getTablesWithoutSchema();
+        // sql do not need completion
+        if (tablesWithoutSchema.isEmpty()) {
+            return inputSql;
+        }
 
         List<Pair<Integer, Integer>> tablesPos = new ArrayList<>();
         for (SqlNode tables : tablesWithoutSchema) {

http://git-wip-us.apache.org/repos/asf/kylin/blob/2eca43c4/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java
----------------------------------------------------------------------
diff --git 
a/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java 
b/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java
index e2ccd9e..8ed58f7 100644
--- a/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java
+++ b/query/src/test/java/org/apache/kylin/query/util/PushDownUtilTest.java
@@ -25,12 +25,12 @@ import org.mockito.Mockito;
 public class PushDownUtilTest {
     @Test
     public void testSchemaCompletion() {
-        String sql1 = "SELECT a \n"+
+        String sql1 = "SELECT a \n" +
                 "FROM a.KYLIN_SALES as KYLIN_SALES\n" +
                 "INNER JOIN \"A\".KYLIN_ACCOUNT as BUYER_ACCOUNT\n" +
                 "ON KYLIN_SALES.BUYER_ID = BUYER_ACCOUNT.ACCOUNT_ID\n" +
                 "INNER JOIN \"KYLIN_COUNTRY\" as BUYER_COUNTRY\n" +
-                "ON BUYER_ACCOUNT.ACCOUNT_COUNTRY = BUYER_COUNTRY.COUNTRY";
+                "ON BUYER_ACCOUNT.ACCOUNT_COUNTRY = BUYER_COUNTRY.COUNTRY 
LIMIT 5";
         String sql2 = "select * from DB2.t,DB2.tt,ttt";
 
         String sql3 = "SELECT t1.week_beg_dt, t1.sum_price, t2.cnt\n" +
@@ -56,14 +56,14 @@ public class PushDownUtilTest {
                 "  ON test_kylin_fact.lstg_site_id = test_sites.site_id\n" +
                 "  group by test_cal_dt.week_beg_dt\n" +
                 ") t2\n" +
-                "on t1.week_beg_dt=t2.week_beg_dt";
+                "on t1.week_beg_dt=t2.week_beg_dt limit 5";
 
         String exceptSQL1 = "SELECT a \n" +
                 "FROM a.KYLIN_SALES as KYLIN_SALES\n" +
                 "INNER JOIN \"A\".KYLIN_ACCOUNT as BUYER_ACCOUNT\n" +
                 "ON KYLIN_SALES.BUYER_ID = BUYER_ACCOUNT.ACCOUNT_ID\n" +
                 "INNER JOIN EDW.\"KYLIN_COUNTRY\" as BUYER_COUNTRY\n" +
-                "ON BUYER_ACCOUNT.ACCOUNT_COUNTRY = BUYER_COUNTRY.COUNTRY";
+                "ON BUYER_ACCOUNT.ACCOUNT_COUNTRY = BUYER_COUNTRY.COUNTRY 
LIMIT 5";
 
         String exceptSQL2 = "select * from DB2.t,DB2.tt,EDW.ttt";
 
@@ -90,7 +90,7 @@ public class PushDownUtilTest {
                 "  ON test_kylin_fact.lstg_site_id = test_sites.site_id\n" +
                 "  group by test_cal_dt.week_beg_dt\n" +
                 ") t2\n" +
-                "on t1.week_beg_dt=t2.week_beg_dt";
+                "on t1.week_beg_dt=t2.week_beg_dt limit 5";
         Assert.assertEquals(exceptSQL1, PushDownUtil.schemaCompletion(sql1, 
"EDW"));
         Assert.assertEquals(exceptSQL2, PushDownUtil.schemaCompletion(sql2, 
"EDW"));
         Assert.assertEquals(exceptSQL3, PushDownUtil.schemaCompletion(sql3, 
"EDW"));

Reply via email to