asterixdb-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Yingyi Bu (Code Review)" <do-not-re...@asterixdb.incubator.apache.org>
Subject Change in asterixdb[master]: ASTERIXDB-1409: fix the type check for functions with two st...
Date Fri, 22 Apr 2016 20:49:35 GMT
Yingyi Bu has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/829

Change subject: ASTERIXDB-1409: fix the type check for functions with two string arguments.
......................................................................

ASTERIXDB-1409: fix the type check for functions with two string arguments.

Change-Id: Idd36d9f5ee0f7d6d20afdff2e0669d6be6c6769b
---
A asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.1.ddl.aql
A asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.2.update.aql
A asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.3.query.aql
A asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring-after-5/substring-after-5.1.adm
M asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractBinaryStringTypeComputer.java
M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringBoolOrNullTypeComputer.java
M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringStringOrNullTypeComputer.java
8 files changed, 137 insertions(+), 12 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/29/829/1

diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.1.ddl.aql
b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.1.ddl.aql
new file mode 100644
index 0000000..a455abc
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.1.ddl.aql
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+drop dataverse test if exists;
+create dataverse test;
+use dataverse test;
+
+create type LogType as {
+  id: int64,
+  RemoteHost: string?
+}
+
+create dataset log(LogType) primary key id;
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.2.update.aql
b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.2.update.aql
new file mode 100644
index 0000000..595405f
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.2.update.aql
@@ -0,0 +1,29 @@
+/*
+ * 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.
+ */
+
+use dataverse test;
+
+insert into dataset log {
+  "id": 1,
+  "RemoteHost": "10.0.0.2@123"
+}
+
+insert into dataset log {
+   "id": 2
+}
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.3.query.aql
b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.3.query.aql
new file mode 100644
index 0000000..356b97b
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries/string/substring-after-5/substring-after-5.3.query.aql
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+/* This query is to verify the fix for ASTERIXDB-1409. */
+
+use dataverse test;
+
+for $e in dataset log
+where not(is-null($e.RemoteHost))
+limit 1
+return substring-after($e.RemoteHost, "@");
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring-after-5/substring-after-5.1.adm
b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring-after-5/substring-after-5.1.adm
new file mode 100644
index 0000000..9560a45
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/string/substring-after-5/substring-after-5.1.adm
@@ -0,0 +1 @@
+"123"
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
index 43c754b..a009620 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite.xml
@@ -5374,6 +5374,11 @@
             </compilation-unit>
         </test-case>
         <test-case FilePath="string">
+            <compilation-unit name="substring-after-5">
+                <output-dir compare="Text">substring-after-5</output-dir>
+            </compilation-unit>
+        </test-case>
+        <test-case FilePath="string">
             <compilation-unit name="substring-before-1">
                 <output-dir compare="Text">substring-before-1</output-dir>
             </compilation-unit>
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractBinaryStringTypeComputer.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractBinaryStringTypeComputer.java
index 007747d..ff859d4 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractBinaryStringTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AbstractBinaryStringTypeComputer.java
@@ -20,7 +20,10 @@
 
 import org.apache.asterix.om.typecomputer.base.IResultTypeComputer;
 import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.AUnionType;
+import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.om.util.NonTaggedFormatUtil;
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
 import org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
@@ -36,8 +39,9 @@
     public IAType computeType(ILogicalExpression expression, IVariableTypeEnvironment env,
             IMetadataProvider<?, ?> metadataProvider) throws AlgebricksException {
         AbstractFunctionCallExpression fce = (AbstractFunctionCallExpression) expression;
-        if (fce.getArguments().size() < 2)
+        if (fce.getArguments().size() < 2) {
             throw new AlgebricksException("Wrong Argument Number.");
+        }
         ILogicalExpression arg0 = fce.getArguments().get(0).getValue();
         ILogicalExpression arg1 = fce.getArguments().get(1).getValue();
         IAType t0, t1;
@@ -47,13 +51,45 @@
         } catch (AlgebricksException e) {
             throw new AlgebricksException(e);
         }
