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 2014/05/31 12:01:53 UTC

git commit: METAMODEL-59: Added Balendra Singhs contribution (with minor modifications).

Repository: incubator-metamodel
Updated Branches:
  refs/heads/master bd54b1e0d -> 49a1553ca


METAMODEL-59: Added Balendra Singhs contribution (with minor
modifications).

Project: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/commit/49a1553c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/tree/49a1553c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-metamodel/diff/49a1553c

Branch: refs/heads/master
Commit: 49a1553cac0fb17c906d9d43dff1bd6bbecd5dd1
Parents: bd54b1e
Author: Balendra Singh <ba...@gmail.com>
Authored: Sat May 31 12:01:01 2014 +0200
Committer: Kasper Sørensen <i....@gmail.com>
Committed: Sat May 31 12:01:01 2014 +0200

----------------------------------------------------------------------
 CHANGES.txt                                     |   1 +
 .../jdbc/dialects/SQLServerQueryRewriter.java   | 105 ++++++++++++++-----
 .../dialects/SQLServerQueryRewriterTest.java    |  23 ++++
 3 files changed, 100 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/49a1553c/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index d32a9d9..ddd26a2 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -15,6 +15,7 @@ Apache MetaModel 4.1.0-incubating
  * [METAMODEL-33] - Ensured that Apache Rat plugin for Maven is properly activated.
  * [METAMODEL-37] - Removed old site sources from project.
  * [METAMODEL-3] - Improved writing of Byte-Order-Mark (BOM) for various encoding spelling variants 
+ * [METAMODEL-59] - Fixed a bug related to handling of date/time literals in MS SQL queries
 
 Apache MetaModel 4.0.0-incubating
 

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/49a1553c/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/SQLServerQueryRewriter.java
----------------------------------------------------------------------
diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/SQLServerQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/SQLServerQueryRewriter.java
index 42c54c1..ebecb9a 100644
--- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/SQLServerQueryRewriter.java
+++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/SQLServerQueryRewriter.java
@@ -18,39 +18,86 @@
  */
 package org.apache.metamodel.jdbc.dialects;
 
+import java.text.DateFormat;
+import java.util.Date;
+
 import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.query.FilterItem;
+import org.apache.metamodel.query.OperatorType;
 import org.apache.metamodel.query.Query;
 import org.apache.metamodel.query.SelectClause;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.Column;
