Hussain Towaileb has uploaded a new change for review.

  https://asterix-gerrit.ics.uci.edu/3046

Change subject: [ASTERIXDB-2476][COMP] Array slicing parser syntax
......................................................................

[ASTERIXDB-2476][COMP] Array slicing parser syntax

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

Details:
- Added slice parser syntax. [list][start:end]
- Added slice parser test cases.

Change-Id: Ie83283bfd0a04257b59b573de3dab6b3e47de1bf
---
M 
asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.1.ddl.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.2.update.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.3.query.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.1.ddl.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.2.update.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.3.query.sqlpp
A 
asterixdb/asterix-app/src/test/resources/runtimets/results/list/list-slice_01/list-slice_01.1.adm
A 
asterixdb/asterix-app/src/test/resources/runtimets/results/list/list-slice_02/list-slice_02.1.adm
M asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
M 
asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/base/AbstractAqlSimpleExpressionVisitor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java
A 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RangeIndexAccessor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
M 
asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
M 
asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
M asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
27 files changed, 466 insertions(+), 13 deletions(-)


  git pull ssh://asterix-gerrit.ics.uci.edu:29418/asterixdb 
refs/changes/46/3046/1

diff --git 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
index 6d70ba5..a3897f2 100644
--- 
a/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
+++ 
b/asterixdb/asterix-algebra/src/main/java/org/apache/asterix/translator/LangExpressionToPlanTranslator.java
@@ -58,6 +58,7 @@
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
 import 
org.apache.asterix.lang.common.expression.QuantifiedExpression.Quantifier;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -750,6 +751,35 @@
     }
 
     @Override
