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);