+import org.apache.metamodel.util.DateUtils;
 
 public class SQLServerQueryRewriter extends DefaultQueryRewriter {
 
-	public SQLServerQueryRewriter(JdbcDataContext dataContext) {
-		super(dataContext);
-	}
-
-	@Override
-	public boolean isMaxRowsSupported() {
-		return true;
-	}
-
-	/**
-	 * SQL server expects the fully qualified column name, including schema, in
-	 * select items.
-	 */
-	@Override
-	public boolean isSchemaIncludedInColumnPaths() {
-		return true;
-	}
-
-	@Override
-	protected String rewriteSelectClause(Query query, SelectClause selectClause) {
-		String result = super.rewriteSelectClause(query, selectClause);
-
-		Integer maxRows = query.getMaxRows();
-		if (maxRows != null) {
-			result = "SELECT TOP " + maxRows + " " + result.substring(7);
-		}
-
-		return result;
-	}
+    public SQLServerQueryRewriter(JdbcDataContext dataContext) {
+        super(dataContext);
+    }
+
+    @Override
+    public boolean isMaxRowsSupported() {
+        return true;
+    }
+
+    /**
+     * SQL server expects the fully qualified column name, including schema, in
+     * select items.
+     */
+    @Override
+    public boolean isSchemaIncludedInColumnPaths() {
+        return true;
+    }
+
+    @Override
+    protected String rewriteSelectClause(Query query, SelectClause selectClause) {
+        String result = super.rewriteSelectClause(query, selectClause);
+
+        Integer maxRows = query.getMaxRows();
+        if (maxRows != null) {
+            result = "SELECT TOP " + maxRows + " " + result.substring(7);
+        }
+
+        return result;
+    }
+
+    @Override
+    public String rewriteFilterItem(FilterItem item) {
+        if (item.isCompoundFilter()) {
+            return super.rewriteFilterItem(item);
+        }
+
+        final SelectItem selectItem = item.getSelectItem();
+        final Object operand = item.getOperand();
+        final OperatorType operator = item.getOperator();
+
+        if (selectItem == null || operand == null || operator == null) {
+            return super.rewriteFilterItem(item);
+        }
+
+        final Column column = selectItem.getColumn();
+        if (column == null) {
+            return super.rewriteFilterItem(item);
+        }
+
+        if (operand instanceof Date) {
+            final String nativeType = column.getNativeType();
+            if ("TIMESTAMP".equalsIgnoreCase(nativeType) || "DATETIME".equalsIgnoreCase(nativeType)) {
+                final StringBuilder sb = new StringBuilder();
+                sb.append(selectItem.getSameQueryAlias(true));
+
+                FilterItem.appendOperator(sb, operand, operator);
+
+                final Date date = (Date) operand;
+
+                final DateFormat format = DateUtils.createDateFormat("yyyy-MM-dd HH:mm:ss");
+                final String dateTimeValue = "CAST('" + format.format(date) + "' AS DATETIME)";
+
+                sb.append(dateTimeValue);
+                return sb.toString();
+            }
+        }
+        return super.rewriteFilterItem(item);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-metamodel/blob/49a1553c/jdbc/src/test/java/org/apache/metamodel/dialects/SQLServerQueryRewriterTest.java
----------------------------------------------------------------------
diff --git a/jdbc/src/test/java/org/apache/metamodel/dialects/SQLServerQueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/dialects/SQLServerQueryRewriterTest.java
index b3ffac3..fa75491 100644
--- a/jdbc/src/test/java/org/apache/metamodel/dialects/SQLServerQueryRewriterTest.java
+++ b/jdbc/src/test/java/org/apache/metamodel/dialects/SQLServerQueryRewriterTest.java
@@ -22,11 +22,16 @@ import junit.framework.TestCase;
 
 import org.apache.metamodel.jdbc.dialects.IQueryRewriter;
 import org.apache.metamodel.jdbc.dialects.SQLServerQueryRewriter;
+import org.apache.metamodel.query.FilterItem;
 import org.apache.metamodel.query.FromItem;
+import org.apache.metamodel.query.OperatorType;
 import org.apache.metamodel.query.Query;
+import org.apache.metamodel.query.SelectItem;
+import org.apache.metamodel.schema.ColumnType;
 import org.apache.metamodel.schema.MutableColumn;
 import org.apache.metamodel.schema.MutableSchema;
 import org.apache.metamodel.schema.MutableTable;
+import org.apache.metamodel.util.TimeComparator;
 
 public class SQLServerQueryRewriterTest extends TestCase {
 
@@ -64,4 +69,22 @@ public class SQLServerQueryRewriterTest extends TestCase {
 				"SELECT TOP 20 MY_SCHEMA.\"foo\".\"bar\" FROM MY_SCHEMA.\"foo\"",
 				qr.rewriteQuery(q));
 	}
+	
+	public void testRewriteFilterItem() {
+
+		MutableColumn timestampColumn = new MutableColumn("timestamp");
+		timestampColumn.setType(ColumnType.TIMESTAMP);
+		timestampColumn.setNativeType("DATETIME");
+		Query q = new Query()
+				.from(table)
+				.select(column)
+				.select(timestampColumn)
+				.where(new FilterItem(new SelectItem(timestampColumn),
+						OperatorType.LESS_THAN, TimeComparator.toDate("2014-06-28 14:06:00")));
+
+		assertEquals(
+				"SELECT MY_SCHEMA.\"foo\".\"bar\", timestamp FROM MY_SCHEMA.\"foo\" WHERE timestamp < CAST('2014-06-28 14:06:00' AS DATETIME)",
+				qr.rewriteQuery(q));
+
+	}
 }
\ No newline at end of file