Repository: asterixdb
Updated Branches:
  refs/heads/master 5cdaa5d6a -> 8cf585195


[ASTERIXDB-2294][FUN] Implement is_atomic()

- user model changes: yes
- storage format changes: no
- interface changes: no

Details:
- Implement is_atomic() function with aliases isatomic(), isatom()
- Add testcases and documentation

Change-Id: Ib979f4fe2fdce7575d13a259ac241d58d9fc6ae2
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2416
Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <ti...@apache.org>


Project: http://git-wip-us.apache.org/repos/asf/asterixdb/repo
Commit: http://git-wip-us.apache.org/repos/asf/asterixdb/commit/8cf58519
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/8cf58519
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/8cf58519

Branch: refs/heads/master
Commit: 8cf585195ac0439bbf41e814b9c09d2d0d3ee1fe
Parents: 5cdaa5d
Author: Dmitry Lychagin <dmitry.lycha...@couchbase.com>
Authored: Wed Feb 21 20:25:23 2018 -0800
Committer: Dmitry Lychagin <dmitry.lycha...@couchbase.com>
Committed: Thu Feb 22 12:59:14 2018 -0800

----------------------------------------------------------------------
 .../types/isatomic/isatomic.1.query.sqlpp       | 30 +++++++++
 .../results/types/isatomic/isatomic.1.adm       |  1 +
 .../resources/runtimets/testsuite_sqlpp.xml     |  5 ++
 .../src/main/markdown/builtins/11_type.md       | 32 ++++++++++
 .../lang/common/util/CommonFunctionMapUtil.java |  2 +
 .../asterix/om/functions/BuiltinFunctions.java  |  3 +
 .../functions/IsAtomicDescriptor.java           | 67 ++++++++++++++++++++
 .../runtime/functions/FunctionCollection.java   |  2 +
 8 files changed, 142 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cf58519/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isatomic/isatomic.1.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isatomic/isatomic.1.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isatomic/isatomic.1.query.sqlpp
new file mode 100644
index 0000000..4339904
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/types/isatomic/isatomic.1.query.sqlpp
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+
+{
+  "a": isatomic(true),
+  "b": isatomic(false),
+  "c": is_atomic(null),
+  "d": is_atomic(missing),
+  "e": isatom("d"),
+  "f": isatom(4.0),
+  "g": isatom(5),
+  "h": isatom(["1", 2]),
+  "i": isatom({"a":1})
+};

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cf58519/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isatomic/isatomic.1.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isatomic/isatomic.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isatomic/isatomic.1.adm
new file mode 100644
index 0000000..b6cd2d0
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/types/isatomic/isatomic.1.adm
@@ -0,0 +1 @@
+{ "a": true, "b": true, "c": null, "e": true, "f": true, "g": true, "h": 
false, "i": false }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cf58519/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml 
b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
index 3a2c24c..a869b22 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -8987,6 +8987,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="types">
+      <compilation-unit name="isatomic">
+        <output-dir compare="Text">isatomic</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="types">
       <compilation-unit name="isboolean">
         <output-dir compare="Text">isboolean</output-dir>
       </compilation-unit>

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cf58519/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md
----------------------------------------------------------------------
diff --git a/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md 
b/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md
index a2b2555..fd6a262 100644
--- a/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md
+++ b/asterixdb/asterix-doc/src/main/markdown/builtins/11_type.md
@@ -53,6 +53,38 @@
 
  The function has an alias `isarray`.
 
+### is_atomic (isatomic, isatom) ###
+ * Syntax:
+
+        is_atomic(expr)
+
+ * Checks whether the given expression is evaluated to be a value of a 
[primitive](../datamodel.html#PrimitiveTypes) type.
+ * Arguments:
+    * `expr` : an expression (any type is allowed).
+ * Return Value:
+    * a `boolean` on whether the argument is a primitive type or not,
+    * a `missing` if the argument is a `missing` value,
+    * a `null` if the argument is a `null` value.
+
+ * Example:
+
+        {
+          "a": is_atomic(true),
+          "b": is_atomic(false),
+          "c": isatomic(null),
+          "d": isatomic(missing),
+          "e": isatomic("d"),
+          "f": isatom(4.0),
+          "g": isatom(5),
+          "h": isatom(["1", 2]),
+          "i": isatom({"a":1})
+        };
+
+* The expected result is:
+
+        { "a": true, "b": true, "c": null, "e": true, "f": true, "g": true, 
"h": false, "i": false }
+
+ The function has two aliases, `isatomic` or `isatom`.
 
 ### is_boolean (isboolean, isbool) ###
  * Syntax:

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cf58519/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java
index b83c49e..b78ee9f 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/util/CommonFunctionMapUtil.java
@@ -53,6 +53,8 @@ public class CommonFunctionMapUtil {
         FUNCTION_NAME_MAP.put("isnull", "is-null"); // isnull, internal: 
is-null
         FUNCTION_NAME_MAP.put("ismissing", "is-missing"); // ismissing, 
internal: is-missing
         FUNCTION_NAME_MAP.put("isunknown", "is-unknown"); // isunknown, 
internal: is-unknown
+        FUNCTION_NAME_MAP.put("isatomic", "is-atomic"); // isatomic, internal: 
is-atomic
+        FUNCTION_NAME_MAP.put("isatom", "is-atomic"); // isatom, internal: 
is-atomic
         FUNCTION_NAME_MAP.put("isboolean", "is-boolean"); // isboolean, 
internal: is-boolean
         FUNCTION_NAME_MAP.put("isbool", "is-boolean"); // isbool, internal: 
is-boolean
         FUNCTION_NAME_MAP.put("isnumber", "is-number"); // isnumber, internal: 
is-number

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cf58519/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
index d920286..153ea45 100644
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java
@@ -829,6 +829,8 @@ public class BuiltinFunctions {
     public static final FunctionIdentifier IS_NULL = 
AlgebricksBuiltinFunctions.IS_NULL;
     public static final FunctionIdentifier IS_UNKNOWN =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-unknown", 
1);
+    public static final FunctionIdentifier IS_ATOMIC =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-atomic", 
1);
     public static final FunctionIdentifier IS_BOOLEAN =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "is-boolean", 
1);
     public static final FunctionIdentifier IS_NUMBER =
