You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@metamodel.apache.org by ka...@apache.org on 2019/02/26 06:21:07 UTC

[metamodel] 05/11: thanks for your advise, I modify the code and add Rewriter for different Hive sersion.

This is an automated email from the ASF dual-hosted git repository.

kaspersor pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/metamodel.git

commit 16a955f84f605baba914e87f7a60331d908f76fa
Author: 李小保 <li...@mininglamp.com>
AuthorDate: Wed Jan 30 09:54:46 2019 +0800

    thanks for your advise,I modify the code and add Rewriter for different Hive sersion.
---
 .../org/apache/metamodel/jdbc/JdbcDataContext.java | 23 ++++++-
 .../jdbc/dialects/Hive2QueryRewriter.java          | 67 +++++++++++++++++++
 .../metamodel/jdbc/dialects/HiveQueryRewriter.java | 78 ----------------------
 .../metamodel/dialects/HiveQueryRewriterTest.java  |  8 ++-
 4 files changed, 94 insertions(+), 82 deletions(-)

diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
index 1668438..2f01f04 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java
@@ -48,6 +48,7 @@ import org.apache.metamodel.jdbc.JdbcUtils.JdbcActionType;
 import org.apache.metamodel.jdbc.dialects.DB2QueryRewriter;
 import org.apache.metamodel.jdbc.dialects.DefaultQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.H2QueryRewriter;
+import org.apache.metamodel.jdbc.dialects.Hive2QueryRewriter;
 import org.apache.metamodel.jdbc.dialects.HiveQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.HsqldbQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.IQueryRewriter;