+    public Pair<ILogicalOperator, LogicalVariable> visit(RangeIndexAccessor 
ria, Mutable<ILogicalOperator> tupSource)
+            throws CompilationException {
+        SourceLocation sourceLoc = ria.getSourceLocation();
+        Pair<ILogicalExpression, Mutable<ILogicalOperator>> p = 
langExprToAlgExpression(ria.getExpr(), tupSource);
+        LogicalVariable v = context.newVar();
+        AbstractFunctionCallExpression f;
+        if (ria.isAny()) {
+            f = new 
ScalarFunctionCallExpression(FunctionUtil.getFunctionInfo(BuiltinFunctions.ANY_COLLECTION_MEMBER));
+            f.getArguments().add(new MutableObject<>(p.first));
+            f.setSourceLocation(sourceLoc);
+        } else {
+            Pair<ILogicalExpression, Mutable<ILogicalOperator>> leftIndexPair =
+                    langExprToAlgExpression(ria.getStartIndexExpression(), 
tupSource);
+            Pair<ILogicalExpression, Mutable<ILogicalOperator>> rightIndexPair 
=
+                    langExprToAlgExpression(ria.getEndIndexExpression(), 
tupSource);
+            f = new ScalarFunctionCallExpression(
+                    
FunctionUtil.getFunctionInfo(BuiltinFunctions.ARRAY_SLICE_WITH_END_POSITION));
+            f.getArguments().add(new MutableObject<>(p.first));
+            f.getArguments().add(new MutableObject<>(leftIndexPair.first));
+            f.getArguments().add(new MutableObject<>(rightIndexPair.first));
+            f.setSourceLocation(sourceLoc);
+        }
+        AssignOperator a = new AssignOperator(v, new MutableObject<>(f));
+        a.getInputs().add(p.second);
+        a.setSourceLocation(sourceLoc);
+        return new Pair<>(a, v);
+    }
+
+    @Override
     public Pair<ILogicalOperator, LogicalVariable> visit(CallExpr fcall, 
Mutable<ILogicalOperator> tupSource)
             throws CompilationException {
         LogicalVariable v = context.newVar();
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.1.ddl.sqlpp
new file mode 100644
index 0000000..21479a2
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.1.ddl.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.
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.2.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.2.update.sqlpp
new file mode 100644
index 0000000..bd244d0
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.2.update.sqlpp
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.3.query.sqlpp
new file mode 100644
index 0000000..08a61c8
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_01/list-slice_01.3.query.sqlpp
@@ -0,0 +1,25 @@
+/*
+ * 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 test;
+
+
+[1,2,3,4][1:3];
+[1,2,3,4][-2:4];
+[1,2,3,4][0:10] IS NULL;
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.1.ddl.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.1.ddl.sqlpp
new file mode 100644
index 0000000..21479a2
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.1.ddl.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.
+ */
+
+drop  dataverse test if exists;
+create  dataverse test;
+
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.2.update.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.2.update.sqlpp
new file mode 100644
index 0000000..bd244d0
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.2.update.sqlpp
@@ -0,0 +1,19 @@
+/*
+ * 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.
+ */
+
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.3.query.sqlpp
 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.3.query.sqlpp
new file mode 100644
index 0000000..9b9cc16
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/queries_sqlpp/list/list-slice_02/list-slice_01.3.query.sqlpp
@@ -0,0 +1,24 @@
+/*
+ * 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 test;
+
+
+[1,2,3,4][(0+1):3];
+[1,2,3,4][-2:(3+1)];
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/list/list-slice_01/list-slice_01.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/list/list-slice_01/list-slice_01.1.adm
new file mode 100644
index 0000000..7199fdb
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/list/list-slice_01/list-slice_01.1.adm
@@ -0,0 +1,3 @@
+[ 2, 3 ]
+[ 3, 4 ]
+true
diff --git 
a/asterixdb/asterix-app/src/test/resources/runtimets/results/list/list-slice_02/list-slice_02.1.adm
 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/list/list-slice_02/list-slice_02.1.adm
new file mode 100644
index 0000000..0b48c58
--- /dev/null
+++ 
b/asterixdb/asterix-app/src/test/resources/runtimets/results/list/list-slice_02/list-slice_02.1.adm
@@ -0,0 +1,2 @@
+[ 2, 3 ]
+[ 3, 4 ]
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 07d054d..1712e9e 100644
--- a/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
+++ b/asterixdb/asterix-app/src/test/resources/runtimets/testsuite_sqlpp.xml
@@ -4636,6 +4636,16 @@
       </compilation-unit>
     </test-case>
     <test-case FilePath="list">
+      <compilation-unit name="list-slice_01">
+        <output-dir compare="Text">list-slice_01</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="list">
+      <compilation-unit name="list-slice_02">
+        <output-dir compare="Text">list-slice_02</output-dir>
+      </compilation-unit>
+    </test-case>
+    <test-case FilePath="list">
       <compilation-unit name="listify_01">
         <output-dir compare="Text">listify_01</output-dir>
       </compilation-unit>
diff --git 
a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/base/AbstractAqlSimpleExpressionVisitor.java
 
b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/base/AbstractAqlSimpleExpressionVisitor.java
index 4f52c37..a3447bf 100644
--- 
a/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/base/AbstractAqlSimpleExpressionVisitor.java
+++ 
b/asterixdb/asterix-lang-aql/src/main/java/org/apache/asterix/lang/aql/visitor/base/AbstractAqlSimpleExpressionVisitor.java
@@ -45,6 +45,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -203,6 +204,18 @@
         return ia;
     }
 
+    @Override
+    public Expression visit(RangeIndexAccessor ria, ILangExpression arg) 
throws CompilationException {
+        ria.setExpr(visit(ria.getExpr(), ria));
+        if (ria.getStartIndexExpression() != null) {
+            ria.setLeftIndexExpression(visit(ria.getStartIndexExpression(), 
arg));
+        }
+        if (ria.getEndIndexExpression() != null) {
+            ria.setRightIndexExpression(visit(ria.getEndIndexExpression(), 
arg));
+        }
+        return ria;
+    }
+
     protected Expression visit(Expression expr, ILangExpression arg) throws 
CompilationException {
         return postVisit(preVisit(expr).accept(this, arg));
     }
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java
index 1066408..f69d163 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/base/Expression.java
@@ -34,6 +34,7 @@
         OP_EXPRESSION,
         FIELD_ACCESSOR_EXPRESSION,
         INDEX_ACCESSOR_EXPRESSION,
+        RANGE_INDEX_ACCESSOR_EXPRESSION,
         UNARY_EXPRESSION,
         UNION_EXPRESSION,
         SELECT_EXPRESSION,
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RangeIndexAccessor.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RangeIndexAccessor.java
new file mode 100644
index 0000000..b07eea7
--- /dev/null
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/expression/RangeIndexAccessor.java
@@ -0,0 +1,99 @@
+/*
+ * 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.lang.common.expression;
+
+import org.apache.asterix.common.exceptions.CompilationException;
+import org.apache.asterix.lang.common.base.Expression;
+import org.apache.asterix.lang.common.visitor.base.ILangVisitor;
+
+import java.util.Objects;
+
+public class RangeIndexAccessor extends AbstractAccessor {
+    private boolean isAny;
+    private Expression startIndexExpression;
+    private Expression endIndexExpression;
+
+    public RangeIndexAccessor(Expression expr, Expression 
startIndexExpression, Expression endIndexExpression) {
+        super(expr);
+        if (startIndexExpression == null || endIndexExpression == null) {
+            this.isAny = true;
+        }
+        this.startIndexExpression = startIndexExpression;
+        this.endIndexExpression = endIndexExpression;
+    }
+
+    public boolean isAny() {
+        return isAny;
+    }
+
+    public void setAny(boolean any) {
+        this.isAny = any;
+    }
+
+    public Expression getStartIndexExpression() {
+        return startIndexExpression;
+    }
+
+    public Expression getEndIndexExpression() {
+        return endIndexExpression;
+    }
+
+    public void setLeftIndexExpression(Expression startIndexExpression) {
+        this.startIndexExpression = startIndexExpression;
+    }
+
+    public void setRightIndexExpression(Expression endIndexExpression) {
+        this.endIndexExpression = endIndexExpression;
+    }
+
+    @Override
+    public Kind getKind() {
+        return Kind.RANGE_INDEX_ACCESSOR_EXPRESSION;
+    }
+
+    @Override
+    public <R, T> R accept(ILangVisitor<R, T> visitor, T arg) throws 
CompilationException {
+        return visitor.visit(this, arg);
+    }
+
+    @Override
+    public int hashCode() {
+        return 31 * super.hashCode() + Objects.hash(startIndexExpression, 
isAny)
+                + Objects.hash(endIndexExpression, isAny);
+    }
+
+    @Override
+    public boolean equals(Object object) {
+        if (this == object) {
+            return true;
+        }
+        if (!(object instanceof RangeIndexAccessor)) {
+            return false;
+        }
+        RangeIndexAccessor target = (RangeIndexAccessor) object;
+        return super.equals(target) && isAny == target.isAny
+                && Objects.equals(startIndexExpression, 
target.startIndexExpression)
+                && Objects.equals(endIndexExpression, 
target.endIndexExpression);
+    }
+
+    @Override
+    public String toString() {
+        return expr + "[" + (isAny ? "?" : startIndexExpression + ":" + 
endIndexExpression) + "]";
+    }
+}
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
index bf9cf89..f625017 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/AbstractInlineUdfsVisitor.java
@@ -18,10 +18,6 @@
  */
 package org.apache.asterix.lang.common.visitor;
 
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
 import org.apache.asterix.common.exceptions.CompilationException;
 import org.apache.asterix.common.exceptions.ErrorCode;
 import org.apache.asterix.common.functions.FunctionSignature;
@@ -45,6 +41,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -61,6 +58,10 @@
 import org.apache.hyracks.algebricks.common.exceptions.AlgebricksException;
 import org.apache.hyracks.algebricks.common.utils.Pair;
 import org.apache.hyracks.api.exceptions.SourceLocation;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
 
 public abstract class AbstractInlineUdfsVisitor extends 
AbstractQueryExpressionVisitor<Boolean, List<FunctionDecl>> {
 
@@ -156,6 +157,13 @@
     }
 
     @Override
+    public Boolean visit(RangeIndexAccessor fa, List<FunctionDecl> arg) throws 
CompilationException {
+        Pair<Boolean, Expression> p = inlineUdfsInExpr(fa.getExpr(), arg);
+        fa.setExpr(p.second);
+        return p.first;
+    }
+
+    @Override
     public Boolean visit(IfExpr ifexpr, List<FunctionDecl> arg) throws 
CompilationException {
         Pair<Boolean, Expression> p1 = inlineUdfsInExpr(ifexpr.getCondExpr(), 
arg);
         ifexpr.setCondExpr(p1.second);
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
index 0b907bc..95c3af8 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/CloneAndSubstituteVariablesVisitor.java
@@ -44,6 +44,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -304,6 +305,27 @@
     }
 
     @Override
+    public Pair<ILangExpression, VariableSubstitutionEnvironment> 
visit(RangeIndexAccessor ria,
+            VariableSubstitutionEnvironment env) throws CompilationException {
+        Pair<ILangExpression, VariableSubstitutionEnvironment> p1 = 
ria.getExpr().accept(this, env);
+        Expression startIndexExpression = null;
+        Expression endIndexExpression = null;
+
+        if (!ria.isAny()) {
+            Pair<ILangExpression, VariableSubstitutionEnvironment> p2 = 
ria.getStartIndexExpression().accept(this, env);
+            Pair<ILangExpression, VariableSubstitutionEnvironment> p3 = 
ria.getEndIndexExpression().accept(this, env);
+            startIndexExpression = (Expression) p2.first;
+            endIndexExpression = (Expression) p3.first;
+        }
+
+        RangeIndexAccessor i = new RangeIndexAccessor((Expression) p1.first, 
startIndexExpression, endIndexExpression);
+        i.setAny(ria.isAny());
+        i.setSourceLocation(ria.getSourceLocation());
+        i.addHints(ria.getHints());
+        return new Pair<>(i, env);
+    }
+
+    @Override
     public Pair<ILangExpression, VariableSubstitutionEnvironment> 
visit(FieldAccessor fa,
             VariableSubstitutionEnvironment env) throws CompilationException {
         Pair<ILangExpression, VariableSubstitutionEnvironment> p = 
fa.getExpr().accept(this, env);
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
index c7f2a5d..d88b355 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/FormatPrintVisitor.java
@@ -53,6 +53,7 @@
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.OrderedListTypeDefinition;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.RecordTypeDefinition;
 import 
org.apache.asterix.lang.common.expression.RecordTypeDefinition.RecordKind;
@@ -387,6 +388,21 @@
     }
 
     @Override
+    public Void visit(RangeIndexAccessor fa, Integer step) throws 
CompilationException {
+        fa.getExpr().accept(this, step + 1);
+        out.print("[");
+        if (fa.isAny()) {
+            out.print("?:?");
+        } else {
+            fa.getStartIndexExpression().accept(this, step + 1);
+            out.print(":");
+            fa.getEndIndexExpression().accept(this, step + 1);
+        }
+        out.print("]");
+        return null;
+    }
+
+    @Override
     public Void visit(TypeDecl t, Integer step) throws CompilationException {
         out.println(skip(step) + "create type " + 
generateFullName(t.getDataverseName(), t.getIdent())
                 + generateIfNotExists(t.getIfNotExists()) + " as");
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
index 3d149fb..033bfce 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/GatherFunctionCallsVisitor.java
@@ -40,6 +40,7 @@
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.OrderedListTypeDefinition;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.TypeReferenceExpression;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
@@ -95,6 +96,12 @@
     }
 
     @Override
+    public Void visit(RangeIndexAccessor ria, Void arg) throws 
CompilationException {
+        ria.getExpr().accept(this, arg);
+        return null;
+    }
+
+    @Override
     public Void visit(LetClause lc, Void arg) throws CompilationException {
         lc.getBindingExpr().accept(this, arg);
         return null;
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
index ff55880..ffa0d43 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/QueryPrintVisitor.java
@@ -44,6 +44,7 @@
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.OrderedListTypeDefinition;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.RecordTypeDefinition;
 import 
org.apache.asterix.lang.common.expression.RecordTypeDefinition.RecordKind;
@@ -320,6 +321,22 @@
     }
 
     @Override
+    public Void visit(RangeIndexAccessor ria, Integer step) throws 
CompilationException {
+        out.println(skip(step) + "RangeIndexAccessor [");
+        ria.getExpr().accept(this, step + 1);
+        out.print(skip(step + 1) + "Range Index: ");
+        if (ria.isAny()) {
+            out.println("ANY");
+        } else {
+            ria.getStartIndexExpression().accept(this, step + 1);
+            out.print(":");
+            ria.getEndIndexExpression().accept(this, step + 1);
+        }
+        out.println(skip(step) + "]");
+        return null;
+    }
+
+    @Override
     public Void visit(TypeDecl t, Integer step) throws CompilationException {
         out.println(skip(step) + "TypeDecl " + t.getIdent() + " [");
         t.getTypeDef().accept(this, step + 1);
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
index a422ef1..99c051f 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/AbstractAstVisitor.java
@@ -32,6 +32,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -86,6 +87,11 @@
     }
 
     @Override
+    public R visit(RangeIndexAccessor ria, T arg) throws CompilationException {
+        return null;
+    }
+
+    @Override
     public R visit(IfExpr ifexpr, T arg) throws CompilationException {
         return null;
     }
diff --git 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
index cace925..ba3ba76 100644
--- 
a/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
+++ 
b/asterixdb/asterix-lang-common/src/main/java/org/apache/asterix/lang/common/visitor/base/ILangVisitor.java
@@ -34,6 +34,7 @@
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.OrderedListTypeDefinition;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.RecordTypeDefinition;
 import org.apache.asterix.lang.common.expression.TypeReferenceExpression;
@@ -117,6 +118,8 @@
 
     R visit(IndexAccessor ia, T arg) throws CompilationException;
 
+    R visit(RangeIndexAccessor ria, T arg) throws CompilationException;
+
     R visit(IfExpr ifexpr, T arg) throws CompilationException;
 
     R visit(QuantifiedExpression qe, T arg) throws CompilationException;
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
index 42b43e8..75c5886 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckDatasetOnlyResolutionVisitor.java
@@ -34,6 +34,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -109,6 +110,11 @@
     }
 
     @Override
