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);
+    }
+
+}