[NO ISSUE][FUN] Implement array functions p1

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

details:
This is part of implementing array functions. This patch
includes array_insert(), array_append(), array_prepend()
array_put() and array_remove(). It includes re-organization
of those functions.

Change-Id: I7d9cb80325138daf99fb039793446d109481c94b
Reviewed-on: https://asterix-gerrit.ics.uci.edu/2751
Sonar-Qube: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Integration-Tests: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Reviewed-by: abdullah alamoudi <bamou...@gmail.com>
Tested-by: Jenkins <jenk...@fulliautomatix.ics.uci.edu>
Contrib: 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/0d7974f2
Tree: http://git-wip-us.apache.org/repos/asf/asterixdb/tree/0d7974f2
Diff: http://git-wip-us.apache.org/repos/asf/asterixdb/diff/0d7974f2

Branch: refs/heads/master
Commit: 0d7974f27d6d922e597a3cfce52dd6f856ea2ac6
Parents: 2fff15a
Author: Ali Alsuliman <ali.al.solai...@gmail.com>
Authored: Thu Jul 12 10:42:48 2018 -0700
Committer: abdullah alamoudi <bamou...@gmail.com>
Committed: Thu Jul 12 23:42:11 2018 -0700

----------------------------------------------------------------------
 .../org/apache/asterix/runtime/ExceptionIT.java |   9 +-
 .../apache/asterix/runtime/NullMissingTest.java |   8 +-
 .../array_append/array_append.3.query.sqlpp     |  13 +-
 .../array_insert/array_insert.1.ddl.sqlpp       |  46 ++++
 .../array_insert/array_insert.2.update.sqlpp    |  22 ++
 .../array_insert/array_insert.3.query.sqlpp     |  43 ++++
 .../array_insert/array_insert.4.ddl.sqlpp       |  20 ++
 .../array_prepend/array_prepend.1.ddl.sqlpp     |  56 +++++
 .../array_prepend/array_prepend.2.update.sqlpp  |  27 +++
 .../array_prepend/array_prepend.3.query.sqlpp   |  32 +++
 .../array_prepend/array_prepend.4.ddl.sqlpp     |  20 ++
 .../array_fun/array_put/array_put.1.ddl.sqlpp   |  56 +++++
 .../array_put/array_put.2.update.sqlpp          |  27 +++
 .../array_fun/array_put/array_put.3.query.sqlpp |  33 +++
 .../array_fun/array_put/array_put.4.query.sqlpp |  22 ++
 .../array_fun/array_put/array_put.5.query.sqlpp |  22 ++
 .../array_fun/array_put/array_put.6.ddl.sqlpp   |  20 ++
 .../array_remove/array_remove.1.ddl.sqlpp       |  56 +++++
 .../array_remove/array_remove.2.update.sqlpp    |  27 +++
 .../array_remove/array_remove.3.query.sqlpp     |  32 +++
 .../array_remove/array_remove.4.query.sqlpp     |  22 ++
 .../array_remove/array_remove.5.query.sqlpp     |  22 ++
 .../array_remove/array_remove.6.ddl.sqlpp       |  20 ++
 .../array_fun/array_append/array_append.3.adm   |   2 +-
 .../array_fun/array_insert/array_insert.3.adm   |   1 +
 .../array_fun/array_prepend/array_prepend.3.adm |   1 +
 .../results/array_fun/array_put/array_put.3.adm |   1 +
 .../array_fun/array_remove/array_remove.3.adm   |   1 +
 .../resources/runtimets/testsuite_sqlpp.xml     |  24 +++
 .../asterix/om/functions/BuiltinFunctions.java  |  18 +-
 .../impl/AListFirstTypeComputer.java            |  50 +++++
 .../om/typecomputer/impl/AListTypeComputer.java |  59 +++++-
 .../impl/ArrayAppendTypeComputer.java           |  54 -----
 .../asterix/om/typecomputer/ExceptionTest.java  |  11 +-
 .../om/typecomputer/TypeComputerTest.java       |  26 ++-
 .../functions/AbstractArrayAddRemoveEval.java   | 209 +++++++++++++++++++
 .../functions/ArrayAppendDescriptor.java        | 105 ++--------
 .../functions/ArrayInsertDescriptor.java        | 129 ++++++++++++
 .../functions/ArrayPrependDescriptor.java       |  90 ++++++++
 .../functions/ArrayPutDescriptor.java           | 136 ++++++++++++
 .../functions/ArrayRemoveDescriptor.java        | 123 +++++++++++
 .../evaluators/functions/CastTypeEvaluator.java |  15 +-
 .../evaluators/functions/PointableHelper.java   |   6 +-
 .../runtime/functions/FunctionCollection.java   |  10 +-
 44 files changed, 1529 insertions(+), 197 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