-        if ((t0.getTypeTag() != ATypeTag.NULL && t0.getTypeTag() != ATypeTag.STRING)
-                || (t1.getTypeTag() != ATypeTag.NULL && t1.getTypeTag() != ATypeTag.STRING))
{
-            throw new AlgebricksException("Expects String Type.");
+
+        boolean nullable = false;
+        ATypeTag tag0, tag1;
+        if (NonTaggedFormatUtil.isOptional(t0)) {
+            tag0 = ((AUnionType) t0).getNullableType().getTypeTag();
+            nullable = true;
+        } else {
+            tag0 = t0.getTypeTag();
         }
 
-        return getResultType(t0, t1);
+        if (NonTaggedFormatUtil.isOptional(t1)) {
+            tag1 = ((AUnionType) t1).getNullableType().getTypeTag();
+            nullable = true;
+        } else {
+            tag1 = t1.getTypeTag();
+        }
+
+        if (tag0 == ATypeTag.NULL && tag1 == ATypeTag.NULL) {
+            return BuiltinType.ANULL;
+        }
+
+        if (tag0 == ATypeTag.NULL || tag1 == ATypeTag.NULL) {
+            nullable = true;
+        }
+
+        // Allow substring to work with ANY types, i.e., types that are unknown at compile
time.
+        if (tag0 == ATypeTag.ANY || tag1 == ATypeTag.ANY) {
+            return BuiltinType.ANY;
+        }
+
+        if (tag0 != ATypeTag.NULL && tag0 != ATypeTag.STRING) {
+            throw new AlgebricksException("First argument should be String Type.");
+        }
+
+        if (tag1 != ATypeTag.NULL && tag1 != ATypeTag.STRING) {
+            throw new AlgebricksException("Second argument should be String Type.");
+        }
+        return getResultType(t0, t1, nullable);
     }
 
-    public abstract IAType getResultType(IAType t0, IAType t1);
+    public abstract IAType getResultType(IAType t0, IAType t1, boolean nullable);
 }
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringBoolOrNullTypeComputer.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringBoolOrNullTypeComputer.java
index c223b4a..6d46533 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringBoolOrNullTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringBoolOrNullTypeComputer.java
@@ -21,7 +21,6 @@
 import org.apache.asterix.om.types.AUnionType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
-import org.apache.asterix.om.types.TypeHelper;
 
 /**
  * @author Xiaoyu Ma
@@ -33,8 +32,8 @@
     }
 
     @Override
-    public IAType getResultType(IAType t0, IAType t1) {
-        if (TypeHelper.canBeNull(t0) || TypeHelper.canBeNull(t1)) {
+    public IAType getResultType(IAType t0, IAType t1, boolean nullable) {
+        if (nullable) {
             return AUnionType.createNullableType(BuiltinType.ABOOLEAN);
         }
         return BuiltinType.ABOOLEAN;
diff --git a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringStringOrNullTypeComputer.java
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringStringOrNullTypeComputer.java
index 562d965..55df1e3 100644
--- a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringStringOrNullTypeComputer.java
+++ b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/BinaryStringStringOrNullTypeComputer.java
@@ -21,7 +21,6 @@
 import org.apache.asterix.om.types.AUnionType;
 import org.apache.asterix.om.types.BuiltinType;
 import org.apache.asterix.om.types.IAType;
-import org.apache.asterix.om.types.TypeHelper;
 
 /**
  * @author Xiaoyu Ma
@@ -34,8 +33,8 @@
     }
 
     @Override
-    public IAType getResultType(IAType t0, IAType t1) {
-        if (TypeHelper.canBeNull(t0) || TypeHelper.canBeNull(t1)) {
+    public IAType getResultType(IAType t0, IAType t1, boolean nullable) {
+        if (nullable) {
             return AUnionType.createNullableType(BuiltinType.ASTRING);
         }
         return BuiltinType.ASTRING;

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/829
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Idd36d9f5ee0f7d6d20afdff2e0669d6be6c6769b
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Yingyi Bu <buyingyi@gmail.com>

Mime
View raw message