From 2b7c752f27ca248d4e7f013c28d78b60edff4617 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kasper=20S=C3=B8rensen?= Date: Thu, 16 Mar 2017 21:45:20 -0700 Subject: [PATCH] METAMODEL-1137: Solution (to be tested manually) for SQLServer type cast --- .../org/apache/metamodel/MetaModelHelper.java | 4 ++-- .../jdbc/dialects/OracleQueryRewriter.java | 2 -- .../jdbc/dialects/SQLServerQueryRewriter.java | 23 ++++++++++++++++++ .../dialects/SQLServerQueryRewriterTest.java | 24 ++++++++++--------- .../dialects/OracleQueryRewriterTest.java | 2 -- 5 files changed, 38 insertions(+), 17 deletions(-) diff --git a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java index 7ffa87052..9e4f73a2a 100644 --- a/core/src/main/java/org/apache/metamodel/MetaModelHelper.java +++ b/core/src/main/java/org/apache/metamodel/MetaModelHelper.java @@ -289,9 +289,9 @@ public static DataSet getSelection(final List selectItems, final Dat return new SubSelectionDataSet(selectItems, dataSet); } - final ScalarFunctionDataSet scalaFunctionDataSet = new ScalarFunctionDataSet( + final ScalarFunctionDataSet scalarFunctionDataSet = new ScalarFunctionDataSet( scalarFunctionSelectItemsToEvaluate, dataSet); - return new SubSelectionDataSet(selectItems, scalaFunctionDataSet); + return new SubSelectionDataSet(selectItems, scalarFunctionDataSet); } public static DataSet getSelection(SelectItem[] selectItems, DataSet dataSet) { diff --git a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriter.java b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriter.java index 647035ea7..f3108fba9 100644 --- a/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriter.java +++ b/jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriter.java @@ -18,8 +18,6 @@ */ package org.apache.metamodel.jdbc.dialects; -import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_ORACLE; - import org.apache.metamodel.jdbc.JdbcDataContext; import org.apache.metamodel.query.FilterItem; import org.apache.metamodel.schema.ColumnType; 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 8e17236aa..ac89db61c 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 @@ -23,8 +23,10 @@ import org.apache.metamodel.jdbc.JdbcDataContext; import org.apache.metamodel.query.FilterItem; +import org.apache.metamodel.query.FunctionType; import org.apache.metamodel.query.OperatorType; import org.apache.metamodel.query.Query; +import org.apache.metamodel.query.ScalarFunction; import org.apache.metamodel.query.SelectClause; import org.apache.metamodel.query.SelectItem; import org.apache.metamodel.schema.Column; @@ -39,6 +41,27 @@ public SQLServerQueryRewriter(JdbcDataContext dataContext) { super(dataContext, FIRST_FETCH_SUPPORTING_VERSION); } + @Override + public boolean isScalarFunctionSupported(ScalarFunction function) { + if (function == FunctionType.TO_STRING) { + return true; + } + return super.isScalarFunctionSupported(function); + } + + @Override + protected String rewriteSelectItem(Query query, SelectItem item) { + if (item.getScalarFunction() == FunctionType.TO_STRING) { + final SelectItem itemWithoutFunction = item.replaceFunction(null); + final StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("CAST("); + stringBuilder.append(rewriteSelectItem(query, itemWithoutFunction)); + stringBuilder.append(" as varchar(8000))"); + return stringBuilder.toString(); + } + return super.rewriteSelectItem(query, item); + } + /** * SQL server expects the fully qualified column name, including schema, in * select items. 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 86f98280d..5b50f20d3 100644 --- a/jdbc/src/test/java/org/apache/metamodel/dialects/SQLServerQueryRewriterTest.java +++ b/jdbc/src/test/java/org/apache/metamodel/dialects/SQLServerQueryRewriterTest.java @@ -20,15 +20,11 @@ import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_SQLSERVER; -import java.sql.Connection; -import java.sql.DatabaseMetaData; - -import junit.framework.TestCase; - import org.apache.metamodel.jdbc.JdbcDataContext; import org.apache.metamodel.jdbc.dialects.SQLServerQueryRewriter; import org.apache.metamodel.query.FilterItem; import org.apache.metamodel.query.FromItem; +import org.apache.metamodel.query.FunctionType; import org.apache.metamodel.query.OperatorType; import org.apache.metamodel.query.Query; import org.apache.metamodel.query.SelectItem; @@ -39,6 +35,8 @@ import org.apache.metamodel.util.TimeComparator; import org.easymock.EasyMock; +import junit.framework.TestCase; + public class SQLServerQueryRewriterTest extends TestCase { private MutableTable table; @@ -73,6 +71,14 @@ public void testRewriteColumnTypeVarchar() throws Exception { assertEquals("VARCHAR(MAX)", qr.rewriteColumnType(ColumnType.VARCHAR, null)); } + public void testRewriteSelectItemToString() throws Exception { + final Query q = new Query(); + q.from(table); + q.select(FunctionType.TO_STRING, column); + + assertEquals("SELECT CAST(MY_SCHEMA.\"foo\".\"bar\" as varchar(8000)) FROM MY_SCHEMA.\"foo\"", qr.rewriteQuery(q)); + } + public void testRewriteFromItem() throws Exception { assertEquals("foo", qr.rewriteFromItem(new FromItem(new MutableTable("foo")))); } @@ -94,12 +100,8 @@ 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"))); + 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('20140628 14:06:00' AS DATETIME)", diff --git a/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriterTest.java b/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriterTest.java index a36a4ba31..a1a141a32 100644 --- a/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriterTest.java +++ b/jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriterTest.java @@ -21,8 +21,6 @@ import static org.apache.metamodel.jdbc.JdbcDataContext.DATABASE_PRODUCT_ORACLE; import static org.junit.Assert.assertEquals; -import java.sql.Connection; -import java.sql.DatabaseMetaData; import java.sql.SQLException; import org.apache.metamodel.jdbc.JdbcDataContext;