+    public Boolean visit(RangeIndexAccessor ria, ILangExpression expr) throws 
CompilationException {
+        return false;
+    }
+
+    @Override
     public Boolean visit(IfExpr ifexpr, ILangExpression expr) throws 
CompilationException {
         return false;
     }
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
index 6ea21a6..8b8a064 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSql92AggregateVisitor.java
@@ -38,6 +38,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -122,6 +123,11 @@
     }
 
     @Override
+    public Boolean visit(RangeIndexAccessor ria, ILangExpression 
parentSelectBlock) throws CompilationException {
+        return ria.getExpr().accept(this, parentSelectBlock);
+    }
+
+    @Override
     public Boolean visit(IfExpr ifexpr, ILangExpression parentSelectBlock) 
throws CompilationException {
         if (ifexpr.getCondExpr().accept(this, parentSelectBlock)) {
             return true;
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
index 34e918e..7f72778 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/CheckSubqueryVisitor.java
@@ -39,6 +39,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -228,6 +229,12 @@
     }
 
     @Override
+    public Boolean visit(RangeIndexAccessor ria, ILangExpression arg) throws 
CompilationException {
+        return visit(ria.getExpr(), arg) || 
visit(ria.getStartIndexExpression(), arg)
+                || visit(ria.getEndIndexExpression(), arg);
+    }
+
+    @Override
     public Boolean visit(IfExpr ifexpr, ILangExpression arg) throws 
CompilationException {
         return visit(ifexpr.getCondExpr(), arg) || visit(ifexpr.getThenExpr(), 
arg) || visit(ifexpr.getElseExpr(), arg);
     }
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
index 7dca268..d0fdbb4 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/DeepCopyVisitor.java
@@ -42,6 +42,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -485,6 +486,25 @@
     }
 
     @Override