@@ -889,6 +891,7 @@ public class BuiltinFunctions {
         addFunction(IS_UNKNOWN, BooleanOnlyTypeComputer.INSTANCE, true);
         addFunction(IS_NULL, BooleanOrMissingTypeComputer.INSTANCE, true);
         addFunction(IS_SYSTEM_NULL, ABooleanTypeComputer.INSTANCE, true);
+        addFunction(IS_ATOMIC, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_BOOLEAN, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_NUMBER, ABooleanTypeComputer.INSTANCE, true);
         addFunction(IS_STRING, ABooleanTypeComputer.INSTANCE, true);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cf58519/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
new file mode 100644
index 0000000..124ffa2
--- /dev/null
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/IsAtomicDescriptor.java
@@ -0,0 +1,67 @@
+/*
+ * 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.asterix.runtime.evaluators.functions;
+
+import org.apache.asterix.om.functions.BuiltinFunctions;
+import org.apache.asterix.om.functions.IFunctionDescriptor;
+import org.apache.asterix.om.functions.IFunctionDescriptorFactory;
+import org.apache.asterix.om.types.EnumDeserializer;
+import 
org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor;
+import org.apache.asterix.runtime.evaluators.common.AbstractTypeCheckEvaluator;
+import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator;
+import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
+import org.apache.hyracks.api.context.IHyracksTaskContext;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+
+public class IsAtomicDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
+    private static final long serialVersionUID = 1L;
+    public static final IFunctionDescriptorFactory FACTORY = new 
IFunctionDescriptorFactory() {
+        @Override
+        public IFunctionDescriptor createFunctionDescriptor() {
+            return new IsAtomicDescriptor();
+        }
+    };
+
+    @Override
+    public IScalarEvaluatorFactory createEvaluatorFactory(final 
IScalarEvaluatorFactory[] args) {
+        return new IScalarEvaluatorFactory() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public IScalarEvaluator createScalarEvaluator(final 
IHyracksTaskContext ctx) throws HyracksDataException {
+                final IScalarEvaluator eval = 
args[0].createScalarEvaluator(ctx);
+                return new AbstractTypeCheckEvaluator(eval) {
+                    @Override
+                    protected Value isMatch(byte typeTag) {
+                        return 
EnumDeserializer.ATYPETAGDESERIALIZER.deserialize(typeTag).isDerivedType() ? 
Value.FALSE
+                                : Value.TRUE;
+
+                    }
+                };
+            }
+        };
+    }
+
+    @Override
+    public FunctionIdentifier getIdentifier() {
+        return BuiltinFunctions.IS_ATOMIC;
+    }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/8cf58519/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
index a111642..2f1fdcb 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java
@@ -167,6 +167,7 @@ import 
org.apache.asterix.runtime.evaluators.functions.IfMissingOrNullDescriptor
 import org.apache.asterix.runtime.evaluators.functions.IfNullDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.InjectFailureDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsArrayDescriptor;
+import org.apache.asterix.runtime.evaluators.functions.IsAtomicDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsBooleanDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsMissingDescriptor;
 import org.apache.asterix.runtime.evaluators.functions.IsNullDescriptor;
@@ -711,6 +712,7 @@ public final class FunctionCollection {
         fc.addGenerated(DurationFromIntervalDescriptor.FACTORY);
 
         // Type functions.
+        fc.addGenerated(IsAtomicDescriptor.FACTORY);
         fc.addGenerated(IsBooleanDescriptor.FACTORY);
         fc.addGenerated(IsNumberDescriptor.FACTORY);
         fc.addGenerated(IsStringDescriptor.FACTORY);

Reply via email to