Repository: asterixdb
Updated Branches:
  refs/heads/master e2c8afe90 -> afadf2cad


[NO ISSUE][FUN] Add docs for array functions, handle FP.

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

details:
Add docs for array functions and remove error codes from
error messages in test suite.
This patch also includes handling of floating-point number
arguments for array_range(), array_insert(), array_repeat().

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


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

Branch: refs/heads/master
Commit: afadf2cadeb90c372265989abae4acf9a6ec2e68
Parents: e2c8afe
Author: Ali Alsuliman <ali.al.solai...@gmail.com>
Authored: Thu Jul 26 21:22:25 2018 -0700
Committer: Murtadha Hubail <mhub...@apache.org>
Committed: Sat Jul 28 18:18:41 2018 -0700

----------------------------------------------------------------------
 .../array_insert/array_insert.3.query.sqlpp     |  7 +++--
 .../array_range/array_range.3.query.sqlpp       |  5 +++-
 .../array_repeat/array_repeat.1.query.sqlpp     |  9 ++++--
 .../array_fun/array_insert/array_insert.3.adm   |  2 +-
 .../array_fun/array_range/array_range.3.adm     |  2 +-
 .../array_fun/array_repeat/array_repeat.1.adm   |  2 +-
 .../resources/runtimets/testsuite_sqlpp.xml     |  4 +--
 .../functions/ArrayAppendDescriptor.java        |  4 +--
 .../functions/ArrayConcatDescriptor.java        |  4 +--
 .../functions/ArrayContainsDescriptor.java      |  5 ++--
 .../functions/ArrayDistinctDescriptor.java      | 18 ++++++++++++
 .../functions/ArrayFlattenDescriptor.java       |  4 +--
 .../functions/ArrayInsertDescriptor.java        | 18 ++++++------
 .../functions/ArrayIntersectDescriptor.java     | 18 ++++++++++++
 .../functions/ArrayPositionDescriptor.java      |  2 +-
 .../functions/ArrayPrependDescriptor.java       |  4 +--
 .../functions/ArrayPutDescriptor.java           |  4 +--
 .../functions/ArrayRangeDescriptor.java         | 25 +++++++++++++++--
 .../functions/ArrayRemoveDescriptor.java        |  8 +++---
 .../functions/ArrayRepeatDescriptor.java        | 28 ++++++++++++++++---
 .../functions/ArrayReplaceDescriptor.java       | 21 ++++++++++++++
 .../functions/ArrayReverseDescriptor.java       | 14 ++++++++--
 .../functions/ArraySortDescriptor.java          | 16 +++++++++++
 .../functions/ArrayStarDescriptor.java          | 29 ++++++++++++++++++++
 .../functions/ArraySymDiffDescriptor.java       | 18 ++++++++++++
 .../functions/ArraySymDiffnDescriptor.java      | 18 ++++++++++++
 .../functions/ArrayUnionDescriptor.java         |  6 ++--
 27 files changed, 249 insertions(+), 46 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.3.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.3.query.sqlpp
index fdc35cc..c0b65e7 100755
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.3.query.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.3.query.sqlpp
@@ -33,12 +33,15 @@ use TinySocial;
   "t11": (array_insert([], 0, 10, 12.0, "sth")),  // OK
   "t12": (array_insert([6], "a", 9)),             // null, position non-numeric
   "t13": (array_insert([6], 1.0, 9)),             // OK
-  "t14": (array_insert([6], 1.5, 9)),             // OK
+  "t14": (array_insert([6], 1.5, 9)),             // null, position with 
decimals
   "t15": (array_insert(null, 3, 9)),              // null
   "t16": (array_insert(missing, 3, 9)),           // missing
   "t17": (array_insert([6], 1, null, 9, null)),   // OK to insert nulls
   "t18": (array_insert([6], null, 5, 9, null)),   // null
   "t19": (array_insert([6], 3, null, missing, 9, null)),  // missing
   "t20": (select array_insert(t.`referred-topics`, 0, 5) from TweetMessages t 
order by t.tweetid),
-  "t21": (select array_insert(d.followers, 0, 5, 3) from d1 d)
+  "t21": (select array_insert(d.followers, 0, 5, 3) from d1 d),
+  "t22": (array_insert([1,2,3], float("NaN"), "a", "b")),
+  "t23": (array_insert([1,2,3], float("INF"), "a", "b")),
+  "t24": (array_insert([1,2,3], float("-INF"), "a", "b"))
 };
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_range/array_range.3.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_range/array_range.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_range/array_range.3.query.sqlpp
index f189fc1..d36a9f1 100755
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_range/array_range.3.query.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_range/array_range.3.query.sqlpp
@@ -36,5 +36,8 @@ use TinySocial;
   "t14": (array_range(2, missing)),
   "t15": (array_range(2, 7, "a")),
   "t16": (array_range(2, "a", 1)),