index e764c32..2e7445f 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/ExceptionIT.java
@@ -50,9 +50,8 @@ public class ExceptionIT {
             String className = func.getClass().getName();
             // We test all generated functions except
             // record and cast functions, which requires type settings.
-            String[] splits = className.split("\\.");
-            if (className.contains("Gen") && !className.contains("record") && 
!className.contains("Cast")
-                    && !splits[splits.length - 1].startsWith("Array")) {
+            if (className.contains("Gen") && !className.contains("record") && 
!className.contains("Cast")) {
+                System.out.println("Testing " + className);
                 testFunction(func);
                 ++testedFunctions;
             }
@@ -83,6 +82,10 @@ public class ExceptionIT {
                     int errorCode = Integer.parseInt(msg.substring(3, 7));
                     Assert.assertTrue(errorCode >= 0 && errorCode < 1000);
                     continue;
+                } else if (msg.startsWith("HYR")) {
+                    // Verifies the error code.
+                    int errorCode = Integer.parseInt(msg.substring(3, 7));
+                    Assert.assertTrue(errorCode >= 0 && errorCode < 1000);
                 } else {
                     // Any root-level data exceptions thrown from runtime 
functions should have an error code.
                     Assert.assertTrue(!(e instanceof HyracksDataException) || 
(e.getCause() != null));

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java
 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java
index f6f617e..f302cef 100644
--- 
a/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java
+++ 
b/asterixdb/asterix-app/src/test/java/org/apache/asterix/runtime/NullMissingTest.java
@@ -41,21 +41,17 @@ import org.junit.Test;
 
 public class NullMissingTest {
 
-    private static final String arrayAppend = "ArrayAppendDescriptor";
-
     @Test
     public void test() throws Exception {
         List<IFunctionDescriptorFactory> functions =
                 
FunctionCollection.createDefaultFunctionCollection().getFunctionDescriptorFactories();
         int testedFunctions = 0;
-        String[] splits;
         for (IFunctionDescriptorFactory func : functions) {
             String className = func.getClass().getName();
             // We test all generated functions except
             // record and cast functions, which requires type settings (we 
test them in runtime tests).
-            splits = className.split("\\.");
-            if (className.contains("Gen") && !className.contains("record") && 
!className.contains("Cast")
-                    && !splits[splits.length - 1].startsWith(arrayAppend)) {
+            if (className.contains("Gen") && !className.contains("record") && 
!className.contains("Cast")) {
+                System.out.println("Testing " + className);
                 testFunction(func);
                 ++testedFunctions;
             }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_append/array_append.3.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_append/array_append.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_append/array_append.3.query.sqlpp
index 8488e22..20ea6fc 100755
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_append/array_append.3.query.sqlpp
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_append/array_append.3.query.sqlpp
@@ -22,10 +22,11 @@ use TinySocial;
 {
   "t1": (select array_append(t.`referred-topics`, "sth", 5) from TweetMessages 
t order by t.tweetid),
   "t2": (select array_append([3, "John"], (select value v.compType from d1 
v))),
-  "t3": (select array_append([3], 7, null, missing)),
-  "t4": (select array_append("non_array", 5)),
-  "t5": (select array_append("non_array", 5, missing)),
-  "t6": (select array_append([], 5, 10, 12.0, "sth")),
-  "t7": (select array_append(missing, 3, 9)),
-  "t8": (select array_append(null, 3, 9))
+  "t3": (array_append([3], 7, null, missing)),    // missing
+  "t4": (array_append("non_array", 5)),           // null
+  "t5": (array_append(null, 3, 9)),               // null
+  "t6": (array_append("non_array", 5, missing)),  // missing
+  "t7": (array_append([], 5, 10, 12.0, "sth")),   // OK
+  "t8": (array_append(missing, 3, 9)),            // missing
+  "t9": (array_append([3], 3, [9], null, "sth"))  // OK to add nulls
 };
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.1.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.1.ddl.sqlpp
new file mode 100755
index 0000000..257c4dd
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.1.ddl.sqlpp
@@ -0,0 +1,46 @@
+/*
+ * 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 TinySocial if exists;
+create  dataverse TinySocial;
+
+use TinySocial;
+
+
+create type TinySocial.TwitterUserType as
+{
+  `screen-name` : string,
+  lang : string,
+  friends_count : bigint,
+  statuses_count : bigint,
+  name : string,
+  followers_count : bigint
+};
+
+create type TinySocial.TweetMessageType as
+ closed {
+  tweetid : string,
+  user : TwitterUserType,
+  `sender-location` : point?,
+  `send-time` : datetime,
+  `referred-topics` : {{string}},
+  `message-text` : string
+};
+
+create  dataset TweetMessages(TweetMessageType) primary key tweetid hints 
(`CARDINALITY`=`100`);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.2.update.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.2.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.2.update.sqlpp
new file mode 100755
index 0000000..4a0e7ed
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.2.update.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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 TinySocial;
+
+load  dataset TweetMessages using localfs 
((`path`=`asterix_nc1://data/tinysocial/twm.adm`),(`format`=`adm`));

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/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
new file mode 100755
index 0000000..137c9fa
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.3.query.sqlpp
@@ -0,0 +1,43 @@
+/*
+ * 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 TinySocial;
+
+{
+  "t1": (array_insert([1,2,3], 0, "a", "b")),          // OK
+  "t2": (array_insert([1,2,3], 3, "a", "b")),          // OK
+  "t3": (array_insert([1,1,2,4], 3, "a", "b")),        // OK
+  "t4": (array_insert([1,1,2,4], 3, 7, "a", 7, "one more")),  // OK
+  "t5": (array_insert([1,2,3], 4, "a")),          // null, out of bound
+  "t6": (array_insert([1,2,3], -1, "a", "b")),    // OK
+  "t7": (array_insert([1,2,3], -4, "a", "b")),    // null, out of bound
+  "t8": (array_insert("non_array", 5, "val")),    // null
+  "t9": (array_insert("non_array", 5, missing)),  // missing
+  "t10": (array_insert([], 5, 10, 12.0, "sth")),  // null, out of bound
+  "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
+  "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)
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.4.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.4.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.4.ddl.sqlpp
new file mode 100755
index 0000000..3f8c8ec
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_insert/array_insert.4.ddl.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * 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 TinySocial;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.1.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.1.ddl.sqlpp
new file mode 100755
index 0000000..1c55a9a
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.1.ddl.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * 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 TinySocial if exists;
+create  dataverse TinySocial;
+
+use TinySocial;
+
+
+create type TinySocial.TwitterUserType as
+{
+  `screen-name` : string,
+  lang : string,
+  friends_count : bigint,
+  statuses_count : bigint,
+  name : string,
+  followers_count : bigint
+};
+
+create type TinySocial.TweetMessageType as
+ closed {
+  tweetid : string,
+  user : TwitterUserType,
+  `sender-location` : point?,
+  `send-time` : datetime,
+  `referred-topics` : {{string}},
+  `message-text` : string
+};
+
+create type t1 AS {
+
+};
+
+create type t2 AS {
+id: int,
+compType: t1
+};
+
+create  dataset TweetMessages(TweetMessageType) primary key tweetid hints 
(`CARDINALITY`=`100`);
+create dataset d1(t2) primary key id;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.2.update.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.2.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.2.update.sqlpp
new file mode 100755
index 0000000..2767210
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.2.update.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.
+ */
+
+use TinySocial;
+
+load  dataset TweetMessages using localfs 
((`path`=`asterix_nc1://data/tinysocial/twm.adm`),(`format`=`adm`));
+
+insert into d1([
+{"id":1, "compType":{"sth":33}},
+{"id":2, "compType":{"sth":44}}
+]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.3.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.3.query.sqlpp
new file mode 100755
index 0000000..e912a75
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.3.query.sqlpp
@@ -0,0 +1,32 @@
+/*
+ * 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 TinySocial;
+
+{
+  "t1": (select array_prepend("sth", 5, t.`referred-topics`) from 
TweetMessages t order by t.tweetid),
+  "t2": (select array_prepend((select value v.compType from d1 v), [3, 
"John"])),
+  "t3": (array_prepend(7, null, missing, [3])),     // missing
+  "t4": (array_prepend(5, "non_array")),            // null
+  "t5": (array_prepend(3, 9, null)),                // null
+  "t6": (array_prepend(5, missing, "non_array")),   // missing
+  "t7": (array_prepend(5, 10, 12.0, "sth",[77, "val"])),   // OK
+  "t8": (array_prepend(5, 10, null, "sth",[77, "val"])),   // OK to insert 
nulls
+  "t9": (array_prepend(3, 9, missing))              // missing
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.4.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.4.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.4.ddl.sqlpp
new file mode 100755
index 0000000..3f8c8ec
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_prepend/array_prepend.4.ddl.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * 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 TinySocial;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.1.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.1.ddl.sqlpp
new file mode 100755
index 0000000..1c55a9a
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.1.ddl.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * 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 TinySocial if exists;
+create  dataverse TinySocial;
+
+use TinySocial;
+
+
+create type TinySocial.TwitterUserType as
+{
+  `screen-name` : string,
+  lang : string,
+  friends_count : bigint,
+  statuses_count : bigint,
+  name : string,
+  followers_count : bigint
+};
+
+create type TinySocial.TweetMessageType as
+ closed {
+  tweetid : string,
+  user : TwitterUserType,
+  `sender-location` : point?,
+  `send-time` : datetime,
+  `referred-topics` : {{string}},
+  `message-text` : string
+};
+
+create type t1 AS {
+
+};
+
+create type t2 AS {
+id: int,
+compType: t1
+};
+
+create  dataset TweetMessages(TweetMessageType) primary key tweetid hints 
(`CARDINALITY`=`100`);
+create dataset d1(t2) primary key id;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.2.update.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.2.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.2.update.sqlpp
new file mode 100755
index 0000000..2767210
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.2.update.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.
+ */
+
+use TinySocial;
+
+load  dataset TweetMessages using localfs 
((`path`=`asterix_nc1://data/tinysocial/twm.adm`),(`format`=`adm`));
+
+insert into d1([
+{"id":1, "compType":{"sth":33}},
+{"id":2, "compType":{"sth":44}}
+]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.3.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.3.query.sqlpp
new file mode 100755
index 0000000..2e37af2
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.3.query.sqlpp
@@ -0,0 +1,33 @@
+/*
+ * 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 TinySocial;
+
+{
+  "t1": (select array_put(t.`referred-topics`, "t-mobile", 5) from 
TweetMessages t order by t.tweetid),
+  "t2": (array_put([3], 7, null, missing)),    // missing
+  "t3": (array_put("non_array", 5)),           // null
+  "t4": (array_put("non_array", 5, missing)),  // missing
+  "t5": (array_put([], 5, 10, 12.0, "sth")),   // OK
+  "t6": (array_put(missing, 3, 9)),            // missing
+  "t7": (array_put(null, 3, 9)),               // null
+  "t8": (array_put([3,2,"sth"], 3, 9, 9, 3, "sth")), // OK
+  "t9": (array_put([3,2,"sth"], 1, 5)),     // OK
+  "t10": (array_put([3,2,"sth"], null, 5))   // null
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.4.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.4.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.4.query.sqlpp
new file mode 100755
index 0000000..a462600
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.4.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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 TinySocial;
+
+select array_put([3, "John"], (select value v.compType from d1 v));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.5.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.5.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.5.query.sqlpp
new file mode 100755
index 0000000..0d27117
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.5.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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 TinySocial;
+
+select array_put([3], 3, [9], 4, "sth");
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.6.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.6.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.6.ddl.sqlpp
new file mode 100755
index 0000000..3f8c8ec
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_put/array_put.6.ddl.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * 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 TinySocial;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.1.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.1.ddl.sqlpp
new file mode 100755
index 0000000..1c55a9a
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.1.ddl.sqlpp
@@ -0,0 +1,56 @@
+/*
+ * 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 TinySocial if exists;
+create  dataverse TinySocial;
+
+use TinySocial;
+
+
+create type TinySocial.TwitterUserType as
+{
+  `screen-name` : string,
+  lang : string,
+  friends_count : bigint,
+  statuses_count : bigint,
+  name : string,
+  followers_count : bigint
+};
+
+create type TinySocial.TweetMessageType as
+ closed {
+  tweetid : string,
+  user : TwitterUserType,
+  `sender-location` : point?,
+  `send-time` : datetime,
+  `referred-topics` : {{string}},
+  `message-text` : string
+};
+
+create type t1 AS {
+
+};
+
+create type t2 AS {
+id: int,
+compType: t1
+};
+
+create  dataset TweetMessages(TweetMessageType) primary key tweetid hints 
(`CARDINALITY`=`100`);
+create dataset d1(t2) primary key id;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.2.update.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.2.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.2.update.sqlpp
new file mode 100755
index 0000000..2767210
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.2.update.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.
+ */
+
+use TinySocial;
+
+load  dataset TweetMessages using localfs 
((`path`=`asterix_nc1://data/tinysocial/twm.adm`),(`format`=`adm`));
+
+insert into d1([
+{"id":1, "compType":{"sth":33}},
+{"id":2, "compType":{"sth":44}}
+]);
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.3.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.3.query.sqlpp
new file mode 100755
index 0000000..f726e7c
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.3.query.sqlpp
@@ -0,0 +1,32 @@
+/*
+ * 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 TinySocial;
+
+{
+  "t1": (select array_remove(t.`referred-topics`, "t-mobile") from 
TweetMessages t order by t.tweetid),
+  "t2": (array_remove([3], 7, null, missing)),    // missing
+  "t3": (array_remove("non_array", 5)),           // null
+  "t4": (array_remove("non_array", 5, missing)),  // missing
+  "t5": (array_remove([], 5, 10, 12.0, "sth")),   // OK
+  "t6": (array_remove(missing, 3, 9)),            // missing
+  "t7": (array_remove(null, 3, 9)),               // null
+  "t8": (array_remove([3,2,"sth"], 3, 9, 9, 3, "sth")), // OK
+  "t9": (array_remove([3,2,"sth"], 1, null))      // null
+};
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.4.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.4.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.4.query.sqlpp
new file mode 100755
index 0000000..2dfa514
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.4.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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 TinySocial;
+
+select array_remove([3, "John"], (select value v.compType from d1 v));
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.5.query.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.5.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.5.query.sqlpp
new file mode 100755
index 0000000..bfa878f
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.5.query.sqlpp
@@ -0,0 +1,22 @@
+/*
+ * 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 TinySocial;
+
+select array_remove([3], 3, [9], 4, "sth");
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.6.ddl.sqlpp
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.6.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.6.ddl.sqlpp
new file mode 100755
index 0000000..3f8c8ec
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_remove/array_remove.6.ddl.sqlpp
@@ -0,0 +1,20 @@
+/*
+ * 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 TinySocial;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_append/array_append.3.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_append/array_append.3.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_append/array_append.3.adm
index c435e4e..52c4546 100644
--- 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_append/array_append.3.adm
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_append/array_append.3.adm
@@ -1 +1 @@
-{ "t1": [ { "$1": {{ "t-mobile", "customization", "sth", 5 }} }, { "$1": {{ 
"verizon", "voice-clarity", "sth", 5 }} }, { "$1": {{ "iphone", "platform", 
"sth", 5 }} }, { "$1": {{ "samsung", "voice-command", "sth", 5 }} }, { "$1": {{ 
"verizon", "shortcut-menu", "sth", 5 }} }, { "$1": {{ "motorola", "speed", 
"sth", 5 }} }, { "$1": {{ "sprint", "voice-command", "sth", 5 }} }, { "$1": {{ 
"motorola", "speed", "sth", 5 }} }, { "$1": {{ "iphone", "voice-clarity", 
"sth", 5 }} }, { "$1": {{ "samsung", "platform", "sth", 5 }} }, { "$1": {{ 
"t-mobile", "shortcut-menu", "sth", 5 }} }, { "$1": {{ "verizon", 
"voicemail-service", "sth", 5 }} } ], "t2": [ { "$2": [ 3, "John", [ { "sth": 
33 }, { "sth": 44 } ] ] } ], "t3": [ {  } ], "t4": [ { "$4": null } ], "t5": [ 
{  } ], "t6": [ { "$6": [ 5, 10, 12.0, "sth" ] } ], "t7": [ {  } ], "t8": [ { 
"$8": null } ] }
+{ "t1": [ { "$1": {{ "t-mobile", "customization", "sth", 5 }} }, { "$1": {{ 
"verizon", "voice-clarity", "sth", 5 }} }, { "$1": {{ "iphone", "platform", 
"sth", 5 }} }, { "$1": {{ "samsung", "voice-command", "sth", 5 }} }, { "$1": {{ 
"verizon", "shortcut-menu", "sth", 5 }} }, { "$1": {{ "motorola", "speed", 
"sth", 5 }} }, { "$1": {{ "sprint", "voice-command", "sth", 5 }} }, { "$1": {{ 
"motorola", "speed", "sth", 5 }} }, { "$1": {{ "iphone", "voice-clarity", 
"sth", 5 }} }, { "$1": {{ "samsung", "platform", "sth", 5 }} }, { "$1": {{ 
"t-mobile", "shortcut-menu", "sth", 5 }} }, { "$1": {{ "verizon", 
"voicemail-service", "sth", 5 }} } ], "t2": [ { "$2": [ 3, "John", [ { "sth": 
33 }, { "sth": 44 } ] ] } ], "t4": null, "t5": null, "t9": [ 3, 3, [ 9 ], null, 
"sth" ], "t7": [ 5, 10, 12.0, "sth" ] }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/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
new file mode 100644
index 0000000..86bc114
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_insert/array_insert.3.adm
@@ -0,0 +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" }} } ] }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_prepend/array_prepend.3.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_prepend/array_prepend.3.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_prepend/array_prepend.3.adm
new file mode 100644
index 0000000..0e3a1af
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_prepend/array_prepend.3.adm
@@ -0,0 +1 @@
+{ "t1": [ { "$1": {{ "sth", 5, "t-mobile", "customization" }} }, { "$1": {{ 
"sth", 5, "verizon", "voice-clarity" }} }, { "$1": {{ "sth", 5, "iphone", 
"platform" }} }, { "$1": {{ "sth", 5, "samsung", "voice-command" }} }, { "$1": 
{{ "sth", 5, "verizon", "shortcut-menu" }} }, { "$1": {{ "sth", 5, "motorola", 
"speed" }} }, { "$1": {{ "sth", 5, "sprint", "voice-command" }} }, { "$1": {{ 
"sth", 5, "motorola", "speed" }} }, { "$1": {{ "sth", 5, "iphone", 
"voice-clarity" }} }, { "$1": {{ "sth", 5, "samsung", "platform" }} }, { "$1": 
{{ "sth", 5, "t-mobile", "shortcut-menu" }} }, { "$1": {{ "sth", 5, "verizon", 
"voicemail-service" }} } ], "t2": [ { "$2": [ [ { "sth": 33 }, { "sth": 44 } ], 
3, "John" ] } ], "t4": null, "t5": null, "t7": [ 5, 10, 12.0, "sth", 77, "val" 
], "t8": [ 5, 10, null, "sth", 77, "val" ] }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_put/array_put.3.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_put/array_put.3.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_put/array_put.3.adm
new file mode 100644
index 0000000..e76b132
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_put/array_put.3.adm
@@ -0,0 +1 @@
+{ "t1": [ { "$1": {{ "t-mobile", "customization", 5 }} }, { "$1": {{ 
"verizon", "voice-clarity", "t-mobile", 5 }} }, { "$1": {{ "iphone", 
"platform", "t-mobile", 5 }} }, { "$1": {{ "samsung", "voice-command", 
"t-mobile", 5 }} }, { "$1": {{ "verizon", "shortcut-menu", "t-mobile", 5 }} }, 
{ "$1": {{ "motorola", "speed", "t-mobile", 5 }} }, { "$1": {{ "sprint", 
"voice-command", "t-mobile", 5 }} }, { "$1": {{ "motorola", "speed", 
"t-mobile", 5 }} }, { "$1": {{ "iphone", "voice-clarity", "t-mobile", 5 }} }, { 
"$1": {{ "samsung", "platform", "t-mobile", 5 }} }, { "$1": {{ "t-mobile", 
"shortcut-menu", 5 }} }, { "$1": {{ "verizon", "voicemail-service", "t-mobile", 
5 }} } ], "t3": null, "t5": [ 5, 10, 12.0, "sth" ], "t7": null, "t8": [ 3, 2, 
"sth", 9, 9 ], "t9": [ 3, 2, "sth", 1, 5 ], "t10": null }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_remove/array_remove.3.adm
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_remove/array_remove.3.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_remove/array_remove.3.adm
new file mode 100644
index 0000000..f579aa3
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_remove/array_remove.3.adm
@@ -0,0 +1 @@
+{ "t1": [ { "$1": {{ "customization" }} }, { "$1": {{ "verizon", 
"voice-clarity" }} }, { "$1": {{ "iphone", "platform" }} }, { "$1": {{ 
"samsung", "voice-command" }} }, { "$1": {{ "verizon", "shortcut-menu" }} }, { 
"$1": {{ "motorola", "speed" }} }, { "$1": {{ "sprint", "voice-command" }} }, { 
"$1": {{ "motorola", "speed" }} }, { "$1": {{ "iphone", "voice-clarity" }} }, { 
"$1": {{ "samsung", "platform" }} }, { "$1": {{ "shortcut-menu" }} }, { "$1": 
{{ "verizon", "voicemail-service" }} } ], "t3": null, "t5": [  ], "t7": null, 
"t8": [ 2 ], "t9": null }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/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 62659ca..632185e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -984,6 +984,11 @@
   </test-group>
   <test-group name="array_fun">
     <test-case FilePath="array_fun">
+      <compilation-unit name="array_prepend">
+        <output-dir compare="Text">array_prepend</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="array_fun">
       <compilation-unit name="array_append">
         <output-dir compare="Text">array_append</output-dir>
       </compilation-unit>
@@ -1012,6 +1017,25 @@
         <expected-error>HYR0115: Cannot compare non-primitive values (in line 
22, at column 8)</expected-error>
       </compilation-unit>
     </test-case>
+    <test-case FilePath="array_fun">
+      <compilation-unit name="array_insert">
+        <output-dir compare="Text">array_insert</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="array_fun">
+      <compilation-unit name="array_put">
+        <output-dir compare="Text">array_put</output-dir>
+        <expected-error>HYR0115: Cannot compare non-primitive values (in line 
22, at column 8)</expected-error>
+        <expected-error>HYR0115: Cannot compare non-primitive values (in line 
22, at column 8)</expected-error>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="array_fun">
+      <compilation-unit name="array_remove">
+        <output-dir compare="Text">array_remove</output-dir>
+        <expected-error>HYR0115: Cannot compare non-primitive values (in line 
22, at column 8)</expected-error>
+        <expected-error>HYR0115: Cannot compare non-primitive values (in line 
22, at column 8)</expected-error>
+      </compilation-unit>
+    </test-case>
   </test-group>
   <test-group name="boolean">
     <test-case FilePath="boolean">

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/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 da45e29..8a968df 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
@@ -43,6 +43,7 @@ import 
org.apache.asterix.om.typecomputer.impl.AInt64TypeComputer;
 import org.apache.asterix.om.typecomputer.impl.AInt8TypeComputer;
 import org.apache.asterix.om.typecomputer.impl.AIntervalTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.ALineTypeComputer;
+import org.apache.asterix.om.typecomputer.impl.AListFirstTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.AListTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.APoint3DTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.APointTypeComputer;
@@ -54,7 +55,6 @@ import 
org.apache.asterix.om.typecomputer.impl.ATimeTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.AUUIDTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.AYearMonthDurationTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.AnyTypeComputer;
-import org.apache.asterix.om.typecomputer.impl.ArrayAppendTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.ArrayRepeatTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.BooleanFunctionTypeComputer;
 import org.apache.asterix.om.typecomputer.impl.BooleanOnlyTypeComputer;
@@ -184,6 +184,12 @@ public class BuiltinFunctions {
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "deep-equal", 
2);
 
     // array functions
+    public static final FunctionIdentifier ARRAY_REMOVE =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"array-remove", FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier ARRAY_PUT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "array-put", 
FunctionIdentifier.VARARGS);
+    public static final FunctionIdentifier ARRAY_PREPEND =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"array-prepend", FunctionIdentifier.VARARGS);
     public static final FunctionIdentifier ARRAY_APPEND =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"array-append", FunctionIdentifier.VARARGS);
     public static final FunctionIdentifier ARRAY_POSITION =
@@ -194,6 +200,8 @@ public class BuiltinFunctions {
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"array-reverse", 1);
     public static final FunctionIdentifier ARRAY_CONTAINS =
             new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"array-contains", 2);
+    public static final FunctionIdentifier ARRAY_INSERT =
+            new FunctionIdentifier(FunctionConstants.ASTERIX_NS, 
"array-insert", FunctionIdentifier.VARARGS);
 
     // objects
     public static final FunctionIdentifier RECORD_MERGE =
@@ -1470,10 +1478,14 @@ public class BuiltinFunctions {
         addFunction(WORD_TOKENS, OrderedListOfAStringTypeComputer.INSTANCE, 
true);
 
         // array functions
-        addFunction(ARRAY_APPEND, ArrayAppendTypeComputer.INSTANCE, true);
+        addFunction(ARRAY_REMOVE, AListTypeComputer.INSTANCE_REMOVE, true);
+        addFunction(ARRAY_PUT, AListTypeComputer.INSTANCE_PUT, true);
+        addFunction(ARRAY_PREPEND, AListTypeComputer.INSTANCE_PREPEND, true);
+        addFunction(ARRAY_APPEND, AListTypeComputer.INSTANCE_APPEND, true);
+        addFunction(ARRAY_INSERT, AListTypeComputer.INSTANCE_INSERT, true);
         addFunction(ARRAY_POSITION, AInt32TypeComputer.INSTANCE, true);
         addFunction(ARRAY_REPEAT, ArrayRepeatTypeComputer.INSTANCE, true);
-        addFunction(ARRAY_REVERSE, AListTypeComputer.INSTANCE, true);
+        addFunction(ARRAY_REVERSE, AListFirstTypeComputer.INSTANCE, true);
         addFunction(ARRAY_CONTAINS, ABooleanTypeComputer.INSTANCE, true);
 
         // objects

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListFirstTypeComputer.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListFirstTypeComputer.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListFirstTypeComputer.java
new file mode 100644
index 0000000..5ba7ba4
--- /dev/null
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListFirstTypeComputer.java
@@ -0,0 +1,50 @@
+/*
+ * 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.om.typecomputer.impl;
+
+import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+import org.apache.asterix.om.types.AUnionType;
+import org.apache.asterix.om.types.BuiltinType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
+import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+
+/**
+ * A type computer that returns the same list type as the presumably input 
list at argument 0. If the argument is not a
+ * list, it returns "ANY".
+ */
+public class AListFirstTypeComputer extends AbstractResultTypeComputer {
+    public static final AListFirstTypeComputer INSTANCE = new 
AListFirstTypeComputer();
+
+    private AListFirstTypeComputer() {
+    }
+
+    @Override
+    protected IAType getResultType(ILogicalExpression expr, IAType... 
strippedInputTypes) throws AlgebricksException {
+        IAType argType = strippedInputTypes[0];
+        switch (argType.getTypeTag()) {
+            case ARRAY:
+            case MULTISET:
+                return AUnionType.createNullableType(argType);
+            default:
+                return BuiltinType.ANY;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListTypeComputer.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListTypeComputer.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListTypeComputer.java
old mode 100644
new mode 100755
index 92730f5..5b2513c
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListTypeComputer.java
+++ 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListTypeComputer.java
@@ -19,31 +19,68 @@
 
 package org.apache.asterix.om.typecomputer.impl;
 
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.common.exceptions.ErrorCode;
+import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
 import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
+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.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.core.algebra.base.ILogicalExpression;
+import 
org.apache.hyracks.algebricks.core.algebra.expressions.AbstractFunctionCallExpression;
 
 /**
- * A type computer that returns the same list type as the presumably input 
list at argument 0. If the argument is not a
- * list, it returns "ANY".
+ * Returns a list that is missable/nullable.
  */
 public class AListTypeComputer extends AbstractResultTypeComputer {
-    public static final AListTypeComputer INSTANCE = new AListTypeComputer();
+    public static final AListTypeComputer INSTANCE_REMOVE = new 
AListTypeComputer(2, false, false, true);
+    public static final AListTypeComputer INSTANCE_PUT = new 
AListTypeComputer(2, false, true, true);
+    public static final AListTypeComputer INSTANCE_PREPEND = new 
AListTypeComputer(2, false, true, false);
+    public static final AListTypeComputer INSTANCE_APPEND = new 
AListTypeComputer(2, true, true, false);
+    public static final AListTypeComputer INSTANCE_INSERT = new 
AListTypeComputer(3, false, true, false);
 
-    private AListTypeComputer() {
+    private final int minNumArgs;
+    private final boolean listIsLast;
+    private final boolean makeOpen;
+    private final boolean nullInNullOut;
+
+    private AListTypeComputer(int minNumArgs, boolean listIsLast, boolean 
makeOpen, boolean nullInNullOut) {
+        this.minNumArgs = minNumArgs;
+        this.listIsLast = listIsLast;
+        this.makeOpen = makeOpen;
+        this.nullInNullOut = nullInNullOut;
     }
 
     @Override
     protected IAType getResultType(ILogicalExpression expr, IAType... 
strippedInputTypes) throws AlgebricksException {
-        IAType argType = strippedInputTypes[0];
-        switch (argType.getTypeTag()) {
-            case ARRAY:
-            case MULTISET:
-                return argType;
-            default:
-                return BuiltinType.ANY;
+        if (strippedInputTypes.length < minNumArgs) {
+            String functionName = ((AbstractFunctionCallExpression) 
expr).getFunctionIdentifier().getName();
+            throw new 
CompilationException(ErrorCode.COMPILATION_INVALID_NUM_OF_ARGS, 
expr.getSourceLocation(),
+                    minNumArgs, functionName);
+        }
+        // output type should be the same as as the type tag at [list index]. 
The output type is nullable/missable
+        // since the output could be null due to other invalid arguments or 
the tag at [list index] itself is not list
+        int listIndex = 0;
+        if (listIsLast) {
+            listIndex = strippedInputTypes.length - 1;
+        }
+
+        IAType listType = strippedInputTypes[listIndex];
+        if (listType.getTypeTag() == ATypeTag.ARRAY) {
+            return makeOpen ? 
AUnionType.createUnknownableType(DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE)
+                    : AUnionType.createUnknownableType(listType);
+        } else if (listType.getTypeTag() == ATypeTag.MULTISET) {
+            return makeOpen ? 
AUnionType.createUnknownableType(DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE)
+                    : AUnionType.createUnknownableType(listType);
+        } else {
+            return BuiltinType.ANY;
         }
     }
+
+    @Override
+    protected boolean propagateNullAndMissing() {
+        return nullInNullOut;
+    }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ArrayAppendTypeComputer.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ArrayAppendTypeComputer.java
 
b/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ArrayAppendTypeComputer.java
deleted file mode 100755
index f2fed42..0000000
--- 
a/asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/ArrayAppendTypeComputer.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * 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.om.typecomputer.impl;
-
-import org.apache.asterix.common.exceptions.CompilationException;
-import org.apache.asterix.common.exceptions.ErrorCode;
-import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
-import org.apache.asterix.om.typecomputer.base.AbstractResultTypeComputer;
-import org.apache.asterix.om.types.ATypeTag;
-import org.apache.asterix.om.types.BuiltinType;
-import org.apache.asterix.om.types.IAType;
-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;
-
-public class ArrayAppendTypeComputer extends AbstractResultTypeComputer {
-
-    public static final ArrayAppendTypeComputer INSTANCE = new 
ArrayAppendTypeComputer();
-
-    @Override
-    protected IAType getResultType(ILogicalExpression expr, IAType... 
strippedInputTypes) throws AlgebricksException {
-        if (strippedInputTypes.length < 2) {
-            String functionName = ((AbstractFunctionCallExpression) 
expr).getFunctionIdentifier().getName();
-            throw new 
CompilationException(ErrorCode.COMPILATION_INVALID_NUM_OF_ARGS, 
expr.getSourceLocation(), 2,
-                    functionName);
-        }
-        // type tag at [0] should be array or multiset.
-        ATypeTag typeTag = strippedInputTypes[0].getTypeTag();
-        if (typeTag == ATypeTag.ARRAY) {
-            return DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE;
-        } else if (typeTag == ATypeTag.MULTISET) {
-            return DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE;
-        } else {
-            return BuiltinType.ANY;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/ExceptionTest.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/ExceptionTest.java
 
b/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/ExceptionTest.java
index fc4646f..29cb9a7 100644
--- 
a/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/ExceptionTest.java
+++ 
b/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/ExceptionTest.java
@@ -22,6 +22,7 @@ package org.apache.asterix.om.typecomputer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.List;
@@ -105,8 +106,14 @@ public class ExceptionTest {
                 
when(mockExpr.getOpaqueParameters()).thenReturn(opaqueParameters);
 
                 // Invokes a type computer.
-                IResultTypeComputer instance = (IResultTypeComputer) 
c.getField("INSTANCE").get(null);
-                instance.computeType(mockExpr, mockTypeEnv, 
mockMetadataProvider);
+                IResultTypeComputer instance;
+                Field[] fields = c.getFields();
+                for (Field field : fields) {
+                    if (field.getName().startsWith("INSTANCE")) {
+                        instance = (IResultTypeComputer) field.get(null);
+                        instance.computeType(mockExpr, mockTypeEnv, 
mockMetadataProvider);
+                    }
+                }
             } catch (AlgebricksException ae) {
                 String msg = ae.getMessage();
                 if (msg.startsWith("ASX")) {

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/TypeComputerTest.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/TypeComputerTest.java
 
b/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/TypeComputerTest.java
index 1ff62b9..c4646e5 100644
--- 
a/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/TypeComputerTest.java
+++ 
b/asterixdb/asterix-om/src/test/java/org/apache/asterix/om/typecomputer/TypeComputerTest.java
@@ -22,6 +22,7 @@ package org.apache.asterix.om.typecomputer;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -106,16 +107,21 @@ public class TypeComputerTest {
         when(mockExpr.getOpaqueParameters()).thenReturn(opaqueParameters);
 
         // Tests the return type. It should be either ANY or NULLABLE/MISSABLE.
-        IResultTypeComputer instance = (IResultTypeComputer) 
c.getField("INSTANCE").get(null);
-        IAType resultType = instance.computeType(mockExpr, mockTypeEnv, 
mockMetadataProvider);
-        ATypeTag typeTag = resultType.getTypeTag();
-        if (typeTag == ATypeTag.ANY) {
-            return true;
-        }
-        if (typeTag == ATypeTag.UNION) {
-            AUnionType unionType = (AUnionType) resultType;
-            return unionType.isMissableType() && unionType.isNullableType();
+        IResultTypeComputer instance;
+        IAType resultType;
+        Field[] fields = c.getFields();
+        for (Field field : fields) {
+            if (field.getName().startsWith("INSTANCE")) {
+                System.out.println("Test type computer INSTANCE: " + 
field.getName());
+                instance = (IResultTypeComputer) field.get(null);
+                resultType = instance.computeType(mockExpr, mockTypeEnv, 
mockMetadataProvider);
+                ATypeTag typeTag = resultType.getTypeTag();
+                if (typeTag != ATypeTag.ANY && !(typeTag == ATypeTag.UNION && 
((AUnionType) resultType).isNullableType()
+                        && ((AUnionType) resultType).isMissableType())) {
+                    return false;
+                }
+            }
         }
-        return false;
+        return true;
     }
 }

http://git-wip-us.apache.org/repos/asf/asterixdb/blob/0d7974f2/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
----------------------------------------------------------------------
diff --git 
a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
new file mode 100755
index 0000000..3701ff5
--- /dev/null
+++ 
b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/AbstractArrayAddRemoveEval.java
@@ -0,0 +1,209 @@
+/*
+ * 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 static 
org.apache.asterix.om.types.EnumDeserializer.ATYPETAGDESERIALIZER;
+
+import java.io.IOException;
+
+import org.apache.asterix.builders.IAsterixListBuilder;
+import org.apache.asterix.builders.OrderedListBuilder;
+import org.apache.asterix.builders.UnorderedListBuilder;
+import org.apache.asterix.om.pointables.base.DefaultOpenFieldType;
+import org.apache.asterix.om.types.ATypeTag;
+import org.apache.asterix.om.types.AbstractCollectionType;
+import org.apache.asterix.om.types.IAType;
+import org.apache.asterix.runtime.evaluators.common.ListAccessor;
+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.ErrorCode;
+import org.apache.hyracks.api.exceptions.HyracksDataException;
+import org.apache.hyracks.api.exceptions.SourceLocation;
+import org.apache.hyracks.data.std.api.IPointable;
+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;
+
+public abstract class AbstractArrayAddRemoveEval implements IScalarEvaluator {
+    protected static final int RETURN_MISSING = -1;
+    protected static final int RETURN_NULL = -2;
+
+    private final IAType[] argTypes;
+    private final ArrayBackedValueStorage storage;
+    private final IPointable listArg;
+    private final IPointable[] valuesArgs;
+    private final IScalarEvaluator listArgEval;
+    private final IScalarEvaluator[] valuesEval;
+    private final SourceLocation sourceLocation;
+    private final CastTypeEvaluator caster;
+    private final ListAccessor listAccessor;
+    private final int listOffset;
+    private final int valuesOffset;
+    private final boolean comparesValues;
+    private final boolean makeOpen;
+    private final boolean acceptNullValues;
+    private IAsterixListBuilder orderedListBuilder;
+    private IAsterixListBuilder unorderedListBuilder;
+
+    public AbstractArrayAddRemoveEval(IScalarEvaluatorFactory[] args, 
IHyracksTaskContext ctx, int listOffset,
+            int valuesOffset, int numValues, IAType[] argTypes, boolean 
comparesValues, SourceLocation sourceLocation,
+            boolean makeOpen, boolean acceptNullValues) throws 
HyracksDataException {
+        this.listOffset = listOffset;
+        this.valuesOffset = valuesOffset;
+        this.argTypes = argTypes;
+        this.comparesValues = comparesValues;
+        this.sourceLocation = sourceLocation;
+        this.makeOpen = makeOpen;
+        this.acceptNullValues = acceptNullValues;
+        orderedListBuilder = null;
+        unorderedListBuilder = null;
+        listAccessor = new ListAccessor();
+        caster = new CastTypeEvaluator();
+        storage = new ArrayBackedValueStorage();
+        listArg = new VoidPointable();
+        listArgEval = args[listOffset].createScalarEvaluator(ctx);
+        valuesArgs = new IPointable[numValues];
+        valuesEval = new IScalarEvaluator[numValues];
+        for (int i = 0; i < numValues; i++) {
+            valuesArgs[i] = new VoidPointable();
+            valuesEval[i] = args[i + valuesOffset].createScalarEvaluator(ctx);
+        }
+    }
+
+    /**
+     * @param listType the type of the list, ordered or unordered.
+     * @param listArg the list into which to insert the items at the 
calculated returned position
+     * @param tuple the tuple that contains the arguments including position 
argument
+     * @return -1 if position value is missing, -2 if null, otherwise should 
return the adjusted position value, >= 0
+     */
+    protected abstract int getPosition(IFrameTupleReference tuple, IPointable 
listArg, ATypeTag listType)
+            throws HyracksDataException;
+
+    @Override
+    public void evaluate(IFrameTupleReference tuple, IPointable result) throws 
HyracksDataException {
+        // get the list argument, 1st or last argument, make sure it's a list
+        listArgEval.evaluate(tuple, listArg);
+        ATypeTag listArgTag = 
ATYPETAGDESERIALIZER.deserialize(listArg.getByteArray()[listArg.getStartOffset()]);
+
+        // evaluate the position argument if provided by some functions
+        int adjustedPosition = getPosition(tuple, listArg, listArgTag);
+
+        if (listArgTag == ATypeTag.MISSING || adjustedPosition == 
RETURN_MISSING) {
+            PointableHelper.setMissing(result);
+            return;
+        }
+
+        boolean returnNull = false;
+        if (!listArgTag.isListType() || adjustedPosition == RETURN_NULL) {
+            returnNull = true;
+        }
+
+        // evaluate values to be added/removed
+        ATypeTag valueTag;
+        IAType defaultOpenType;
+        boolean encounteredNonPrimitive = false;
+        for (int i = 0; i < valuesEval.length; i++) {
+            // cast val to open if needed. don't cast if function will return 
null anyway, e.g. list arg was not list
+            defaultOpenType = 
DefaultOpenFieldType.getDefaultOpenFieldType(argTypes[i + 
valuesOffset].getTypeTag());
+            if (defaultOpenType != null && !returnNull) {
+                caster.reset(defaultOpenType, argTypes[i + valuesOffset], 
valuesEval[i]);
+                caster.evaluate(tuple, valuesArgs[i]);
+            } else {
+                valuesEval[i].evaluate(tuple, valuesArgs[i]);
+            }
+            valueTag = 
ATYPETAGDESERIALIZER.deserialize(valuesArgs[i].getByteArray()[valuesArgs[i].getStartOffset()]);
+            // for now, we don't support deep equality of object/lists. Throw 
an error if the value is of these types
+            if (comparesValues && valueTag.isDerivedType()) {
+                encounteredNonPrimitive = true;
+            }
+            if (valueTag == ATypeTag.MISSING) {
+                PointableHelper.setMissing(result);
+                return;
+            }
+            if (!acceptNullValues && valueTag == ATypeTag.NULL) {
+                returnNull = true;
+            }
+        }
+
+        if (returnNull) {
+            PointableHelper.setNull(result);
+            return;
+        }
+
+        if (encounteredNonPrimitive) {
+            throw 
HyracksDataException.create(ErrorCode.CANNOT_COMPARE_COMPLEX, sourceLocation);
+        }
+        // all arguments are valid
+        AbstractCollectionType listType = (AbstractCollectionType) 
argTypes[listOffset];
+        IAsterixListBuilder listBuilder;
+        // create the new list to be returned. cast the input list and make it 
open if required
+        if (listArgTag == ATypeTag.ARRAY) {
+            if (orderedListBuilder == null) {
+                orderedListBuilder = new OrderedListBuilder();
+            }
+            listBuilder = orderedListBuilder;
+            if (makeOpen) {
+                listType = DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE;
+                caster.reset(listType, argTypes[listOffset], listArgEval);
+                caster.evaluate(tuple, listArg);
+            }
+        } else {
+            if (unorderedListBuilder == null) {
+                unorderedListBuilder = new UnorderedListBuilder();
+            }
+            listBuilder = unorderedListBuilder;
+            if (makeOpen) {
+                listType = 
DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE;
+                caster.reset(listType, argTypes[listOffset], listArgEval);
+                caster.evaluate(tuple, listArg);
+            }
+        }
+
+        listBuilder.reset(listType);
+        listAccessor.reset(listArg.getByteArray(), listArg.getStartOffset());
+        try {
+            processList(listAccessor, listBuilder, valuesArgs, 
adjustedPosition);
+            storage.reset();
+            listBuilder.write(storage.getDataOutput(), true);
+            result.set(storage);
+        } catch (IOException e) {
+            throw HyracksDataException.create(e);
+        }
+    }
+
+    protected void processList(ListAccessor listAccessor, IAsterixListBuilder 
listBuilder, IPointable[] values,
+            int position) throws IOException {
+        int i;
+        for (i = 0; i < position; i++) {
+            storage.reset();
+            listAccessor.writeItem(i, storage.getDataOutput());
+            listBuilder.addItem(storage);
+        }
+        // insert the values arguments
+        for (int j = 0; j < values.length; j++) {
+            listBuilder.addItem(values[j]);
+        }
+        for (; i < listAccessor.size(); i++) {
+            storage.reset();
+            listAccessor.writeItem(i, storage.getDataOutput());
+            listBuilder.addItem(storage);
+        }
+    }
+}

Reply via email to