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