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: 李小保 <[email protected]> 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");