+    public Expression visit(RangeIndexAccessor ria, Void arg) throws 
CompilationException {
+        Expression expr = (Expression) ria.getExpr().accept(this, arg);
+        Expression startIndexExpression = null;
+        Expression endIndexExpression = null;
+
+        if (ria.getStartIndexExpression() != null) {
+            startIndexExpression = (Expression) 
ria.getStartIndexExpression().accept(this, arg);
+        }
+
+        if (ria.getEndIndexExpression() != null) {
+            endIndexExpression = (Expression) 
ria.getEndIndexExpression().accept(this, arg);
+        }
+        RangeIndexAccessor copy = new RangeIndexAccessor(expr, 
startIndexExpression, endIndexExpression);
+        copy.setSourceLocation(ria.getSourceLocation());
+        copy.addHints(ria.getHints());
+        return copy;
+    }
+
+    @Override
     public ILangExpression visit(CaseExpression caseExpr, Void arg) throws 
CompilationException {
         Expression conditionExpr = (Expression) 
caseExpr.getConditionExpr().accept(this, arg);
         List<Expression> whenExprList = copyExprList(caseExpr.getWhenExprs(), 
arg);
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
index 3fb3507..89026ac 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/FreeVariableVisitor.java
@@ -40,6 +40,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -417,6 +418,18 @@
     }
 
     @Override
