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]>