Hussain Towaileb has uploaded a new change for review. https://asterix-gerrit.ics.uci.edu/3031
Change subject: [ASTERIXDB-2476][FUN] Support array slicing in SQL++ ...................................................................... [ASTERIXDB-2476][FUN] Support array slicing in SQL++ - user model changes: yes - storage format changes: no - interface changes: no Details: - Added array_slice function. - Added array_slice function test cases. - Array slice syntax and documentation will be added in subsequent changes. Change-Id: Ic609676cc068e92c6342fb0fa4c9074ec4bd98bf --- A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.4.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.4.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.4.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.4.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.4.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.4.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.1.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.2.update.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.3.query.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.4.ddl.sqlpp A asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_double/array_slice_double.3.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_int/array_slice_int.3.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_invalid/array_slice_invalid.3.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_missing/array_slice_missing.3.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_mixed/array_slice_mixed.3.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_negative/array_slice_negative.3.adm A asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_null/array_slice_null.3.adm M asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/functions/BuiltinFunctions.java M asterixdb/asterix-om/src/main/java/org/apache/asterix/om/typecomputer/impl/AListTypeComputer.java A asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySliceDescriptor.java M asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java 40 files changed, 1,302 insertions(+), 0 deletions(-) git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb refs/changes/31/3031/1 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.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_slice/array_slice_double/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.2.update.sqlpp new file mode 100755 index 0000000..1c4bad0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.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}, "followers":["John Green", "Emily Jones"]} +]); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.3.query.sqlpp new file mode 100755 index 0000000..a3ba922 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.3.query.sqlpp @@ -0,0 +1,30 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +use TinySocial; + +{ + "t1": (array_slice([0, 1, 2, 3], 0, 1.0)), // OK + "t2": (array_slice([0, 1, 2, 3], 2.0, 3.0)), // OK + "t3": (array_slice([0, 1, 2, 3], 2, 3.0)), // OK + "t4": (array_slice([0, 1, 2, 3], 1.5, 3)), // null + "t5": (array_slice([0, 1, 2, 3], 1, -1.0)), // OK + "t6": (array_slice([0, 1, 2, 3], 1, -2.3)), // null + "t7": (SELECT value array_slice(d1.followers, 0.0, -1) FROM d1) // OK +}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.4.ddl.sqlpp new file mode 100755 index 0000000..873178c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_double/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.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_slice/array_slice_int/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.2.update.sqlpp new file mode 100755 index 0000000..1c4bad0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.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}, "followers":["John Green", "Emily Jones"]} +]); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.3.query.sqlpp new file mode 100755 index 0000000..fa469aa --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.3.query.sqlpp @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +use TinySocial; + +{ + "t1": (array_slice([], 0, 0)), // null + "t2": (array_slice([0, 1, 2, 3], 0, 1)), // OK + "t3": (array_slice([0, 1, 2, 3], 2, 4)), // OK + "t4": (SELECT value array_slice(d1.followers, 0, 1) FROM d1) // OK +}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.4.ddl.sqlpp new file mode 100755 index 0000000..873178c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_int/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.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_slice/array_slice_invalid/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.2.update.sqlpp new file mode 100755 index 0000000..1c4bad0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.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}, "followers":["John Green", "Emily Jones"]} +]); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.3.query.sqlpp new file mode 100755 index 0000000..4baf972 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.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. + */ + + /* + * Those tests have invalid conditions, like position greater than array length, and start greater than end position + */ + +use TinySocial; + +{ + "t1": (array_slice([0, 1, 2, 3], 0, 2)), // OK + "t2": (array_slice([0, 1, 2, 3], 2, 2)), // OK + "t3": (array_slice([0, 1, 2, 3], 2, 1)), // null + "t4": (array_slice([0, 1, 2, 3], 10, 3)), // null + "t5": (array_slice([0, 1, 2, 3], 1, 10)), // null + "t6": (SELECT value array_slice(d1.followers, 1, 0) FROM d1) // null +}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.4.ddl.sqlpp new file mode 100755 index 0000000..873178c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_invalid/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.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_slice/array_slice_missing/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.2.update.sqlpp new file mode 100755 index 0000000..1c4bad0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.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}, "followers":["John Green", "Emily Jones"]} +]); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.3.query.sqlpp new file mode 100755 index 0000000..0eeed80 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.3.query.sqlpp @@ -0,0 +1,27 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +use TinySocial; + +{ + "t1": (array_slice([0, 1, 2, 3], 1)), // Exception (OK After Parser is extended with new syntax) + "t2": (array_slice([0, 1, 2, 3])), // Exception + "t3": (array_slice()) // Exception + //"t4": (SELECT array_slice(d1.followers, 0, 2) FROM d1) // OK +}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.4.ddl.sqlpp new file mode 100755 index 0000000..873178c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_missing/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.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_slice/array_slice_mixed/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.2.update.sqlpp new file mode 100755 index 0000000..1c4bad0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.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}, "followers":["John Green", "Emily Jones"]} +]); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.3.query.sqlpp new file mode 100755 index 0000000..e6e4d6d --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.3.query.sqlpp @@ -0,0 +1,28 @@ +/* + * 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_slice("non_array", 1, 2)), // null + "t2": (array_slice([0, 1, 2, 3], "0", 3)), // null + "t3": (array_slice([0, 1, 2, 3], 0, "3")), // null + "t4": (array_slice([0, 1, 2, 3], 0, to_double("4"))), // OK + "t5": (array_slice(["zero", [1], true, 3], 0, to_double("3"))) // OK +}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.4.ddl.sqlpp new file mode 100755 index 0000000..873178c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_mixed/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.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_slice/array_slice_negative/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.2.update.sqlpp new file mode 100755 index 0000000..1c4bad0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.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}, "followers":["John Green", "Emily Jones"]} +]); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.3.query.sqlpp new file mode 100755 index 0000000..dcfe5ff --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.3.query.sqlpp @@ -0,0 +1,29 @@ +/* + * 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_slice([0, 1, 2, 3], 0, -1)), // OK + "t2": (array_slice([0, 1, 2, 3], -2, 3)), // OK + "t3": (array_slice([0, 1, 2, 3], -2, -1)), // OK + "t4": (array_slice([0, 1, 2, 3], -1, -2)), // null + "t5": (array_slice([0, 1, 2, 3], 0, -10)), // null + "t6": (SELECT value array_slice(d1.followers, 0, -1) FROM d1) // OK +}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.4.ddl.sqlpp new file mode 100755 index 0000000..873178c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_negative/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.1.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.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_slice/array_slice_null/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.2.update.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.2.update.sqlpp new file mode 100755 index 0000000..1c4bad0 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.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}, "followers":["John Green", "Emily Jones"]} +]); \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.3.query.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.3.query.sqlpp new file mode 100755 index 0000000..7e5429f --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.3.query.sqlpp @@ -0,0 +1,28 @@ +/* + * 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_slice(null, 1, 2)), // null + "t2": (array_slice([0, 1, 2, 3], null, 3)), // null + "t3": (array_slice([0, 1, 2, 3], 0, null)), // null + "t4": (array_slice([0, 1, null, null], 1, 4)), // OK + "t5": (SELECT value array_slice(d1.followers, null, 2) FROM d1) // null +}; \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.4.ddl.sqlpp b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.4.ddl.sqlpp new file mode 100755 index 0000000..873178c --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/array_fun/array_slice/array_slice_null/array_slice.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 diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_double/array_slice_double.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_double/array_slice_double.3.adm new file mode 100644 index 0000000..0fed383 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_double/array_slice_double.3.adm @@ -0,0 +1 @@ +{ "t1": [ 0 ], "t2": [ 2 ], "t3": [ 2 ], "t4": null, "t5": [ 1, 2 ], "t6": null, "t7": [ null, [ "John Green" ] ] } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_int/array_slice_int.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_int/array_slice_int.3.adm new file mode 100644 index 0000000..e44168d --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_int/array_slice_int.3.adm @@ -0,0 +1 @@ +{ "t1": null, "t2": [ 0 ], "t3": [ 2, 3 ], "t4": [ null, [ "John Green" ] ] } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_invalid/array_slice_invalid.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_invalid/array_slice_invalid.3.adm new file mode 100644 index 0000000..a3bfac7 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_invalid/array_slice_invalid.3.adm @@ -0,0 +1 @@ +{ "t1": [ 0, 1 ], "t2": [ ], "t3": null, "t4": null, "t5": null, "t6": [ null, null ] } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_missing/array_slice_missing.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_missing/array_slice_missing.3.adm new file mode 100644 index 0000000..8e001df --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_missing/array_slice_missing.3.adm @@ -0,0 +1 @@ +{ "t1": null, "t2": null, "t3": null, "t4": [ null, [ "John Green" ] ] } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_mixed/array_slice_mixed.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_mixed/array_slice_mixed.3.adm new file mode 100644 index 0000000..03ab59b --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_mixed/array_slice_mixed.3.adm @@ -0,0 +1 @@ +{ "t1": null, "t2": null, "t3": null, "t4": [ 0, 1, 2, 3 ], "t5": [ "zero", [ 1 ], true ] } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_negative/array_slice_negative.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_negative/array_slice_negative.3.adm new file mode 100644 index 0000000..0bf2eb6 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_negative/array_slice_negative.3.adm @@ -0,0 +1 @@ +{ "t1": [ 0, 1, 2 ], "t2": [ 2 ], "t3": [ 2 ], "t4": null, "t5": null, "t6": [ null, [ "John Green" ] ] } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_null/array_slice_null.3.adm b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_null/array_slice_null.3.adm new file mode 100644 index 0000000..bb0ccf3 --- /dev/null +++ b/asterixdb/asterix-app/src/test/resources/runtimets/results/array_fun/array_slice/array_slice_null/array_slice_null.3.adm @@ -0,0 +1 @@ +{ "t1": null, "t2": null, "t3": null, "t4": [ 1, null, null ], "t5": null } \ No newline at end of file diff --git a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml index e52449c..64d0b06 100644 --- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml +++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml @@ -2031,6 +2031,37 @@ <expected-error>Cannot compare non-primitive values (in line 27, at column 8)</expected-error> </compilation-unit> </test-case> + <test-case FilePath="array_fun"> + <compilation-unit name="array_slice/array_slice_double"> + <output-dir compare="Text">array_slice/array_slice_double</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="array_fun"> + <compilation-unit name="array_slice/array_slice_int"> + <output-dir compare="Text">array_slice/array_slice_int</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="array_fun"> + <compilation-unit name="array_slice/array_slice_invalid"> + <output-dir compare="Text">array_slice/array_slice_invalid</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="array_fun"> + <compilation-unit name="array_slice/array_slice_missing"> + <output-dir compare="Text">array_slice/array_slice_missing</output-dir> + <expected-error>Compilation error</expected-error> + </compilation-unit> + </test-case> + <test-case FilePath="array_fun"> + <compilation-unit name="array_slice/array_slice_mixed"> + <output-dir compare="Text">array_slice/array_slice_mixed</output-dir> + </compilation-unit> + </test-case> + <test-case FilePath="array_fun"> + <compilation-unit name="array_slice/array_slice_negative"> + <output-dir compare="Text">array_slice/array_slice_negative</output-dir> + </compilation-unit> + </test-case> </test-group> <test-group name="boolean"> <test-case FilePath="boolean"> 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 9a52f55..1a941be 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 @@ -239,6 +239,8 @@ new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "array-symdiffn", FunctionIdentifier.VARARGS); public static final FunctionIdentifier ARRAY_STAR = new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "array-star", 1); + public static final FunctionIdentifier ARRAY_SLICE = + new FunctionIdentifier(FunctionConstants.ASTERIX_NS, "array-slice", 3); // objects public static final FunctionIdentifier RECORD_MERGE = @@ -1923,6 +1925,7 @@ addFunction(ARRAY_SYMDIFF, AListMultiListArgsTypeComputer.INSTANCE, true); addFunction(ARRAY_SYMDIFFN, AListMultiListArgsTypeComputer.INSTANCE, true); addFunction(ARRAY_STAR, OpenARecordTypeComputer.INSTANCE, true); + addFunction(ARRAY_SLICE, AListTypeComputer.INSTANCE_SLICE, true); // objects addFunction(RECORD_MERGE, RecordMergeTypeComputer.INSTANCE, true); 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 index d1c9c48..3e3e99f 100755 --- 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 @@ -40,6 +40,7 @@ public static final AListTypeComputer INSTANCE_APPEND = new AListTypeComputer(2, -1, false, true, false); public static final AListTypeComputer INSTANCE_INSERT = new AListTypeComputer(3, -1, false, true, false); public static final AListTypeComputer INSTANCE_REPLACE = new AListTypeComputer(3, 4, false, true, false); + public static final AListTypeComputer INSTANCE_SLICE = new AListTypeComputer(2, 3, false, false, false); private final int minNumArgs; private final int maxNumArgs; diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySliceDescriptor.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySliceDescriptor.java new file mode 100644 index 0000000..57ddade --- /dev/null +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/evaluators/functions/ArraySliceDescriptor.java @@ -0,0 +1,335 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.asterix.runtime.evaluators.functions; + +import org.apache.asterix.builders.IAsterixListBuilder; +import org.apache.asterix.builders.OrderedListBuilder; +import org.apache.asterix.builders.UnorderedListBuilder; +import org.apache.asterix.dataflow.data.nontagged.serde.ADoubleSerializerDeserializer; +import org.apache.asterix.dataflow.data.nontagged.serde.AFloatSerializerDeserializer; +import org.apache.asterix.dataflow.data.nontagged.serde.AInt16SerializerDeserializer; +import org.apache.asterix.dataflow.data.nontagged.serde.AInt32SerializerDeserializer; +import org.apache.asterix.dataflow.data.nontagged.serde.AInt64SerializerDeserializer; +import org.apache.asterix.dataflow.data.nontagged.serde.AInt8SerializerDeserializer; +import org.apache.asterix.om.functions.BuiltinFunctions; +import org.apache.asterix.om.functions.IFunctionDescriptor; +import org.apache.asterix.om.functions.IFunctionDescriptorFactory; +import org.apache.asterix.om.functions.IFunctionTypeInferer; +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.om.types.hierachy.ATypeHierarchy; +import org.apache.asterix.runtime.evaluators.base.AbstractScalarFunctionDynamicDescriptor; +import org.apache.asterix.runtime.evaluators.common.ListAccessor; +import org.apache.asterix.runtime.exceptions.UnsupportedItemTypeException; +import org.apache.asterix.runtime.functions.FunctionTypeInferers; +import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException; +import org.apache.hyracks.algebricks.core.algebra.functions.FunctionIdentifier; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluator; +import org.apache.hyracks.algebricks.runtime.base.IScalarEvaluatorFactory; +import org.apache.hyracks.api.context.IHyracksTaskContext; +import org.apache.hyracks.api.exceptions.HyracksDataException; +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; + +import java.io.IOException; + +import static org.apache.asterix.om.types.EnumDeserializer.ATYPETAGDESERIALIZER; + +/** + * <pre> + * array_slice(array, start, end) returns a subset of the {@code array} containing the elements from position + * {@code start} to position {@code end -1}. The {@code end} argument is optional. if {@code end} is not provided, + * the returned subset of the {@code array} contains the elements from {@code start} position to the end of + * {@code array}. The array index starts at {@code 0}. The element at {@code start} is included while the element + * at {@code end} is not included. Negative positions are counted backwards from the end of the array. + * + * Examples: + * array_slice([1, 2, 3, 4], 1, 3) will return [2, 3]. + * array_slice([1, 2, 3, 4], -3, 3) will return [2, 3]. + * array_slice([1, 2, 3, 4], 1) will return [2, 3, 4]. + * + * It throws an error at compile time if the number of arguments is greater than {@code 3} or less than {@code 2}. + * + * {@code MISSING} is returned if: + * - {@code array} is missing. + * - {@code start} is missing. + * + * {@code NULL} is returned if: + * - {@code array} is not an array. + * - {@code start} or {@code end} is not valid numbers. 1, 2, 3.0 are accepted but 3.2 is not accepted. + * - {@code start} or {@code end} is greater than the length of the {@code array}. + * - {@code end} is smaller than {@code start}. + * </pre> + */ +public class ArraySliceDescriptor extends AbstractScalarFunctionDynamicDescriptor { + private static final long serialVersionUID = 1L; + private IAType inputListType; + + public static final IFunctionDescriptorFactory FACTORY = new IFunctionDescriptorFactory() { + @Override + public IFunctionDescriptor createFunctionDescriptor() { + return new ArraySliceDescriptor(); + } + + @Override + public IFunctionTypeInferer createFunctionTypeInferer() { + return FunctionTypeInferers.SET_ARGUMENTS_TYPE; + } + }; + + @Override + public FunctionIdentifier getIdentifier() { + return BuiltinFunctions.ARRAY_SLICE; + } + + @Override + public void setImmutableStates(Object... states) { + inputListType = (IAType) states[0]; + } + + @Override + public IScalarEvaluatorFactory createEvaluatorFactory(final IScalarEvaluatorFactory[] args) + throws AlgebricksException { + return new IScalarEvaluatorFactory() { + private static final long serialVersionUID = 1L; + + @Override + public IScalarEvaluator createScalarEvaluator(final IHyracksTaskContext ctx) throws HyracksDataException { + return new ArraySliceEval(args, ctx); + } + }; + } + + public class ArraySliceEval implements IScalarEvaluator { + // Storage + private final ArrayBackedValueStorage storage = new ArrayBackedValueStorage(); + + // Evaluators + private final IScalarEvaluator listEval; + private final IScalarEvaluator startPositionEval; + private IScalarEvaluator endPositionEval; + + // Pointables + private final IPointable listPointable = new VoidPointable(); + private final IPointable startPositionPointable = new VoidPointable(); + private final IPointable endPositionPointable = new VoidPointable(); + + // Accessors + private final ListAccessor listAccessor = new ListAccessor(); + private final CastTypeEvaluator caster = new CastTypeEvaluator(); + + // Constructor + public ArraySliceEval(IScalarEvaluatorFactory[] args, IHyracksTaskContext ctx) throws HyracksDataException { + // Evaluators + listEval = args[0].createScalarEvaluator(ctx); + startPositionEval = args[1].createScalarEvaluator(ctx); + + // Check for optional parameter + if (args.length == 3) { + endPositionEval = args[2].createScalarEvaluator(ctx); + } + } + + @Override + public void evaluate(IFrameTupleReference tuple, IPointable result) throws HyracksDataException { + // Positions + double startPositionValue; + double endPositionValue = 0; + + // Evaluate + listEval.evaluate(tuple, listPointable); + startPositionEval.evaluate(tuple, startPositionPointable); + + // Data bytes, offsets and type tags + byte[] listBytes = listPointable.getByteArray(); + byte[] startPositionBytes = startPositionPointable.getByteArray(); + int listOffset = listPointable.getStartOffset(); + int startPositionOffset = startPositionPointable.getStartOffset(); + ATypeTag listTypetag = ATYPETAGDESERIALIZER.deserialize(listBytes[listOffset]); + ATypeTag startPositionTypeTag = ATYPETAGDESERIALIZER.deserialize(startPositionBytes[startPositionOffset]); + + // Invalid types + if (!listTypetag.isListType() || !ATypeHierarchy.isCompatible(startPositionTypeTag, ATypeTag.DOUBLE)) { + PointableHelper.setNull(result); + return; + } + + // List accessor + listAccessor.reset(listBytes, listOffset); + + // Optional parameter + byte[] endPositionBytes = null; + int endPositionOffset = 0; + ATypeTag endPositionTypeTag; + boolean isEndPositionAvailable = false; + + // Check for the optional parameter + if (endPositionEval != null) { + // Evaluate + endPositionEval.evaluate(tuple, endPositionPointable); + + // Data bytes, offset and type tag + endPositionBytes = endPositionPointable.getByteArray(); + endPositionOffset = endPositionPointable.getStartOffset(); + endPositionTypeTag = ATYPETAGDESERIALIZER.deserialize(endPositionBytes[endPositionOffset]); + + // Mark flag + isEndPositionAvailable = true; + } else { + // Use list length as end position + endPositionValue = listAccessor.size(); + endPositionTypeTag = ATypeTag.DOUBLE; + } + + // Type tag checks (List and valid number positions) + if (!ATypeHierarchy.isCompatible(endPositionTypeTag, ATypeTag.DOUBLE)) { + PointableHelper.setNull(result); + return; + } + + // Get the position value + startPositionValue = getValue(startPositionBytes, startPositionOffset, startPositionTypeTag); + endPositionValue = isEndPositionAvailable + ? getValue(endPositionBytes, endPositionOffset, endPositionTypeTag) : endPositionValue; + + // Since we accept negative values for positions, we need to convert them appropriately to positives before + // we compare the start and end positions. (e.g. length = 4, start = -1 -> start = 4 + (-1) = 3) + startPositionValue = startPositionValue < 0 ? listAccessor.size() + startPositionValue : startPositionValue; + endPositionValue = endPositionValue < 0 ? listAccessor.size() + endPositionValue : endPositionValue; + + // Check arguments validity + if (!isValidArguments(listAccessor.size(), startPositionValue, endPositionValue)) { + PointableHelper.setNull(result); + return; + } + + // From here onward, all arguments are valid + // Prepare the list builder + IAsterixListBuilder listBuilder; + AbstractCollectionType collectionType; + + // Array + if (listTypetag == ATypeTag.ARRAY) { + listBuilder = new OrderedListBuilder(); + + // Array or open type + if (inputListType.getTypeTag() == ATypeTag.ARRAY) { + collectionType = (AbstractCollectionType) inputListType; + } else { + collectionType = DefaultOpenFieldType.NESTED_OPEN_AORDERED_LIST_TYPE; + caster.reset(collectionType, inputListType, listEval); + caster.evaluate(tuple, listPointable); + } + } + // Multiset + else { + listBuilder = new UnorderedListBuilder(); + + // Multiset or open type + if (inputListType.getTypeTag() == ATypeTag.MULTISET) { + collectionType = (AbstractCollectionType) inputListType; + } else { + collectionType = DefaultOpenFieldType.NESTED_OPEN_AUNORDERED_LIST_TYPE; + caster.reset(collectionType, inputListType, listEval); + caster.evaluate(tuple, listPointable); + } + } + + // Builder ready + listBuilder.reset(collectionType); + listAccessor.reset(listPointable.getByteArray(), listPointable.getStartOffset()); + + try { + // Create the subset list based on the positions + for (double i = startPositionValue; i < endPositionValue; i++) { + storage.reset(); + listAccessor.writeItem((int) i, storage.getDataOutput()); + listBuilder.addItem(storage); + } + } catch (IOException ex) { + throw HyracksDataException.create(ex); + } + + storage.reset(); + listBuilder.write(storage.getDataOutput(), true); + result.set(storage); + } + + // Get the value + private double getValue(byte[] data, int offset, ATypeTag typeTag) throws HyracksDataException { + + // Value based on type tag + switch (typeTag) { + case TINYINT: + return AInt8SerializerDeserializer.getByte(data, offset + 1); + case SMALLINT: + return AInt16SerializerDeserializer.getShort(data, offset + 1); + case INTEGER: + return AInt32SerializerDeserializer.getInt(data, offset + 1); + case BIGINT: + return AInt64SerializerDeserializer.getLong(data, offset + 1); + case FLOAT: + return AFloatSerializerDeserializer.getFloat(data, offset + 1); + case DOUBLE: + return ADoubleSerializerDeserializer.getDouble(data, offset + 1); + default: + throw new UnsupportedItemTypeException(sourceLoc, getIdentifier(), typeTag.serialize()); + } + } + + /** + * Ensures that the positions used are valid + * + * @param listLength list length + * @param startPosition start position value + * @param endPosition end position value + * + * @return {@code true} if all conditions are valid, otherwise {@code false} + */ + private boolean isValidArguments(double listLength, double startPosition, double endPosition) { + + // Negative values check (negative positions already adjusted, if a value is still negative then it's greater than the list length) + if (startPosition < 0 || endPosition < 0) { + return false; + } + + // Length vs Position check (Positions can't be greater than list length - 1) + if (startPosition > listLength - 1 || endPosition > listLength) { + return false; + } + + // Value validity check (1, 2, 3.0 are accepted, but 3.2 is not) + if (Math.floor(startPosition) != startPosition || Math.floor(endPosition) != endPosition) { + return false; + } + + // Length vs Position check (start position can't be greater than end position) + if (startPosition > endPosition) { + return false; + } + + // All conditions passed + return true; + } + } +} diff --git a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java index dd1d862..fc4ebbd 100644 --- a/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java +++ b/asterixdb/asterix-runtime/src/main/java/org/apache/asterix/runtime/functions/FunctionCollection.java @@ -242,6 +242,7 @@ import org.apache.asterix.runtime.evaluators.functions.ArrayReplaceDescriptor; import org.apache.asterix.runtime.evaluators.functions.ArrayReverseDescriptor; import org.apache.asterix.runtime.evaluators.functions.ArraySortDescriptor; +import org.apache.asterix.runtime.evaluators.functions.ArraySliceDescriptor; import org.apache.asterix.runtime.evaluators.functions.ArrayStarDescriptor; import org.apache.asterix.runtime.evaluators.functions.ArraySymDiffDescriptor; import org.apache.asterix.runtime.evaluators.functions.ArraySymDiffnDescriptor; @@ -498,6 +499,7 @@ fc.addGenerated(ArrayRangeDescriptor.FACTORY); fc.addGenerated(ArrayFlattenDescriptor.FACTORY); fc.add(ArrayReplaceDescriptor.FACTORY); + fc.add(ArraySliceDescriptor.FACTORY); fc.addGenerated(ArraySymDiffDescriptor.FACTORY); fc.addGenerated(ArraySymDiffnDescriptor.FACTORY); fc.addGenerated(ArrayStarDescriptor.FACTORY); -- To view, visit https://asterix-gerrit.ics.uci.edu/3031 To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ic609676cc068e92c6342fb0fa4c9074ec4bd98bf Gerrit-PatchSet: 1 Gerrit-Project: asterixdb Gerrit-Branch: master Gerrit-Owner: Hussain Towaileb <hussai...@gmail.com>