+    public Void visit(RangeIndexAccessor ria, Collection<VariableExpr> 
freeVars) throws CompilationException {
+        ria.getExpr().accept(this, freeVars);
+        if (ria.getStartIndexExpression() != null) {
+            ria.getStartIndexExpression().accept(this, freeVars);
+        }
+        if (ria.getEndIndexExpression() != null) {
+            ria.getEndIndexExpression().accept(this, freeVars);
+        }
+        return null;
+    }
+
+    @Override
     public Void visit(CaseExpression caseExpr, Collection<VariableExpr> 
freeVars) throws CompilationException {
         caseExpr.getConditionExpr().accept(this, freeVars);
         visit(caseExpr.getWhenExprs(), freeVars);
diff --git 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
index a3bb592..acfe057 100644
--- 
a/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
+++ 
b/asterixdb/asterix-lang-sqlpp/src/main/java/org/apache/asterix/lang/sqlpp/visitor/base/AbstractSqlppSimpleExpressionVisitor.java
@@ -39,6 +39,7 @@
 import org.apache.asterix.lang.common.expression.LiteralExpr;
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.UnaryExpr;
 import org.apache.asterix.lang.common.expression.VariableExpr;
@@ -347,6 +348,18 @@
     }
 
     @Override
+    public Expression visit(RangeIndexAccessor ria, ILangExpression arg) 
throws CompilationException {
+        ria.setExpr(visit(ria.getExpr(), ria));
+        if (ria.getStartIndexExpression() != null) {
+            ria.setLeftIndexExpression(visit(ria.getStartIndexExpression(), 
arg));
+        }
+        if (ria.getEndIndexExpression() != null) {
+            ria.setRightIndexExpression(visit(ria.getEndIndexExpression(), 
arg));
+        }
+        return ria;
+    }
+
+    @Override
     public Expression visit(CaseExpression caseExpr, ILangExpression arg) 
