METAMODEL-1111: Fixed
authorJakub Horcicka <jakub.horcicka@humaninference.com>
Tue, 9 Aug 2016 15:29:53 +0000 (08:29 -0700)
committerkaspersorensen <i.am.kasper.sorensen@gmail.com>
Tue, 9 Aug 2016 15:29:53 +0000 (08:29 -0700)
Fixes #123

CHANGES.md
jdbc/src/main/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriter.java
jdbc/src/test/java/org/apache/metamodel/jdbc/dialects/OracleQueryRewriterTest.java [new file with mode: 0644]

index d3d7506..a27fa50 100644 (file)
@@ -1,3 +1,7 @@
+### Apache MetaModel 4.5.5
+
+ * [METAMODEL-1111] - Added WHERE rewrite for Oracle when empty strings are considered as NULL.
+
 ### Apache MetaModel 4.5.4
 
  * [METAMODEL-1099] - Created a new DataContextFactory SPI and a extensible registry of implementations based on ServiceLoader.
index cad357b..305dbb8 100644 (file)
@@ -19,6 +19,7 @@
 package org.apache.metamodel.jdbc.dialects;
 
 import org.apache.metamodel.jdbc.JdbcDataContext;
+import org.apache.metamodel.query.FilterItem;
 import org.apache.metamodel.schema.ColumnType;
 
 /**
@@ -77,4 +78,14 @@ public class OracleQueryRewriter extends DefaultQueryRewriter {
         }
         return super.rewriteColumnType(columnType, columnSize);
     }
+
+    @Override
+    public String rewriteFilterItem(final FilterItem item) {
+        if (item.getOperand() instanceof String && item.getOperand().equals("")) {
+            // In Oracle empty strings are treated as null. Typical SQL constructs with an empty string do not work.
+            return super.rewriteFilterItem(new FilterItem(item.getSelectItem(), item.getOperator(), null));
+        } else {
+            return super.rewriteFilterItem(item);
+        }
+    }
 }
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
new file mode 100644 (file)
index 0000000..88f0a50
--- /dev/null
@@ -0,0 +1,41 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.metamodel.jdbc.dialects;
+
+import org.apache.metamodel.query.FilterItem;
+import org.apache.metamodel.query.OperatorType;
+import org.apache.metamodel.query.SelectItem;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+
+public class OracleQueryRewriterTest {
+
+    @Test
+    public void testReplaceEmptyStringWithNull() throws Exception {
+        final OracleQueryRewriter rewriter = new OracleQueryRewriter(null);
+        final String alias = "alias";
+        SelectItem selectItem = new SelectItem("expression", alias);
+        final FilterItem filterItem = new FilterItem(selectItem, OperatorType.DIFFERENT_FROM, "");
+        final String rewrittenValue = rewriter.rewriteFilterItem(filterItem);
+        final String expectedValue = alias + " IS NOT NULL";
+        
+        assertEquals(expectedValue, rewrittenValue);
+    }
+}
\ No newline at end of file