@@ -231,7 +232,27 @@ public class JdbcDataContext extends AbstractDataContext implements UpdateableDa
         } else if (DATABASE_PRODUCT_H2.equals(_databaseProductName)) {
             setQueryRewriter(new H2QueryRewriter(this));
         } else if (DATABASE_PRODUCT_HIVE.equals(_databaseProductName)) {
-            setQueryRewriter(new HiveQueryRewriter(this));
+            int majorVersion = 0;
+            String[] parts = databaseVersion.split("\\.");
+            if(parts.length < 2) {
+                logger.warn("Illegal Hive Version: " + databaseVersion + " (expected A.B.* format)");
+                parts[0] = "0";
+            } else {
+                majorVersion = Integer.valueOf(parts[0]);
+            }
+            switch (majorVersion){
+                case 1:
+                    setQueryRewriter(new HiveQueryRewriter(this));
+                    break;
+                case 2:
+                case 3:
+                    setQueryRewriter(new Hive2QueryRewriter(this));
+                    break;
+                default:
+                    setQueryRewriter(new HiveQueryRewriter(this));
+                    break;
+            }
+
         } else if (DATABASE_PRODUCT_SQLITE.equals(_databaseProductName)) {
             setQueryRewriter(new SQLiteQueryRewriter(this));
         } else {
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java
new file mode 100644
index 0000000..ec449bf
--- /dev/null
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java
@@ -0,0 +1,67 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.jdbc.dialects;
+
+import java.util.List;
+import org.apache.metamodel.MetaModelException;
+import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.ColumnType;
+
+/**
+ * Query rewriter for Apache Hive
+ */
+public class Hive2QueryRewriter extends LimitOffsetQueryRewriter {
+
+    private int majorVersion;
+
+    public Hive2QueryRewriter(JdbcDataContext dataContext) {
+        super(dataContext);
+    }
+
+    @Override
+    public String rewriteColumnType(ColumnType columnType, Integer columnSize) {
+        if (columnType == ColumnType.INTEGER) {
+            return "INT";
+        }
+
+        if(columnType == ColumnType.STRING) {
+            return "STRING";
+        }
+
+        // Hive does not support VARCHAR without a width, nor VARCHAR(MAX).
+        // Returning max allowable column size instead.
+        if (columnType == ColumnType.VARCHAR && columnSize == null) {
+            return super.rewriteColumnType(columnType, 65535);
+        }
+        return super.rewriteColumnType(columnType, columnSize);
+    }
+    
+    @Override
+    public boolean isTransactional() {
+        return false;
+    }
+    
+	@Override
+	public boolean isPrimaryKeySupported() {
+		return false;
+	}
+}
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
index 48d3eb8..b187b77 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/HiveQueryRewriter.java
@@ -31,60 +31,12 @@ import org.apache.metamodel.schema.ColumnType;
  */
 public class HiveQueryRewriter extends DefaultQueryRewriter {
 
-    private int majorVersion;
-
     public HiveQueryRewriter(JdbcDataContext dataContext) {
         super(dataContext);
-        String version = dataContext.getDatabaseVersion();
-        String[] parts = version.split("\\.");
-        if(parts.length < 2) {
-            throw new RuntimeException("Illegal Hive Version: " + version + " (expected A.B.* format)");
-        } else {
-            majorVersion = Integer.valueOf(parts[0]);
-        }
-    }
-
-    @Override
-    public final boolean isFirstRowSupported(final Query query) {
-        switch (majorVersion) {
-            case 2:
-            case 3:
-                return true;
-            default:
-                return super.isFirstRowSupported(query);
-        }
-    }
-
-    @Override
-    public final boolean isMaxRowsSupported() {
-        switch (majorVersion) {
-            case 2:
-            case 3:
-                return true;
-            default:
-                return super.isMaxRowsSupported();
-        }
     }
 
-    /**
-     * {@inheritDoc}
-     *
-     * If the Max rows and/or First row property of the query is set, then we
-     * will use the database's LIMIT and OFFSET functions.
-     */
     @Override
     public String rewriteQuery(Query query) {
-        switch (majorVersion) {
-            case 2:
-            case 3:
-                return rewriteQueryForHive2(query);
-            default:
-                return rewriteQueryForHive1(query);
-        }
-
-    }
-
-    private String rewriteQueryForHive1(Query query) {
 
         Integer maxRows = query.getMaxRows();
         Integer firstRow = query.getFirstRow();
@@ -95,7 +47,6 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
             }
         }
 
-
         if (maxRows == null && (firstRow == null || firstRow.intValue() == 1)) {
             return super.rewriteQuery(query);
         }
@@ -136,35 +87,6 @@ public class HiveQueryRewriter extends DefaultQueryRewriter {
 
     }
 
-    private String rewriteQueryForHive2(Query query) {
-        Integer maxRows = query.getMaxRows();
-        Integer firstRow = query.getFirstRow();
-
-        if(firstRow != null && firstRow > 1) {
-            if(query.getOrderByClause().getItemCount() == 0){
-                throw new MetaModelException("OFFSET requires an ORDER BY clause");
-            }
-        }
-
-        String queryString = super.rewriteQuery(query);
-
-        if (maxRows != null || firstRow != null) {
-
-            if (maxRows == null) {
-                maxRows = Integer.MAX_VALUE;
-            }
-            queryString = queryString + " LIMIT " + maxRows;
-
-            if (firstRow != null && firstRow > 1) {
-                // offset is 0-based
-                int offset = firstRow - 1;
-                queryString = queryString + " OFFSET " + offset;
-            }
-        }
-
-        return queryString;
-
-    }
 
     @Override
     public String rewriteColumnType(ColumnType columnType, Integer columnSize) {
diff --git a/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
index 423b120..c4bc753 100644
--- a/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/dialects/HiveQueryRewriterTest.java
@@ -21,8 +21,12 @@ package org.apache.metamodel.dialects;
 import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_HIVE;
 import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_SQLSERVER;
 
+import java.sql.Connection;
+import java.sql.Driver;
+import java.sql.DriverManager;
 import junit.framework.TestCase;
 import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.jdbc.dialects.Hive2QueryRewriter;
 import org.apache.metamodel.jdbc.dialects.HiveQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.MysqlQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.SQLServerQueryRewriter;
@@ -45,8 +49,6 @@ public class HiveQueryRewriterTest extends TestCase {
     @Override
     protected void setUp() throws Exception {
         super.setUp();
-
-
     }
 
     public void testHive1SqlWithPagination() {
@@ -73,7 +75,7 @@ public class HiveQueryRewriterTest extends TestCase {
         EasyMock.expect(mockContext.getIdentifierQuoteString()).andReturn("quoteString").anyTimes();
 
         EasyMock.replay(mockContext);
-        HiveQueryRewriter qr = new HiveQueryRewriter(mockContext);
+        Hive2QueryRewriter qr = new Hive2QueryRewriter(mockContext);
 
         MutableColumn col1 = new MutableColumn("kkbh");
         MutableColumn col2 = new MutableColumn("kkmc");