[NO ISSUE][FUN] Add array_length()

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

Details:
- Add array_length() which is an alias for len()
- Add testcases
- Add comment explaining logical plan generation for
  EVERY quantified expression

Change-Id: I5bd03717d3cc41567d6b060b25ca3051d9f43b3a
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2446
Sonar-Qube: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Tested-by: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Contrib: Jenkins <jenkins@fulliautomatix.ics.uci.edu>
Reviewed-by: Till Westmann <tillw@apache.org>
diff --git a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index 2b7adc1..6ab76fa 100644
--- a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -1088,6 +1088,10 @@
             fAgg = BuiltinFunctions.makeAggregateFunctionExpression(BuiltinFunctions.NON_EMPTY_STREAM,
                     new ArrayList<>());
         } else { // EVERY
+            // look for input items that do not satisfy the condition, if none found then return true
+            // when inverting the condition account for NULL/MISSING by replacing them with FALSE
+            // condition() -> not(if-missing-or-null(condition(), false))
+
             List<Mutable<ILogicalExpression>> ifMissingOrNullArgs = new ArrayList<>(2);
             ifMissingOrNullArgs.add(new MutableObject<>(eo2.first));
             ifMissingOrNullArgs
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/array_length/array_length.1.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/array_length/array_length.1.query.sqlpp
new file mode 100644
index 0000000..66f3b93
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/array_length/array_length.1.query.sqlpp
@@ -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.
+ */
+
+[
+  is_missing(array_length(missing)),
+  is_null(array_length(null)),
+  array_length([]),
+  array_length([2]),
+  array_length([2,3]),
+  array_length([2,3,4])
+]
\ No newline at end of file
diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/list/array_length/array_length.1.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/list/array_length/array_length.1.adm
new file mode 100644
index 0000000..09fe966
--- /dev/null
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/list/array_length/array_length.1.adm
@@ -0,0 +1 @@
+[ true, true, 0, 1, 2, 3 ]
\ No newline at end of file
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 dd1ae0c..67980d0 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -3430,6 +3430,11 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="list">
+      <compilation-unit name="array_length">
+        <output-dir compare="Text">array_length</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="list">
       <compilation-unit name="exists">
         <output-dir compare="Text">exists</output-dir>
       </compilation-unit>
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 5556ea9..e5d1643 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
@@ -88,6 +88,9 @@
         FUNCTION_NAME_MAP.put("record-add-fields", "object-add-fields");
         // record-remove-fields, internal: object-remove-fields
         FUNCTION_NAME_MAP.put("record-remove-fields", "object-remove-fields");
+
+        // Array/Mutliset functions
+        FUNCTION_NAME_MAP.put("array_length", "len");
     }
 
     private CommonFunctionMapUtil() {