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:08 UTC
[metamodel] 06/11: thanks for your advise,I modify the code.
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: 李小保 <li...@mininglamp.com>
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);
+ }
+
+}