-  "t17": (array_range("a", 7, 1))
+  "t17": (array_range("a", 7, 1)),
+  "t18": (array_range(5, 10, float("NaN"))),
+  "t19": (array_range(5, float("INF"), 1)),
+  "t20": (array_range(5, float("-INF"), -2))
 };
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_repeat/array_repeat.1.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_repeat/array_repeat.1.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_repeat/array_repeat.1.query.sqlpp
index 50a0d7b..a5ebb4c 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_repeat/array_repeat.1.query.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_repeat/array_repeat.1.query.sqlpp
@@ -22,12 +22,17 @@
   "t1": (select value array_repeat("a", 3)),
   "t2": (array_repeat("a", 3)),
   "t3": (array_repeat("a", 0)),
-  "t4": (array_repeat("a", -3)),
+  "t4": (array_repeat("a", -3)),  // null
   "t5": (array_repeat("a", "a")),
   "t6": (array_repeat("a", missing)),
   "t7": (array_repeat(missing, 3)),
   "t8": (array_repeat("a", null)),
   "t9": (array_repeat(null, 3)),
   "t10": (array_repeat({ "a": 1 }, 3)),
-  "t11": (array_repeat([1, 2], 3))
+  "t11": (array_repeat([1, 2], 3)),
+  "t12": (array_repeat("a", 4.0)),  // OK
+  "t13": (array_repeat("a", 4.1)),  // null
+  "t14": (array_repeat("a", double("INF"))),  // null
+  "t15": (array_repeat("a", double("-INF"))), // null
+  "t16": (array_repeat("a", double("NaN")))   // null
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_insert/array_insert.3.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_insert/array_insert.3.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_insert/array_insert.3.adm
index 8e136ca..0acb072 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_insert/array_insert.3.adm
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_insert/array_insert.3.adm
@@ -1 +1 @@
-{ "t1": [ "a", "b", 1, 2, 3 ], "t2": [ 1, 2, 3, "a", "b" ], "t3": [ 1, 1, 2, 
"a", "b", 4 ], "t4": [ 1, 1, 2, 7, "a", 7, "one more", 4 ], "t5": null, "t6": [ 
1, 2, "a", "b", 3 ], "t7": null, "t8": null, "t10": null, "t11": [ 10, 12.0, 
"sth" ], "t12": null, "t13": [ 6, 9 ], "t14": [ 6, 9 ], "t15": null, "t17": [ 
6, null, 9, null ], "t18": null, "t20": [ { "$1": {{ 5, "t-mobile", 
"customization" }} }, { "$1": {{ 5, "verizon", "voice-clarity" }} }, { "$1": {{ 
5, "iphone", "platform" }} }, { "$1": {{ 5, "samsung", "voice-command" }} }, { 
"$1": {{ 5, "verizon", "shortcut-menu" }} }, { "$1": {{ 5, "motorola", "speed" 
}} }, { "$1": {{ 5, "sprint", "voice-command" }} }, { "$1": {{ 5, "motorola", 
"speed" }} }, { "$1": {{ 5, "iphone", "voice-clarity" }} }, { "$1": {{ 5, 
"samsung", "platform" }} }, { "$1": {{ 5, "t-mobile", "shortcut-menu" }} }, { 
"$1": {{ 5, "verizon", "voicemail-service" }} } ], "t21": [ {  }, { "$2": [ 5, 
3, "John Green", "Emily Jones" ] } ] }
+{ "t1": [ "a", "b", 1, 2, 3 ], "t2": [ 1, 2, 3, "a", "b" ], "t3": [ 1, 1, 2, 
"a", "b", 4 ], "t4": [ 1, 1, 2, 7, "a", 7, "one more", 4 ], "t5": null, "t6": [ 
1, 2, "a", "b", 3 ], "t7": null, "t8": null, "t10": null, "t11": [ 10, 12.0, 
"sth" ], "t12": null, "t13": [ 6, 9 ], "t14": null, "t15": null, "t17": [ 6, 
null, 9, null ], "t18": null, "t20": [ { "$1": {{ 5, "t-mobile", 
"customization" }} }, { "$1": {{ 5, "verizon", "voice-clarity" }} }, { "$1": {{ 
5, "iphone", "platform" }} }, { "$1": {{ 5, "samsung", "voice-command" }} }, { 
"$1": {{ 5, "verizon", "shortcut-menu" }} }, { "$1": {{ 5, "motorola", "speed" 
}} }, { "$1": {{ 5, "sprint", "voice-command" }} }, { "$1": {{ 5, "motorola", 
"speed" }} }, { "$1": {{ 5, "iphone", "voice-clarity" }} }, { "$1": {{ 5, 
"samsung", "platform" }} }, { "$1": {{ 5, "t-mobile", "shortcut-menu" }} }, { 
"$1": {{ 5, "verizon", "voicemail-service" }} } ], "t21": [ {  }, { "$2": [ 5, 
3, "John Green", "Emily Jones" ] } ], "t22": null, "t23": null, "t24": nul
 l }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_range/array_range.3.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_range/array_range.3.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_range/array_range.3.adm