throws CompilationException {
         caseExpr.setConditionExpr(visit(caseExpr.getConditionExpr(), arg));
         caseExpr.setWhenExprs(visit(caseExpr.getWhenExprs(), arg));
diff --git a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj 
b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
index e19ee7a..36a9d62 100644
--- a/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
+++ b/asterixdb/asterix-lang-sqlpp/src/main/javacc/SQLPP.jj
@@ -96,6 +96,7 @@
 import org.apache.asterix.lang.common.expression.OperatorExpr;
 import org.apache.asterix.lang.common.expression.OrderedListTypeDefinition;
 import org.apache.asterix.lang.common.expression.QuantifiedExpression;
+import org.apache.asterix.lang.common.expression.RangeIndexAccessor;
 import org.apache.asterix.lang.common.expression.RecordConstructor;
 import org.apache.asterix.lang.common.expression.RecordTypeDefinition;
 import org.apache.asterix.lang.common.expression.TypeExpression;
@@ -2315,30 +2316,49 @@
     }
 }
 
-IndexAccessor IndexAccessor(Expression inputExpr) throws ParseException:
+AbstractAccessor IndexAccessor(Expression inputExpr) throws ParseException:
 {
+  AbstractAccessor accessor = null;
   Token startToken = null;
-  Expression expr = null;
+  Expression firstExpression = null;
+  Expression secondExpression = null;
 }
 {
   <LEFTBRACKET> { startToken = token; }
-  ( expr = Expression()
+  ( firstExpression = Expression()
     {
-        if (expr.getKind() == Expression.Kind.LITERAL_EXPRESSION)
+        if (firstExpression.getKind() == Expression.Kind.LITERAL_EXPRESSION)
         {
-            Literal lit = ((LiteralExpr)expr).getValue();
+            Literal lit = ((LiteralExpr)firstExpression).getValue();
             if (lit.getLiteralType() != Literal.Type.INTEGER &&
                 lit.getLiteralType() != Literal.Type.LONG) {
-                throw new SqlppParseException(expr.getSourceLocation(), "Index 
should be an INTEGER");
+                throw new 
SqlppParseException(firstExpression.getSourceLocation(), "Index should be an 
INTEGER");
             }
         }
     }
   )
-
+  (<COLON>
+      ( secondExpression = Expression()
+          {
+              if (secondExpression.getKind() == 
Expression.Kind.LITERAL_EXPRESSION)
+              {
+                  Literal lit = ((LiteralExpr)secondExpression).getValue();
+                  if (lit.getLiteralType() != Literal.Type.INTEGER &&
+                      lit.getLiteralType() != Literal.Type.LONG) {
+                      throw new 
SqlppParseException(secondExpression.getSourceLocation(), "Index should be an 
INTEGER");
+                  }
+              }
+          }
+      )
+  )?
   <RIGHTBRACKET>
   {
-    IndexAccessor ia = new IndexAccessor(inputExpr, expr);
-    return addSourceLocation(ia, startToken);
+    if (secondExpression == null) {
+        accessor = new IndexAccessor(inputExpr, firstExpression);
+    } else {
+        accessor = new RangeIndexAccessor(inputExpr, firstExpression, 
secondExpression);
+    }
+    return addSourceLocation(accessor, startToken);
   }
 }
 

-- 
To view, visit https://asterix-gerrit.ics.uci.edu/3046
To unsubscribe, visit https://asterix-gerrit.ics.uci.edu/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: Ie83283bfd0a04257b59b573de3dab6b3e47de1bf
Gerrit-PatchSet: 1
Gerrit-Project: asterixdb
Gerrit-Branch: master
Gerrit-Owner: Hussain Towaileb <[email protected]>

Reply via email to