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 cb28d7ce5ea98b10e900af5d72a742426b2ea0ce Author: 李小保 <[email protected]> AuthorDate: Fri Feb 1 00:39:30 2019 +0800 thanks for your advise,I modify the code. --- .../org/apache/metamodel/jdbc/JdbcDataContext.java | 32 +++++++------- .../metamodel/jdbc/dialects/DB2QueryRewriter.java | 30 +------------ .../jdbc/dialects/Hive2QueryRewriter.java | 12 +++--- .../metamodel/jdbc/dialects/HiveQueryRewriter.java | 38 ++-------------- .../jdbc/dialects/RowNumberQueryRewriter.java | 50 ++++++++++++++++++++++ 5 files changed, 77 insertions(+), 85 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 2f01f04..4329179 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/JdbcDataContext.java @@ -232,27 +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)) { - int majorVersion = 0; + int majorVersion = -1; String[] parts = databaseVersion.split("\\."); - if(parts.length < 2) { + if (parts.length < 2) { logger.warn("Illegal Hive Version: " + databaseVersion + " (expected A.B.* format)"); - parts[0] = "0"; } else { - majorVersion = Integer.valueOf(parts[0]); + try { + majorVersion = Integer.valueOf(parts[0]); + } catch (NumberFormatException ne) { + logger.warn("Illegal Hive Major Version: " + databaseVersion + " (can not get major version)"); + } } - switch (majorVersion){ - case 1: - setQueryRewriter(new HiveQueryRewriter(this)); - break; - case 2: - case 3: - setQueryRewriter(new Hive2QueryRewriter(this)); - break; - default: - setQueryRewriter(new HiveQueryRewriter(this)); - break; + if (majorVersion == -1) { + logger.warn("Illegal Hive Major Version :" + majorVersion + " can not decide which QueryRewrite to use, use DefaultQueryRewriter"); + setQueryRewriter(new DefaultQueryRewriter(this)); + } else if (majorVersion == 0 || majorVersion == 1) { + //version 0 or 1 use HiveQueryRewriter + setQueryRewriter(new HiveQueryRewriter(this)); + } else if (majorVersion >= 2) { + //from version 2 support limit offset + setQueryRewriter(new Hive2QueryRewriter(this)); } - } else if (DATABASE_PRODUCT_SQLITE.equals(_databaseProductName)) { setQueryRewriter(new SQLiteQueryRewriter(this)); } else { diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java index 601bfd8..8f21692 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/DB2QueryRewriter.java @@ -34,7 +34,7 @@ import org.apache.metamodel.util.TimeComparator; /** * Query rewriter for IBM DB2 */ -public class DB2QueryRewriter extends DefaultQueryRewriter { +public class DB2QueryRewriter extends RowNumberQueryRewriter { public DB2QueryRewriter(JdbcDataContext dataContext) { super(dataContext); @@ -86,33 +86,7 @@ public class DB2QueryRewriter extends DefaultQueryRewriter { // ROW_NUMBER() AS metamodel_row_number // FROM [remainder of regular query]) // WHERE metamodel_row_number BETWEEN [firstRow] and [maxRows]; - - final Query innerQuery = query.clone(); - innerQuery.setFirstRow(null); - innerQuery.setMaxRows(null); - - final Query outerQuery = new Query(); - final FromItem subQuerySelectItem = new FromItem(innerQuery).setAlias("metamodel_subquery"); - outerQuery.from(subQuerySelectItem); - - final List<SelectItem> innerSelectItems = innerQuery.getSelectClause().getItems(); - for (SelectItem selectItem : innerSelectItems) { - outerQuery.select(new SelectItem(selectItem, subQuerySelectItem)); - } - - final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause()); - final String rowOver = "ROW_NUMBER() " + "OVER(" + rewrittenOrderByClause + ")"; - innerQuery.select(new SelectItem(rowOver, "metamodel_row_number")); - innerQuery.getOrderByClause().removeItems(); - - final String baseQueryString = rewriteQuery(outerQuery); - - if (maxRows == null) { - return baseQueryString + " WHERE metamodel_row_number > " + (firstRow - 1); - } - - return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND " - + (firstRow - 1 + maxRows); + return getRowNumberSql(query, maxRows, firstRow); } } 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 index ec449bf..7db9de5 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/Hive2QueryRewriter.java @@ -31,8 +31,6 @@ import org.apache.metamodel.schema.ColumnType; */ public class Hive2QueryRewriter extends LimitOffsetQueryRewriter { - private int majorVersion; - public Hive2QueryRewriter(JdbcDataContext dataContext) { super(dataContext); } @@ -43,7 +41,7 @@ public class Hive2QueryRewriter extends LimitOffsetQueryRewriter { return "INT"; } - if(columnType == ColumnType.STRING) { + if (columnType == ColumnType.STRING) { return "STRING"; } @@ -60,8 +58,8 @@ public class Hive2QueryRewriter extends LimitOffsetQueryRewriter { return false; } - @Override - public boolean isPrimaryKeySupported() { - 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 b187b77..f134656 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 @@ -29,7 +29,7 @@ import org.apache.metamodel.schema.ColumnType; /** * Query rewriter for Apache Hive */ -public class HiveQueryRewriter extends DefaultQueryRewriter { +public class HiveQueryRewriter extends RowNumberQueryRewriter { public HiveQueryRewriter(JdbcDataContext dataContext) { super(dataContext); @@ -41,12 +41,6 @@ public class HiveQueryRewriter extends DefaultQueryRewriter { 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"); - } - } - if (maxRows == null && (firstRow == null || firstRow.intValue() == 1)) { return super.rewriteQuery(query); } @@ -55,37 +49,13 @@ public class HiveQueryRewriter extends DefaultQueryRewriter { // We prefer to use the "LIMIT n" approach, if // firstRow is not specified. return super.rewriteQuery(query) + " LIMIT " + maxRows; + } else { + return getRowNumberSql(query, maxRows, firstRow); } - final Query innerQuery = query.clone(); - innerQuery.setFirstRow(null); - innerQuery.setMaxRows(null); - - final Query outerQuery = new Query(); - final FromItem subQuerySelectItem = new FromItem(innerQuery).setAlias("metamodel_subquery"); - outerQuery.from(subQuerySelectItem); - - final List<SelectItem> innerSelectItems = innerQuery.getSelectClause().getItems(); - for (SelectItem selectItem : innerSelectItems) { - outerQuery.select(new SelectItem(selectItem, subQuerySelectItem)); - } - - - final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause()); - final String rowOver = "ROW_NUMBER() " + "OVER(" + rewrittenOrderByClause + ")"; - innerQuery.select(new SelectItem(rowOver, "metamodel_row_number")); - innerQuery.getOrderByClause().removeItems(); - - final String baseQueryString = rewriteQuery(outerQuery); - - if (maxRows == null) { - return baseQueryString + " WHERE metamodel_row_number > " + (firstRow - 1); - } + } - return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND " - + (firstRow - 1 + maxRows); - } @Override diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java new file mode 100644 index 0000000..6544c09 --- /dev/null +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/RowNumberQueryRewriter.java @@ -0,0 +1,50 @@ +package org.apache.metamodel.jdbc.dialects; + +import java.util.List; +import org.apache.metamodel.jdbc.JdbcDataContext; +import org.apache.metamodel.query.FromItem; +import org.apache.metamodel.query.Query; +import org.apache.metamodel.query.SelectItem; + +/** + * @author lixiaobao + * @create 2019-02-01 12:01 AM + **/ + +public class RowNumberQueryRewriter extends DefaultQueryRewriter { + + public RowNumberQueryRewriter(JdbcDataContext dataContext) { + super(dataContext); + } + + protected String getRowNumberSql(Query query, Integer maxRows, Integer firstRow) { + final Query innerQuery = query.clone(); + innerQuery.setFirstRow(null); + innerQuery.setMaxRows(null); + + final Query outerQuery = new Query(); + final FromItem subQuerySelectItem = new FromItem(innerQuery).setAlias("metamodel_subquery"); + outerQuery.from(subQuerySelectItem); + + final List<SelectItem> innerSelectItems = innerQuery.getSelectClause().getItems(); + for (SelectItem selectItem : innerSelectItems) { + outerQuery.select(new SelectItem(selectItem, subQuerySelectItem)); + } + + + final String rewrittenOrderByClause = rewriteOrderByClause(innerQuery, innerQuery.getOrderByClause()); + final String rowOver = "ROW_NUMBER() OVER(" + rewrittenOrderByClause + ")"; + innerQuery.select(new SelectItem(rowOver, "metamodel_row_number")); + innerQuery.getOrderByClause().removeItems(); + + final String baseQueryString = rewriteQuery(outerQuery); + + if (maxRows == null) { + return baseQueryString + " WHERE metamodel_row_number > " + (firstRow - 1); + } + + return baseQueryString + " WHERE metamodel_row_number BETWEEN " + firstRow + " AND " + + (firstRow - 1 + maxRows); + } + +}