index e04c673..362debf 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_range/array_range.3.adm
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_range/array_range.3.adm
@@ -1 +1 @@
-{ "t1": [ 1, 2, 3, 4, 5 ], "t2": [ 0, 5, 10, 15, 20 ], "t3": [ 0.1, 1.1 ], 
"t4": [ 10, 7, 4 ], "t5": [ -1, -4, -7 ], "t6": [  ], "t7": [  ], "t8": [  ], 
"t9": [  ], "t10": [ 2 ], "t11": [ 2.0, 3.1, 4.2, 5.300000000000001, 6.4, 7.5, 
8.6 ], "t12": null, "t15": null, "t16": null, "t17": null }
+{ "t1": [ 1, 2, 3, 4, 5 ], "t2": [ 0, 5, 10, 15, 20 ], "t3": [ 0.1, 1.1 ], 
"t4": [ 10, 7, 4 ], "t5": [ -1, -4, -7 ], "t6": [  ], "t7": [  ], "t8": [  ], 
"t9": [  ], "t10": [ 2 ], "t11": [ 2.0, 3.1, 4.2, 5.300000000000001, 6.4, 7.5, 
8.6 ], "t12": null, "t15": null, "t16": null, "t17": null, "t18": null, "t19": 
null, "t20": null }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_repeat/array_repeat.1.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_repeat/array_repeat.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_repeat/array_repeat.1.adm
index 183211f..963aeac 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_repeat/array_repeat.1.adm
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_repeat/array_repeat.1.adm
@@ -1 +1 @@
-{ "t1": [ [ "a", "a", "a" ] ], "t2": [ "a", "a", "a" ], "t3": [  ], "t4": [  
], "t5": null, "t8": null, "t9": null, "t10": [ { "a": 1 }, { "a": 1 }, { "a": 
1 } ], "t11": [ [ 1, 2 ], [ 1, 2 ], [ 1, 2 ] ] }
+{ "t1": [ [ "a", "a", "a" ] ], "t2": [ "a", "a", "a" ], "t3": [  ], "t4": 
null, "t5": null, "t8": null, "t9": null, "t10": [ { "a": 1 }, { "a": 1 }, { 
"a": 1 } ], "t11": [ [ 1, 2 ], [ 1, 2 ], [ 1, 2 ] ], "t12": [ "a", "a", "a", 
"a" ], "t13": null, "t14": null, "t15": null, "t16": null }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/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 ada210e..9ca1fbd 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -1089,8 +1089,8 @@
       <compilation-unit name="array_replace">
         <output-dir compare="Text">array_replace</output-dir>
         <expected-error>Cannot compare non-primitive values (in line 27, at 
column 8)</expected-error>
-        <expected-error>ASX1087: Invalid number of arguments for function 
array-replace (in line 27, at column 8)</expected-error>
-        <expected-error>ASX1087: Invalid number of arguments for function 
array-replace (in line 27, at column 8)</expected-error>
+        <expected-error>Invalid number of arguments for function array-replace 
(in line 27, at column 8)</expected-error>
+        <expected-error>Invalid number of arguments for function array-replace 
(in line 27, at column 8)</expected-error>
       </compilation-unit>
     </test-case>
     <test-case FilePath="array_fun">

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayAppendDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayAppendDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayAppendDescriptor.java
index 6d636ed..009d7b3 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayAppendDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayAppendDescriptor.java
@@ -39,7 +39,7 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 /**
  * <pre>
- * array_append(list, val1, val2, ...) returns a new open list with all the 
values appended to the input list items.
+ * array_append(list, val1, val2, ...) returns a new list with all the values 
appended to the input list items.
  * Values can be null (i.e., one can append nulls)
  *
  * It throws an error at compile time if the number of arguments < 2
@@ -47,7 +47,7 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
  * It returns in order:
  * 1. missing, if any argument is missing.
  * 2. null, if the list arg is null or it's not a list.
- * 3. otherwise, a new open list.
+ * 3. otherwise, a new list.
  *
  * </pre>
  */

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayConcatDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayConcatDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayConcatDescriptor.java
index 9af159c..c808ec5 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayConcatDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayConcatDescriptor.java
@@ -36,7 +36,7 @@ import org.apache.hyracks.data.std.api.IPointable;
 
 /**
  * <pre>
- * array_concat(list1, list2, ...) returns a new open list with all the values 
of all lists appended in order into the
+ * array_concat(list1, list2, ...) returns a new list with all the values of 
all lists appended in order into the
  * new list. Items of the lists can be null or missing (both are added as a 
null value).
  *
  * It throws an error at compile time if the number of arguments < 2
@@ -45,7 +45,7 @@ import org.apache.hyracks.data.std.api.IPointable;
  * 1. missing, if any argument is missing.
  * 2. an error if the input lists are not of the same type (one is an ordered 
list while the other is unordered).
  * 3. null, if any input list is null or is not a list.
- * 4. otherwise, a new open list.
+ * 4. otherwise, a new list.
  *
  * </pre>
  */

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayContainsDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayContainsDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayContainsDescriptor.java
index 16bb0c9..5443834 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayContainsDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayContainsDescriptor.java
@@ -37,14 +37,15 @@ import org.apache.hyracks.data.std.api.IPointable;
 
 /**
  * <pre>
- * array_contains(list, val) returns true if the the input list contains the 
value argument.
+ * array_contains(list, val) returns true if the the input list contains the 
value argument. It's case-sensitive to
+ * string value argument.
  *
  * It throws an error at compile time if the number of arguments != 2
  *
  * It returns (or throws an error at runtime) in order:
  * 1. missing, if any argument is missing.
  * 2. null, if any argument is null.
- * 3. an error if the value is of a list/object type (i.e. derived type) since 
deep equality is not yet supported.
+ * 3. an error if the value is a list/object type (i.e. derived type) since 
deep equality is not yet supported.
  * 4. null, if the input list is not a list.
  * 5. otherwise, returns true or false.
  *

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayDistinctDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayDistinctDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayDistinctDescriptor.java
index 4ac1f8dc..648132c 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayDistinctDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayDistinctDescriptor.java
@@ -52,6 +52,24 @@ import org.apache.hyracks.api.exceptions.SourceLocation;
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 
+/**
+ * <pre>
+ * array_distinct(list) returns a new list with distinct items of the input 
list. The returned list has the same type as
+ * the input list. The list can contain null and missing items. Null and 
missing are considered to be the same.
+ * It's case-sensitive to string items.
+ *
+ * array_distinct([1,2,null,4,missing,2,1]) will output [1,2,null,4]
+ *
+ * It throws an error at compile time if the number of arguments != 1
+ *
+ * It returns (or throws an error at runtime) in order:
+ * 1. missing, if any argument is missing.
+ * 2. null, if the list arg is null or it's not a list.
+ * 3. an error if any list item is a list/object type (i.e. derived type) 
since deep equality is not yet supported.
+ * 4. otherwise, a new list.
+ *
+ * </pre>
+ */
 public class ArrayDistinctDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
     private IAType inputListType;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
