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");