index af55eea..06381b5 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayFlattenDescriptor.java
@@ -57,7 +57,7 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 /**
  * <pre>
- * array_flatten(list, depth) returns a new open list with any nested list 
(all types) flattened up to the specified
+ * array_flatten(list, depth) returns a new list with any nested list (all 
types) flattened up to the specified
  * depth. The returned list type is the same as the input list type. Null and 
missing items are preserved.
  * If the depth < 0, then it flattens the input list all the way deep.
  *
@@ -73,7 +73,7 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
  * - the input list is not a list.
  * - the depth arg is not numeric or
  * - it's a floating-point number with decimals (e.g. 1.2 will produce null, 
1.0 is OK).
- * 3. otherwise, a new open list.
+ * 3. otherwise, a new list.
  *
  * </pre>
  */

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayInsertDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayInsertDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayInsertDescriptor.java
index 634f114..969e1d7 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayInsertDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayInsertDescriptor.java
@@ -43,11 +43,10 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 /**
  * <pre>
- * array_insert(list, pos, val1, val2, ...) returns a new open list with all 
values inserted at the specified position.
+ * array_insert(list, pos, val1, val2, ...) returns a new list with all values 
inserted at the specified position.
  * Values can be null (i.e., one can insert nulls). Position can be negative 
where the last position = -1. When position
  * is positive then the first position = 0. Input list can be empty where the 
only valid position is 0.
  * For the list [5,6], the valid positions are 0, 1, 2, -1, -2. If position is 
floating-point, it's casted to integer.
- * TODO: should decide on what to do for floating-point positions.
  *
  * It throws an error at compile time if the number of arguments < 3
  *
@@ -55,8 +54,8 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
  * 1. missing, if any argument is missing.
  * 2. null, if
  * - the list arg is null or it's not a list
- * - the position is not numeric or the position is out of bound.
- * 3. otherwise, a new open list.
+ * - the position is not numeric or the position is out of bound or it's a 
floating-point with decimals or NaN or +-INF.
+ * 3. otherwise, a new list.
  *
  * </pre>
  */
@@ -117,14 +116,17 @@ public class ArrayInsertDescriptor extends 
AbstractScalarFunctionDynamicDescript
                 return RETURN_MISSING;
             }
 
-            int position;
-            if (!ATypeHierarchy.isCompatible(ATypeTag.INTEGER, 
ATYPETAGDESERIALIZER.deserialize(positionArg.getTag()))
+            double position;
+            if (!ATypeHierarchy.isCompatible(ATypeTag.DOUBLE, 
ATYPETAGDESERIALIZER.deserialize(positionArg.getTag()))
                     || !listTag.isListType()) {
                 return RETURN_NULL;
             } else {
                 String name = getIdentifier().getName();
-                position = ATypeHierarchy.getIntegerValue(name, 1, 
positionArg.getByteArray(),
+                position = ATypeHierarchy.getDoubleValue(name, 1, 
positionArg.getByteArray(),
                         positionArg.getStartOffset());
+                if (Double.isNaN(position) || Double.isInfinite(position) || 
Math.floor(position) < position) {
+                    return RETURN_NULL;
+                }
                 // list size
                 int size;
                 if (listTag == ATypeTag.ARRAY) {
@@ -140,7 +142,7 @@ public class ArrayInsertDescriptor extends 
AbstractScalarFunctionDynamicDescript
                 if (position < 0 || position > size) {
                     return RETURN_NULL;
                 }
-                return position;
+                return (int) position;
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
index 706cb53..52335a0 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayIntersectDescriptor.java
@@ -67,6 +67,24 @@ import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
+/**
+ * <pre>
+ * array_intersect(list1, list2, ...) returns a new list containing items that 
are present in all of the input
+ * lists. Null and missing items are ignored. It's case-sensitive to string 
items.
+ *
+ * array_intersect([null, 2, missing], [3,missing,2,null]) will result in [2].
+ *
+ * It throws an error at compile time if the number of arguments < 2
+ *
+ * It returns (or throws an error at runtime) in order:
+ * 1. missing, if any argument is missing.
+ * 2. an error if the input lists are not of the same type (one is an ordered 
list while the other is unordered).
+ * 3. null, if any input list is null or is not a list.
+ * 4. an error if any list item is a list/object type (i.e. derived type) 
since deep equality is not yet supported.
+ * 5. otherwise, a new list.
+ *
+ * </pre>
+ */
 public class ArrayIntersectDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
     private IAType[] argTypes;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPositionDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPositionDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPositionDescriptor.java
index e4e54f1..411e846 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPositionDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPositionDescriptor.java
@@ -37,7 +37,7 @@ import org.apache.hyracks.data.std.api.IPointable;
 /**
  * <pre>
  * array_position(list, val) returns the 0-based position (as integer) of the 
value argument in the input list. If the
- * value does not exists, it returns -1
+ * value does not exists, it returns -1. It's case-sensitive to string value 
argument.
  *
  * It throws an error at compile time if the number of arguments != 2
  *

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPrependDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPrependDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPrependDescriptor.java
index dcb6ad8..fa56fb1 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPrependDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPrependDescriptor.java
@@ -37,7 +37,7 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 /**
  * <pre>
- * array_prepend(val1, val2, ..., list) returns a new open list with all the 
values prepended to the input list items.
+ * array_prepend(val1, val2, ..., list) returns a new list with all the values 
prepended to the input list items.
  * Values can be null (i.e., one can append nulls)
  *
  * It throws an error at compile time if the number of arguments < 2
@@ -45,7 +45,7 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
  * It returns in order:
  * 1. missing, if any argument is missing.
  * 2. null, if the list arg is null or it's not a list.
- * 3. otherwise, a new open list.
+ * 3. otherwise, a new list.
  *
  * </pre>
  */

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPutDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPutDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPutDescriptor.java
index fc17e99..86321da 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPutDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayPutDescriptor.java
@@ -46,7 +46,7 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 /**
  * <pre>
- * array_put(list, val1, val2, ...) returns a new open list with all the 
values appended to the input list items only if
+ * array_put(list, val1, val2, ...) returns a new list with all the values 
appended to the input list items only if
  * the list does not already have the value. Values cannot be null (i.e., one 
cannot append nulls).
  * array_put([2, 3], 2, 2, 9, 9) will result in [2, 3, 9, 9].
  *
@@ -56,7 +56,7 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
  * 1. missing, if any argument is missing.
  * 2. null, if any argument is null.
  * 3. an error if any value arg is of a list/object type (i.e. derived type) 
since deep equality is not yet supported.
- * 4. otherwise, a new open list.
+ * 4. otherwise, a new list.
  *
  * </pre>
  */

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java
index 4068101..902ec7a 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRangeDescriptor.java
@@ -44,6 +44,22 @@ import 
org.apache.hyracks.data.std.primitive.TaggedValuePointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
+/**
+ * <pre>
+ * array_range(start_num, end_num, step_num?) returns a new ordered list, list 
of long items or double items
+ * depending on the supplied arguments. One floating-point arg will make it a 
list of double items. step_num is optional
+ * where the default is 1. It returns an empty list for arguments like:
+ * array_range(2, 20, -2), array_range(10, 3, 4) and array_range(1,6,0) where 
it cannot determine a proper sequence.
+ *
+ * It throws an error at compile time if the number of arguments < 2 or > 3
+ *
+ * It returns in order:
+ * 1. missing, if any argument is missing.
+ * 2. null, if any argument is null or they are not numeric or they are NaN 
+-INF.
+ * 3. otherwise, a new list.
+ *
+ * </pre>
+ */
 public class ArrayRangeDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
 
@@ -118,8 +134,8 @@ public class ArrayRangeDescriptor extends 
AbstractScalarFunctionDynamicDescripto
                 stepNum = ATypeHierarchy.getDoubleValue(n, 2, 
step.getByteArray(), step.getStartOffset());
             }
 
-            if (!ATypeHierarchy.isCompatible(ATypeTag.DOUBLE, startTag)
-                    || !ATypeHierarchy.isCompatible(ATypeTag.DOUBLE, endTag)) {
+            if (!ATypeHierarchy.isCompatible(ATypeTag.DOUBLE, startTag) || 
Double.isNaN(stepNum)
+                    || !ATypeHierarchy.isCompatible(ATypeTag.DOUBLE, endTag) 
|| Double.isInfinite(stepNum)) {
                 PointableHelper.setNull(result);
                 return;
             }
@@ -145,6 +161,11 @@ public class ArrayRangeDescriptor extends 
AbstractScalarFunctionDynamicDescripto
                 serde = 
SerializerDeserializerProvider.INSTANCE.getSerializerDeserializer(BuiltinType.ADOUBLE);
                 double startNum = ATypeHierarchy.getDoubleValue(n, 0, 
start.getByteArray(), start.getStartOffset());
                 double endNum = ATypeHierarchy.getDoubleValue(n, 1, 
end.getByteArray(), end.getStartOffset());
+                if (Double.isNaN(startNum) || Double.isInfinite(startNum) || 
Double.isNaN(endNum)
+                        || Double.isInfinite(endNum)) {
+                    PointableHelper.setNull(result);
+                    return;
+                }
                 listBuilder.reset(ArrayRangeTypeComputer.DOUBLE_LIST);
                 while ((startNum < endNum && stepNum > 0) || (startNum > 
endNum && stepNum < 0)) {
                     aDouble.setValue(startNum);

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRemoveDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRemoveDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRemoveDescriptor.java
index ea27017..a5afa5f 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRemoveDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRemoveDescriptor.java
@@ -44,16 +44,16 @@ import 
org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
 /**
  * <pre>
- * array_remove(list, val1, val2, ...) returns a new (open or closed) list 
with all the values removed from the input
- * list. Values cannot be null (i.e., one cannot remove nulls).
+ * array_remove(list, val1, val2, ...) returns a new list with all the values 
removed from the input
+ * list. Values cannot be null (i.e., one cannot remove nulls). It's 
case-sensitive to string value arguments.
  *
  * It throws an error at compile time if the number of arguments < 2
  *
  * It returns (or throws an error at runtime) in order:
  * 1. missing, if any argument is missing.
  * 2. null, if any argument is null.
- * 4. an error if any value arg is of a list/object type (i.e. derived type) 
since deep equality is not yet supported.
- * 3. otherwise, a new list that has the same type as the input list.
+ * 3. an error if any value arg is of a list/object type (i.e. derived type) 
since deep equality is not yet supported.
+ * 4. otherwise, a new list that has the same type as the input list.
  *
  * </pre>
  */

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java
index ce9d3cc..5e50fe0 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayRepeatDescriptor.java
@@ -43,10 +43,25 @@ import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
+/**
+ * <pre>
+ * array_repeat(val, num_times) returns a new ordered list with the same item 
type as the input value.
+ *
+ * It throws an error at compile time if the number of arguments != 2
+ *
+ * It returns in order:
+ * 1. missing, if any argument is missing.
+ * 2. null, if:
+ * - any argument is null
+ * - num_times is not numeric or it's a floating-point with decimals (3.2) or 
it's NaN/+-INF or it's negative.
+ * 3. otherwise, a new ordered list.
+ *
+ * </pre>
+ */
 public class ArrayRepeatDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
 
-    AbstractCollectionType repeatedValueListType;
+    private AbstractCollectionType repeatedValueListType;
 
     public static final IFunctionDescriptorFactory FACTORY = new 
IFunctionDescriptorFactory() {
         @Override
@@ -110,14 +125,19 @@ public class ArrayRepeatDescriptor extends 
AbstractScalarFunctionDynamicDescript
             // 2nd arg: number of repetitions
             repeatEval.evaluate(tuple, repeatArg);
             repeatArgValue.set(repeatArg);
-            if (!ATypeHierarchy.isCompatible(ATypeTag.INTEGER, 
ATypeTag.VALUE_TYPE_MAPPING[repeatArgValue.getTag()])) {
+            if (!ATypeHierarchy.isCompatible(ATypeTag.DOUBLE, 
ATypeTag.VALUE_TYPE_MAPPING[repeatArgValue.getTag()])) {
                 PointableHelper.setNull(result);
                 return;
             }
             final String name = getIdentifier().getName();
-            final int repetitions =
-                    ATypeHierarchy.getIntegerValue(name, 1, 
repeatArg.getByteArray(), repeatArg.getStartOffset());
+            final double repetitions =
+                    ATypeHierarchy.getDoubleValue(name, 1, 
repeatArg.getByteArray(), repeatArg.getStartOffset());
 
+            if (Double.isNaN(repetitions) || Double.isInfinite(repetitions) || 
Math.floor(repetitions) < repetitions
+                    || repetitions < 0) {
+                PointableHelper.setNull(result);
+                return;
+            }
             // create list
             listBuilder.reset(repeatedValueListType);
             for (int i = 0; i < repetitions; ++i) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceDescriptor.java
index e8d77a8..032ef32 100644
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReplaceDescriptor.java
@@ -54,6 +54,27 @@ import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
+/**
+ * <pre>
+ * array_replace(list, val1, val2, max_num_times?) returns a new list with the 
occurrences of val1 replaced with
+ * val2. max_num_times arg is optional. If supplied, it replaces val1 as many 
as max_num_times. Any negative number for
+ * max_num_times means "replace all occurrences". val2 can be null meaning you 
can replace existing items with nulls.
+ *
+ * array_replace([2,3,3,3,1], 3, 8, 0) will do nothing and result in 
[2,3,3,3,1].
+ *
+ * It throws an error at compile time if the number of arguments < 3 or > 4
+ *
+ * It returns (or throws an error at runtime) in order:
+ * 1. missing, if any argument is missing.
+ * 2. null, if:
+ * - any argument is null (except for val2).
+ * - input list is not a list.
+ * - num_times is not numeric or it's a floating-point number with decimals, 
e.g, 3.2 (3.0 is OK).
+ * 3. an error if val1 is a list/object type (i.e. derived type) since deep 
equality is not yet supported.
+ * 4. otherwise, a new list.
+ *
+ * </pre>
+ */
 public class ArrayReplaceDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
     private IAType inputListType;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReverseDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReverseDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReverseDescriptor.java
index 331c9a4..05a5c39 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReverseDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayReverseDescriptor.java
@@ -40,8 +40,18 @@ import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 
 /**
- * array_reverse(list) returns a new list with the entries of the original 
input list in reverse order. If the input is
- * not a list, it returns "null".
+ * <pre>
+ * array_reverse(list) returns a new list with the entries of the original 
input list in reverse order.
+ * The returned list has the same type as the input list. The list can contain 
null/missing items. Both are preserved.
+ *
+ * It throws an error at compile time if the number of arguments != 1
+ *
+ * It returns in order:
+ * 1. missing, if any argument is missing.
+ * 2. null, if the list arg is null or it's not a list.
+ * 3. otherwise, a new list.
+ *
+ * </pre>
  */
 public class ArrayReverseDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySortDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySortDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySortDescriptor.java
index 12ae2fd..1d8db47 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySortDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySortDescriptor.java
@@ -47,6 +47,22 @@ import org.apache.hyracks.api.exceptions.SourceLocation;
 import org.apache.hyracks.data.std.api.IPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 
+/**
+ * <pre>
+ * array_sort(list) returns a new list with the items sorted in ascending 
order. The returned list has the same type as
+ * the input list. The list can contain null and missing items, and both are 
preserved. It's case-sensitive to string
+ * items.
+ *
+ * It throws an error at compile time if the number of arguments != 1
+ *
+ * It returns (or throws an error at runtime) in order:
+ * 1. missing, if any argument is missing.
+ * 2. null, if the list arg is null or it's not a list.
+ * 3. an error if any list item is a list/object type (i.e. derived type) 
since deep equality is not yet supported.
+ * 4. otherwise, a new list.
+ *
+ * </pre>
+ */
 public class ArraySortDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
     private IAType inputListType;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
index 2c4c308..4bc885c 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayStarDescriptor.java
@@ -54,6 +54,35 @@ import org.apache.hyracks.data.std.primitive.VoidPointable;
 import org.apache.hyracks.data.std.util.ArrayBackedValueStorage;
 import org.apache.hyracks.dataflow.common.data.accessors.IFrameTupleReference;
 
+/**
+ * <pre>
+ * array_star(ordered_list) returns a new object. The input ordered list is 
supposed to be a list of objects:
+ * [{"id":1, "dept":"CS"}, {"id":2, "dept":"FIN"}, {"id":3, "dept":"CS"}]
+ * For the returned object, each field has a value = list of values of that 
specific field taken from each object in the
+ * input list.
+ *
+ * Ex1: array_star([{"a":1, "b":2}, {"a":9, "b":4}]) will produce: {"a":[1, 
9], "b":[2, 4]}
+ * Ex2: array_star([{"a":1}, {"a":9, "b":4}]) will produce: {"a":[1, 9], 
"b":[null, 4]}
+ * Ex3: array_star([{"a":1, "c":5}, {"a":9, "b":4}]) will produce: {"a":[1, 
9], "b":[null, 4], "c":[5,null]}
+ * Ex4: array_star([{"c":5, "a":1}, "non_object"]) will produce: {"a":[1, 
null], "c":[5,null]}
+ * Ex5: array_star(["non_object1", "non_object2"]) will produce: {} (i.e., 
missing)
+ *
+ * Note that in the final object result, the fields are ordered by their names 
regardless of their original order in the
+ * object items in the input list. "a" comes before "c". However, for every 
field, all the items in each list must not
+ * be ordered. They should appear in the sequence they appear in the input 
list.
+ * For Ex1, "a":[1,9] in the final result, item at index 0 comes from object 
at index 0 (which is 1).
+ *
+ * It throws an error at compile time if the number of arguments != 1
+ *
+ * It returns in order:
+ * 1. missing, if any argument is missing.
+ * 2. null, if the list arg is null or it's not an ordered list.
+ * 3. missing, if input list is missing the notion of fields.
+ *    E.g., the input list contains no object items (e.g., list of int), or 
all objects have no fields.
+ * 4. otherwise, a new object.
+ *
+ * </pre>
+ */
 public class ArrayStarDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
 

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffDescriptor.java
index 4dce4df..f9e68df 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffDescriptor.java
@@ -32,6 +32,24 @@ import 
org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
+/**
+ * <pre>
+ * array_symdiff(list1, list2, ...) returns a new list based on the set 
symmetric difference, or disjunctive union,
+ * of the input. The new list contains only those items that appear in exactly 
one of the input lists.
+ * array_symdiff([null, 2,3], [missing, 3]) will result in [2, null, null] 
where one null is for the missing item
+ * and the second null for the null item.
+ *
+ * It throws an error at compile time if the number of arguments < 2
+ *
+ * It returns (or throws an error at runtime) in order:
+ * 1. missing, if any argument is missing.
+ * 2. an error if the input lists are not of the same type (one is an ordered 
list while the other is unordered).
+ * 3. null, if any input list is null or is not a list.
+ * 4. an error if any list item is a list/object type (i.e. derived type) 
since deep equality is not yet supported.
+ * 5. otherwise, a new list.
+ *
+ * </pre>
+ */
 public class ArraySymDiffDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
     private IAType[] argTypes;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffnDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffnDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffnDescriptor.java
index 26c438d..0cafb1b 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffnDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySymDiffnDescriptor.java
@@ -32,6 +32,24 @@ import 
org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory;
 import org.apache.hyracks.api.context.IHyracksTaskContext;
 import org.apache.hyracks.api.exceptions.HyracksDataException;
 
+/**
+ * <pre>
+ * array_symdiffn(list1, list2, ...) returns a new list based on the set 
symmetric difference, or disjunctive
+ * union, of the input lists. The new list contains only those items that 
appear in an odd number of input lists.
+ * array_symdiffn([null, 2,3], [missing, 3]) will result in [2, null, null] 
where one null is for the missing item
+ * and the second null for the null item.
+ *
+ * It throws an error at compile time if the number of arguments < 2
+ *
+ * It returns (or throws an error at runtime) in order:
+ * 1. missing, if any argument is missing.
+ * 2. an error if the input lists are not of the same type (one is an ordered 
list while the other is unordered).
+ * 3. null, if any input list is null or is not a list.
+ * 4. an error if any list item is a list/object type (i.e. derived type) 
since deep equality is not yet supported.
+ * 5. otherwise, a new list.
+ *
+ * </pre>
+ */
 public class ArraySymDiffnDescriptor extends 
AbstractScalarFunctionDynamicDescriptor {
     private static final long serialVersionUID = 1L;
     private IAType[] argTypes;

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/afadf2ca/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayUnionDescriptor.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayUnionDescriptor.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayUnionDescriptor.java
index 0a0a6ef..d6a2f1f 100755
--- 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayUnionDescriptor.java
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArrayUnionDescriptor.java
@@ -49,7 +49,7 @@ import org.apache.hyracks.data.std.api.IPointable;
 
 /**
  * <pre>
- * array_union(list1, list2, ...) returns a new open list with the set union 
of the input lists (no duplicates).
+ * array_union(list1, list2, ...) returns a new list with the set union of the 
input lists (no duplicates).
  * Items of the lists can be null or missing (both are added as a null value).
  * array_union([null, 2], [missing, 3, null]) will result in [null, 2, null, 
3] where one null is for the missing item
  * and the second null for the null item.
@@ -60,8 +60,8 @@ import org.apache.hyracks.data.std.api.IPointable;
  * 1. missing, if any argument is missing.
  * 2. an error if the input lists are not of the same type (one is an ordered 
list while the other is unordered).
  * 3. null, if any input list is null or is not a list.
- * 4. an error if any list item is of a list/object type (i.e. derived type) 
since deep equality is not yet supported.
- * 5. otherwise, a new open list.
+ * 4. an error if any list item is a list/object type (i.e. derived type) 
since deep equality is not yet supported.
+ * 5. otherwise, a new list.
  *
  * </pre>
  */

Reply via email to