From 30f1af17cdf564f528cdb1b0601b87ab52046b58 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 13:21:44 +0100 Subject: [PATCH 001/136] Fix documentation. --- docs/HTTPServer.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/HTTPServer.md b/docs/HTTPServer.md index af87fdd9d..f9a93df28 100644 --- a/docs/HTTPServer.md +++ b/docs/HTTPServer.md @@ -18,7 +18,7 @@ Caution! Launching a server always has consequences on security, especially as R The HTTP server is meant not to be used directly by end users, but instead to make it possible to integrate RumbleDB in other languages and environments, such as Python and Jupyter notebooks. -To test that the the server running, you can try the following address in your browser, assuming you have a query stored locally at /tmp/query.jq. All queries have to go to the /jsoniq path. +To test that the server is running, you can try the following address in your browser, assuming you have a query stored locally at /tmp/query.jq. All queries have to go to the /jsoniq path. http://localhost:8001/jsoniq?query-path=/tmp/query.jq From 7a60038ec70743de245fcee66e59e11238d09d77 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 13:26:47 +0100 Subject: [PATCH 002/136] Add all values to each module. --- .../compiler/DynamicContextVisitor.java | 6 ++--- .../compiler/StaticContextVisitor.java | 6 ++--- .../rumbledb/context/InScopeSchemaTypes.java | 8 +++--- .../org/rumbledb/context/StaticContext.java | 20 +++++++------- .../org/rumbledb/context/VariableValues.java | 26 +++++++------------ 5 files changed, 25 insertions(+), 41 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/DynamicContextVisitor.java b/src/main/java/org/rumbledb/compiler/DynamicContextVisitor.java index 9ddc97b2a..ed1562eb5 100644 --- a/src/main/java/org/rumbledb/compiler/DynamicContextVisitor.java +++ b/src/main/java/org/rumbledb/compiler/DynamicContextVisitor.java @@ -332,13 +332,11 @@ public DynamicContext visitLibraryModule(LibraryModule module, DynamicContext ar } argument.getVariableValues() .importModuleValues( - this.importedModuleContexts.get(module.getNamespace()).getVariableValues(), - module.getNamespace() + this.importedModuleContexts.get(module.getNamespace()).getVariableValues() ); argument.getInScopeSchemaTypes() .importModuleTypes( - this.importedModuleContexts.get(module.getNamespace()).getInScopeSchemaTypes(), - module.getNamespace() + this.importedModuleContexts.get(module.getNamespace()).getInScopeSchemaTypes() ); return argument; } diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java index be20f6851..3f6697a10 100644 --- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java +++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java @@ -106,13 +106,11 @@ public StaticContext visitLibraryModule(LibraryModule libraryModule, StaticConte this.importedModuleContexts.put(libraryModule.getNamespace(), moduleContext); } argument.importModuleContext( - this.importedModuleContexts.get(libraryModule.getNamespace()), - libraryModule.getNamespace() + this.importedModuleContexts.get(libraryModule.getNamespace()) ); argument.getInScopeSchemaTypes() .importModuleTypes( - this.importedModuleContexts.get(libraryModule.getNamespace()).getInScopeSchemaTypes(), - libraryModule.getNamespace() + this.importedModuleContexts.get(libraryModule.getNamespace()).getInScopeSchemaTypes() ); return argument; } diff --git a/src/main/java/org/rumbledb/context/InScopeSchemaTypes.java b/src/main/java/org/rumbledb/context/InScopeSchemaTypes.java index b561d6bd3..dd8754907 100644 --- a/src/main/java/org/rumbledb/context/InScopeSchemaTypes.java +++ b/src/main/java/org/rumbledb/context/InScopeSchemaTypes.java @@ -73,12 +73,10 @@ public void read(Kryo kryo, Input input) { this.inScopeSchemaTypes = kryo.readObject(input, HashMap.class); } - public void importModuleTypes(InScopeSchemaTypes inScopeSchemaTypes, String targetNamespace) { + public void importModuleTypes(InScopeSchemaTypes inScopeSchemaTypes) { for (Name name : inScopeSchemaTypes.inScopeSchemaTypes.keySet()) { - if (name.getNamespace().equals(targetNamespace)) { - ItemType itemType = inScopeSchemaTypes.inScopeSchemaTypes.get(name); - this.inScopeSchemaTypes.put(name, itemType); - } + ItemType itemType = inScopeSchemaTypes.inScopeSchemaTypes.get(name); + this.inScopeSchemaTypes.put(name, itemType); } } diff --git a/src/main/java/org/rumbledb/context/StaticContext.java b/src/main/java/org/rumbledb/context/StaticContext.java index e8d6cf0ee..e5a861e23 100644 --- a/src/main/java/org/rumbledb/context/StaticContext.java +++ b/src/main/java/org/rumbledb/context/StaticContext.java @@ -312,18 +312,14 @@ public void read(Kryo kryo, Input input) { this.emptySequenceOrderLeast = input.readBoolean(); } - public void importModuleContext(StaticContext moduleContext, String targetNamespace) { + public void importModuleContext(StaticContext moduleContext) { for (Name name : moduleContext.inScopeVariables.keySet()) { - if (name.getNamespace().contentEquals(targetNamespace)) { - InScopeVariable variable = moduleContext.inScopeVariables.get(name); - this.inScopeVariables.put(name, variable); - } + InScopeVariable variable = moduleContext.inScopeVariables.get(name); + this.inScopeVariables.put(name, variable); } for (FunctionIdentifier fi : moduleContext.staticallyKnownFunctionSignatures.keySet()) { - if (fi.getName().getNamespace().contentEquals(targetNamespace)) { - FunctionSignature signature = moduleContext.staticallyKnownFunctionSignatures.get(fi); - this.staticallyKnownFunctionSignatures.put(fi, signature); - } + FunctionSignature signature = moduleContext.staticallyKnownFunctionSignatures.get(fi); + this.staticallyKnownFunctionSignatures.put(fi, signature); } } @@ -377,7 +373,7 @@ public void setContextItemStaticType(SequenceType contextItemStaticType) { // replace all inScopeVariable in this context and all parents until [stopContext] with name not in [varToExclude] // with same variable with sequence type arity changed from 1 to + and form ? to * - // used by groupBy cluse + // used by groupBy clause public void incrementArities(StaticContext stopContext, Set varToExclude) { this.inScopeVariables.replaceAll( (key, value) -> varToExclude.contains(key) @@ -395,7 +391,9 @@ public void incrementArities(StaticContext stopContext, Set varToExclude) if (!this.inScopeVariables.containsKey(entry.getKey())) { this.addVariable( entry.getKey(), - entry.getValue().getSequenceType().incrementArity(), + varToExclude.contains(entry.getKey()) + ? entry.getValue().getSequenceType() + : entry.getValue().getSequenceType().incrementArity(), entry.getValue().getMetadata() ); } diff --git a/src/main/java/org/rumbledb/context/VariableValues.java b/src/main/java/org/rumbledb/context/VariableValues.java index abc20488d..175298a8f 100644 --- a/src/main/java/org/rumbledb/context/VariableValues.java +++ b/src/main/java/org/rumbledb/context/VariableValues.java @@ -371,30 +371,22 @@ public String toString() { return sb.toString(); } - public void importModuleValues(VariableValues moduleValues, String targetNamespace) { + public void importModuleValues(VariableValues moduleValues) { for (Name name : moduleValues.localVariableValues.keySet()) { - if (name.getNamespace().equals(targetNamespace)) { - List items = moduleValues.localVariableValues.get(name); - this.localVariableValues.put(name, items); - } + List items = moduleValues.localVariableValues.get(name); + this.localVariableValues.put(name, items); } for (Name name : moduleValues.localVariableCounts.keySet()) { - if (name.getNamespace().equals(targetNamespace)) { - Item item = moduleValues.localVariableCounts.get(name); - this.localVariableCounts.put(name, item); - } + Item item = moduleValues.localVariableCounts.get(name); + this.localVariableCounts.put(name, item); } for (Name name : moduleValues.rddVariableValues.keySet()) { - if (name.getNamespace().equals(targetNamespace)) { - JavaRDD items = moduleValues.rddVariableValues.get(name); - this.rddVariableValues.put(name, items); - } + JavaRDD items = moduleValues.rddVariableValues.get(name); + this.rddVariableValues.put(name, items); } for (Name name : moduleValues.dataFrameVariableValues.keySet()) { - if (name.getNamespace().equals(targetNamespace)) { - JSoundDataFrame items = moduleValues.dataFrameVariableValues.get(name); - this.dataFrameVariableValues.put(name, items); - } + JSoundDataFrame items = moduleValues.dataFrameVariableValues.get(name); + this.dataFrameVariableValues.put(name, items); } } } From b297e1af3dff2fe665c924c1a894fe292e5c05e7 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 13:37:42 +0100 Subject: [PATCH 003/136] Add functions. --- .../context/BuiltinFunctionCatalogue.java | 56 ++++++++++++++--- .../input/ParquetFileFunctionIterator.java | 14 +++-- .../trigonometric/CoshFunctionIterator.java | 60 +++++++++++++++++++ .../trigonometric/SinhFunctionIterator.java | 60 +++++++++++++++++++ 4 files changed, 177 insertions(+), 13 deletions(-) create mode 100644 src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CoshFunctionIterator.java create mode 100644 src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinhFunctionIterator.java diff --git a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java index ffba03af9..1c2ffbe11 100644 --- a/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java +++ b/src/main/java/org/rumbledb/context/BuiltinFunctionCatalogue.java @@ -77,13 +77,7 @@ import org.rumbledb.runtime.functions.numerics.exponential.LogFunctionIterator; import org.rumbledb.runtime.functions.numerics.exponential.PowFunctionIterator; import org.rumbledb.runtime.functions.numerics.exponential.SqrtFunctionIterator; -import org.rumbledb.runtime.functions.numerics.trigonometric.ACosFunctionIterator; -import org.rumbledb.runtime.functions.numerics.trigonometric.ASinFunctionIterator; -import org.rumbledb.runtime.functions.numerics.trigonometric.ATan2FunctionIterator; -import org.rumbledb.runtime.functions.numerics.trigonometric.ATanFunctionIterator; -import org.rumbledb.runtime.functions.numerics.trigonometric.CosFunctionIterator; -import org.rumbledb.runtime.functions.numerics.trigonometric.SinFunctionIterator; -import org.rumbledb.runtime.functions.numerics.trigonometric.TanFunctionIterator; +import org.rumbledb.runtime.functions.numerics.trigonometric.*; import org.rumbledb.runtime.functions.object.ObjectAccumulateFunctionIterator; import org.rumbledb.runtime.functions.object.ObjectDescendantFunctionIterator; import org.rumbledb.runtime.functions.object.ObjectDescendantPairsFunctionIterator; @@ -496,13 +490,26 @@ private static BuiltinFunction createBuiltinFunction( /** * function that parses a parquet file */ - static final BuiltinFunction parquet_file = createBuiltinFunction( + static final BuiltinFunction parquet_file1 = createBuiltinFunction( new Name(Name.JN_NS, "jn", "parquet-file"), "string", "item*", ParquetFileFunctionIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME ); + + /** + * function that parses a parquet file + */ + static final BuiltinFunction parquet_file2 = createBuiltinFunction( + new Name(Name.JN_NS, "jn", "parquet-file"), + "string", + "integer", + "item*", + ParquetFileFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.DATAFRAME + ); + /** * function that parses a csv file */ @@ -1243,6 +1250,34 @@ private static BuiltinFunction createBuiltinFunction( ATan2FunctionIterator.class, BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL ); + /** + * function that returns the hyperbolic cosine of the angle given in radians + */ + static final BuiltinFunction cosh = createBuiltinFunction( + new Name( + Name.JN_NS, + "jn", + "cosh" + ), + "double?", + "double?", + CoshFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); + /** + * function that returns the hyperbolic sine of the angle given in radians + */ + static final BuiltinFunction sinh = createBuiltinFunction( + new Name( + Name.JN_NS, + "jn", + "sinh" + ), + "double?", + "double?", + SinhFunctionIterator.class, + BuiltinFunction.BuiltinFunctionExecutionMode.LOCAL + ); /** * function that returns string @@ -2641,7 +2676,8 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(local_text_file.getIdentifier(), local_text_file); builtinFunctions.put(parallelizeFunction1.getIdentifier(), parallelizeFunction1); builtinFunctions.put(parallelizeFunction2.getIdentifier(), parallelizeFunction2); - builtinFunctions.put(parquet_file.getIdentifier(), parquet_file); + builtinFunctions.put(parquet_file1.getIdentifier(), parquet_file1); + builtinFunctions.put(parquet_file2.getIdentifier(), parquet_file2); builtinFunctions.put(csv_file1.getIdentifier(), csv_file1); builtinFunctions.put(csv_file2.getIdentifier(), csv_file2); builtinFunctions.put(root_file1.getIdentifier(), root_file1); @@ -2708,6 +2744,8 @@ private static BuiltinFunction createBuiltinFunction( builtinFunctions.put(acos.getIdentifier(), acos); builtinFunctions.put(atan.getIdentifier(), atan); builtinFunctions.put(atan2.getIdentifier(), atan2); + builtinFunctions.put(cosh.getIdentifier(), cosh); + builtinFunctions.put(sinh.getIdentifier(), sinh); builtinFunctions.put(string0.getIdentifier(), string0); builtinFunctions.put(string1.getIdentifier(), string1); diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParquetFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParquetFileFunctionIterator.java index 4b3687e4d..5864c2cc1 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParquetFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParquetFileFunctionIterator.java @@ -50,19 +50,25 @@ public ParquetFileFunctionIterator( @Override public JSoundDataFrame getDataFrame(DynamicContext context) { - RuntimeIterator urlIterator = this.children.get(0); - urlIterator.open(context); - String url = urlIterator.next().getStringValue(); - urlIterator.close(); + + String url = this.children.get(0).materializeFirstItemOrNull(context).getStringValue(); + URI uri = FileSystemUtil.resolveURI(this.staticURI, url, getMetadata()); if (!FileSystemUtil.exists(uri, context.getRumbleRuntimeConfiguration(), getMetadata())) { throw new CannotRetrieveResourceException("File " + uri + " not found.", getMetadata()); } + int partitions = -1; + if (this.children.size() > 1) { + partitions = this.children.get(1).materializeFirstItemOrNull(context).getIntValue(); + } try { Dataset dataFrame = SparkSessionManager.getInstance() .getOrCreateSession() .read() .parquet(uri.toString()); + if (partitions != -1) { + dataFrame = dataFrame.repartition(partitions); + } return new JSoundDataFrame(dataFrame); } catch (Exception e) { if (e instanceof AnalysisException) { diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CoshFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CoshFunctionIterator.java new file mode 100644 index 000000000..f346ac86b --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CoshFunctionIterator.java @@ -0,0 +1,60 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package org.rumbledb.runtime.functions.numerics.trigonometric; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class CoshFunctionIterator extends AtMostOneItemLocalRuntimeIterator { + + + private static final long serialVersionUID = 1L; + + public CoshFunctionIterator( + List arguments, + ExecutionMode executionMode, + ExceptionMetadata iteratorMetadata + ) { + super(arguments, executionMode, iteratorMetadata); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { + Item value = this.children.get(0).materializeFirstItemOrNull(dynamicContext); + if (value == null) { + return null; + } + double dvalue = value.getDoubleValue(); + if (Double.isNaN(dvalue) || Double.isInfinite(dvalue)) { + return ItemFactory.getInstance().createDoubleItem(Double.NaN); + } + return ItemFactory.getInstance().createDoubleItem(Math.cosh(dvalue)); + } + + +} diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinhFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinhFunctionIterator.java new file mode 100644 index 000000000..ce50c61fa --- /dev/null +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinhFunctionIterator.java @@ -0,0 +1,60 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package org.rumbledb.runtime.functions.numerics.trigonometric; + +import org.rumbledb.api.Item; +import org.rumbledb.context.DynamicContext; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.items.ItemFactory; +import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; +import org.rumbledb.runtime.RuntimeIterator; + +import java.util.List; + +public class SinhFunctionIterator extends AtMostOneItemLocalRuntimeIterator { + + + private static final long serialVersionUID = 1L; + + public SinhFunctionIterator( + List arguments, + ExecutionMode executionMode, + ExceptionMetadata iteratorMetadata + ) { + super(arguments, executionMode, iteratorMetadata); + } + + @Override + public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { + Item value = this.children.get(0).materializeFirstItemOrNull(dynamicContext); + if (value == null) { + return null; + } + double dvalue = value.getDoubleValue(); + if (Double.isNaN(dvalue) || Double.isInfinite(dvalue)) { + return ItemFactory.getInstance().createDoubleItem(Double.NaN); + } + return ItemFactory.getInstance().createDoubleItem(Math.sinh(dvalue)); + } + + +} From 7947654897c8b350330af319506fbad321f89d56 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 13:55:17 +0100 Subject: [PATCH 004/136] Rewrite some general comparisons to value comparisons. --- .../rumbledb/compiler/ComparisonVisitor.java | 181 ++++++++++++++++++ .../org/rumbledb/compiler/VisitorHelpers.java | 13 ++ .../comparison/ComparisonExpression.java | 25 +++ .../control/TryCatchExpression.java | 5 + .../rumbledb/expressions/flowr/LetClause.java | 26 ++- 5 files changed, 248 insertions(+), 2 deletions(-) create mode 100644 src/main/java/org/rumbledb/compiler/ComparisonVisitor.java diff --git a/src/main/java/org/rumbledb/compiler/ComparisonVisitor.java b/src/main/java/org/rumbledb/compiler/ComparisonVisitor.java new file mode 100644 index 000000000..8aee78d39 --- /dev/null +++ b/src/main/java/org/rumbledb/compiler/ComparisonVisitor.java @@ -0,0 +1,181 @@ +package org.rumbledb.compiler; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +import org.rumbledb.context.Name; +import org.rumbledb.context.StaticContext; +import org.rumbledb.expressions.CommaExpression; +import org.rumbledb.expressions.Expression; +import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.comparison.ComparisonExpression; +import org.rumbledb.expressions.flowr.Clause; +import org.rumbledb.expressions.flowr.FlworExpression; +import org.rumbledb.expressions.flowr.ForClause; +import org.rumbledb.expressions.flowr.ReturnClause; +import org.rumbledb.expressions.flowr.WhereClause; +import org.rumbledb.expressions.postfix.FilterExpression; +import org.rumbledb.expressions.primary.BooleanLiteralExpression; +import org.rumbledb.expressions.primary.FunctionCallExpression; +import org.rumbledb.expressions.primary.IntegerLiteralExpression; +import org.rumbledb.expressions.primary.StringLiteralExpression; +import org.rumbledb.expressions.primary.VariableReferenceExpression; +import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; + +public class ComparisonVisitor extends CloneVisitor { + @Override + public Node visitComparisonExpr(ComparisonExpression expression, Node argument) { + Expression leftChild = (Expression) visit(expression.getChildren().get(0), argument); + Expression rightChild = (Expression) visit(expression.getChildren().get(1), argument); + + // if it's already value comparison, return it + if (expression.getComparisonOperator().isValueComparison()) { + ComparisonExpression result = new ComparisonExpression( + leftChild, + rightChild, + expression.getComparisonOperator(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + ComparisonExpression.ComparisonOperator comparisonOperator = ComparisonExpression.ComparisonOperator + .getValueComparisonFromComparison( + expression.getComparisonOperator() + ); + // if left and right have arity one, use value comparison + if ( + leftChild.getStaticSequenceType().getArity() == SequenceType.Arity.One + && rightChild.getStaticSequenceType().getArity() == SequenceType.Arity.One + ) { + ComparisonExpression result = new ComparisonExpression( + leftChild, + rightChild, + comparisonOperator, + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + // if left or right are a sequence, use FLWOR + if ( + SequenceType.Arity.OneOrMore.isSubtypeOf(leftChild.getStaticSequenceType().getArity()) + || SequenceType.Arity.OneOrMore.isSubtypeOf(rightChild.getStaticSequenceType().getArity()) + ) { + Name variableNameLeft = Name.TEMP_VAR1; + Name variableNameRight = Name.TEMP_VAR2; + + StaticContext leftContext = new StaticContext(expression.getStaticContext()); + leftContext.addVariable(variableNameLeft, leftChild.getStaticSequenceType(), expression.getMetadata()); + Clause firstClause = new ForClause( + variableNameLeft, + false, + leftChild.getStaticSequenceType(), + null, + leftChild, + expression.getMetadata() + ); + firstClause.setStaticContext(leftContext); + StaticContext rightContext = new StaticContext(leftContext); + rightContext.addVariable(variableNameRight, rightChild.getStaticSequenceType(), expression.getMetadata()); + Clause secondClause = new ForClause( + variableNameRight, + false, + rightChild.getStaticSequenceType(), + null, + rightChild, + expression.getMetadata() + ); + secondClause.setStaticContext(rightContext); + firstClause.chainWith(secondClause); + Expression leftReference = new VariableReferenceExpression(variableNameLeft, expression.getMetadata()); + leftReference.setStaticSequenceType( + new SequenceType(leftChild.getStaticSequenceType().getItemType(), SequenceType.Arity.One) + ); + leftReference.setStaticContext(rightContext); + Expression rightReference = new VariableReferenceExpression(variableNameRight, expression.getMetadata()); + rightReference.setStaticSequenceType( + new SequenceType(rightChild.getStaticSequenceType().getItemType(), SequenceType.Arity.One) + ); + rightReference.setStaticContext(rightContext); + Expression valueComparison = new ComparisonExpression( + leftReference, + rightReference, + comparisonOperator, + expression.getMetadata() + ); + valueComparison.setStaticContext(rightContext); + valueComparison.setStaticSequenceType( + new SequenceType(BuiltinTypesCatalogue.booleanItem, SequenceType.Arity.One) + ); + WhereClause whereClause = new WhereClause(valueComparison, expression.getMetadata()); + whereClause.setStaticContext(rightContext); + secondClause.chainWith(whereClause); + Expression stringLiteralExpression = new StringLiteralExpression("", null); + stringLiteralExpression.setStaticContext(rightContext); + stringLiteralExpression.setStaticSequenceType( + new SequenceType(BuiltinTypesCatalogue.stringItem, SequenceType.Arity.One) + ); + ReturnClause returnClause = new ReturnClause( + stringLiteralExpression, + expression.getMetadata() + ); + returnClause.setStaticContext(rightContext); + whereClause.chainWith(returnClause); + Expression flworExpression = new FlworExpression(returnClause, expression.getMetadata()); + flworExpression.setStaticSequenceType( + new SequenceType(BuiltinTypesCatalogue.stringItem, SequenceType.Arity.ZeroOrMore) + ); + flworExpression.setStaticContext(expression.getStaticContext()); + FunctionCallExpression functionCallExpression = new FunctionCallExpression( + Name.createVariableInDefaultFunctionNamespace("exists"), + Collections.singletonList(flworExpression), + expression.getMetadata() + ); + functionCallExpression.setStaticSequenceType( + new SequenceType(BuiltinTypesCatalogue.booleanItem, SequenceType.Arity.One) + ); + functionCallExpression.setStaticContext(expression.getStaticContext()); + return functionCallExpression; + } + // otherwise, use ([left op right, false][[1]]) + ComparisonExpression comparisonExpression = new ComparisonExpression( + (Expression) visit(expression.getChildren().get(0), argument), + (Expression) visit(expression.getChildren().get(1), argument), + comparisonOperator, + expression.getMetadata() + ); + comparisonExpression.setStaticSequenceType(expression.getStaticSequenceType()); + comparisonExpression.setStaticContext(expression.getStaticContext()); + BooleanLiteralExpression booleanExpression = new BooleanLiteralExpression(false, expression.getMetadata()); + booleanExpression.setStaticSequenceType( + new SequenceType(BuiltinTypesCatalogue.booleanItem, SequenceType.Arity.One) + ); + booleanExpression.setStaticContext(expression.getStaticContext()); + + List commaExpressions = new ArrayList<>(); + commaExpressions.add(comparisonExpression); + commaExpressions.add(booleanExpression); + CommaExpression commaExpression = new CommaExpression(commaExpressions, expression.getMetadata()); + commaExpression.setStaticSequenceType( + new SequenceType(BuiltinTypesCatalogue.booleanItem, SequenceType.Arity.OneOrMore) + ); + commaExpression.setStaticContext(expression.getStaticContext()); + + Expression integerLiteralExpression = new IntegerLiteralExpression("1", expression.getMetadata()); + integerLiteralExpression.setStaticSequenceType(SequenceType.INTEGER); + integerLiteralExpression.setStaticContext(expression.getStaticContext()); + FilterExpression result = new FilterExpression( + commaExpression, + integerLiteralExpression, + expression.getMetadata() + ); + result.setStaticSequenceType(new SequenceType(BuiltinTypesCatalogue.booleanItem, SequenceType.Arity.One)); + result.setStaticContext(expression.getStaticContext()); + return result; + } +} diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 9b4f1eedc..04571a1f5 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -5,6 +5,7 @@ import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import org.antlr.v4.runtime.BailErrorStrategy; @@ -22,6 +23,7 @@ import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.ParsingException; +import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Node; import org.rumbledb.expressions.module.LibraryModule; @@ -61,6 +63,15 @@ private static void inferTypes(Module module, RumbleRuntimeConfiguration conf) { } } + private static MainModule applyTypeDependentOptimizations(MainModule module) { + List> optimizers = Collections.singletonList(new ComparisonVisitor()); + MainModule result = module; + for (AbstractNodeVisitor optimizer : optimizers) { + result = (MainModule) optimizer.visit(result, null); + } + return result; + } + private static void printTree(Module node, RumbleRuntimeConfiguration conf) { System.err.println("***************"); System.err.println("Expression tree"); @@ -140,6 +151,7 @@ public static MainModule parseJSONiqMainModule( resolveDependencies(mainModule, configuration); populateStaticContext(mainModule, configuration); inferTypes(mainModule, configuration); + mainModule = applyTypeDependentOptimizations(mainModule); populateExecutionModes(mainModule, configuration); return mainModule; } catch (ParseCancellationException ex) { @@ -180,6 +192,7 @@ public static MainModule parseXQueryMainModule( resolveDependencies(mainModule, configuration); populateStaticContext(mainModule, configuration); inferTypes(mainModule, configuration); + mainModule = applyTypeDependentOptimizations(mainModule); populateExecutionModes(mainModule, configuration); return mainModule; } catch (ParseCancellationException ex) { diff --git a/src/main/java/org/rumbledb/expressions/comparison/ComparisonExpression.java b/src/main/java/org/rumbledb/expressions/comparison/ComparisonExpression.java index ce4bf57f1..6fc56a297 100644 --- a/src/main/java/org/rumbledb/expressions/comparison/ComparisonExpression.java +++ b/src/main/java/org/rumbledb/expressions/comparison/ComparisonExpression.java @@ -131,6 +131,31 @@ public static ComparisonOperator fromSymbol(String symbol) { } throw new OurBadException("Unrecognized comparison symbol: " + symbol); } + + public static ComparisonOperator getValueComparisonFromComparison(ComparisonOperator operator) { + switch (operator) { + case VC_EQ: + case GC_EQ: + return VC_EQ; + case VC_NE: + case GC_NE: + return VC_NE; + case VC_LT: + case GC_LT: + return VC_LT; + case VC_LE: + case GC_LE: + return VC_LE; + case VC_GT: + case GC_GT: + return VC_GT; + case VC_GE: + case GC_GE: + return VC_GE; + default: + return operator; + } + } }; private Expression leftExpression; diff --git a/src/main/java/org/rumbledb/expressions/control/TryCatchExpression.java b/src/main/java/org/rumbledb/expressions/control/TryCatchExpression.java index 67fc40827..f6de3ff5e 100644 --- a/src/main/java/org/rumbledb/expressions/control/TryCatchExpression.java +++ b/src/main/java/org/rumbledb/expressions/control/TryCatchExpression.java @@ -33,6 +33,7 @@ public class TryCatchExpression extends Expression { private final Expression tryExpression; + private final Map catchExpressions; private final Expression catchAllExpression; @@ -56,6 +57,10 @@ public List getErrorsCaught() { return new ArrayList<>(this.catchExpressions.keySet()); } + public Map getCatchExpressions() { + return this.catchExpressions; + } + public boolean catches(String error) { return this.catchExpressions.containsKey(error); } diff --git a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java index b548b22ef..bf12e8847 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java @@ -38,8 +38,11 @@ public class LetClause extends Clause { private final Name variableName; protected SequenceType sequenceType; + protected SequenceType staticType; protected Expression expression; + private boolean isReferenced; + // Holds whether the let variable will be stored in materialized(local) or native/spark(RDD or DF) format in a tuple protected ExecutionMode variableHighestStorageMode = ExecutionMode.UNSET; @@ -56,6 +59,7 @@ public LetClause( this.variableName = variableName; this.sequenceType = sequenceType; this.expression = expression; + this.isReferenced = true; } public Name getVariableName() { @@ -118,8 +122,10 @@ public void print(StringBuffer buffer, int indent) { " (" + (this.variableName) + ", " - + this.getSequenceType().toString() - + (this.getSequenceType().isResolved() ? " (resolved)" : " (unresolved)") + + ((this.getStaticType() != null) ? this.getStaticType().toString() : "(unset)") + + ((this.getStaticType() != null) + ? (this.getStaticType().isResolved() ? " (resolved)" : " (unresolved)") + : "") + ") " ); buffer.append(")"); @@ -143,4 +149,20 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { this.expression.serializeToJSONiq(sb, 0); sb.append(")\n"); } + + public SequenceType getStaticType() { + return this.staticType; + } + + public void setStaticType(SequenceType staticType) { + this.staticType = staticType; + } + + public boolean getReferenced() { + return this.isReferenced; + } + + public void setReferenced(boolean isReferenced) { + this.isReferenced = false; + } } From a8a3b799d231f6d6c739575a6dbfbe99bddfaea2 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 14:11:28 +0100 Subject: [PATCH 005/136] Fix command line parameter to activate or not the optimizeation. --- .../org/rumbledb/compiler/TranslationVisitor.java | 2 +- .../org/rumbledb/compiler/VisitorHelpers.java | 12 +++++++----- .../config/RumbleRuntimeConfiguration.java | 15 +++++++++++++++ 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index a9a979911..6b89fb67f 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -850,7 +850,7 @@ public Node visitComparisonExpr(JsoniqParser.ComparisonExprContext ctx) { ComparisonExpression.ComparisonOperator kind = ComparisonExpression.ComparisonOperator.fromSymbol( ctx.op.get(0).getText() ); - if (kind.isValueComparison()) { + if (kind.isValueComparison() || this.configuration.optimizeGeneralComparisonToValueComparison()) { return new ComparisonExpression( mainExpression, childExpression, diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 04571a1f5..26c1cc99d 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -5,7 +5,6 @@ import java.net.URI; import java.nio.charset.StandardCharsets; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.antlr.v4.runtime.BailErrorStrategy; @@ -63,8 +62,11 @@ private static void inferTypes(Module module, RumbleRuntimeConfiguration conf) { } } - private static MainModule applyTypeDependentOptimizations(MainModule module) { - List> optimizers = Collections.singletonList(new ComparisonVisitor()); + private static MainModule applyTypeDependentOptimizations(MainModule module, RumbleRuntimeConfiguration conf) { + List> optimizers = new ArrayList<>(); + if (conf.optimizeGeneralComparisonToValueComparison()) { + optimizers.add(new ComparisonVisitor()); + } MainModule result = module; for (AbstractNodeVisitor optimizer : optimizers) { result = (MainModule) optimizer.visit(result, null); @@ -151,7 +153,7 @@ public static MainModule parseJSONiqMainModule( resolveDependencies(mainModule, configuration); populateStaticContext(mainModule, configuration); inferTypes(mainModule, configuration); - mainModule = applyTypeDependentOptimizations(mainModule); + mainModule = applyTypeDependentOptimizations(mainModule, configuration); populateExecutionModes(mainModule, configuration); return mainModule; } catch (ParseCancellationException ex) { @@ -192,7 +194,7 @@ public static MainModule parseXQueryMainModule( resolveDependencies(mainModule, configuration); populateStaticContext(mainModule, configuration); inferTypes(mainModule, configuration); - mainModule = applyTypeDependentOptimizations(mainModule); + mainModule = applyTypeDependentOptimizations(mainModule, configuration); populateExecutionModes(mainModule, configuration); return mainModule; } catch (ParseCancellationException ex) { diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java index 330a54958..b337baffb 100644 --- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java +++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java @@ -67,6 +67,7 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl private boolean nativeSQLPredicates; private boolean dataFrameExecutionModeDetection; private boolean datesWithTimeZone; + private boolean optimizeGeneralComparisonToValueComparison; private boolean thirdFeature; private Map shortcutMap; @@ -392,6 +393,12 @@ public void init() { } else { this.datesWithTimeZone = false; } + + if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) { + this.optimizeGeneralComparisonToValueComparison = this.arguments.get("optimize-general-comparison-to-value-comparison").equals("yes"); + } else { + this.optimizeGeneralComparisonToValueComparison = true; + } } public boolean getOverwrite() { @@ -575,6 +582,14 @@ public void setDateWithTimezone(boolean b) { this.datesWithTimeZone = b; } + public boolean optimizeGeneralComparisonToValueComparison() { + return this.optimizeGeneralComparisonToValueComparison; + } + + public void setOptimizeGeneralComparisonToValueComparison(boolean b) { + this.optimizeGeneralComparisonToValueComparison = b; + } + public boolean isLocal() { String masterConfig = SparkSessionManager.getInstance().getJavaSparkContext().getConf().get("spark.master"); return masterConfig.contains("local"); From 8064eef5e530cffa7e0904397a240201c606d574 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 14:12:24 +0100 Subject: [PATCH 006/136] Simplify code. --- src/main/java/org/rumbledb/compiler/TranslationVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index 6b89fb67f..f735513cd 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -854,7 +854,7 @@ public Node visitComparisonExpr(JsoniqParser.ComparisonExprContext ctx) { return new ComparisonExpression( mainExpression, childExpression, - ComparisonExpression.ComparisonOperator.fromSymbol(ctx.op.get(0).getText()), + kind, createMetadataFromContext(ctx) ); } From dbd207a37a811dc3c87b843e1e94407204efd4b4 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 14:14:25 +0100 Subject: [PATCH 007/136] Add documentation for sinh and cosh. --- docs/Function library.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/docs/Function library.md b/docs/Function library.md index 6845bdf44..f40fe1f7d 100644 --- a/docs/Function library.md +++ b/docs/Function library.md @@ -194,6 +194,22 @@ cos(pi()) ``` +### cosh +JSONiq-specific. Fully implemented + +``` +cosh(pi()) +``` + + +### sinh +JSONiq-specific. Fully implemented + +``` +sinh(pi()) +``` + + ### tan [W3C specification](https://www.w3.org/TR/xpath-functions-31/#func-tan) From 027ae5b1c133b17228809c35c50271293727dcc0 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 14:15:31 +0100 Subject: [PATCH 008/136] Spotless. --- .../java/org/rumbledb/config/RumbleRuntimeConfiguration.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java index b337baffb..e29c891dd 100644 --- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java +++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java @@ -395,7 +395,9 @@ public void init() { } if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) { - this.optimizeGeneralComparisonToValueComparison = this.arguments.get("optimize-general-comparison-to-value-comparison").equals("yes"); + this.optimizeGeneralComparisonToValueComparison = this.arguments.get( + "optimize-general-comparison-to-value-comparison" + ).equals("yes"); } else { this.optimizeGeneralComparisonToValueComparison = true; } From 3445a3f9caa38f3b49a70b60b2ed370277d8e03f Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 14:16:49 +0100 Subject: [PATCH 009/136] Document new CLI parameter. --- docs/CLI.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/CLI.md b/docs/CLI.md index c4fd41289..a86386a18 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -38,4 +38,5 @@ Previous parameters (--shell, --query-path, --server) work in a backward compati | --context-item-input-format | N/A | context-item-input-format | text or json | sets the input format to use for parsing the standard input (as text or as a serialized json value) | | --dates-with-timezone | N/A | dates-with-timezone | yes or no | activates timezone support for the type xs:date (deactivated by default) | +| --optimize-general-comparison-to-value-comparison | N/A | optimize-general-comparison-to-valud-comparison | yes or no | activates automatic conversion of general comparisons to value comparisons when applicable | From 7f38324e35cdd2eff02d5f86c6e6566111998b62 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 14:18:53 +0100 Subject: [PATCH 010/136] Add clone visitor. --- .../org/rumbledb/compiler/CloneVisitor.java | 714 ++++++++++++++++++ 1 file changed, 714 insertions(+) create mode 100644 src/main/java/org/rumbledb/compiler/CloneVisitor.java diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java new file mode 100644 index 000000000..2b563092d --- /dev/null +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -0,0 +1,714 @@ +package org.rumbledb.compiler; + +import org.rumbledb.expressions.AbstractNodeVisitor; +import org.rumbledb.expressions.CommaExpression; +import org.rumbledb.expressions.Expression; +import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.arithmetic.AdditiveExpression; +import org.rumbledb.expressions.arithmetic.MultiplicativeExpression; +import org.rumbledb.expressions.arithmetic.UnaryExpression; +import org.rumbledb.expressions.comparison.ComparisonExpression; +import org.rumbledb.expressions.control.*; +import org.rumbledb.expressions.flowr.*; +import org.rumbledb.expressions.logic.AndExpression; +import org.rumbledb.expressions.logic.NotExpression; +import org.rumbledb.expressions.logic.OrExpression; +import org.rumbledb.expressions.miscellaneous.RangeExpression; +import org.rumbledb.expressions.miscellaneous.StringConcatExpression; +import org.rumbledb.expressions.module.*; +import org.rumbledb.expressions.postfix.*; +import org.rumbledb.expressions.primary.*; +import org.rumbledb.expressions.typing.*; + +import java.util.*; +import java.util.stream.Collectors; + +public class CloneVisitor extends AbstractNodeVisitor { + @Override + protected Node defaultAction(Node node, Node argument) { + return node; + } + + @Override + public Node visitMainModule(MainModule module, Node argument) { + MainModule result = new MainModule( + (Prolog) visit(module.getProlog(), module.getProlog()), + (Expression) visit(module.getExpression(), argument), + module.getMetadata() + ); + result.setStaticContext(module.getStaticContext()); + return result; + } + + @Override + public Node visitLibraryModule(LibraryModule module, Node argument) { + LibraryModule result = new LibraryModule( + (Prolog) visit(module.getProlog(), module.getProlog()), + module.getNamespace(), + module.getMetadata() + ); + result.setStaticContext(module.getStaticContext()); + return result; + } + + @Override + public Node visitProlog(Prolog expression, Node argument) { + List libraryModules = expression.getImportedModules() + .stream() + .map(libraryModule -> (LibraryModule) visit(libraryModule, argument)) + .collect(Collectors.toList()); + List declarations = expression.getFunctionDeclarations() + .stream() + .map(expr -> visit(expr, argument)) + .collect(Collectors.toList()); + declarations.addAll(expression.getVariableDeclarations()); + declarations.addAll(expression.getTypeDeclarations()); + expression.setDeclarations(declarations); + expression.getImportedModules().clear(); + expression.getImportedModules().addAll(libraryModules); + return expression; + } + + @Override + public Node visitCommaExpression(CommaExpression expression, Node argument) { + List children = new ArrayList<>(); + for (Expression child : expression.getExpressions()) { + children.add((Expression) visit(child, argument)); + } + CommaExpression result = new CommaExpression(children, expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + // region flwor + @Override + public Node visitFlowrExpression(FlworExpression expression, Node argument) { + Clause clause = expression.getReturnClause().getFirstClause(); + Clause result = null; + while (clause != null) { + Clause temp = (Clause) this.visit(clause, argument); + if (result != null) { + result.chainWith(temp); + } + result = temp; + clause = clause.getNextClause(); + } + Expression resultingExpression = new FlworExpression((ReturnClause) result, expression.getMetadata()); + resultingExpression.setStaticContext(expression.getStaticContext()); + resultingExpression.setStaticSequenceType(expression.getStaticSequenceType()); + return resultingExpression; + } + + public Node visitVariableReference(VariableReferenceExpression expression, Node argument) { + VariableReferenceExpression result = new VariableReferenceExpression( + expression.getVariableName(), + expression.getMetadata() + ); + result.setActualType(expression.getActualType()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + @Override + public Node visitForClause(ForClause clause, Node argument) { + Clause result = new ForClause( + clause.getVariableName(), + clause.isAllowEmpty(), + clause.getActualSequenceType(), + clause.getPositionalVariableName(), + (Expression) visit(clause.getExpression(), argument), + clause.getMetadata() + ); + result.setStaticContext(clause.getStaticContext()); + return result; + } + + @Override + public Node visitLetClause(LetClause clause, Node argument) { + LetClause result = new LetClause( + clause.getVariableName(), + clause.getActualSequenceType(), + (Expression) visit(clause.getExpression(), argument), + clause.getMetadata() + ); + result.setStaticType(clause.getStaticType()); + result.setStaticContext(clause.getStaticContext()); + return result; + } + + @Override + public Node visitGroupByClause(GroupByClause clause, Node argument) { + List groupByVariableDeclarations = new ArrayList<>(); + for (GroupByVariableDeclaration variable : clause.getGroupVariables()) { + groupByVariableDeclarations.add( + new GroupByVariableDeclaration( + variable.getVariableName(), + variable.getActualSequenceType(), + (variable.getExpression() == null) + ? variable.getExpression() + : (Expression) visit(variable.getExpression(), argument) + ) + ); + } + Clause result = new GroupByClause(groupByVariableDeclarations, clause.getMetadata()); + result.setStaticContext(clause.getStaticContext()); + return result; + } + + @Override + public Node visitOrderByClause(OrderByClause clause, Node argument) { + List groupByVariableDeclarations = new ArrayList<>(); + for (OrderByClauseSortingKey orderByClauseSortingKey : clause.getSortingKeys()) { + groupByVariableDeclarations.add( + new OrderByClauseSortingKey( + (Expression) visit(orderByClauseSortingKey.getExpression(), argument), + orderByClauseSortingKey.isAscending(), + orderByClauseSortingKey.getUri(), + orderByClauseSortingKey.getEmptyOrder() + ) + ); + + } + Clause result = new OrderByClause(groupByVariableDeclarations, clause.isStable(), clause.getMetadata()); + result.setStaticContext(clause.getStaticContext()); + return result; + } + + @Override + public Node visitCountClause(CountClause expression, Node argument) { + Clause result = new CountClause( + (VariableReferenceExpression) visit(expression.getCountVariable(), argument), + expression.getMetadata() + ); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitWhereClause(WhereClause clause, Node argument) { + Clause result = new WhereClause( + (Expression) visit(clause.getWhereExpression(), argument), + clause.getMetadata() + ); + result.setStaticContext(clause.getStaticContext()); + return result; + } + + @Override + public Node visitReturnClause(ReturnClause clause, Node argument) { + Clause result = new ReturnClause((Expression) visit(clause.getReturnExpr(), argument), clause.getMetadata()); + result.setStaticContext(clause.getStaticContext()); + return result; + } + // endregion + + // region postfix + @Override + public Node visitArrayUnboxingExpression(ArrayUnboxingExpression expression, Node argument) { + ArrayUnboxingExpression result = new ArrayUnboxingExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitArrayLookupExpression(ArrayLookupExpression expression, Node argument) { + ArrayLookupExpression result = new ArrayLookupExpression( + (Expression) visit(expression.getMainExpression(), argument), + (Expression) visit(expression.getLookupExpression(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitObjectLookupExpression(ObjectLookupExpression expression, Node argument) { + ObjectLookupExpression result = new ObjectLookupExpression( + (Expression) visit(expression.getMainExpression(), argument), + (Expression) visit(expression.getLookupExpression(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitFilterExpression(FilterExpression expression, Node argument) { + FilterExpression result = new FilterExpression( + (Expression) visit(expression.getMainExpression(), argument), + (Expression) visit(expression.getPredicateExpression(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitDynamicFunctionCallExpression(DynamicFunctionCallExpression expression, Node argument) { + DynamicFunctionCallExpression result = new DynamicFunctionCallExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getArguments(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + // endregion + + // region primary + public Node visitArrayConstructor(ArrayConstructorExpression expression, Node argument) { + ArrayConstructorExpression result = new ArrayConstructorExpression( + (expression.getExpression() == null) + ? expression.getExpression() + : (Expression) visit(expression.getExpression(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitObjectConstructor(ObjectConstructorExpression expression, Node argument) { + if (expression.isMergedConstructor()) { + Expression result = new ObjectConstructorExpression( + (Expression) visit(expression.getChildren().get(0), argument), + expression.getMetadata() + ); + result.setStaticContext(expression.getStaticContext()); + return result; + } else { + List keys = expression.getKeys() + .stream() + .map(key -> (Expression) visit(key, argument)) + .collect(Collectors.toList()); + List values = expression.getValues() + .stream() + .map(key -> (Expression) visit(key, argument)) + .collect(Collectors.toList()); + Expression result = new ObjectConstructorExpression(keys, values, expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + } + + @Override + public Node visitContextExpr(ContextItemExpression expression, Node argument) { + Expression result = new ContextItemExpression(expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + @Override + public Node visitFunctionCall(FunctionCallExpression expression, Node argument) { + List arguments = expression.getArguments() + .stream() + .map(expr -> expr != null ? (Expression) visit(expr, argument) : null) + .collect(Collectors.toList()); + Expression result = new FunctionCallExpression( + expression.getFunctionName(), + arguments, + expression.getMetadata() + ); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + @Override + public Node visitInlineFunctionExpr(InlineFunctionExpression expression, Node argument) { + InlineFunctionExpression result = new InlineFunctionExpression( + expression.getName(), + expression.getParams(), + expression.getReturnType(), + (Expression) visit(expression.getBody(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + public Node visitNamedFunctionRef(NamedFunctionReferenceExpression expression, Node argument) { + Expression result = new NamedFunctionReferenceExpression(expression.getIdentifier(), expression.getMetadata()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + // endregion + + // region literal + public Node visitInteger(IntegerLiteralExpression expression, Node argument) { + Expression result = new IntegerLiteralExpression(expression.getLexicalValue(), expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + public Node visitString(StringLiteralExpression expression, Node argument) { + Expression result = new StringLiteralExpression(expression.getValue(), expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + public Node visitDouble(DoubleLiteralExpression expression, Node argument) { + Expression result = new DoubleLiteralExpression(expression.getValue(), expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + public Node visitDecimal(DecimalLiteralExpression expression, Node argument) { + Expression result = new DecimalLiteralExpression(expression.getValue(), expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + public Node visitNull(NullLiteralExpression expression, Node argument) { + Expression result = new NullLiteralExpression(expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + + public Node visitBoolean(BooleanLiteralExpression expression, Node argument) { + Expression result = new BooleanLiteralExpression(expression.getValue(), expression.getMetadata()); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + // endregion + + // region operational + @Override + public Node visitAdditiveExpr(AdditiveExpression expression, Node argument) { + AdditiveExpression result = new AdditiveExpression( + (Expression) visit(expression.getLeftExpression(), argument), + (Expression) visit(expression.getRightExpression(), argument), + expression.isMinus(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitMultiplicativeExpr(MultiplicativeExpression expression, Node argument) { + MultiplicativeExpression result = new MultiplicativeExpression( + (Expression) visit(expression.getLeftExpression(), argument), + (Expression) visit(expression.getRightExpression(), argument), + expression.getMultiplicativeOperator(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitSimpleMapExpr(SimpleMapExpression expression, Node argument) { + SimpleMapExpression result = new SimpleMapExpression( + (Expression) visit(expression.getChildren().get(0), argument), + (Expression) visit(expression.getChildren().get(1), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitAndExpr(AndExpression expression, Node argument) { + AndExpression result = new AndExpression( + (Expression) visit(expression.getChildren().get(0), argument), + (Expression) visit(expression.getChildren().get(1), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitOrExpr(OrExpression expression, Node argument) { + OrExpression result = new OrExpression( + (Expression) visit(expression.getChildren().get(0), argument), + (Expression) visit(expression.getChildren().get(1), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitNotExpr(NotExpression expression, Node argument) { + NotExpression result = new NotExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitUnaryExpr(UnaryExpression expression, Node argument) { + UnaryExpression result = new UnaryExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.isNegated(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitRangeExpr(RangeExpression expression, Node argument) { + RangeExpression result = new RangeExpression( + (Expression) visit(expression.getChildren().get(0), argument), + (Expression) visit(expression.getChildren().get(1), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitStringConcatExpr(StringConcatExpression expression, Node argument) { + StringConcatExpression result = new StringConcatExpression( + (Expression) visit(expression.getChildren().get(0), argument), + (Expression) visit(expression.getChildren().get(1), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitComparisonExpr(ComparisonExpression expression, Node argument) { + ComparisonExpression result = new ComparisonExpression( + (Expression) visit(expression.getChildren().get(0), argument), + (Expression) visit(expression.getChildren().get(1), argument), + expression.getComparisonOperator(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitInstanceOfExpression(InstanceOfExpression expression, Node argument) { + InstanceOfExpression result = new InstanceOfExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getSequenceType(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitIsStaticallyExpr(IsStaticallyExpression expression, Node argument) { + IsStaticallyExpression result = new IsStaticallyExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getSequenceType(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitTreatExpression(TreatExpression expression, Node argument) { + TreatExpression result = new TreatExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getsequenceType(), + expression.errorCodeThatShouldBeThrown(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitCastableExpression(CastableExpression expression, Node argument) { + CastableExpression result = new CastableExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getSequenceType(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitCastExpression(CastExpression expression, Node argument) { + CastExpression result = new CastExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getSequenceType(), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + // endregion + + // region control + @Override + public Node visitConditionalExpression(ConditionalExpression expression, Node argument) { + ConditionalExpression result = new ConditionalExpression( + (Expression) visit(expression.getCondition(), argument), + (Expression) visit(expression.getBranch(), argument), + (Expression) visit(expression.getElseBranch(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitSwitchExpression(SwitchExpression expression, Node argument) { + List resultCases = new ArrayList<>(); + for (SwitchCase switchCase : expression.getCases()) { + List children = new ArrayList<>(); + for (Expression child : switchCase.getConditionExpressions()) { + children.add((Expression) visit(child, argument)); + } + resultCases.add(new SwitchCase(children, (Expression) visit(switchCase.getReturnExpression(), argument))); + } + SwitchExpression result = new SwitchExpression( + (Expression) visit(expression.getTestCondition(), argument), + resultCases, + (Expression) visit(expression.getDefaultExpression(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitTypeSwitchExpression(TypeSwitchExpression expression, Node argument) { + List resultCases = new ArrayList<>(); + for (TypeswitchCase switchCase : expression.getCases()) { + if (switchCase.getUnion() == null) { + resultCases.add( + new TypeswitchCase( + switchCase.getVariableName(), + (Expression) visit(switchCase.getReturnExpression(), argument) + ) + ); + } else { + resultCases.add( + new TypeswitchCase( + switchCase.getVariableName(), + switchCase.getUnion(), + (Expression) visit(switchCase.getReturnExpression(), argument) + ) + ); + } + } + TypeswitchCase defaultCase = (expression.getDefaultCase().getUnion() == null) + ? new TypeswitchCase( + expression.getDefaultCase().getVariableName(), + (Expression) visit(expression.getDefaultCase().getReturnExpression(), argument) + ) + : new TypeswitchCase( + expression.getDefaultCase().getVariableName(), + expression.getDefaultCase().getUnion(), + (Expression) visit(expression.getDefaultCase().getReturnExpression(), argument) + ); + + TypeSwitchExpression result = new TypeSwitchExpression( + (Expression) visit(expression.getTestCondition(), argument), + resultCases, + defaultCase, + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + + @Override + public Node visitTryCatchExpression(TryCatchExpression expression, Node argument) { + Map catchExpressions = new HashMap<>(); + for (String key : expression.getCatchExpressions().keySet()) { + catchExpressions.put(key, (Expression) visit(expression.getCatchExpressions().get(key), argument)); + } + TryCatchExpression result = new TryCatchExpression( + (Expression) visit(expression.getTryExpression(), argument), + catchExpressions, + (expression.getExpressionCatchingAll() == null) + ? expression.getExpressionCatchingAll() + : (Expression) visit(expression.getExpressionCatchingAll(), argument), + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + result.setStaticContext(expression.getStaticContext()); + return result; + } + // endregion + + // region prolog + @Override + public Node visitVariableDeclaration(VariableDeclaration expression, Node argument) { + return new VariableDeclaration( + expression.getVariableName(), + expression.external(), + expression.getActualSequenceType(), + (Expression) visit(expression.getExpression(), argument), + expression.getMetadata() + ); + } + + @Override + public Node visitFunctionDeclaration(FunctionDeclaration expression, Node argument) { + return new FunctionDeclaration( + (InlineFunctionExpression) visit(expression.getExpression(), argument), + expression.getMetadata() + ); + } + + public Node visitTypeDeclaration(TypeDeclaration expression, Node argument) { + return new TypeDeclaration(expression.getDefinition(), expression.getMetadata()); + } + + @Override + public Node visitValidateTypeExpression(ValidateTypeExpression expression, Node argument) { + Expression result = new ValidateTypeExpression( + (Expression) visit(expression.getMainExpression(), argument), + expression.getSequenceType(), + expression.getMetadata() + ); + result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } +} From 2be97e03d8cb1a4a61c61c239f70f92292d0b15e Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 23 Mar 2023 14:30:44 +0100 Subject: [PATCH 011/136] Add tests. --- .../runtime/FunctionNumerics/Trigonometric/FunctionCosh.jq | 4 ++++ .../runtime/FunctionNumerics/Trigonometric/FunctionSinh.jq | 4 ++++ 2 files changed, 8 insertions(+) create mode 100644 src/test/resources/test_files/runtime/FunctionNumerics/Trigonometric/FunctionCosh.jq create mode 100644 src/test/resources/test_files/runtime/FunctionNumerics/Trigonometric/FunctionSinh.jq diff --git a/src/test/resources/test_files/runtime/FunctionNumerics/Trigonometric/FunctionCosh.jq b/src/test/resources/test_files/runtime/FunctionNumerics/Trigonometric/FunctionCosh.jq new file mode 100644 index 000000000..b54135a09 --- /dev/null +++ b/src/test/resources/test_files/runtime/FunctionNumerics/Trigonometric/FunctionCosh.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="(1, 11.605905056625701)" :) +cosh(0), +cosh(3.1428), +cosh(()) diff --git a/src/test/resources/test_files/runtime/FunctionNumerics/Trigonometric/FunctionSinh.jq b/src/test/resources/test_files/runtime/FunctionNumerics/Trigonometric/FunctionSinh.jq new file mode 100644 index 000000000..066b07294 --- /dev/null +++ b/src/test/resources/test_files/runtime/FunctionNumerics/Trigonometric/FunctionSinh.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="(0, 11.562743281047538)" :) +sinh(0), +sinh(3.1428), +sinh(()) From 7bf479729b939dac4df5c6f638427658258fabb8 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 11:42:43 +0200 Subject: [PATCH 012/136] Fix bug with join projections. --- .../org/rumbledb/context/DynamicContext.java | 20 +++++++++++++++++++ .../runtime/flwor/FlworDataFrameUtils.java | 5 +++++ .../flwor/clauses/LetClauseSparkIterator.java | 8 ++++++-- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/context/DynamicContext.java b/src/main/java/org/rumbledb/context/DynamicContext.java index e4e998f3e..f81d4a932 100644 --- a/src/main/java/org/rumbledb/context/DynamicContext.java +++ b/src/main/java/org/rumbledb/context/DynamicContext.java @@ -34,6 +34,7 @@ import org.rumbledb.items.structured.JSoundDataFrame; import java.io.Serializable; +import java.util.HashMap; import java.util.List; import java.util.Map; @@ -158,6 +159,25 @@ public static void mergeVariableDependencies( } } + public static Map copyVariableDependencies( + Map from + ) { + Map result = new HashMap<>(); + for (Name v : from.keySet()) { + result.put(v, from.get(v)); + } + return result; + } + + public static void printVariableDependencies( + Map deps + ) { + System.err.println("" + deps.size() + " variable dependencies:"); + for (Name v : deps.keySet()) { + System.err.println("Key: " + v + " Value: " + deps.get(v)); + } + } + @Override public String toString() { StringBuilder sb = new StringBuilder(); diff --git a/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java b/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java index 614404396..0277f13d6 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java +++ b/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java @@ -394,6 +394,7 @@ public static List getColumns( List variablesToRestrictTo, List variablesToExclude ) { + inputSchema.printTreeString(); List result = new ArrayList<>(); if (dependencies == null) { for (String columnName : inputSchema.fieldNames()) { @@ -439,6 +440,10 @@ public static void getColumns( if (variablesToRestrictTo != null && !variablesToRestrictTo.contains(variableName)) { return; } + System.err.println(variableName.toString()); + for (String s : columnNames) { + System.err.println(" c " + s); + } switch (dependency.getValue()) { case FULL: { if (columnNames.contains(variableName.toString())) { diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java index e18c7930c..603f6d173 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java @@ -413,9 +413,14 @@ public FlworDataFrame getDataFrameAsJoin( StructType inputSchema = inputDF.schema(); List variableNamesToExclude = new ArrayList<>(); variableNamesToExclude.add(this.variableName); + inputSchema.printTreeString(); + Map prefilterProjection = DynamicContext.copyVariableDependencies(parentProjection); + DynamicContext.mergeVariableDependencies(prefilterProjection, predicateDependencies); + prefilterProjection.put(this.variableName, prefilterProjection.get(Name.CONTEXT_ITEM)); + prefilterProjection.remove(Name.CONTEXT_ITEM); List columnsToSelect = FlworDataFrameUtils.getColumns( inputSchema, - parentProjection, + prefilterProjection, null, variableNamesToExclude ); @@ -434,7 +439,6 @@ public FlworDataFrame getDataFrameAsJoin( SparkSessionManager.leftHandSideHashColumnName ) ); - // We now post-filter on the predicate, by hash group. RuntimeIterator filteringPredicateIterator = new PredicateIterator( new VariableReferenceIterator( From db94a92ec66c39581f8b745e7321f8533cb7e726 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 12:56:56 +0200 Subject: [PATCH 013/136] Update FlworDataFrameUtils.java --- .../java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java b/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java index 0277f13d6..dbd0e8ebc 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java +++ b/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java @@ -440,10 +440,6 @@ public static void getColumns( if (variablesToRestrictTo != null && !variablesToRestrictTo.contains(variableName)) { return; } - System.err.println(variableName.toString()); - for (String s : columnNames) { - System.err.println(" c " + s); - } switch (dependency.getValue()) { case FULL: { if (columnNames.contains(variableName.toString())) { From 8e66499f5f17de4d1ec9d34d38c85818a838b5f0 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 12:57:10 +0200 Subject: [PATCH 014/136] Update FlworDataFrameUtils.java --- .../java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java b/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java index dbd0e8ebc..614404396 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java +++ b/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrameUtils.java @@ -394,7 +394,6 @@ public static List getColumns( List variablesToRestrictTo, List variablesToExclude ) { - inputSchema.printTreeString(); List result = new ArrayList<>(); if (dependencies == null) { for (String columnName : inputSchema.fieldNames()) { From dd3d5149192acc2549f053bb2cb3c9544a24d91e Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 12:57:31 +0200 Subject: [PATCH 015/136] Update DynamicContext.java --- src/main/java/org/rumbledb/context/DynamicContext.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/org/rumbledb/context/DynamicContext.java b/src/main/java/org/rumbledb/context/DynamicContext.java index f81d4a932..236deef58 100644 --- a/src/main/java/org/rumbledb/context/DynamicContext.java +++ b/src/main/java/org/rumbledb/context/DynamicContext.java @@ -169,15 +169,6 @@ public static Map copyVariableDependenc return result; } - public static void printVariableDependencies( - Map deps - ) { - System.err.println("" + deps.size() + " variable dependencies:"); - for (Name v : deps.keySet()) { - System.err.println("Key: " + v + " Value: " + deps.get(v)); - } - } - @Override public String toString() { StringBuilder sb = new StringBuilder(); From d142df1f932c60c6bcf9520080e50bcb740b1dbd Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 13:27:22 +0200 Subject: [PATCH 016/136] Add tests forcing local execution. --- .../compiler/LocalExecutionModeVisitor.java | 46 ++++ src/test/java/iq/LocalRuntimeTests.java | 227 ++++++++++++++++++ 2 files changed, 273 insertions(+) create mode 100644 src/main/java/org/rumbledb/compiler/LocalExecutionModeVisitor.java create mode 100644 src/test/java/iq/LocalRuntimeTests.java diff --git a/src/main/java/org/rumbledb/compiler/LocalExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/LocalExecutionModeVisitor.java new file mode 100644 index 000000000..708ae91ff --- /dev/null +++ b/src/main/java/org/rumbledb/compiler/LocalExecutionModeVisitor.java @@ -0,0 +1,46 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package org.rumbledb.compiler; + +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.StaticContext; +import org.rumbledb.expressions.AbstractNodeVisitor; +import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.expressions.Node; + +/** + * Static context visitor implements a multi-pass algorithm that enables function hoisting + */ +public class LocalExecutionModeVisitor extends AbstractNodeVisitor { + + LocalExecutionModeVisitor(RumbleRuntimeConfiguration configuration) { + } + + void setVisitorConfig(VisitorConfig visitorConfig) { + } + + @Override + protected StaticContext defaultAction(Node node, StaticContext argument) { + visitDescendants(node, argument); + node.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } +} diff --git a/src/test/java/iq/LocalRuntimeTests.java b/src/test/java/iq/LocalRuntimeTests.java new file mode 100644 index 000000000..697c5196c --- /dev/null +++ b/src/test/java/iq/LocalRuntimeTests.java @@ -0,0 +1,227 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import iq.base.AnnotationsTestsBase; +import scala.util.Properties; + +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaRDD; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.Item; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.Name; +import org.rumbledb.items.ItemFactory; + +import sparksoniq.spark.SparkSessionManager; +import utils.FileManager; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +@RunWith(Parameterized.class) +public class LocalRuntimeTests extends AnnotationsTestsBase { + + public static final File runtimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime" + ); + public static final String javaVersion = + System.getProperty("java.version"); + public static final String scalaVersion = + Properties.scalaPropOrElse("version.number", "unknown"); + protected static List _testFiles = new ArrayList<>(); + protected final File testFile; + protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--variable:externalUnparsedString", + "unparsed string", + "--local-execution-only", + "yes" } + ).setExternalVariableValue( + Name.createVariableInNoNamespace("externalStringItem"), + Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) + ) + .setExternalVariableValue( + Name.createVariableInNoNamespace("externalIntegerItems"), + Arrays.asList( + new Item[] { + ItemFactory.getInstance().createIntItem(1), + ItemFactory.getInstance().createIntItem(2), + ItemFactory.getInstance().createIntItem(3), + ItemFactory.getInstance().createIntItem(4), + ItemFactory.getInstance().createIntItem(5), + } + ) + ); + public LocalRuntimeTests(File testFile) { + this.testFile = testFile; + } + + public static void readFileList(File dir) { + FileManager.loadJiqFiles(dir).forEach(file -> LocalRuntimeTests._testFiles.add(file)); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + LocalRuntimeTests.readFileList(LocalRuntimeTests.runtimeTestsDirectory); + LocalRuntimeTests._testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } + + @BeforeClass + public static void setupSparkSession() { + System.err.println("Java version: " + javaVersion); + System.err.println("Scala version: " + scalaVersion); + SparkConf sparkConfiguration = new SparkConf(); + sparkConfiguration.setMaster("local[*]"); + sparkConfiguration.set("spark.submit.deployMode", "client"); + sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); + sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); + sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + + // prevents spark from failing to start on MacOS when disconnected from the internet + sparkConfiguration.set("spark.driver.host", "127.0.0.1"); + + + // sparkConfiguration.set("spark.driver.memory", "2g"); + // sparkConfiguration.set("spark.executor.memory", "2g"); + // sparkConfiguration.set("spark.speculation", "true"); + // sparkConfiguration.set("spark.speculation.quantile", "0.5"); + SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); + SparkSessionManager.COLLECT_ITEM_LIMIT = LocalRuntimeTests.configuration.getResultSizeCap(); + System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); + } + + @Test(timeout = 1000000) + public void testRuntimeIterators() throws Throwable { + System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); + testAnnotations(this.testFile.getAbsolutePath(), LocalRuntimeTests.configuration); + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput; + if (!sequence.availableAsRDD()) { + actualOutput = runIterators(sequence); + } else { + actualOutput = getRDDResults(sequence); + } + Assert.assertTrue( + "Expected output: " + expectedOutput + "\nActual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + } + + protected String runIterators(SequenceOfItems sequence) { + String actualOutput = getIteratorOutput(sequence); + return actualOutput; + } + + protected String getIteratorOutput(SequenceOfItems sequence) { + sequence.open(); + Item result = null; + if (sequence.hasNext()) { + result = sequence.next(); + } + if (result == null) { + return ""; + } + String singleOutput = result.serialize(); + if (!sequence.hasNext()) { + return singleOutput; + } else { + int itemCount = 1; + StringBuilder sb = new StringBuilder(); + sb.append("("); + sb.append(result.serialize()); + sb.append(", "); + while ( + sequence.hasNext() + && + ((itemCount < AnnotationsTestsBase.configuration.getResultSizeCap() + && AnnotationsTestsBase.configuration.getResultSizeCap() > 0) + || + AnnotationsTestsBase.configuration.getResultSizeCap() == 0) + ) { + sb.append(sequence.next().serialize()); + sb.append(", "); + itemCount++; + } + if (sequence.hasNext() && itemCount == AnnotationsTestsBase.configuration.getResultSizeCap()) { + System.err.println( + "Warning! The output sequence contains a large number of items but its materialization was capped at " + + SparkSessionManager.COLLECT_ITEM_LIMIT + + " items. This value can be configured with the --result-size parameter at startup" + ); + } + // remove last comma + String output = sb.toString(); + output = output.substring(0, output.length() - 2); + output += ")"; + return output; + } + } + + private String getRDDResults(SequenceOfItems sequence) { + JavaRDD rdd = sequence.getAsRDD(); + JavaRDD output = rdd.map(o -> o.serialize()); + List collectedOutput = new ArrayList(); + SparkSessionManager.collectRDDwithLimitWarningOnly(output, collectedOutput); + + if (collectedOutput.isEmpty()) { + return ""; + } + + if (collectedOutput.size() == 1) { + return collectedOutput.get(0); + } + + StringBuilder sb = new StringBuilder(); + sb.append("("); + for (String item : collectedOutput) { + sb.append(item); + sb.append(", "); + } + + String result = sb.toString(); + result = result.substring(0, result.length() - 2); + result += ")"; + return result; + } +} From ad5e818a5308b2b6b8c8936d45dc26f8e1f31fa3 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 13:45:35 +0200 Subject: [PATCH 017/136] A few fixes. --- .../org/rumbledb/compiler/VisitorHelpers.java | 31 +++++++++++++------ .../config/RumbleRuntimeConfiguration.java | 15 +++++++++ .../expressions/flowr/CountClause.java | 13 +++++--- .../rumbledb/expressions/flowr/ForClause.java | 16 +++++++--- .../expressions/flowr/GroupByClause.java | 1 + .../rumbledb/expressions/flowr/LetClause.java | 16 +++++++--- .../expressions/flowr/OrderByClause.java | 1 + .../expressions/flowr/ReturnClause.java | 1 + .../expressions/flowr/WhereClause.java | 4 +++ .../input/ParallelizeFunctionIterator.java | 29 +++++++++++++++-- 10 files changed, 104 insertions(+), 23 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 26c1cc99d..15b835dd8 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -313,9 +313,23 @@ private static void populateExecutionModes(Module module, RumbleRuntimeConfigura if (conf.isPrintIteratorTree()) { printTree(module, conf); } - ExecutionModeVisitor visitor = new ExecutionModeVisitor(conf); - visitor.visit(module, module.getStaticContext()); - + if(conf.localExecutionOnly()) + { + System.err.println("[Local execution only]"); + LocalExecutionModeVisitor visitor = new LocalExecutionModeVisitor(conf); + visitor.visit(module, module.getStaticContext()); + if (conf.isPrintIteratorTree()) { + printTree(module, conf); + } + if (module.numberOfUnsetExecutionModes() > 0) { + System.err.println( + "[WARNING] Some execution modes could not be set. The query may still work, but we would welcome a bug report." + ); + } + return; + } + ExecutionModeVisitor visitor = new ExecutionModeVisitor(conf); + visitor.visit(module, module.getStaticContext()); visitor.setVisitorConfig(VisitorConfig.staticContextVisitorIntermediatePassConfig); int prevUnsetCount = module.numberOfUnsetExecutionModes(); @@ -354,12 +368,11 @@ private static void populateExecutionModes(Module module, RumbleRuntimeConfigura if (conf.isPrintIteratorTree()) { printTree(module, conf); } - if (module.numberOfUnsetExecutionModes() > 0) { - System.err.println( - "[WARNING] Some execution modes could not be set. The query may still work, but we would welcome a bug report." - ); - } - + if (module.numberOfUnsetExecutionModes() > 0) { + System.err.println( + "[WARNING] Some execution modes could not be set. The query may still work, but we would welcome a bug report." + ); + } } private static void populateStaticContext(Module module, RumbleRuntimeConfiguration conf) { diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java index e29c891dd..d669d01e7 100644 --- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java +++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java @@ -68,6 +68,7 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl private boolean dataFrameExecutionModeDetection; private boolean datesWithTimeZone; private boolean optimizeGeneralComparisonToValueComparison; + private boolean localExecutionOnly; private boolean thirdFeature; private Map shortcutMap; @@ -394,6 +395,12 @@ public void init() { this.datesWithTimeZone = false; } + if (this.arguments.containsKey("local-execution-only")) { + this.localExecutionOnly = this.arguments.get("local-execution-only").equals("yes"); + } else { + this.localExecutionOnly = false; + } + if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) { this.optimizeGeneralComparisonToValueComparison = this.arguments.get( "optimize-general-comparison-to-value-comparison" @@ -584,6 +591,14 @@ public void setDateWithTimezone(boolean b) { this.datesWithTimeZone = b; } + public boolean localExecutionOnly() { + return this.localExecutionOnly; + } + + public void setLocalExecutionOnly(boolean b) { + this.localExecutionOnly = b; + } + public boolean optimizeGeneralComparisonToValueComparison() { return this.optimizeGeneralComparisonToValueComparison; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/CountClause.java b/src/main/java/org/rumbledb/expressions/flowr/CountClause.java index 339246478..8a4f82b67 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/CountClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/CountClause.java @@ -20,14 +20,14 @@ package org.rumbledb.expressions.flowr; +import java.util.ArrayList; +import java.util.List; + import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Node; import org.rumbledb.expressions.primary.VariableReferenceExpression; -import java.util.Collections; -import java.util.List; - public class CountClause extends Clause { private VariableReferenceExpression countClauseVar; @@ -39,7 +39,12 @@ public CountClause(VariableReferenceExpression countClauseVar, ExceptionMetadata @Override public List getChildren() { - return Collections.singletonList(this.countClauseVar); + List result = new ArrayList<>(); + if (this.countClauseVar != null) { + result.add(this.countClauseVar); + } + result.add(this.getPreviousClause()); + return result; } @Override diff --git a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java index 435c0dadf..3030c07d0 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java @@ -20,6 +20,9 @@ package org.rumbledb.expressions.flowr; +import java.util.ArrayList; +import java.util.List; + import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.context.Name; import org.rumbledb.exceptions.ExceptionMetadata; @@ -31,9 +34,6 @@ import org.rumbledb.expressions.Node; import org.rumbledb.types.SequenceType; -import java.util.Collections; -import java.util.List; - public class ForClause extends Clause { private final Name variableName; @@ -114,7 +114,15 @@ public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) @Override public List getChildren() { - return Collections.singletonList(this.expression); + List result = new ArrayList<>(); + if (this.expression != null) { + result.add(this.expression); + } + if(this.getPreviousClause() != null) + { + result.add(this.getPreviousClause()); + } + return result; } @Override diff --git a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java index d4fb0ccd6..1d98e65dc 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java @@ -59,6 +59,7 @@ public List getChildren() { result.add(e.getExpression()); } }); + result.add(this.getPreviousClause()); return result; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java index bf12e8847..fae857970 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java @@ -20,6 +20,9 @@ package org.rumbledb.expressions.flowr; +import java.util.ArrayList; +import java.util.List; + import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.context.Name; import org.rumbledb.exceptions.ExceptionMetadata; @@ -31,9 +34,6 @@ import org.rumbledb.expressions.Node; import org.rumbledb.types.SequenceType; -import java.util.Collections; -import java.util.List; - public class LetClause extends Clause { private final Name variableName; @@ -105,7 +105,15 @@ public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) @Override public List getChildren() { - return Collections.singletonList(this.expression); + List result = new ArrayList<>(); + if (this.expression != null) { + result.add(this.expression); + } + if(this.getPreviousClause() != null) + { + result.add(this.getPreviousClause()); + } + return result; } @Override diff --git a/src/main/java/org/rumbledb/expressions/flowr/OrderByClause.java b/src/main/java/org/rumbledb/expressions/flowr/OrderByClause.java index 5d892a177..6deb76666 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/OrderByClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/OrderByClause.java @@ -52,6 +52,7 @@ public List getChildren() { result.add(e.getExpression()); } }); + result.add(this.getPreviousClause()); return result; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/ReturnClause.java b/src/main/java/org/rumbledb/expressions/flowr/ReturnClause.java index 265eaa9ec..d8b4f1eb4 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/ReturnClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/ReturnClause.java @@ -48,6 +48,7 @@ public List getChildren() { if (this.returnExpr != null) { result.add(this.returnExpr); } + result.add(this.getPreviousClause()); return result; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/WhereClause.java b/src/main/java/org/rumbledb/expressions/flowr/WhereClause.java index c1e9958fb..8868fe78c 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/WhereClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/WhereClause.java @@ -53,6 +53,10 @@ public List getChildren() { if (this.whereExpression != null) { result.add(this.whereExpression); } + if(this.getPreviousClause() != null) + { + result.add(this.getPreviousClause()); + } return result; } diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java index e85e02fd7..810552d42 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java @@ -26,7 +26,7 @@ import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.expressions.ExecutionMode; -import org.rumbledb.runtime.RDDRuntimeIterator; +import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import sparksoniq.spark.SparkSessionManager; @@ -34,7 +34,7 @@ import java.util.ArrayList; import java.util.List; -public class ParallelizeFunctionIterator extends RDDRuntimeIterator { +public class ParallelizeFunctionIterator extends HybridRuntimeIterator { private static final long serialVersionUID = 1L; @@ -90,4 +90,29 @@ public JavaRDD getRDDAux(DynamicContext context) { } return rdd; } + + @Override + protected void openLocal() { + this.children.get(0).open(this.currentDynamicContextForLocalExecution); + } + + @Override + protected void closeLocal() { + this.children.get(0).close(); + } + + @Override + protected void resetLocal() { + this.children.get(0).reset(this.currentDynamicContextForLocalExecution); + } + + @Override + protected boolean hasNextLocal() { + return this.children.get(0).hasNext(); + } + + @Override + protected Item nextLocal() { + return this.children.get(0).next(); + } } From 2ef84996a104481bff86e7e1d0cc0b2555694a6f Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 14:06:34 +0200 Subject: [PATCH 018/136] Spotless. --- .../compiler/LocalExecutionModeVisitor.java | 2 +- .../org/rumbledb/compiler/VisitorHelpers.java | 35 ++++++++-------- .../expressions/flowr/CountClause.java | 2 +- .../rumbledb/expressions/flowr/ForClause.java | 5 +-- .../expressions/flowr/GroupByClause.java | 2 +- .../rumbledb/expressions/flowr/LetClause.java | 5 +-- .../expressions/flowr/OrderByClause.java | 2 +- .../expressions/flowr/WhereClause.java | 5 +-- .../input/ParallelizeFunctionIterator.java | 40 +++++++++---------- src/test/java/iq/LocalRuntimeTests.java | 1 + 10 files changed, 48 insertions(+), 51 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/LocalExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/LocalExecutionModeVisitor.java index 708ae91ff..56373802c 100644 --- a/src/main/java/org/rumbledb/compiler/LocalExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/LocalExecutionModeVisitor.java @@ -31,7 +31,7 @@ */ public class LocalExecutionModeVisitor extends AbstractNodeVisitor { - LocalExecutionModeVisitor(RumbleRuntimeConfiguration configuration) { + LocalExecutionModeVisitor(RumbleRuntimeConfiguration configuration) { } void setVisitorConfig(VisitorConfig visitorConfig) { diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 15b835dd8..1682f5ac3 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -313,23 +313,22 @@ private static void populateExecutionModes(Module module, RumbleRuntimeConfigura if (conf.isPrintIteratorTree()) { printTree(module, conf); } - if(conf.localExecutionOnly()) - { - System.err.println("[Local execution only]"); - LocalExecutionModeVisitor visitor = new LocalExecutionModeVisitor(conf); - visitor.visit(module, module.getStaticContext()); + if (conf.localExecutionOnly()) { + System.err.println("[Local execution only]"); + LocalExecutionModeVisitor visitor = new LocalExecutionModeVisitor(conf); + visitor.visit(module, module.getStaticContext()); if (conf.isPrintIteratorTree()) { printTree(module, conf); } - if (module.numberOfUnsetExecutionModes() > 0) { - System.err.println( - "[WARNING] Some execution modes could not be set. The query may still work, but we would welcome a bug report." - ); - } - return; + if (module.numberOfUnsetExecutionModes() > 0) { + System.err.println( + "[WARNING] Some execution modes could not be set. The query may still work, but we would welcome a bug report." + ); + } + return; } - ExecutionModeVisitor visitor = new ExecutionModeVisitor(conf); - visitor.visit(module, module.getStaticContext()); + ExecutionModeVisitor visitor = new ExecutionModeVisitor(conf); + visitor.visit(module, module.getStaticContext()); visitor.setVisitorConfig(VisitorConfig.staticContextVisitorIntermediatePassConfig); int prevUnsetCount = module.numberOfUnsetExecutionModes(); @@ -368,11 +367,11 @@ private static void populateExecutionModes(Module module, RumbleRuntimeConfigura if (conf.isPrintIteratorTree()) { printTree(module, conf); } - if (module.numberOfUnsetExecutionModes() > 0) { - System.err.println( - "[WARNING] Some execution modes could not be set. The query may still work, but we would welcome a bug report." - ); - } + if (module.numberOfUnsetExecutionModes() > 0) { + System.err.println( + "[WARNING] Some execution modes could not be set. The query may still work, but we would welcome a bug report." + ); + } } private static void populateStaticContext(Module module, RumbleRuntimeConfiguration conf) { diff --git a/src/main/java/org/rumbledb/expressions/flowr/CountClause.java b/src/main/java/org/rumbledb/expressions/flowr/CountClause.java index 8a4f82b67..84cfbcfa2 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/CountClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/CountClause.java @@ -43,7 +43,7 @@ public List getChildren() { if (this.countClauseVar != null) { result.add(this.countClauseVar); } - result.add(this.getPreviousClause()); + result.add(this.getPreviousClause()); return result; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java index 3030c07d0..f9b014c16 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java @@ -118,9 +118,8 @@ public List getChildren() { if (this.expression != null) { result.add(this.expression); } - if(this.getPreviousClause() != null) - { - result.add(this.getPreviousClause()); + if (this.getPreviousClause() != null) { + result.add(this.getPreviousClause()); } return result; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java index 1d98e65dc..4c5626a52 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java @@ -59,7 +59,7 @@ public List getChildren() { result.add(e.getExpression()); } }); - result.add(this.getPreviousClause()); + result.add(this.getPreviousClause()); return result; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java index fae857970..ce0318f55 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java @@ -109,9 +109,8 @@ public List getChildren() { if (this.expression != null) { result.add(this.expression); } - if(this.getPreviousClause() != null) - { - result.add(this.getPreviousClause()); + if (this.getPreviousClause() != null) { + result.add(this.getPreviousClause()); } return result; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/OrderByClause.java b/src/main/java/org/rumbledb/expressions/flowr/OrderByClause.java index 6deb76666..53c62a9c9 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/OrderByClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/OrderByClause.java @@ -52,7 +52,7 @@ public List getChildren() { result.add(e.getExpression()); } }); - result.add(this.getPreviousClause()); + result.add(this.getPreviousClause()); return result; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/WhereClause.java b/src/main/java/org/rumbledb/expressions/flowr/WhereClause.java index 8868fe78c..706e08056 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/WhereClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/WhereClause.java @@ -53,9 +53,8 @@ public List getChildren() { if (this.whereExpression != null) { result.add(this.whereExpression); } - if(this.getPreviousClause() != null) - { - result.add(this.getPreviousClause()); + if (this.getPreviousClause() != null) { + result.add(this.getPreviousClause()); } return result; } diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java index 810552d42..d25fe824e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java @@ -91,28 +91,28 @@ public JavaRDD getRDDAux(DynamicContext context) { return rdd; } - @Override - protected void openLocal() { - this.children.get(0).open(this.currentDynamicContextForLocalExecution); - } + @Override + protected void openLocal() { + this.children.get(0).open(this.currentDynamicContextForLocalExecution); + } - @Override - protected void closeLocal() { - this.children.get(0).close(); - } + @Override + protected void closeLocal() { + this.children.get(0).close(); + } - @Override - protected void resetLocal() { - this.children.get(0).reset(this.currentDynamicContextForLocalExecution); - } + @Override + protected void resetLocal() { + this.children.get(0).reset(this.currentDynamicContextForLocalExecution); + } - @Override - protected boolean hasNextLocal() { - return this.children.get(0).hasNext(); - } + @Override + protected boolean hasNextLocal() { + return this.children.get(0).hasNext(); + } - @Override - protected Item nextLocal() { - return this.children.get(0).next(); - } + @Override + protected Item nextLocal() { + return this.children.get(0).next(); + } } diff --git a/src/test/java/iq/LocalRuntimeTests.java b/src/test/java/iq/LocalRuntimeTests.java index 697c5196c..c8d0af7ff 100644 --- a/src/test/java/iq/LocalRuntimeTests.java +++ b/src/test/java/iq/LocalRuntimeTests.java @@ -84,6 +84,7 @@ public class LocalRuntimeTests extends AnnotationsTestsBase { } ) ); + public LocalRuntimeTests(File testFile) { this.testFile = testFile; } From e07d915d7c9a037ca25f142434e7302091942e13 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 14:20:17 +0200 Subject: [PATCH 019/136] Spotless. --- src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java | 2 +- src/main/java/org/rumbledb/compiler/InferTypeVisitor.java | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index b0bb68dd2..915a0c77f 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -235,7 +235,7 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static @Override public StaticContext visitReturnClause(ReturnClause expression, StaticContext argument) { - visitDescendants(expression, expression.getStaticContext()); + expression.getReturnExpr().accept(this, expression.getStaticContext()); if (expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig).isDataFrame()) { if ( expression.getReturnExpr() diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index 5ea1d85c4..8fe7fb9fe 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -1755,7 +1755,7 @@ public StaticContext visitFlowrExpression(FlworExpression expression, StaticCont @Override public StaticContext visitForClause(ForClause expression, StaticContext argument) { - visitDescendants(expression, argument); + expression.getExpression().accept(this, argument); SequenceType declaredType = expression.getActualSequenceType(); SequenceType inferredType = SequenceType.ITEM_STAR; if (declaredType == null) { @@ -1910,7 +1910,6 @@ public StaticContext visitGroupByClause(GroupByClause expression, StaticContext @Override public StaticContext visitOrderByClause(OrderByClause expression, StaticContext argument) { - visitDescendants(expression, argument); for (OrderByClauseSortingKey orderClause : expression.getSortingKeys()) { SequenceType orderType = orderClause.getExpression().getStaticSequenceType(); basicChecks(orderType, expression.getClass().getSimpleName(), true, false, expression.getMetadata()); From d6fca007bb86d385660054fe23a2f1353ad87017 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 27 Mar 2023 14:20:27 +0200 Subject: [PATCH 020/136] Spotless. --- src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java | 2 +- src/main/java/org/rumbledb/compiler/InferTypeVisitor.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 915a0c77f..18e5a71b4 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -235,7 +235,7 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static @Override public StaticContext visitReturnClause(ReturnClause expression, StaticContext argument) { - expression.getReturnExpr().accept(this, expression.getStaticContext()); + expression.getReturnExpr().accept(this, expression.getStaticContext()); if (expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig).isDataFrame()) { if ( expression.getReturnExpr() diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index 8fe7fb9fe..a0062aeec 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -1755,7 +1755,7 @@ public StaticContext visitFlowrExpression(FlworExpression expression, StaticCont @Override public StaticContext visitForClause(ForClause expression, StaticContext argument) { - expression.getExpression().accept(this, argument); + expression.getExpression().accept(this, argument); SequenceType declaredType = expression.getActualSequenceType(); SequenceType inferredType = SequenceType.ITEM_STAR; if (declaredType == null) { From 5a0fe7a8ed4555552bd0c310025e3b4eb895acab Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 31 Mar 2023 15:54:54 +0200 Subject: [PATCH 021/136] Fix tests. --- .../compiler/ExecutionModeVisitor.java | 87 ++++++++++++++++- .../rumbledb/compiler/InferTypeVisitor.java | 26 ++++- .../compiler/StaticContextVisitor.java | 63 +++++++++--- .../primary/FunctionCallExpression.java | 96 ------------------- .../runtime/DataFrameRuntimeIterator.java | 4 - .../runtime/HybridRuntimeIterator.java | 24 +++-- .../rumbledb/runtime/RDDRuntimeIterator.java | 8 +- .../org/rumbledb/runtime/RuntimeIterator.java | 16 +++- 8 files changed, 195 insertions(+), 129 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 18e5a71b4..cff6d910e 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -27,11 +27,15 @@ import org.apache.log4j.LogManager; import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.BuiltinFunction; import org.rumbledb.context.BuiltinFunctionCatalogue; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.InScopeVariable; import org.rumbledb.context.Name; import org.rumbledb.context.StaticContext; +import org.rumbledb.context.BuiltinFunction.BuiltinFunctionExecutionMode; +import org.rumbledb.exceptions.OurBadException; +import org.rumbledb.exceptions.UnknownFunctionCallException; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; @@ -228,9 +232,90 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static expression.getMetadata() ); } - expression.initFunctionCallHighestExecutionMode(this.visitorConfig); + if (BuiltinFunctionCatalogue.exists(expression.getFunctionIdentifier())) { + BuiltinFunction builtinFunction = BuiltinFunctionCatalogue.getBuiltinFunction( + expression.getFunctionIdentifier() + ); + expression.setHighestExecutionMode( + getBuiltInFunctionExecutionMode( + builtinFunction, + expression.getArguments().size() > 0 + ? expression.getArguments().get(0).getHighestExecutionMode(this.visitorConfig) + : null, + this.visitorConfig + ) + ); + } else { + if ( + expression.getStaticContext() + .getUserDefinedFunctionsExecutionModes() + .exists(expression.getFunctionIdentifier()) + ) { + if (expression.isPartialApplication()) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + } else { + expression.setHighestExecutionMode( + expression.getStaticContext() + .getUserDefinedFunctionsExecutionModes() + .getExecutionMode(expression.getFunctionIdentifier(), expression.getMetadata()) + ); + } + } else { + + if (!this.visitorConfig.suppressErrorsForCallingMissingFunctions()) { + throw new UnknownFunctionCallException( + expression.getFunctionIdentifier().getName(), + expression.getFunctionIdentifier().getArity(), + expression.getMetadata() + ); + } + } + } return argument; } + + private static ExecutionMode getBuiltInFunctionExecutionMode( + BuiltinFunction builtinFunction, + ExecutionMode firstMode, + VisitorConfig visitorConfig + ) { + BuiltinFunctionExecutionMode functionExecutionMode = builtinFunction.getBuiltinFunctionExecutionMode(); + if (functionExecutionMode == BuiltinFunctionExecutionMode.LOCAL) { + return ExecutionMode.LOCAL; + } + if (functionExecutionMode == BuiltinFunctionExecutionMode.RDD) { + return ExecutionMode.RDD; + } + if (functionExecutionMode == BuiltinFunctionExecutionMode.DATAFRAME) { + return ExecutionMode.DATAFRAME; + } + if (functionExecutionMode == BuiltinFunctionExecutionMode.INHERIT_FROM_FIRST_ARGUMENT) { + ExecutionMode firstArgumentExecutionMode = firstMode; + if (firstArgumentExecutionMode.isDataFrame()) { + return ExecutionMode.DATAFRAME; + } + if (firstArgumentExecutionMode.isRDDOrDataFrame()) { + return ExecutionMode.RDD; + } + return ExecutionMode.LOCAL; + } + if ( + functionExecutionMode == BuiltinFunctionExecutionMode.INHERIT_FROM_FIRST_ARGUMENT_BUT_DATAFRAME_FALLSBACK_TO_LOCAL + ) { + ExecutionMode firstArgumentExecutionMode = firstMode; + if ( + firstArgumentExecutionMode.isRDDOrDataFrame() + && !firstArgumentExecutionMode.isDataFrame() + ) { + return ExecutionMode.RDD; + } + return ExecutionMode.LOCAL; + } + throw new OurBadException( + "Unhandled functionExecutionMode detected while extracting execution mode for built-in function." + ); + } + // endregion @Override diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index a0062aeec..644acecc5 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -23,6 +23,7 @@ import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnexpectedStaticTypeException; import org.rumbledb.exceptions.UnknownFunctionCallException; +import org.rumbledb.exceptions.UnsupportedFeatureException; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.CommaExpression; import org.rumbledb.expressions.Expression; @@ -394,7 +395,6 @@ private FunctionSignature getSignature(FunctionIdentifier identifier, StaticCont @Override public StaticContext visitNamedFunctionRef(NamedFunctionReferenceExpression expression, StaticContext argument) { visitDescendants(expression, argument); - try { FunctionSignature signature = getSignature(expression.getIdentifier(), expression.getStaticContext()); expression.setStaticSequenceType(new SequenceType(ItemTypeFactory.createFunctionItemType(signature))); @@ -460,6 +460,25 @@ private boolean tryAnnotateSpecificFunctions(FunctionCallExpression expression, @Override public StaticContext visitFunctionCall(FunctionCallExpression expression, StaticContext argument) { visitDescendants(expression, argument); + + if (BuiltinFunctionCatalogue.exists(expression.getFunctionIdentifier())) { + if (expression.isPartialApplication()) { + throw new UnsupportedFeatureException( + "Partial application on built-in functions are not supported.", + expression.getMetadata() + ); + } + BuiltinFunction builtinFunction = BuiltinFunctionCatalogue.getBuiltinFunction( + expression.getFunctionIdentifier() + ); + if (builtinFunction == null) { + throw new UnknownFunctionCallException( + expression.getFunctionIdentifier().getName(), + expression.getFunctionIdentifier().getArity(), + expression.getMetadata() + ); + } + } FunctionSignature signature = null; try { signature = getSignature(expression.getFunctionIdentifier(), expression.getStaticContext()); @@ -1903,14 +1922,15 @@ public StaticContext visitGroupByClause(GroupByClause expression, StaticContext // finally if there was a for clause we need to change the arity of the variables binded so far in the flowr // expression, from ? to * and from 1 to + // excluding the grouping variables - StaticContext firstClauseStaticContext = expression.getFirstClause().getStaticContext(); - nextClause.getStaticContext().incrementArities(firstClauseStaticContext, groupingVars); + StaticContext nextClauseStaticContext = expression.getNextClause().getStaticContext(); + nextClause.getStaticContext().incrementArities(nextClauseStaticContext, groupingVars); return argument; } @Override public StaticContext visitOrderByClause(OrderByClause expression, StaticContext argument) { for (OrderByClauseSortingKey orderClause : expression.getSortingKeys()) { + visit(orderClause.getExpression(), argument); SequenceType orderType = orderClause.getExpression().getStaticSequenceType(); basicChecks(orderType, expression.getClass().getSimpleName(), true, false, expression.getMetadata()); if (orderType.isSubtypeOf(SequenceType.createSequenceType("json-item*"))) { diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java index 3f6697a10..b6f845e57 100644 --- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java +++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java @@ -41,6 +41,10 @@ import org.rumbledb.expressions.flowr.ForClause; import org.rumbledb.expressions.flowr.GroupByClause; import org.rumbledb.expressions.flowr.LetClause; +import org.rumbledb.expressions.flowr.OrderByClause; +import org.rumbledb.expressions.flowr.OrderByClauseSortingKey; +import org.rumbledb.expressions.flowr.ReturnClause; +import org.rumbledb.expressions.flowr.WhereClause; import org.rumbledb.expressions.module.FunctionDeclaration; import org.rumbledb.expressions.module.LibraryModule; import org.rumbledb.expressions.module.MainModule; @@ -86,6 +90,10 @@ public StaticContext visit(Node node, StaticContext argument) { ((Expression) node).setStaticContext(argument); } if (node instanceof Clause) { + System.err.println("Visiting "); + System.err.println(node); + System.err.println("Context: "); + System.err.println(argument); ((Clause) node).setStaticContext(argument); } return node.accept(this, argument); @@ -191,11 +199,7 @@ public StaticContext visitInlineFunctionExpr(InlineFunctionExpression expression @Override public StaticContext visitFlowrExpression(FlworExpression expression, StaticContext argument) { Clause clause = expression.getReturnClause().getFirstClause(); - StaticContext result = argument; - while (clause != null) { - result = this.visit(clause, result); - clause = clause.getNextClause(); - } + this.visit(clause, argument); return argument; } @@ -220,7 +224,8 @@ public StaticContext visitForClause(ForClause clause, StaticContext argument) { clause.getMetadata() ); } - return result; + this.visit(clause.getNextClause(), result); + return argument; } @Override @@ -234,18 +239,27 @@ public StaticContext visitLetClause(LetClause clause, StaticContext argument) { clause.getMetadata() ); clause.getSequenceType().resolve(result, clause.getMetadata()); + this.visit(clause.getNextClause(), result); + return argument; + } + + @Override + public StaticContext visitWhereClause(WhereClause clause, StaticContext argument) { + this.visit(clause.getWhereExpression(), argument); - return result; + StaticContext result = new StaticContext(argument); + this.visit(clause.getNextClause(), result); + return argument; } @Override public StaticContext visitGroupByClause(GroupByClause clause, StaticContext argument) { - StaticContext groupByClauseContext = new StaticContext(argument); + StaticContext result = new StaticContext(argument); for (GroupByVariableDeclaration variable : clause.getGroupVariables()) { if (variable.getExpression() != null) { // if a variable declaration takes place this.visit(variable.getExpression(), argument); - groupByClauseContext.addVariable( + result.addVariable( variable.getVariableName(), variable.getActualSequenceType(), clause.getMetadata() @@ -257,19 +271,38 @@ public StaticContext visitGroupByClause(GroupByClause clause, StaticContext argu ); } } - return groupByClauseContext; + this.visit(clause.getNextClause(), result); + return argument; } @Override - public StaticContext visitCountClause(CountClause expression, StaticContext argument) { + public StaticContext visitOrderByClause(OrderByClause clause, StaticContext argument) { + for (OrderByClauseSortingKey s : clause.getSortingKeys()) { + this.visit(s.getExpression(), argument); + } + + StaticContext result = new StaticContext(argument); + this.visit(clause.getNextClause(), result); + return argument; + } + + @Override + public StaticContext visitCountClause(CountClause clause, StaticContext argument) { StaticContext result = new StaticContext(argument); result.addVariable( - expression.getCountVariable().getVariableName(), + clause.getCountVariable().getVariableName(), new SequenceType(BuiltinTypesCatalogue.integerItem, SequenceType.Arity.One), - expression.getMetadata() + clause.getMetadata() ); - this.visit(expression.getCountVariable(), result); - return result; + this.visit(clause.getCountVariable(), argument); + this.visit(clause.getNextClause(), result); + return argument; + } + + @Override + public StaticContext visitReturnClause(ReturnClause clause, StaticContext argument) { + this.visit(clause.getReturnExpr(), argument); + return argument; } // endregion diff --git a/src/main/java/org/rumbledb/expressions/primary/FunctionCallExpression.java b/src/main/java/org/rumbledb/expressions/primary/FunctionCallExpression.java index 1a497038f..f2d00b684 100644 --- a/src/main/java/org/rumbledb/expressions/primary/FunctionCallExpression.java +++ b/src/main/java/org/rumbledb/expressions/primary/FunctionCallExpression.java @@ -20,18 +20,10 @@ package org.rumbledb.expressions.primary; -import org.rumbledb.compiler.VisitorConfig; -import org.rumbledb.context.BuiltinFunction; -import org.rumbledb.context.BuiltinFunctionCatalogue; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.Name; -import org.rumbledb.context.BuiltinFunction.BuiltinFunctionExecutionMode; import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.exceptions.UnknownFunctionCallException; -import org.rumbledb.exceptions.UnsupportedFeatureException; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; @@ -81,94 +73,6 @@ public boolean isPartialApplication() { return this.isPartialApplication; } - @Override - public final void initHighestExecutionMode(VisitorConfig visitorConfig) { - throw new OurBadException("Function call expressions do not use the highestExecutionMode initializer"); - } - - public void initFunctionCallHighestExecutionMode(VisitorConfig visitorConfig) { - if (BuiltinFunctionCatalogue.exists(this.identifier)) { - if (this.isPartialApplication) { - throw new UnsupportedFeatureException( - "Partial application on built-in functions are not supported.", - this.getMetadata() - ); - } - BuiltinFunction builtinFunction = BuiltinFunctionCatalogue.getBuiltinFunction(this.identifier); - if (builtinFunction == null) { - throw new UnknownFunctionCallException( - this.identifier.getName(), - this.identifier.getArity(), - this.getMetadata() - ); - } - this.highestExecutionMode = this.getBuiltInFunctionExecutionMode(builtinFunction, visitorConfig); - return; - } - - if ( - getStaticContext().getUserDefinedFunctionsExecutionModes() - .exists(this.identifier) - ) { - if (this.isPartialApplication) { - this.highestExecutionMode = ExecutionMode.LOCAL; - return; - } - this.highestExecutionMode = getStaticContext().getUserDefinedFunctionsExecutionModes() - .getExecutionMode(this.identifier, getMetadata()); - return; - } - - if (!visitorConfig.suppressErrorsForCallingMissingFunctions()) { - throw new UnknownFunctionCallException( - this.identifier.getName(), - this.identifier.getArity(), - this.getMetadata() - ); - } - } - - private ExecutionMode getBuiltInFunctionExecutionMode( - BuiltinFunction builtinFunction, - VisitorConfig visitorConfig - ) { - BuiltinFunctionExecutionMode functionExecutionMode = builtinFunction.getBuiltinFunctionExecutionMode(); - if (functionExecutionMode == BuiltinFunctionExecutionMode.LOCAL) { - return ExecutionMode.LOCAL; - } - if (functionExecutionMode == BuiltinFunctionExecutionMode.RDD) { - return ExecutionMode.RDD; - } - if (functionExecutionMode == BuiltinFunctionExecutionMode.DATAFRAME) { - return ExecutionMode.DATAFRAME; - } - if (functionExecutionMode == BuiltinFunctionExecutionMode.INHERIT_FROM_FIRST_ARGUMENT) { - ExecutionMode firstArgumentExecutionMode = this.arguments.get(0).getHighestExecutionMode(visitorConfig); - if (firstArgumentExecutionMode.isDataFrame()) { - return ExecutionMode.DATAFRAME; - } - if (firstArgumentExecutionMode.isRDDOrDataFrame()) { - return ExecutionMode.RDD; - } - return ExecutionMode.LOCAL; - } - if ( - functionExecutionMode == BuiltinFunctionExecutionMode.INHERIT_FROM_FIRST_ARGUMENT_BUT_DATAFRAME_FALLSBACK_TO_LOCAL - ) { - ExecutionMode firstArgumentExecutionMode = this.arguments.get(0).getHighestExecutionMode(visitorConfig); - if ( - firstArgumentExecutionMode.isRDDOrDataFrame() - && !firstArgumentExecutionMode.isDataFrame() - ) { - return ExecutionMode.RDD; - } - return ExecutionMode.LOCAL; - } - throw new OurBadException( - "Unhandled functionExecutionMode detected while extracting execution mode for built-in function." - ); - } - @Override public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitFunctionCall(this, argument); diff --git a/src/main/java/org/rumbledb/runtime/DataFrameRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/DataFrameRuntimeIterator.java index 87b30c45e..fb05f3601 100644 --- a/src/main/java/org/rumbledb/runtime/DataFrameRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/DataFrameRuntimeIterator.java @@ -21,7 +21,6 @@ package org.rumbledb.runtime; import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.ExecutionMode; import java.util.List; @@ -36,9 +35,6 @@ protected DataFrameRuntimeIterator( ExceptionMetadata iteratorMetadata ) { super(children, executionMode, iteratorMetadata); - if (executionMode != ExecutionMode.DATAFRAME) { - throw new OurBadException("DF runtime iterators support only dataframe execution mode"); - } } @Override diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java index 446237944..d33dd9b0e 100644 --- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java @@ -55,6 +55,10 @@ protected boolean implementsDataFrames() { return false; } + protected boolean implementsLocal() { + return true; + } + protected void fallbackToRDDIfDFNotImplemented(ExecutionMode executionMode) { if (executionMode == ExecutionMode.DATAFRAME && !this.implementsDataFrames()) { this.highestExecutionMode = ExecutionMode.RDD; @@ -64,7 +68,7 @@ protected void fallbackToRDDIfDFNotImplemented(ExecutionMode executionMode) { @Override public void open(DynamicContext context) { super.open(context); - if (!isRDDOrDataFrame()) { + if (!isRDDOrDataFrame() && implementsLocal()) { openLocal(); } } @@ -72,7 +76,7 @@ public void open(DynamicContext context) { @Override public void reset(DynamicContext context) { super.reset(context); - if (!isRDDOrDataFrame()) { + if (!isRDDOrDataFrame() && implementsLocal()) { resetLocal(); return; } @@ -82,7 +86,7 @@ public void reset(DynamicContext context) { @Override public void close() { super.close(); - if (!isRDDOrDataFrame()) { + if (!isRDDOrDataFrame() && implementsLocal()) { closeLocal(); return; } @@ -91,12 +95,20 @@ public void close() { @Override public boolean hasNext() { - if (!isRDDOrDataFrame()) { + if (isLocal() && implementsLocal()) { return hasNextLocal(); } if (this.result == null) { this.currentResultIndex = 0; - JavaRDD rdd = this.getRDD(this.currentDynamicContextForLocalExecution); + JavaRDD rdd = null; + if (!isRDD() && implementsDataFrames()) { + rdd = dataFrameToRDDOfItems( + this.getDataFrame(this.currentDynamicContextForLocalExecution), + this.getMetadata() + ); + } else { + rdd = this.getRDDAux(this.currentDynamicContextForLocalExecution); + } this.result = SparkSessionManager.collectRDDwithLimit(rdd, this.getMetadata()); this.hasNext = !this.result.isEmpty(); } @@ -105,7 +117,7 @@ public boolean hasNext() { @Override public Item next() { - if (!isRDDOrDataFrame()) { + if (!isRDDOrDataFrame() && implementsLocal()) { return nextLocal(); } if (!this.isOpen) { diff --git a/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java index a9d1def06..6fe382999 100644 --- a/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java @@ -39,15 +39,17 @@ protected RDDRuntimeIterator( ExceptionMetadata iteratorMetadata ) { super(children, executionMode, iteratorMetadata); - if (executionMode != ExecutionMode.RDD && executionMode != ExecutionMode.DATAFRAME) { - throw new OurBadException("RDD runtime iterators support either RDD or DF execution modes"); - } } protected JavaRDD getRDDAux(DynamicContext context) { throw new OurBadException("RDDs are not implemented for the iterator", getMetadata()); } + @Override + protected boolean implementsLocal() { + return false; + } + @Override protected void openLocal() { throw new OurBadException("Local evaluation are not implemented for the iterator", getMetadata()); diff --git a/src/main/java/org/rumbledb/runtime/RuntimeIterator.java b/src/main/java/org/rumbledb/runtime/RuntimeIterator.java index b70ba5541..a6786464c 100644 --- a/src/main/java/org/rumbledb/runtime/RuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/RuntimeIterator.java @@ -247,11 +247,25 @@ public ExecutionMode getHighestExecutionMode() { public boolean isRDDOrDataFrame() { if (this.highestExecutionMode == ExecutionMode.UNSET) { - throw new OurBadException("isRDD field in iterator without execution mode being set."); + throw new OurBadException("isRDDorDataFrame field in iterator without execution mode being set."); } return this.highestExecutionMode.isRDDOrDataFrame(); } + public boolean isRDD() { + if (this.highestExecutionMode == ExecutionMode.UNSET) { + throw new OurBadException("isRDD field in iterator without execution mode being set."); + } + return this.highestExecutionMode.isRDD(); + } + + public boolean isLocal() { + if (this.highestExecutionMode == ExecutionMode.UNSET) { + throw new OurBadException("isLocal field in iterator without execution mode being set."); + } + return this.highestExecutionMode.isLocal(); + } + public JavaRDD getRDD(DynamicContext context) { throw new OurBadException( "RDDs are not implemented for the iterator " + getClass().getCanonicalName(), From bee1a1f898cec0c95b48a9ee63789da71f3bd14c Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 31 Mar 2023 16:06:48 +0200 Subject: [PATCH 022/136] Fix test. --- src/test/java/iq/FrontendTests.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/iq/FrontendTests.java b/src/test/java/iq/FrontendTests.java index 2f334ac62..ad5d08e5b 100644 --- a/src/test/java/iq/FrontendTests.java +++ b/src/test/java/iq/FrontendTests.java @@ -115,7 +115,7 @@ public void testSematicChecks() throws Throwable { AnnotationsTestsBase.configuration ); - testVariableTypes(testFile, mainModule); + testVariableTypes(mainModule); } } } @@ -196,7 +196,7 @@ public void testSematicChecks() throws Throwable { * } */ - private void testVariableTypes(File testFile, MainModule mainModule) { + private void testVariableTypes(MainModule mainModule) { List vars = mainModule .getDescendantsMatching( @@ -218,7 +218,7 @@ private void testVariableTypes(File testFile, MainModule mainModule) { ); js.forEach( j -> Assert.assertTrue( - ((VariableReferenceExpression) j).getType().getItemType().equals(BuiltinTypesCatalogue.item) + ((VariableReferenceExpression) j).getType().getItemType().equals(BuiltinTypesCatalogue.integerItem) || ((VariableReferenceExpression) j).getType().getItemType().equals(BuiltinTypesCatalogue.stringItem) ) From 37e7a38583406b29bc0cfb042076ce309163a387 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 31 Mar 2023 16:08:14 +0200 Subject: [PATCH 023/136] Remove output. --- src/main/java/org/rumbledb/compiler/StaticContextVisitor.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java index b6f845e57..0516a20a9 100644 --- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java +++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java @@ -90,10 +90,6 @@ public StaticContext visit(Node node, StaticContext argument) { ((Expression) node).setStaticContext(argument); } if (node instanceof Clause) { - System.err.println("Visiting "); - System.err.println(node); - System.err.println("Context: "); - System.err.println(argument); ((Clause) node).setStaticContext(argument); } return node.accept(this, argument); From 991c05a8182834e719eb050d865083a0545ea8a5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 31 Mar 2023 16:09:24 +0200 Subject: [PATCH 024/136] Remove output. --- src/main/java/org/rumbledb/compiler/VisitorHelpers.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 1682f5ac3..7e035b869 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -314,7 +314,6 @@ private static void populateExecutionModes(Module module, RumbleRuntimeConfigura printTree(module, conf); } if (conf.localExecutionOnly()) { - System.err.println("[Local execution only]"); LocalExecutionModeVisitor visitor = new LocalExecutionModeVisitor(conf); visitor.visit(module, module.getStaticContext()); if (conf.isPrintIteratorTree()) { From 529e22147369f2b771d27c1f6a808cea7985a00a Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 31 Mar 2023 16:24:48 +0200 Subject: [PATCH 025/136] Fix tests. --- src/main/java/org/rumbledb/compiler/StaticContextVisitor.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java index 0516a20a9..aa1fc535e 100644 --- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java +++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java @@ -290,7 +290,6 @@ public StaticContext visitCountClause(CountClause clause, StaticContext argument new SequenceType(BuiltinTypesCatalogue.integerItem, SequenceType.Arity.One), clause.getMetadata() ); - this.visit(clause.getCountVariable(), argument); this.visit(clause.getNextClause(), result); return argument; } From 5a5d4735f4dd8ca25defb74f16e03755acaca3f3 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 10:32:33 +0200 Subject: [PATCH 026/136] Fix count clause. --- .../org/rumbledb/compiler/CloneVisitor.java | 2 +- .../compiler/ExecutionModeVisitor.java | 3 +-- .../rumbledb/compiler/InferTypeVisitor.java | 14 ++++++++++ .../compiler/RuntimeIteratorVisitor.java | 2 +- .../compiler/StaticContextVisitor.java | 4 +-- .../rumbledb/compiler/TranslationVisitor.java | 2 +- .../compiler/XQueryTranslationVisitor.java | 2 +- .../expressions/flowr/CountClause.java | 26 +++++++------------ .../clauses/CountClauseSparkIterator.java | 6 ++--- 9 files changed, 33 insertions(+), 28 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java index 2b563092d..f924e6d49 100644 --- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -179,7 +179,7 @@ public Node visitOrderByClause(OrderByClause clause, Node argument) { @Override public Node visitCountClause(CountClause expression, Node argument) { Clause result = new CountClause( - (VariableReferenceExpression) visit(expression.getCountVariable(), argument), + expression.getCountVariableName(), expression.getMetadata() ); result.setStaticContext(expression.getStaticContext()); diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index cff6d910e..b1f8e858d 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -458,10 +458,9 @@ public StaticContext visitGroupByClause(GroupByClause clause, StaticContext argu public StaticContext visitCountClause(CountClause expression, StaticContext argument) { expression.initHighestExecutionMode(this.visitorConfig); argument.setVariableStorageMode( - expression.getCountVariable().getVariableName(), + expression.getCountVariableName(), ExecutionMode.LOCAL ); - this.visit(expression.getCountVariable(), expression.getCountVariable().getStaticContext()); return argument; } diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index 644acecc5..fd7226b52 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -39,6 +39,7 @@ import org.rumbledb.expressions.control.TypeSwitchExpression; import org.rumbledb.expressions.control.TypeswitchCase; import org.rumbledb.expressions.flowr.Clause; +import org.rumbledb.expressions.flowr.CountClause; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.expressions.flowr.FlworExpression; import org.rumbledb.expressions.flowr.ForClause; @@ -1963,6 +1964,19 @@ public StaticContext visitOrderByClause(OrderByClause expression, StaticContext return argument; } + @Override + public StaticContext visitCountClause(CountClause clause, StaticContext argument) { + checkAndUpdateVariableStaticType( + null, + SequenceType.INTEGER, + clause.getNextClause().getStaticContext(), + clause.getClass().getSimpleName(), + clause.getCountVariableName(), + clause.getMetadata() + ); + return argument; + } + // endregion // region module diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index b55557232..6568b98a2 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -316,7 +316,7 @@ private RuntimeTupleIterator visitFlowrClause( } else if (clause instanceof CountClause) { return new CountClauseSparkIterator( previousIterator, - this.visit(((CountClause) clause).getCountVariable(), argument), + ((CountClause) clause).getCountVariableName(), clause.getHighestExecutionMode(this.visitorConfig), clause.getMetadata() ); diff --git a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java index aa1fc535e..0475aafb0 100644 --- a/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java +++ b/src/main/java/org/rumbledb/compiler/StaticContextVisitor.java @@ -286,8 +286,8 @@ public StaticContext visitOrderByClause(OrderByClause clause, StaticContext argu public StaticContext visitCountClause(CountClause clause, StaticContext argument) { StaticContext result = new StaticContext(argument); result.addVariable( - clause.getCountVariable().getVariableName(), - new SequenceType(BuiltinTypesCatalogue.integerItem, SequenceType.Arity.One), + clause.getCountVariableName(), + SequenceType.INTEGER, clause.getMetadata() ); this.visit(clause.getNextClause(), result); diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index f735513cd..8088aa96f 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -795,7 +795,7 @@ public Node visitWhereClause(JsoniqParser.WhereClauseContext ctx) { @Override public Node visitCountClause(JsoniqParser.CountClauseContext ctx) { VariableReferenceExpression child = (VariableReferenceExpression) this.visitVarRef(ctx.varRef()); - return new CountClause(child, createMetadataFromContext(ctx)); + return new CountClause(child.getVariableName(), createMetadataFromContext(ctx)); } // endregion diff --git a/src/main/java/org/rumbledb/compiler/XQueryTranslationVisitor.java b/src/main/java/org/rumbledb/compiler/XQueryTranslationVisitor.java index fc97945f6..84c9a97c5 100644 --- a/src/main/java/org/rumbledb/compiler/XQueryTranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/XQueryTranslationVisitor.java @@ -1579,7 +1579,7 @@ public OrderByClauseSortingKey processOrderByExpr(XQueryParser.OrderSpecContext @Override public Node visitCountClause(XQueryParser.CountClauseContext ctx) { VariableReferenceExpression child = (VariableReferenceExpression) this.visitVarName(ctx.varName()); - return new CountClause(child, createMetadataFromContext(ctx)); + return new CountClause(child.getVariableName(), createMetadataFromContext(ctx)); } // endregion diff --git a/src/main/java/org/rumbledb/expressions/flowr/CountClause.java b/src/main/java/org/rumbledb/expressions/flowr/CountClause.java index 84cfbcfa2..9618d8476 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/CountClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/CountClause.java @@ -20,31 +20,26 @@ package org.rumbledb.expressions.flowr; -import java.util.ArrayList; +import java.util.Collections; import java.util.List; +import org.rumbledb.context.Name; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Node; -import org.rumbledb.expressions.primary.VariableReferenceExpression; public class CountClause extends Clause { - private VariableReferenceExpression countClauseVar; + private Name variableName; - public CountClause(VariableReferenceExpression countClauseVar, ExceptionMetadata metadata) { + public CountClause(Name variableName, ExceptionMetadata metadata) { super(FLWOR_CLAUSES.COUNT, metadata); - this.countClauseVar = countClauseVar; + this.variableName = variableName; } @Override public List getChildren() { - List result = new ArrayList<>(); - if (this.countClauseVar != null) { - result.add(this.countClauseVar); - } - result.add(this.getPreviousClause()); - return result; + return Collections.singletonList(this.getPreviousClause()); } @Override @@ -52,8 +47,8 @@ public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitCountClause(this, argument); } - public VariableReferenceExpression getCountVariable() { - return this.countClauseVar; + public Name getCountVariableName() { + return this.variableName; } public void print(StringBuffer buffer, int indent) { @@ -61,7 +56,7 @@ public void print(StringBuffer buffer, int indent) { buffer.append(" "); } buffer.append(getClass().getSimpleName()); - buffer.append(" (" + (this.countClauseVar) + ") "); + buffer.append(" (" + (this.variableName) + ") "); buffer.append(" | " + this.highestExecutionMode); buffer.append("\n"); for (Node iterator : getChildren()) { @@ -75,8 +70,7 @@ public void print(StringBuffer buffer, int indent) { @Override public void serializeToJSONiq(StringBuffer sb, int indent) { indentIt(sb, indent); - sb.append("count "); - this.countClauseVar.serializeToJSONiq(sb, 0); + sb.append("count $" + this.variableName); } } diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/CountClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/CountClauseSparkIterator.java index 7b5a35857..3e38bf8d9 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/CountClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/CountClauseSparkIterator.java @@ -33,13 +33,11 @@ import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.ItemFactory; -import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.RuntimeTupleIterator; import org.rumbledb.runtime.flwor.FlworDataFrame; import org.rumbledb.runtime.flwor.FlworDataFrameColumn; import org.rumbledb.runtime.flwor.FlworDataFrameUtils; import org.rumbledb.runtime.flwor.udfs.LongSerializeUDF; -import org.rumbledb.runtime.primary.VariableReferenceIterator; import sparksoniq.jsoniq.tuple.FlworTuple; @@ -60,12 +58,12 @@ public class CountClauseSparkIterator extends RuntimeTupleIterator { public CountClauseSparkIterator( RuntimeTupleIterator child, - RuntimeIterator variableReference, + Name variableName, ExecutionMode executionMode, ExceptionMetadata iteratorMetadata ) { super(child, executionMode, iteratorMetadata); - this.variableName = ((VariableReferenceIterator) variableReference).getVariableName(); + this.variableName = variableName; this.currentCountIndex = 1; // indices start at 1 in JSONiq } From 40ce4172eab0306fbc7732a1274b12de33aaeb67 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 11:13:57 +0200 Subject: [PATCH 027/136] Move tests to Spark. --- .../test_files/{runtime => runtime-spark}/ForLetJoinError1.jq | 0 .../test_files/{runtime => runtime-spark}/ForLetJoinError2.jq | 0 .../test_files/{runtime => runtime-spark}/ForLetJoinError3.jq | 0 .../test_files/{runtime => runtime-spark}/ForLetJoinError4.jq | 0 .../test_files/{runtime => runtime-spark}/ForLetJoinError5.jq | 0 src/test/resources/test_files/{runtime => runtime-spark}/Join5.jq | 0 src/test/resources/test_files/{runtime => runtime-spark}/Join7.jq | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename src/test/resources/test_files/{runtime => runtime-spark}/ForLetJoinError1.jq (100%) rename src/test/resources/test_files/{runtime => runtime-spark}/ForLetJoinError2.jq (100%) rename src/test/resources/test_files/{runtime => runtime-spark}/ForLetJoinError3.jq (100%) rename src/test/resources/test_files/{runtime => runtime-spark}/ForLetJoinError4.jq (100%) rename src/test/resources/test_files/{runtime => runtime-spark}/ForLetJoinError5.jq (100%) rename src/test/resources/test_files/{runtime => runtime-spark}/Join5.jq (100%) rename src/test/resources/test_files/{runtime => runtime-spark}/Join7.jq (100%) diff --git a/src/test/resources/test_files/runtime/ForLetJoinError1.jq b/src/test/resources/test_files/runtime-spark/ForLetJoinError1.jq similarity index 100% rename from src/test/resources/test_files/runtime/ForLetJoinError1.jq rename to src/test/resources/test_files/runtime-spark/ForLetJoinError1.jq diff --git a/src/test/resources/test_files/runtime/ForLetJoinError2.jq b/src/test/resources/test_files/runtime-spark/ForLetJoinError2.jq similarity index 100% rename from src/test/resources/test_files/runtime/ForLetJoinError2.jq rename to src/test/resources/test_files/runtime-spark/ForLetJoinError2.jq diff --git a/src/test/resources/test_files/runtime/ForLetJoinError3.jq b/src/test/resources/test_files/runtime-spark/ForLetJoinError3.jq similarity index 100% rename from src/test/resources/test_files/runtime/ForLetJoinError3.jq rename to src/test/resources/test_files/runtime-spark/ForLetJoinError3.jq diff --git a/src/test/resources/test_files/runtime/ForLetJoinError4.jq b/src/test/resources/test_files/runtime-spark/ForLetJoinError4.jq similarity index 100% rename from src/test/resources/test_files/runtime/ForLetJoinError4.jq rename to src/test/resources/test_files/runtime-spark/ForLetJoinError4.jq diff --git a/src/test/resources/test_files/runtime/ForLetJoinError5.jq b/src/test/resources/test_files/runtime-spark/ForLetJoinError5.jq similarity index 100% rename from src/test/resources/test_files/runtime/ForLetJoinError5.jq rename to src/test/resources/test_files/runtime-spark/ForLetJoinError5.jq diff --git a/src/test/resources/test_files/runtime/Join5.jq b/src/test/resources/test_files/runtime-spark/Join5.jq similarity index 100% rename from src/test/resources/test_files/runtime/Join5.jq rename to src/test/resources/test_files/runtime-spark/Join5.jq diff --git a/src/test/resources/test_files/runtime/Join7.jq b/src/test/resources/test_files/runtime-spark/Join7.jq similarity index 100% rename from src/test/resources/test_files/runtime/Join7.jq rename to src/test/resources/test_files/runtime-spark/Join7.jq From 8d10c4bb89baf36e4470ca1b642f2ddebf236f69 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 11:18:11 +0200 Subject: [PATCH 028/136] Reorganize tests. --- .github/workflows/maven.yml | 36 ++++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 345b17fe6..a40f105e1 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -27,22 +27,20 @@ jobs: run: mvn install -DskipTests -Dgpg.skip --quiet - name: Compile with Maven run: mvn clean compile assembly:single + - name: Spotless check + run: mvn spotless:check - name: FrontendTests run: mvn -Dtest=FrontendTests test - name: Bugs run: mvn -Dtest=Bugs test - name: RuntimeTests run: mvn -Dtest=RuntimeTests test - - name: SparkRuntimeTests - run: mvn -Dtest=SparkRuntimeTests test + - name: LocalRuntimeTests + run: mvn -Dtest=LocalRuntimeTests test - name: StaticTypeTests run: mvn -Dtest=StaticTypeTests test - - name: NativeFLWORRuntimeTests - run: mvn -Dtest=NativeFLWORRuntimeTests test - name: JavaAPITest run: mvn -Dtest=JavaAPITest test - - name: Spotless check - run: mvn spotless:check - name: Copying artefacts run: mkdir staging && cp target/*.jar staging - name: Package @@ -50,3 +48,29 @@ jobs: with: name: Package path: staging + + tests2: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Java 11 + uses: actions/setup-java@v3 + with: + java-version: 11 + distribution: adopt + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Install with Maven + run: mvn install -DskipTests -Dgpg.skip --quiet + - name: Compile with Maven + run: mvn clean compile assembly:single + - name: SparkRuntimeTests + run: mvn -Dtest=SparkRuntimeTests test + - name: NativeFLWORRuntimeTests + run: mvn -Dtest=NativeFLWORRuntimeTests test From ff43f2c08afc1bfb038ec60461a54532981ab349 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 11:40:59 +0200 Subject: [PATCH 029/136] Add local read for json-file. --- .../input/JsonFileFunctionIterator.java | 102 +++++++++++++++++- 1 file changed, 100 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java index 9e5edc81f..6f1b39fea 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java @@ -25,24 +25,34 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.exceptions.RumbleException; import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.items.parsing.ItemParser; import org.rumbledb.items.parsing.JSONSyntaxToItemMapper; -import org.rumbledb.runtime.RDDRuntimeIterator; +import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; +import com.google.gson.stream.JsonReader; + import sparksoniq.spark.SparkSessionManager; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; +import java.io.StringReader; import java.net.URI; import java.util.ArrayList; import java.util.List; -public class JsonFileFunctionIterator extends RDDRuntimeIterator { +public class JsonFileFunctionIterator extends HybridRuntimeIterator { private static final long serialVersionUID = 1L; + RuntimeIterator iterator; + BufferedReader reader; + Item path; + Item nextItem; public JsonFileFunctionIterator( List arguments, @@ -50,6 +60,10 @@ public JsonFileFunctionIterator( ExceptionMetadata iteratorMetadata ) { super(arguments, executionMode, iteratorMetadata); + this.iterator = this.children.get(0); + this.reader = null; + this.nextItem = null; + this.path = null; } @Override @@ -117,4 +131,88 @@ public JavaRDD getRDDAux(DynamicContext context) { } return strings.mapPartitions(new JSONSyntaxToItemMapper(getMetadata())); } + + protected void init() { + try { + URI uri = FileSystemUtil.resolveURI( + this.staticURI, + this.path.getStringValue(), + getMetadata() + ); + InputStream is = FileSystemUtil.getDataInputStream( + uri, + this.currentDynamicContextForLocalExecution.getRumbleRuntimeConfiguration(), + getMetadata() + ); + this.reader = new BufferedReader(new InputStreamReader(is)); + fetchNext(); + } catch (IteratorFlowException e) { + throw new IteratorFlowException(e.getJSONiqErrorMessage(), getMetadata()); + } + } + + @Override + protected void openLocal() { + this.path = this.iterator.materializeFirstItemOrNull(this.currentDynamicContextForLocalExecution); + init(); + } + + @Override + protected void closeLocal() { + try { + this.reader.close(); + } catch (IOException e) { + handleException(e); + } + this.reader = null; + this.nextItem = null; + } + + @Override + protected void resetLocal() { + try { + this.reader.close(); + } catch (IOException e) { + handleException(e); + } + this.path = this.iterator.materializeFirstItemOrNull(this.currentDynamicContextForLocalExecution); + init(); + } + + @Override + protected boolean hasNextLocal() { + return this.hasNext; + } + + @Override + protected Item nextLocal() { + Item result = nextItem; + fetchNext(); + return result; + } + + public void fetchNext() { + try { + String line = this.reader.readLine(); + this.hasNext = (line != null); + if (this.hasNext) { + JsonReader object = new JsonReader(new StringReader(line)); + this.nextItem = ItemParser.getItemFromObject(object, getMetadata()); + } + } catch (IOException e) { + handleException(e); + } + } + + public void handleException(IOException e) { + RumbleException rumbleException = new CannotRetrieveResourceException( + "I/O error while accessing file: " + + this.path.getStringValue() + + " Cause: " + + e.getMessage(), + getMetadata() + ); + rumbleException.initCause(e); + throw rumbleException; + } } From 25bd1f1baf579b4d850a9af23e17dd328394f4de Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 13:51:42 +0200 Subject: [PATCH 030/136] Improve execution mode for switch and typeswitch. --- .../compiler/ExecutionModeVisitor.java | 60 ++++++++++++++++++- .../expressions/control/SwitchExpression.java | 27 --------- .../control/TypeSwitchExpression.java | 16 ----- 3 files changed, 58 insertions(+), 45 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index b1f8e858d..48e003d32 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -40,6 +40,8 @@ import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.control.SwitchCase; +import org.rumbledb.expressions.control.SwitchExpression; import org.rumbledb.expressions.control.TypeSwitchExpression; import org.rumbledb.expressions.control.TypeswitchCase; import org.rumbledb.expressions.flowr.Clause; @@ -497,12 +499,66 @@ public StaticContext visitTypeSwitchExpression(TypeSwitchExpression expression, ); this.visit(expression.getDefaultCase().getReturnExpression(), null); } - expression.initHighestExecutionMode(this.visitorConfig); - // return the given context unchanged as defined variables go out of scope + + ExecutionMode defaultMode = expression.getDefaultCase() + .getReturnExpression() + .getHighestExecutionMode(visitorConfig); + + if (defaultMode.isUnset()) { + expression.setHighestExecutionMode(ExecutionMode.UNSET); + return argument; + } + + for (TypeswitchCase c : expression.getCases()) { + ExecutionMode mode = c.getReturnExpression().getHighestExecutionMode(visitorConfig); + if (mode.isUnset()) { + expression.setHighestExecutionMode(ExecutionMode.UNSET); + return argument; + } + if (defaultMode.isRDD() && mode.isLocal()) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + if (defaultMode.isDataFrame() && !mode.isDataFrame()) { + expression.setHighestExecutionMode(mode); + } + } + + expression.setHighestExecutionMode(defaultMode); return argument; } // endregion + @Override + public StaticContext visitSwitchExpression(SwitchExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + + ExecutionMode defaultMode = expression.getDefaultExpression().getHighestExecutionMode(visitorConfig); + + if (defaultMode.isUnset()) { + expression.setHighestExecutionMode(ExecutionMode.UNSET); + return argument; + } + + for (SwitchCase c : expression.getCases()) { + ExecutionMode mode = c.getReturnExpression().getHighestExecutionMode(visitorConfig); + if (mode.isUnset()) { + expression.setHighestExecutionMode(ExecutionMode.UNSET); + return argument; + } + if (defaultMode.isRDD() && mode.isLocal()) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + if (defaultMode.isDataFrame() && !mode.isDataFrame()) { + expression.setHighestExecutionMode(mode); + } + } + + expression.setHighestExecutionMode(defaultMode); + return argument; + } + @Override public StaticContext visitVariableDeclaration(VariableDeclaration variableDeclaration, StaticContext argument) { if (variableDeclaration.getExpression() != null) { diff --git a/src/main/java/org/rumbledb/expressions/control/SwitchExpression.java b/src/main/java/org/rumbledb/expressions/control/SwitchExpression.java index 271115bcb..eb5ea827d 100644 --- a/src/main/java/org/rumbledb/expressions/control/SwitchExpression.java +++ b/src/main/java/org/rumbledb/expressions/control/SwitchExpression.java @@ -21,10 +21,8 @@ package org.rumbledb.expressions.control; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; @@ -102,31 +100,6 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { } } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = this.defaultExpression.getHighestExecutionMode(visitorConfig); - - if (this.highestExecutionMode.isUnset()) { - return; - } - - for (SwitchCase c : this.cases) { - ExecutionMode mode = c.getReturnExpression().getHighestExecutionMode(visitorConfig); - if (mode.isUnset()) { - this.highestExecutionMode = ExecutionMode.UNSET; - return; - } - if (this.highestExecutionMode.isDataFrame() && !mode.isDataFrame()) { - this.highestExecutionMode = mode; - break; - } - if (this.highestExecutionMode.isRDD() && mode.isLocal()) { - this.highestExecutionMode = ExecutionMode.LOCAL; - break; - } - } - } - @Override public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitSwitchExpression(this, argument); diff --git a/src/main/java/org/rumbledb/expressions/control/TypeSwitchExpression.java b/src/main/java/org/rumbledb/expressions/control/TypeSwitchExpression.java index 4a80583e9..4b0e6e920 100644 --- a/src/main/java/org/rumbledb/expressions/control/TypeSwitchExpression.java +++ b/src/main/java/org/rumbledb/expressions/control/TypeSwitchExpression.java @@ -1,10 +1,8 @@ package org.rumbledb.expressions.control; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; @@ -97,20 +95,6 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { } } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = this.defaultCase.getReturnExpression().getHighestExecutionMode(visitorConfig); - - if (this.highestExecutionMode == ExecutionMode.RDD) { - for (TypeswitchCase c : this.cases) { - if (!c.getReturnExpression().getHighestExecutionMode(visitorConfig).isRDDOrDataFrame()) { - this.highestExecutionMode = ExecutionMode.LOCAL; - break; - } - } - } - } - @Override public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitTypeSwitchExpression(this, argument); From dc2929b4ea357f5cb4cbdafb1a0869a3b7f765e4 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 14:01:55 +0200 Subject: [PATCH 031/136] Take over annotate expression. --- .../expressions/typing/ValidateTypeExpression.java | 13 ++++++++++++- src/main/java/org/rumbledb/parser/Jsoniq.g4 | 13 +++++++++++-- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/rumbledb/expressions/typing/ValidateTypeExpression.java b/src/main/java/org/rumbledb/expressions/typing/ValidateTypeExpression.java index 4e0484d37..6f5ec6256 100644 --- a/src/main/java/org/rumbledb/expressions/typing/ValidateTypeExpression.java +++ b/src/main/java/org/rumbledb/expressions/typing/ValidateTypeExpression.java @@ -14,13 +14,20 @@ public class ValidateTypeExpression extends Expression { private Expression mainExpression; private SequenceType sequenceType; + private boolean isValidate; - public ValidateTypeExpression(Expression mainExpression, SequenceType sequenceType, ExceptionMetadata metadata) { + public ValidateTypeExpression( + Expression mainExpression, + boolean isValidate, + SequenceType sequenceType, + ExceptionMetadata metadata + ) { super(metadata); if (mainExpression == null) { throw new OurBadException("Expression cannot be null."); } this.mainExpression = mainExpression; + this.isValidate = isValidate; this.sequenceType = sequenceType; if (sequenceType.isEmptySequence()) { throw new OurBadException( @@ -79,4 +86,8 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { this.mainExpression.serializeToJSONiq(sb, 0); sb.append(" as {" + this.sequenceType.toString() + "\n}\n"); } + + public boolean isValidate() { + return this.isValidate; + } } diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.g4 b/src/main/java/org/rumbledb/parser/Jsoniq.g4 index fb072ec61..78457c372 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.g4 +++ b/src/main/java/org/rumbledb/parser/Jsoniq.g4 @@ -177,9 +177,12 @@ arrowFunctionSpecifier : qname | varRef | parenthesizedExpr; unaryExpr : op+=('-' | '+')* main_expr=valueExpr; valueExpr : simpleMap_expr=simpleMapExpr - | validate_expr=validateExpr; + | validate_expr=validateExpr + | annotate_expr=annotateExpr; -validateExpr : 'validate' Ktype sequenceType '{' expr '}'; +validateExpr : Kvalidate Ktype sequenceType '{' expr '}'; + +annotateExpr : Kannotate Ktype sequenceType '{' expr '}'; simpleMapExpr : main_expr=postFixExpr ('!' map_expr+=postFixExpr)*; @@ -315,6 +318,8 @@ keyWords : Kjsoniq | Ktrue | Kfalse | Ktype + | Kvalidate + | Kannotate ; ///////////////////////// literals @@ -415,6 +420,10 @@ Kfalse : 'false'; Ktype : 'type'; +Kvalidate : 'validate'; + +Kannotate : 'annotate'; + Kdeclare : 'declare'; Kcontext : 'context'; From 31f5dbf36df4d8b97ffa7779bf1ce08cab7ef0a8 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 14:05:24 +0200 Subject: [PATCH 032/136] Implement annotate. --- .../org/rumbledb/compiler/CloneVisitor.java | 1 + .../compiler/RuntimeIteratorVisitor.java | 1 + .../rumbledb/compiler/TranslationVisitor.java | 14 +- .../java/org/rumbledb/parser/Jsoniq.tokens | 258 +- .../rumbledb/parser/JsoniqBaseVisitor.java | 9 +- .../java/org/rumbledb/parser/JsoniqLexer.java | 823 +++--- .../org/rumbledb/parser/JsoniqLexer.tokens | 258 +- .../org/rumbledb/parser/JsoniqParser.java | 2346 +++++++++-------- .../org/rumbledb/parser/JsoniqVisitor.java | 8 +- .../clauses/ReturnClauseSparkIterator.java | 2 +- .../runtime/typing/ValidateTypeIterator.java | 42 +- .../spark/ml/AnnotateFunctionIterator.java | 12 +- 12 files changed, 1913 insertions(+), 1861 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java index f924e6d49..f30c9b063 100644 --- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -704,6 +704,7 @@ public Node visitTypeDeclaration(TypeDeclaration expression, Node argument) { public Node visitValidateTypeExpression(ValidateTypeExpression expression, Node argument) { Expression result = new ValidateTypeExpression( (Expression) visit(expression.getMainExpression(), argument), + expression.isValidate(), expression.getSequenceType(), expression.getMetadata() ); diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 6568b98a2..7670eb3d9 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -846,6 +846,7 @@ public RuntimeIterator visitValidateTypeExpression(ValidateTypeExpression expres RuntimeIterator runtimeIterator = new ValidateTypeIterator( childExpression, expression.getSequenceType().getItemType(), + expression.isValidate(), expression.getHighestExecutionMode(this.visitorConfig), this.config, expression.getMetadata() diff --git a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java index 8088aa96f..6d8e09121 100644 --- a/src/main/java/org/rumbledb/compiler/TranslationVisitor.java +++ b/src/main/java/org/rumbledb/compiler/TranslationVisitor.java @@ -1108,14 +1108,24 @@ public Node visitValueExpr(JsoniqParser.ValueExprContext ctx) { if (ctx.simpleMap_expr != null) { return this.visitSimpleMapExpr(ctx.simpleMap_expr); } - return this.visitValidateExpr(ctx.validate_expr); + if (ctx.validate_expr != null) { + return this.visitValidateExpr(ctx.validate_expr); + } + return this.visitAnnotateExpr(ctx.annotate_expr); + } + + @Override + public Node visitAnnotateExpr(JsoniqParser.AnnotateExprContext ctx) { + Expression mainExpr = (Expression) this.visitExpr(ctx.expr()); + SequenceType sequenceType = this.processSequenceType(ctx.sequenceType()); + return new ValidateTypeExpression(mainExpr, false, sequenceType, createMetadataFromContext(ctx)); } @Override public Node visitValidateExpr(JsoniqParser.ValidateExprContext ctx) { Expression mainExpr = (Expression) this.visitExpr(ctx.expr()); SequenceType sequenceType = this.processSequenceType(ctx.sequenceType()); - return new ValidateTypeExpression(mainExpr, sequenceType, createMetadataFromContext(ctx)); + return new ValidateTypeExpression(mainExpr, true, sequenceType, createMetadataFromContext(ctx)); } // endregion diff --git a/src/main/java/org/rumbledb/parser/Jsoniq.tokens b/src/main/java/org/rumbledb/parser/Jsoniq.tokens index 665fe0525..1a3cdf8b7 100644 --- a/src/main/java/org/rumbledb/parser/Jsoniq.tokens +++ b/src/main/java/org/rumbledb/parser/Jsoniq.tokens @@ -58,71 +58,72 @@ T__56=57 T__57=58 T__58=59 T__59=60 -T__60=61 -Kfor=62 -Klet=63 -Kwhere=64 -Kgroup=65 -Kby=66 -Korder=67 -Kreturn=68 -Kif=69 -Kin=70 -Kas=71 -Kat=72 -Kallowing=73 -Kempty=74 -Kcount=75 -Kstable=76 -Kascending=77 -Kdescending=78 -Ksome=79 -Kevery=80 -Ksatisfies=81 -Kcollation=82 -Kgreatest=83 -Kleast=84 -Kswitch=85 -Kcase=86 -Ktry=87 -Kcatch=88 -Kdefault=89 -Kthen=90 -Kelse=91 -Ktypeswitch=92 -Kor=93 -Kand=94 -Knot=95 -Kto=96 -Kinstance=97 -Kof=98 -Kstatically=99 -Kis=100 -Ktreat=101 -Kcast=102 -Kcastable=103 -Kversion=104 -Kjsoniq=105 -Kunordered=106 -Ktrue=107 -Kfalse=108 -Ktype=109 -Kdeclare=110 -Kcontext=111 -Kitem=112 -Kvariable=113 -STRING=114 -ArgumentPlaceholder=115 -NullLiteral=116 -Literal=117 -NumericLiteral=118 -IntegerLiteral=119 -DecimalLiteral=120 -DoubleLiteral=121 -WS=122 -NCName=123 -XQComment=124 -ContentChar=125 +Kfor=61 +Klet=62 +Kwhere=63 +Kgroup=64 +Kby=65 +Korder=66 +Kreturn=67 +Kif=68 +Kin=69 +Kas=70 +Kat=71 +Kallowing=72 +Kempty=73 +Kcount=74 +Kstable=75 +Kascending=76 +Kdescending=77 +Ksome=78 +Kevery=79 +Ksatisfies=80 +Kcollation=81 +Kgreatest=82 +Kleast=83 +Kswitch=84 +Kcase=85 +Ktry=86 +Kcatch=87 +Kdefault=88 +Kthen=89 +Kelse=90 +Ktypeswitch=91 +Kor=92 +Kand=93 +Knot=94 +Kto=95 +Kinstance=96 +Kof=97 +Kstatically=98 +Kis=99 +Ktreat=100 +Kcast=101 +Kcastable=102 +Kversion=103 +Kjsoniq=104 +Kunordered=105 +Ktrue=106 +Kfalse=107 +Ktype=108 +Kvalidate=109 +Kannotate=110 +Kdeclare=111 +Kcontext=112 +Kitem=113 +Kvariable=114 +STRING=115 +ArgumentPlaceholder=116 +NullLiteral=117 +Literal=118 +NumericLiteral=119 +IntegerLiteral=120 +DecimalLiteral=121 +DoubleLiteral=122 +WS=123 +NCName=124 +XQComment=125 +ContentChar=126 ';'=1 'module'=2 'namespace'=3 @@ -175,66 +176,67 @@ ContentChar=125 'div'=50 'idiv'=51 'mod'=52 -'validate'=53 -'!'=54 -'['=55 -']'=56 -'.'=57 -'$$'=58 -'#'=59 -'{|'=60 -'|}'=61 -'for'=62 -'let'=63 -'where'=64 -'group'=65 -'by'=66 -'order'=67 -'return'=68 -'if'=69 -'in'=70 -'as'=71 -'at'=72 -'allowing'=73 -'empty'=74 -'count'=75 -'stable'=76 -'ascending'=77 -'descending'=78 -'some'=79 -'every'=80 -'satisfies'=81 -'collation'=82 -'greatest'=83 -'least'=84 -'switch'=85 -'case'=86 -'try'=87 -'catch'=88 -'default'=89 -'then'=90 -'else'=91 -'typeswitch'=92 -'or'=93 -'and'=94 -'not'=95 -'to'=96 -'instance'=97 -'of'=98 -'statically'=99 -'is'=100 -'treat'=101 -'cast'=102 -'castable'=103 -'version'=104 -'jsoniq'=105 -'unordered'=106 -'true'=107 -'false'=108 -'type'=109 -'declare'=110 -'context'=111 -'item'=112 -'variable'=113 -'?'=115 -'null'=116 +'!'=53 +'['=54 +']'=55 +'.'=56 +'$$'=57 +'#'=58 +'{|'=59 +'|}'=60 +'for'=61 +'let'=62 +'where'=63 +'group'=64 +'by'=65 +'order'=66 +'return'=67 +'if'=68 +'in'=69 +'as'=70 +'at'=71 +'allowing'=72 +'empty'=73 +'count'=74 +'stable'=75 +'ascending'=76 +'descending'=77 +'some'=78 +'every'=79 +'satisfies'=80 +'collation'=81 +'greatest'=82 +'least'=83 +'switch'=84 +'case'=85 +'try'=86 +'catch'=87 +'default'=88 +'then'=89 +'else'=90 +'typeswitch'=91 +'or'=92 +'and'=93 +'not'=94 +'to'=95 +'instance'=96 +'of'=97 +'statically'=98 +'is'=99 +'treat'=100 +'cast'=101 +'castable'=102 +'version'=103 +'jsoniq'=104 +'unordered'=105 +'true'=106 +'false'=107 +'type'=108 +'validate'=109 +'annotate'=110 +'declare'=111 +'context'=112 +'item'=113 +'variable'=114 +'?'=116 +'null'=117 diff --git a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java index ddf7c7ed7..9651ffda1 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java +++ b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.8 +// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.7 // Java header package org.rumbledb.parser; @@ -448,6 +448,13 @@ public class JsoniqBaseVisitor extends AbstractParseTreeVisitor implements * {@link #visitChildren} on {@code ctx}.

*/ @Override public T visitValidateExpr(JsoniqParser.ValidateExprContext ctx) { return visitChildren(ctx); } + /** + * {@inheritDoc} + * + *

The default implementation returns the result of calling + * {@link #visitChildren} on {@code ctx}.

+ */ + @Override public T visitAnnotateExpr(JsoniqParser.AnnotateExprContext ctx) { return visitChildren(ctx); } /** * {@inheritDoc} * diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.java b/src/main/java/org/rumbledb/parser/JsoniqLexer.java index 67cdc1b97..01503d070 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java @@ -1,4 +1,4 @@ -// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.8 +// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.7 // Java header package org.rumbledb.parser; @@ -16,7 +16,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class JsoniqLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -30,17 +30,17 @@ public class JsoniqLexer extends Lexer { T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45, T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52, T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59, - T__59=60, T__60=61, Kfor=62, Klet=63, Kwhere=64, Kgroup=65, Kby=66, Korder=67, - Kreturn=68, Kif=69, Kin=70, Kas=71, Kat=72, Kallowing=73, Kempty=74, Kcount=75, - Kstable=76, Kascending=77, Kdescending=78, Ksome=79, Kevery=80, Ksatisfies=81, - Kcollation=82, Kgreatest=83, Kleast=84, Kswitch=85, Kcase=86, Ktry=87, - Kcatch=88, Kdefault=89, Kthen=90, Kelse=91, Ktypeswitch=92, Kor=93, Kand=94, - Knot=95, Kto=96, Kinstance=97, Kof=98, Kstatically=99, Kis=100, Ktreat=101, - Kcast=102, Kcastable=103, Kversion=104, Kjsoniq=105, Kunordered=106, Ktrue=107, - Kfalse=108, Ktype=109, Kdeclare=110, Kcontext=111, Kitem=112, Kvariable=113, - STRING=114, ArgumentPlaceholder=115, NullLiteral=116, Literal=117, NumericLiteral=118, - IntegerLiteral=119, DecimalLiteral=120, DoubleLiteral=121, WS=122, NCName=123, - XQComment=124, ContentChar=125; + T__59=60, Kfor=61, Klet=62, Kwhere=63, Kgroup=64, Kby=65, Korder=66, Kreturn=67, + Kif=68, Kin=69, Kas=70, Kat=71, Kallowing=72, Kempty=73, Kcount=74, Kstable=75, + Kascending=76, Kdescending=77, Ksome=78, Kevery=79, Ksatisfies=80, Kcollation=81, + Kgreatest=82, Kleast=83, Kswitch=84, Kcase=85, Ktry=86, Kcatch=87, Kdefault=88, + Kthen=89, Kelse=90, Ktypeswitch=91, Kor=92, Kand=93, Knot=94, Kto=95, + Kinstance=96, Kof=97, Kstatically=98, Kis=99, Ktreat=100, Kcast=101, Kcastable=102, + Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108, + Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114, + STRING=115, ArgumentPlaceholder=116, NullLiteral=117, Literal=118, NumericLiteral=119, + IntegerLiteral=120, DecimalLiteral=121, DoubleLiteral=122, WS=123, NCName=124, + XQComment=125, ContentChar=126; public static String[] channelNames = { "DEFAULT_TOKEN_CHANNEL", "HIDDEN" }; @@ -49,72 +49,63 @@ public class JsoniqLexer extends Lexer { "DEFAULT_MODE" }; - private static String[] makeRuleNames() { - return new String[] { - "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", - "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16", - "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", - "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", - "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", - "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", - "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56", - "T__57", "T__58", "T__59", "T__60", "Kfor", "Klet", "Kwhere", "Kgroup", - "Kby", "Korder", "Kreturn", "Kif", "Kin", "Kas", "Kat", "Kallowing", - "Kempty", "Kcount", "Kstable", "Kascending", "Kdescending", "Ksome", - "Kevery", "Ksatisfies", "Kcollation", "Kgreatest", "Kleast", "Kswitch", - "Kcase", "Ktry", "Kcatch", "Kdefault", "Kthen", "Kelse", "Ktypeswitch", - "Kor", "Kand", "Knot", "Kto", "Kinstance", "Kof", "Kstatically", "Kis", - "Ktreat", "Kcast", "Kcastable", "Kversion", "Kjsoniq", "Kunordered", - "Ktrue", "Kfalse", "Ktype", "Kdeclare", "Kcontext", "Kitem", "Kvariable", - "STRING", "ESC", "UNICODE", "HEX", "ArgumentPlaceholder", "NullLiteral", - "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", - "Digits", "WS", "NCName", "NameStartChar", "NameChar", "XQComment", "ContentChar" - }; - } - public static final String[] ruleNames = makeRuleNames(); + public static final String[] ruleNames = { + "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", + "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16", + "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", + "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", + "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", + "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", + "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56", + "T__57", "T__58", "T__59", "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", + "Korder", "Kreturn", "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", + "Kcount", "Kstable", "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", + "Kcollation", "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", + "Kdefault", "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", + "Kinstance", "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", + "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", + "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", "STRING", "ESC", + "UNICODE", "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", + "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS", "NCName", + "NameStartChar", "NameChar", "XQComment", "ContentChar" + }; - private static String[] makeLiteralNames() { - return new String[] { - null, "';'", "'module'", "'namespace'", "'='", "'ordering'", "'ordered'", - "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", - "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", - "'digit'", "'pattern-separator'", "'import'", "','", "':='", "'external'", - "'function'", "'('", "')'", "'{'", "'}'", "'jsound'", "'compact'", "'verbose'", - "'json'", "'schema'", "'$'", "'|'", "'*'", "'eq'", "'ne'", "'lt'", "'le'", - "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", "'+'", - "'-'", "'div'", "'idiv'", "'mod'", "'validate'", "'!'", "'['", "']'", - "'.'", "'$$'", "'#'", "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", - "'by'", "'order'", "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", - "'empty'", "'count'", "'stable'", "'ascending'", "'descending'", "'some'", - "'every'", "'satisfies'", "'collation'", "'greatest'", "'least'", "'switch'", - "'case'", "'try'", "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", - "'or'", "'and'", "'not'", "'to'", "'instance'", "'of'", "'statically'", - "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", - "'true'", "'false'", "'type'", "'declare'", "'context'", "'item'", "'variable'", - null, "'?'", "'null'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", - "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", - "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", - "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", - "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", - "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", - "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kdeclare", "Kcontext", - "Kitem", "Kvariable", "STRING", "ArgumentPlaceholder", "NullLiteral", - "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", - "WS", "NCName", "XQComment", "ContentChar" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + private static final String[] _LITERAL_NAMES = { + null, "';'", "'module'", "'namespace'", "'='", "'ordering'", "'ordered'", + "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", + "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", + "'digit'", "'pattern-separator'", "'import'", "','", "':='", "'external'", + "'function'", "'('", "')'", "'{'", "'}'", "'jsound'", "'compact'", "'verbose'", + "'json'", "'schema'", "'$'", "'|'", "'*'", "'eq'", "'ne'", "'lt'", "'le'", + "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", "'+'", "'-'", + "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'", "'$$'", "'#'", + "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", "'by'", "'order'", + "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", "'empty'", "'count'", + "'stable'", "'ascending'", "'descending'", "'some'", "'every'", "'satisfies'", + "'collation'", "'greatest'", "'least'", "'switch'", "'case'", "'try'", + "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", "'or'", "'and'", + "'not'", "'to'", "'instance'", "'of'", "'statically'", "'is'", "'treat'", + "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", "'true'", + "'false'", "'type'", "'validate'", "'annotate'", "'declare'", "'context'", + "'item'", "'variable'", null, "'?'", "'null'" + }; + private static final String[] _SYMBOLIC_NAMES = { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", + "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", + "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", + "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", + "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", + "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", + "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", + "Kdeclare", "Kcontext", "Kitem", "Kvariable", "STRING", "ArgumentPlaceholder", + "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", + "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" + }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); /** @@ -173,9 +164,9 @@ public JsoniqLexer(CharStream input) { public ATN getATN() { return _ATN; } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\177\u040b\b\1\4\2"+ - "\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4"+ - "\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\2\u0080\u0416\b\1\4"+ + "\2\t\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n"+ + "\4\13\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22"+ "\t\22\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31"+ "\t\31\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t"+ " \4!\t!\4\"\t\"\4#\t#\4$\t$\4%\t%\4&\t&\4\'\t\'\4(\t(\4)\t)\4*\t*\4+\t"+ @@ -188,339 +179,343 @@ public JsoniqLexer(CharStream input) { "\tk\4l\tl\4m\tm\4n\tn\4o\to\4p\tp\4q\tq\4r\tr\4s\ts\4t\tt\4u\tu\4v\tv"+ "\4w\tw\4x\tx\4y\ty\4z\tz\4{\t{\4|\t|\4}\t}\4~\t~\4\177\t\177\4\u0080\t"+ "\u0080\4\u0081\t\u0081\4\u0082\t\u0082\4\u0083\t\u0083\4\u0084\t\u0084"+ - "\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3\4\3"+ - "\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7\3\7\3\7\3\7\3\7"+ - "\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+ - "\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n"+ - "\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+ - "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f\3\f\3\f\3\f\3\f"+ - "\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16\3\16\3\16\3\16\3"+ - "\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20\3\20\3\20\3\20\3"+ - "\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3\21\3"+ - "\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3"+ - "\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\24\3\24\3\24\3"+ - "\24\3\24\3\24\3\24\3\25\3\25\3\26\3\26\3\26\3\27\3\27\3\27\3\27\3\27\3"+ - "\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\30\3\31\3"+ - "\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\35\3\35\3\35\3\35\3\35\3"+ - "\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37\3\37\3\37\3\37\3"+ - "\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3\"\3\"\3#\3#\3$\3$\3%\3"+ - "%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3*\3+\3+\3+\3,\3,\3"+ - "-\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\62\3\62\3\63\3\63\3"+ - "\63\3\63\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65\3\66\3\66\3\66\3"+ - "\66\3\66\3\66\3\66\3\66\3\66\3\67\3\67\38\38\39\39\3:\3:\3;\3;\3;\3<\3"+ - "<\3=\3=\3=\3>\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3B\3"+ - "B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3D\3D\3D\3E\3E\3E\3E\3E\3E\3E\3F\3F\3F\3"+ - "G\3G\3G\3H\3H\3H\3I\3I\3I\3J\3J\3J\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3"+ - "K\3L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3N\3N\3"+ - "N\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3"+ - "R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3S\3T\3T\3T\3"+ - "T\3T\3T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3V\3V\3W\3W\3W\3W\3"+ - "W\3X\3X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3"+ - "[\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3]\3^\3^\3^\3_\3_"+ - "\3_\3_\3`\3`\3`\3`\3a\3a\3a\3b\3b\3b\3b\3b\3b\3b\3b\3b\3c\3c\3c\3d\3d"+ - "\3d\3d\3d\3d\3d\3d\3d\3d\3d\3e\3e\3e\3f\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g"+ - "\3h\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j\3j"+ - "\3j\3k\3k\3k\3k\3k\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3m\3n"+ - "\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3p\3p\3q\3q\3q"+ - "\3q\3q\3r\3r\3r\3r\3r\3r\3r\3r\3r\3s\3s\3s\7s\u0399\ns\fs\16s\u039c\13"+ - "s\3s\3s\3t\3t\3t\5t\u03a3\nt\3u\3u\3u\3u\3u\3u\3v\3v\3w\3w\3x\3x\3x\3"+ - "x\3x\3y\3y\3z\3z\3z\5z\u03b9\nz\3{\3{\3|\3|\3|\3|\3|\7|\u03c2\n|\f|\16"+ - "|\u03c5\13|\5|\u03c7\n|\3}\3}\3}\3}\3}\7}\u03ce\n}\f}\16}\u03d1\13}\5"+ - "}\u03d3\n}\5}\u03d5\n}\3}\3}\5}\u03d9\n}\3}\3}\3~\6~\u03de\n~\r~\16~\u03df"+ - "\3\177\3\177\3\177\3\177\3\u0080\3\u0080\7\u0080\u03e8\n\u0080\f\u0080"+ - "\16\u0080\u03eb\13\u0080\3\u0081\5\u0081\u03ee\n\u0081\3\u0082\3\u0082"+ - "\5\u0082\u03f2\n\u0082\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083\3\u0083"+ - "\3\u0083\3\u0083\7\u0083\u03fc\n\u0083\f\u0083\16\u0083\u03ff\13\u0083"+ - "\3\u0083\6\u0083\u0402\n\u0083\r\u0083\16\u0083\u0403\3\u0083\3\u0083"+ - "\3\u0083\3\u0083\3\u0084\3\u0084\2\2\u0085\3\3\5\4\7\5\t\6\13\7\r\b\17"+ - "\t\21\n\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+"+ - "\27-\30/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+"+ - "U,W-Y.[/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081"+ - "B\u0083C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095"+ - "L\u0097M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9"+ - "V\u00abW\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd"+ - "`\u00bfa\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1"+ - "j\u00d3k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5"+ - "t\u00e7\2\u00e9\2\u00eb\2\u00edu\u00efv\u00f1w\u00f3x\u00f5y\u00f7z\u00f9"+ - "{\u00fb\2\u00fd|\u00ff}\u0101\2\u0103\2\u0105~\u0107\177\3\2\17\4\2$$"+ - "^^\n\2$$\61\61^^ddhhppttvv\5\2\62;CHch\3\2\62;\4\2GGgg\4\2--//\5\2\13"+ - "\f\17\17\"\"\20\2C\\aac|\u00c2\u00d8\u00da\u00f8\u00fa\u0301\u0372\u037f"+ - "\u0381\u2001\u200e\u200f\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902\ufdd1"+ - "\ufdf2\uffff\7\2//\62;\u00b9\u00b9\u0302\u0371\u2041\u2042\3\2<<\3\2+"+ - "+\4\2**<<\7\2$$()>>}}\177\177\2\u0417\2\3\3\2\2\2\2\5\3\2\2\2\2\7\3\2"+ - "\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2\2\2\2"+ - "\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2\2\35\3"+ - "\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2\2\2)\3"+ - "\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2\2\2\65"+ - "\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2\2\2A\3"+ - "\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2M\3\2\2"+ - "\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3\2\2\2\2"+ - "[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2\2\2g\3"+ - "\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2s\3\2\2"+ - "\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177\3\2\2"+ - "\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2\2\2\u0089"+ - "\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091\3\2\2"+ - "\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2\2\2\u009b"+ - "\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3\3\2\2"+ - "\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2\2\2\u00ad"+ - "\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5\3\2\2"+ - "\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2\2\2\u00bf"+ - "\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7\3\2\2"+ - "\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2\2\2\u00d1"+ - "\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9\3\2\2"+ - "\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2\2\2\u00e3"+ - "\3\2\2\2\2\u00e5\3\2\2\2\2\u00ed\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1\3\2\2"+ - "\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2\2\2\u00fd"+ - "\3\2\2\2\2\u00ff\3\2\2\2\2\u0105\3\2\2\2\2\u0107\3\2\2\2\3\u0109\3\2\2"+ - "\2\5\u010b\3\2\2\2\7\u0112\3\2\2\2\t\u011c\3\2\2\2\13\u011e\3\2\2\2\r"+ - "\u0127\3\2\2\2\17\u012f\3\2\2\2\21\u013e\3\2\2\2\23\u0140\3\2\2\2\25\u0152"+ - "\3\2\2\2\27\u0165\3\2\2\2\31\u016e\3\2\2\2\33\u0179\3\2\2\2\35\u017d\3"+ - "\2\2\2\37\u0185\3\2\2\2!\u018f\3\2\2\2#\u019a\3\2\2\2%\u01a0\3\2\2\2\'"+ - "\u01b2\3\2\2\2)\u01b9\3\2\2\2+\u01bb\3\2\2\2-\u01be\3\2\2\2/\u01c7\3\2"+ - "\2\2\61\u01d0\3\2\2\2\63\u01d2\3\2\2\2\65\u01d4\3\2\2\2\67\u01d6\3\2\2"+ - "\29\u01d8\3\2\2\2;\u01df\3\2\2\2=\u01e7\3\2\2\2?\u01ef\3\2\2\2A\u01f4"+ - "\3\2\2\2C\u01fb\3\2\2\2E\u01fd\3\2\2\2G\u01ff\3\2\2\2I\u0201\3\2\2\2K"+ - "\u0204\3\2\2\2M\u0207\3\2\2\2O\u020a\3\2\2\2Q\u020d\3\2\2\2S\u0210\3\2"+ - "\2\2U\u0213\3\2\2\2W\u0216\3\2\2\2Y\u0218\3\2\2\2[\u021b\3\2\2\2]\u021d"+ - "\3\2\2\2_\u0220\3\2\2\2a\u0223\3\2\2\2c\u0225\3\2\2\2e\u0227\3\2\2\2g"+ - "\u022b\3\2\2\2i\u0230\3\2\2\2k\u0234\3\2\2\2m\u023d\3\2\2\2o\u023f\3\2"+ - "\2\2q\u0241\3\2\2\2s\u0243\3\2\2\2u\u0245\3\2\2\2w\u0248\3\2\2\2y\u024a"+ - "\3\2\2\2{\u024d\3\2\2\2}\u0250\3\2\2\2\177\u0254\3\2\2\2\u0081\u0258\3"+ - "\2\2\2\u0083\u025e\3\2\2\2\u0085\u0264\3\2\2\2\u0087\u0267\3\2\2\2\u0089"+ - "\u026d\3\2\2\2\u008b\u0274\3\2\2\2\u008d\u0277\3\2\2\2\u008f\u027a\3\2"+ - "\2\2\u0091\u027d\3\2\2\2\u0093\u0280\3\2\2\2\u0095\u0289\3\2\2\2\u0097"+ - "\u028f\3\2\2\2\u0099\u0295\3\2\2\2\u009b\u029c\3\2\2\2\u009d\u02a6\3\2"+ - "\2\2\u009f\u02b1\3\2\2\2\u00a1\u02b6\3\2\2\2\u00a3\u02bc\3\2\2\2\u00a5"+ - "\u02c6\3\2\2\2\u00a7\u02d0\3\2\2\2\u00a9\u02d9\3\2\2\2\u00ab\u02df\3\2"+ - "\2\2\u00ad\u02e6\3\2\2\2\u00af\u02eb\3\2\2\2\u00b1\u02ef\3\2\2\2\u00b3"+ - "\u02f5\3\2\2\2\u00b5\u02fd\3\2\2\2\u00b7\u0302\3\2\2\2\u00b9\u0307\3\2"+ - "\2\2\u00bb\u0312\3\2\2\2\u00bd\u0315\3\2\2\2\u00bf\u0319\3\2\2\2\u00c1"+ - "\u031d\3\2\2\2\u00c3\u0320\3\2\2\2\u00c5\u0329\3\2\2\2\u00c7\u032c\3\2"+ - "\2\2\u00c9\u0337\3\2\2\2\u00cb\u033a\3\2\2\2\u00cd\u0340\3\2\2\2\u00cf"+ - "\u0345\3\2\2\2\u00d1\u034e\3\2\2\2\u00d3\u0356\3\2\2\2\u00d5\u035d\3\2"+ - "\2\2\u00d7\u0367\3\2\2\2\u00d9\u036c\3\2\2\2\u00db\u0372\3\2\2\2\u00dd"+ - "\u0377\3\2\2\2\u00df\u037f\3\2\2\2\u00e1\u0387\3\2\2\2\u00e3\u038c\3\2"+ - "\2\2\u00e5\u0395\3\2\2\2\u00e7\u039f\3\2\2\2\u00e9\u03a4\3\2\2\2\u00eb"+ - "\u03aa\3\2\2\2\u00ed\u03ac\3\2\2\2\u00ef\u03ae\3\2\2\2\u00f1\u03b3\3\2"+ - "\2\2\u00f3\u03b8\3\2\2\2\u00f5\u03ba\3\2\2\2\u00f7\u03c6\3\2\2\2\u00f9"+ - "\u03d4\3\2\2\2\u00fb\u03dd\3\2\2\2\u00fd\u03e1\3\2\2\2\u00ff\u03e5\3\2"+ - "\2\2\u0101\u03ed\3\2\2\2\u0103\u03f1\3\2\2\2\u0105\u03f3\3\2\2\2\u0107"+ - "\u0409\3\2\2\2\u0109\u010a\7=\2\2\u010a\4\3\2\2\2\u010b\u010c\7o\2\2\u010c"+ - "\u010d\7q\2\2\u010d\u010e\7f\2\2\u010e\u010f\7w\2\2\u010f\u0110\7n\2\2"+ - "\u0110\u0111\7g\2\2\u0111\6\3\2\2\2\u0112\u0113\7p\2\2\u0113\u0114\7c"+ - "\2\2\u0114\u0115\7o\2\2\u0115\u0116\7g\2\2\u0116\u0117\7u\2\2\u0117\u0118"+ - "\7r\2\2\u0118\u0119\7c\2\2\u0119\u011a\7e\2\2\u011a\u011b\7g\2\2\u011b"+ - "\b\3\2\2\2\u011c\u011d\7?\2\2\u011d\n\3\2\2\2\u011e\u011f\7q\2\2\u011f"+ - "\u0120\7t\2\2\u0120\u0121\7f\2\2\u0121\u0122\7g\2\2\u0122\u0123\7t\2\2"+ - "\u0123\u0124\7k\2\2\u0124\u0125\7p\2\2\u0125\u0126\7i\2\2\u0126\f\3\2"+ - "\2\2\u0127\u0128\7q\2\2\u0128\u0129\7t\2\2\u0129\u012a\7f\2\2\u012a\u012b"+ - "\7g\2\2\u012b\u012c\7t\2\2\u012c\u012d\7g\2\2\u012d\u012e\7f\2\2\u012e"+ - "\16\3\2\2\2\u012f\u0130\7f\2\2\u0130\u0131\7g\2\2\u0131\u0132\7e\2\2\u0132"+ - "\u0133\7k\2\2\u0133\u0134\7o\2\2\u0134\u0135\7c\2\2\u0135\u0136\7n\2\2"+ - "\u0136\u0137\7/\2\2\u0137\u0138\7h\2\2\u0138\u0139\7q\2\2\u0139\u013a"+ - "\7t\2\2\u013a\u013b\7o\2\2\u013b\u013c\7c\2\2\u013c\u013d\7v\2\2\u013d"+ - "\20\3\2\2\2\u013e\u013f\7<\2\2\u013f\22\3\2\2\2\u0140\u0141\7f\2\2\u0141"+ - "\u0142\7g\2\2\u0142\u0143\7e\2\2\u0143\u0144\7k\2\2\u0144\u0145\7o\2\2"+ - "\u0145\u0146\7c\2\2\u0146\u0147\7n\2\2\u0147\u0148\7/\2\2\u0148\u0149"+ - "\7u\2\2\u0149\u014a\7g\2\2\u014a\u014b\7r\2\2\u014b\u014c\7c\2\2\u014c"+ - "\u014d\7t\2\2\u014d\u014e\7c\2\2\u014e\u014f\7v\2\2\u014f\u0150\7q\2\2"+ - "\u0150\u0151\7t\2\2\u0151\24\3\2\2\2\u0152\u0153\7i\2\2\u0153\u0154\7"+ - "t\2\2\u0154\u0155\7q\2\2\u0155\u0156\7w\2\2\u0156\u0157\7r\2\2\u0157\u0158"+ - "\7k\2\2\u0158\u0159\7p\2\2\u0159\u015a\7i\2\2\u015a\u015b\7/\2\2\u015b"+ - "\u015c\7u\2\2\u015c\u015d\7g\2\2\u015d\u015e\7r\2\2\u015e\u015f\7c\2\2"+ - "\u015f\u0160\7t\2\2\u0160\u0161\7c\2\2\u0161\u0162\7v\2\2\u0162\u0163"+ - "\7q\2\2\u0163\u0164\7t\2\2\u0164\26\3\2\2\2\u0165\u0166\7k\2\2\u0166\u0167"+ - "\7p\2\2\u0167\u0168\7h\2\2\u0168\u0169\7k\2\2\u0169\u016a\7p\2\2\u016a"+ - "\u016b\7k\2\2\u016b\u016c\7v\2\2\u016c\u016d\7{\2\2\u016d\30\3\2\2\2\u016e"+ - "\u016f\7o\2\2\u016f\u0170\7k\2\2\u0170\u0171\7p\2\2\u0171\u0172\7w\2\2"+ - "\u0172\u0173\7u\2\2\u0173\u0174\7/\2\2\u0174\u0175\7u\2\2\u0175\u0176"+ - "\7k\2\2\u0176\u0177\7i\2\2\u0177\u0178\7p\2\2\u0178\32\3\2\2\2\u0179\u017a"+ - "\7P\2\2\u017a\u017b\7c\2\2\u017b\u017c\7P\2\2\u017c\34\3\2\2\2\u017d\u017e"+ - "\7r\2\2\u017e\u017f\7g\2\2\u017f\u0180\7t\2\2\u0180\u0181\7e\2\2\u0181"+ - "\u0182\7g\2\2\u0182\u0183\7p\2\2\u0183\u0184\7v\2\2\u0184\36\3\2\2\2\u0185"+ - "\u0186\7r\2\2\u0186\u0187\7g\2\2\u0187\u0188\7t\2\2\u0188\u0189\7/\2\2"+ - "\u0189\u018a\7o\2\2\u018a\u018b\7k\2\2\u018b\u018c\7n\2\2\u018c\u018d"+ - "\7n\2\2\u018d\u018e\7g\2\2\u018e \3\2\2\2\u018f\u0190\7|\2\2\u0190\u0191"+ - "\7g\2\2\u0191\u0192\7t\2\2\u0192\u0193\7q\2\2\u0193\u0194\7/\2\2\u0194"+ - "\u0195\7f\2\2\u0195\u0196\7k\2\2\u0196\u0197\7i\2\2\u0197\u0198\7k\2\2"+ - "\u0198\u0199\7v\2\2\u0199\"\3\2\2\2\u019a\u019b\7f\2\2\u019b\u019c\7k"+ - "\2\2\u019c\u019d\7i\2\2\u019d\u019e\7k\2\2\u019e\u019f\7v\2\2\u019f$\3"+ - "\2\2\2\u01a0\u01a1\7r\2\2\u01a1\u01a2\7c\2\2\u01a2\u01a3\7v\2\2\u01a3"+ - "\u01a4\7v\2\2\u01a4\u01a5\7g\2\2\u01a5\u01a6\7t\2\2\u01a6\u01a7\7p\2\2"+ - "\u01a7\u01a8\7/\2\2\u01a8\u01a9\7u\2\2\u01a9\u01aa\7g\2\2\u01aa\u01ab"+ - "\7r\2\2\u01ab\u01ac\7c\2\2\u01ac\u01ad\7t\2\2\u01ad\u01ae\7c\2\2\u01ae"+ - "\u01af\7v\2\2\u01af\u01b0\7q\2\2\u01b0\u01b1\7t\2\2\u01b1&\3\2\2\2\u01b2"+ - "\u01b3\7k\2\2\u01b3\u01b4\7o\2\2\u01b4\u01b5\7r\2\2\u01b5\u01b6\7q\2\2"+ - "\u01b6\u01b7\7t\2\2\u01b7\u01b8\7v\2\2\u01b8(\3\2\2\2\u01b9\u01ba\7.\2"+ - "\2\u01ba*\3\2\2\2\u01bb\u01bc\7<\2\2\u01bc\u01bd\7?\2\2\u01bd,\3\2\2\2"+ - "\u01be\u01bf\7g\2\2\u01bf\u01c0\7z\2\2\u01c0\u01c1\7v\2\2\u01c1\u01c2"+ - "\7g\2\2\u01c2\u01c3\7t\2\2\u01c3\u01c4\7p\2\2\u01c4\u01c5\7c\2\2\u01c5"+ - "\u01c6\7n\2\2\u01c6.\3\2\2\2\u01c7\u01c8\7h\2\2\u01c8\u01c9\7w\2\2\u01c9"+ - "\u01ca\7p\2\2\u01ca\u01cb\7e\2\2\u01cb\u01cc\7v\2\2\u01cc\u01cd\7k\2\2"+ - "\u01cd\u01ce\7q\2\2\u01ce\u01cf\7p\2\2\u01cf\60\3\2\2\2\u01d0\u01d1\7"+ - "*\2\2\u01d1\62\3\2\2\2\u01d2\u01d3\7+\2\2\u01d3\64\3\2\2\2\u01d4\u01d5"+ - "\7}\2\2\u01d5\66\3\2\2\2\u01d6\u01d7\7\177\2\2\u01d78\3\2\2\2\u01d8\u01d9"+ - "\7l\2\2\u01d9\u01da\7u\2\2\u01da\u01db\7q\2\2\u01db\u01dc\7w\2\2\u01dc"+ - "\u01dd\7p\2\2\u01dd\u01de\7f\2\2\u01de:\3\2\2\2\u01df\u01e0\7e\2\2\u01e0"+ - "\u01e1\7q\2\2\u01e1\u01e2\7o\2\2\u01e2\u01e3\7r\2\2\u01e3\u01e4\7c\2\2"+ - "\u01e4\u01e5\7e\2\2\u01e5\u01e6\7v\2\2\u01e6<\3\2\2\2\u01e7\u01e8\7x\2"+ - "\2\u01e8\u01e9\7g\2\2\u01e9\u01ea\7t\2\2\u01ea\u01eb\7d\2\2\u01eb\u01ec"+ - "\7q\2\2\u01ec\u01ed\7u\2\2\u01ed\u01ee\7g\2\2\u01ee>\3\2\2\2\u01ef\u01f0"+ - "\7l\2\2\u01f0\u01f1\7u\2\2\u01f1\u01f2\7q\2\2\u01f2\u01f3\7p\2\2\u01f3"+ - "@\3\2\2\2\u01f4\u01f5\7u\2\2\u01f5\u01f6\7e\2\2\u01f6\u01f7\7j\2\2\u01f7"+ - "\u01f8\7g\2\2\u01f8\u01f9\7o\2\2\u01f9\u01fa\7c\2\2\u01faB\3\2\2\2\u01fb"+ - "\u01fc\7&\2\2\u01fcD\3\2\2\2\u01fd\u01fe\7~\2\2\u01feF\3\2\2\2\u01ff\u0200"+ - "\7,\2\2\u0200H\3\2\2\2\u0201\u0202\7g\2\2\u0202\u0203\7s\2\2\u0203J\3"+ - "\2\2\2\u0204\u0205\7p\2\2\u0205\u0206\7g\2\2\u0206L\3\2\2\2\u0207\u0208"+ - "\7n\2\2\u0208\u0209\7v\2\2\u0209N\3\2\2\2\u020a\u020b\7n\2\2\u020b\u020c"+ - "\7g\2\2\u020cP\3\2\2\2\u020d\u020e\7i\2\2\u020e\u020f\7v\2\2\u020fR\3"+ - "\2\2\2\u0210\u0211\7i\2\2\u0211\u0212\7g\2\2\u0212T\3\2\2\2\u0213\u0214"+ - "\7#\2\2\u0214\u0215\7?\2\2\u0215V\3\2\2\2\u0216\u0217\7>\2\2\u0217X\3"+ - "\2\2\2\u0218\u0219\7>\2\2\u0219\u021a\7?\2\2\u021aZ\3\2\2\2\u021b\u021c"+ - "\7@\2\2\u021c\\\3\2\2\2\u021d\u021e\7@\2\2\u021e\u021f\7?\2\2\u021f^\3"+ - "\2\2\2\u0220\u0221\7~\2\2\u0221\u0222\7~\2\2\u0222`\3\2\2\2\u0223\u0224"+ - "\7-\2\2\u0224b\3\2\2\2\u0225\u0226\7/\2\2\u0226d\3\2\2\2\u0227\u0228\7"+ - "f\2\2\u0228\u0229\7k\2\2\u0229\u022a\7x\2\2\u022af\3\2\2\2\u022b\u022c"+ - "\7k\2\2\u022c\u022d\7f\2\2\u022d\u022e\7k\2\2\u022e\u022f\7x\2\2\u022f"+ - "h\3\2\2\2\u0230\u0231\7o\2\2\u0231\u0232\7q\2\2\u0232\u0233\7f\2\2\u0233"+ - "j\3\2\2\2\u0234\u0235\7x\2\2\u0235\u0236\7c\2\2\u0236\u0237\7n\2\2\u0237"+ - "\u0238\7k\2\2\u0238\u0239\7f\2\2\u0239\u023a\7c\2\2\u023a\u023b\7v\2\2"+ - "\u023b\u023c\7g\2\2\u023cl\3\2\2\2\u023d\u023e\7#\2\2\u023en\3\2\2\2\u023f"+ - "\u0240\7]\2\2\u0240p\3\2\2\2\u0241\u0242\7_\2\2\u0242r\3\2\2\2\u0243\u0244"+ - "\7\60\2\2\u0244t\3\2\2\2\u0245\u0246\7&\2\2\u0246\u0247\7&\2\2\u0247v"+ - "\3\2\2\2\u0248\u0249\7%\2\2\u0249x\3\2\2\2\u024a\u024b\7}\2\2\u024b\u024c"+ - "\7~\2\2\u024cz\3\2\2\2\u024d\u024e\7~\2\2\u024e\u024f\7\177\2\2\u024f"+ - "|\3\2\2\2\u0250\u0251\7h\2\2\u0251\u0252\7q\2\2\u0252\u0253\7t\2\2\u0253"+ - "~\3\2\2\2\u0254\u0255\7n\2\2\u0255\u0256\7g\2\2\u0256\u0257\7v\2\2\u0257"+ - "\u0080\3\2\2\2\u0258\u0259\7y\2\2\u0259\u025a\7j\2\2\u025a\u025b\7g\2"+ - "\2\u025b\u025c\7t\2\2\u025c\u025d\7g\2\2\u025d\u0082\3\2\2\2\u025e\u025f"+ - "\7i\2\2\u025f\u0260\7t\2\2\u0260\u0261\7q\2\2\u0261\u0262\7w\2\2\u0262"+ - "\u0263\7r\2\2\u0263\u0084\3\2\2\2\u0264\u0265\7d\2\2\u0265\u0266\7{\2"+ - "\2\u0266\u0086\3\2\2\2\u0267\u0268\7q\2\2\u0268\u0269\7t\2\2\u0269\u026a"+ - "\7f\2\2\u026a\u026b\7g\2\2\u026b\u026c\7t\2\2\u026c\u0088\3\2\2\2\u026d"+ - "\u026e\7t\2\2\u026e\u026f\7g\2\2\u026f\u0270\7v\2\2\u0270\u0271\7w\2\2"+ - "\u0271\u0272\7t\2\2\u0272\u0273\7p\2\2\u0273\u008a\3\2\2\2\u0274\u0275"+ - "\7k\2\2\u0275\u0276\7h\2\2\u0276\u008c\3\2\2\2\u0277\u0278\7k\2\2\u0278"+ - "\u0279\7p\2\2\u0279\u008e\3\2\2\2\u027a\u027b\7c\2\2\u027b\u027c\7u\2"+ - "\2\u027c\u0090\3\2\2\2\u027d\u027e\7c\2\2\u027e\u027f\7v\2\2\u027f\u0092"+ - "\3\2\2\2\u0280\u0281\7c\2\2\u0281\u0282\7n\2\2\u0282\u0283\7n\2\2\u0283"+ - "\u0284\7q\2\2\u0284\u0285\7y\2\2\u0285\u0286\7k\2\2\u0286\u0287\7p\2\2"+ - "\u0287\u0288\7i\2\2\u0288\u0094\3\2\2\2\u0289\u028a\7g\2\2\u028a\u028b"+ - "\7o\2\2\u028b\u028c\7r\2\2\u028c\u028d\7v\2\2\u028d\u028e\7{\2\2\u028e"+ - "\u0096\3\2\2\2\u028f\u0290\7e\2\2\u0290\u0291\7q\2\2\u0291\u0292\7w\2"+ - "\2\u0292\u0293\7p\2\2\u0293\u0294\7v\2\2\u0294\u0098\3\2\2\2\u0295\u0296"+ - "\7u\2\2\u0296\u0297\7v\2\2\u0297\u0298\7c\2\2\u0298\u0299\7d\2\2\u0299"+ - "\u029a\7n\2\2\u029a\u029b\7g\2\2\u029b\u009a\3\2\2\2\u029c\u029d\7c\2"+ - "\2\u029d\u029e\7u\2\2\u029e\u029f\7e\2\2\u029f\u02a0\7g\2\2\u02a0\u02a1"+ - "\7p\2\2\u02a1\u02a2\7f\2\2\u02a2\u02a3\7k\2\2\u02a3\u02a4\7p\2\2\u02a4"+ - "\u02a5\7i\2\2\u02a5\u009c\3\2\2\2\u02a6\u02a7\7f\2\2\u02a7\u02a8\7g\2"+ - "\2\u02a8\u02a9\7u\2\2\u02a9\u02aa\7e\2\2\u02aa\u02ab\7g\2\2\u02ab\u02ac"+ - "\7p\2\2\u02ac\u02ad\7f\2\2\u02ad\u02ae\7k\2\2\u02ae\u02af\7p\2\2\u02af"+ - "\u02b0\7i\2\2\u02b0\u009e\3\2\2\2\u02b1\u02b2\7u\2\2\u02b2\u02b3\7q\2"+ - "\2\u02b3\u02b4\7o\2\2\u02b4\u02b5\7g\2\2\u02b5\u00a0\3\2\2\2\u02b6\u02b7"+ - "\7g\2\2\u02b7\u02b8\7x\2\2\u02b8\u02b9\7g\2\2\u02b9\u02ba\7t\2\2\u02ba"+ - "\u02bb\7{\2\2\u02bb\u00a2\3\2\2\2\u02bc\u02bd\7u\2\2\u02bd\u02be\7c\2"+ - "\2\u02be\u02bf\7v\2\2\u02bf\u02c0\7k\2\2\u02c0\u02c1\7u\2\2\u02c1\u02c2"+ - "\7h\2\2\u02c2\u02c3\7k\2\2\u02c3\u02c4\7g\2\2\u02c4\u02c5\7u\2\2\u02c5"+ - "\u00a4\3\2\2\2\u02c6\u02c7\7e\2\2\u02c7\u02c8\7q\2\2\u02c8\u02c9\7n\2"+ - "\2\u02c9\u02ca\7n\2\2\u02ca\u02cb\7c\2\2\u02cb\u02cc\7v\2\2\u02cc\u02cd"+ - "\7k\2\2\u02cd\u02ce\7q\2\2\u02ce\u02cf\7p\2\2\u02cf\u00a6\3\2\2\2\u02d0"+ - "\u02d1\7i\2\2\u02d1\u02d2\7t\2\2\u02d2\u02d3\7g\2\2\u02d3\u02d4\7c\2\2"+ - "\u02d4\u02d5\7v\2\2\u02d5\u02d6\7g\2\2\u02d6\u02d7\7u\2\2\u02d7\u02d8"+ - "\7v\2\2\u02d8\u00a8\3\2\2\2\u02d9\u02da\7n\2\2\u02da\u02db\7g\2\2\u02db"+ - "\u02dc\7c\2\2\u02dc\u02dd\7u\2\2\u02dd\u02de\7v\2\2\u02de\u00aa\3\2\2"+ - "\2\u02df\u02e0\7u\2\2\u02e0\u02e1\7y\2\2\u02e1\u02e2\7k\2\2\u02e2\u02e3"+ - "\7v\2\2\u02e3\u02e4\7e\2\2\u02e4\u02e5\7j\2\2\u02e5\u00ac\3\2\2\2\u02e6"+ - "\u02e7\7e\2\2\u02e7\u02e8\7c\2\2\u02e8\u02e9\7u\2\2\u02e9\u02ea\7g\2\2"+ - "\u02ea\u00ae\3\2\2\2\u02eb\u02ec\7v\2\2\u02ec\u02ed\7t\2\2\u02ed\u02ee"+ - "\7{\2\2\u02ee\u00b0\3\2\2\2\u02ef\u02f0\7e\2\2\u02f0\u02f1\7c\2\2\u02f1"+ - "\u02f2\7v\2\2\u02f2\u02f3\7e\2\2\u02f3\u02f4\7j\2\2\u02f4\u00b2\3\2\2"+ - "\2\u02f5\u02f6\7f\2\2\u02f6\u02f7\7g\2\2\u02f7\u02f8\7h\2\2\u02f8\u02f9"+ - "\7c\2\2\u02f9\u02fa\7w\2\2\u02fa\u02fb\7n\2\2\u02fb\u02fc\7v\2\2\u02fc"+ - "\u00b4\3\2\2\2\u02fd\u02fe\7v\2\2\u02fe\u02ff\7j\2\2\u02ff\u0300\7g\2"+ - "\2\u0300\u0301\7p\2\2\u0301\u00b6\3\2\2\2\u0302\u0303\7g\2\2\u0303\u0304"+ - "\7n\2\2\u0304\u0305\7u\2\2\u0305\u0306\7g\2\2\u0306\u00b8\3\2\2\2\u0307"+ - "\u0308\7v\2\2\u0308\u0309\7{\2\2\u0309\u030a\7r\2\2\u030a\u030b\7g\2\2"+ - "\u030b\u030c\7u\2\2\u030c\u030d\7y\2\2\u030d\u030e\7k\2\2\u030e\u030f"+ - "\7v\2\2\u030f\u0310\7e\2\2\u0310\u0311\7j\2\2\u0311\u00ba\3\2\2\2\u0312"+ - "\u0313\7q\2\2\u0313\u0314\7t\2\2\u0314\u00bc\3\2\2\2\u0315\u0316\7c\2"+ - "\2\u0316\u0317\7p\2\2\u0317\u0318\7f\2\2\u0318\u00be\3\2\2\2\u0319\u031a"+ - "\7p\2\2\u031a\u031b\7q\2\2\u031b\u031c\7v\2\2\u031c\u00c0\3\2\2\2\u031d"+ - "\u031e\7v\2\2\u031e\u031f\7q\2\2\u031f\u00c2\3\2\2\2\u0320\u0321\7k\2"+ - "\2\u0321\u0322\7p\2\2\u0322\u0323\7u\2\2\u0323\u0324\7v\2\2\u0324\u0325"+ - "\7c\2\2\u0325\u0326\7p\2\2\u0326\u0327\7e\2\2\u0327\u0328\7g\2\2\u0328"+ - "\u00c4\3\2\2\2\u0329\u032a\7q\2\2\u032a\u032b\7h\2\2\u032b\u00c6\3\2\2"+ - "\2\u032c\u032d\7u\2\2\u032d\u032e\7v\2\2\u032e\u032f\7c\2\2\u032f\u0330"+ - "\7v\2\2\u0330\u0331\7k\2\2\u0331\u0332\7e\2\2\u0332\u0333\7c\2\2\u0333"+ - "\u0334\7n\2\2\u0334\u0335\7n\2\2\u0335\u0336\7{\2\2\u0336\u00c8\3\2\2"+ - "\2\u0337\u0338\7k\2\2\u0338\u0339\7u\2\2\u0339\u00ca\3\2\2\2\u033a\u033b"+ - "\7v\2\2\u033b\u033c\7t\2\2\u033c\u033d\7g\2\2\u033d\u033e\7c\2\2\u033e"+ - "\u033f\7v\2\2\u033f\u00cc\3\2\2\2\u0340\u0341\7e\2\2\u0341\u0342\7c\2"+ - "\2\u0342\u0343\7u\2\2\u0343\u0344\7v\2\2\u0344\u00ce\3\2\2\2\u0345\u0346"+ - "\7e\2\2\u0346\u0347\7c\2\2\u0347\u0348\7u\2\2\u0348\u0349\7v\2\2\u0349"+ - "\u034a\7c\2\2\u034a\u034b\7d\2\2\u034b\u034c\7n\2\2\u034c\u034d\7g\2\2"+ - "\u034d\u00d0\3\2\2\2\u034e\u034f\7x\2\2\u034f\u0350\7g\2\2\u0350\u0351"+ - "\7t\2\2\u0351\u0352\7u\2\2\u0352\u0353\7k\2\2\u0353\u0354\7q\2\2\u0354"+ - "\u0355\7p\2\2\u0355\u00d2\3\2\2\2\u0356\u0357\7l\2\2\u0357\u0358\7u\2"+ - "\2\u0358\u0359\7q\2\2\u0359\u035a\7p\2\2\u035a\u035b\7k\2\2\u035b\u035c"+ - "\7s\2\2\u035c\u00d4\3\2\2\2\u035d\u035e\7w\2\2\u035e\u035f\7p\2\2\u035f"+ - "\u0360\7q\2\2\u0360\u0361\7t\2\2\u0361\u0362\7f\2\2\u0362\u0363\7g\2\2"+ - "\u0363\u0364\7t\2\2\u0364\u0365\7g\2\2\u0365\u0366\7f\2\2\u0366\u00d6"+ - "\3\2\2\2\u0367\u0368\7v\2\2\u0368\u0369\7t\2\2\u0369\u036a\7w\2\2\u036a"+ - "\u036b\7g\2\2\u036b\u00d8\3\2\2\2\u036c\u036d\7h\2\2\u036d\u036e\7c\2"+ - "\2\u036e\u036f\7n\2\2\u036f\u0370\7u\2\2\u0370\u0371\7g\2\2\u0371\u00da"+ - "\3\2\2\2\u0372\u0373\7v\2\2\u0373\u0374\7{\2\2\u0374\u0375\7r\2\2\u0375"+ - "\u0376\7g\2\2\u0376\u00dc\3\2\2\2\u0377\u0378\7f\2\2\u0378\u0379\7g\2"+ - "\2\u0379\u037a\7e\2\2\u037a\u037b\7n\2\2\u037b\u037c\7c\2\2\u037c\u037d"+ - "\7t\2\2\u037d\u037e\7g\2\2\u037e\u00de\3\2\2\2\u037f\u0380\7e\2\2\u0380"+ - "\u0381\7q\2\2\u0381\u0382\7p\2\2\u0382\u0383\7v\2\2\u0383\u0384\7g\2\2"+ - "\u0384\u0385\7z\2\2\u0385\u0386\7v\2\2\u0386\u00e0\3\2\2\2\u0387\u0388"+ - "\7k\2\2\u0388\u0389\7v\2\2\u0389\u038a\7g\2\2\u038a\u038b\7o\2\2\u038b"+ - "\u00e2\3\2\2\2\u038c\u038d\7x\2\2\u038d\u038e\7c\2\2\u038e\u038f\7t\2"+ - "\2\u038f\u0390\7k\2\2\u0390\u0391\7c\2\2\u0391\u0392\7d\2\2\u0392\u0393"+ - "\7n\2\2\u0393\u0394\7g\2\2\u0394\u00e4\3\2\2\2\u0395\u039a\7$\2\2\u0396"+ - "\u0399\5\u00e7t\2\u0397\u0399\n\2\2\2\u0398\u0396\3\2\2\2\u0398\u0397"+ - "\3\2\2\2\u0399\u039c\3\2\2\2\u039a\u0398\3\2\2\2\u039a\u039b\3\2\2\2\u039b"+ - "\u039d\3\2\2\2\u039c\u039a\3\2\2\2\u039d\u039e\7$\2\2\u039e\u00e6\3\2"+ - "\2\2\u039f\u03a2\7^\2\2\u03a0\u03a3\t\3\2\2\u03a1\u03a3\5\u00e9u\2\u03a2"+ - "\u03a0\3\2\2\2\u03a2\u03a1\3\2\2\2\u03a3\u00e8\3\2\2\2\u03a4\u03a5\7w"+ - "\2\2\u03a5\u03a6\5\u00ebv\2\u03a6\u03a7\5\u00ebv\2\u03a7\u03a8\5\u00eb"+ - "v\2\u03a8\u03a9\5\u00ebv\2\u03a9\u00ea\3\2\2\2\u03aa\u03ab\t\4\2\2\u03ab"+ - "\u00ec\3\2\2\2\u03ac\u03ad\7A\2\2\u03ad\u00ee\3\2\2\2\u03ae\u03af\7p\2"+ - "\2\u03af\u03b0\7w\2\2\u03b0\u03b1\7n\2\2\u03b1\u03b2\7n\2\2\u03b2\u00f0"+ - "\3\2\2\2\u03b3\u03b4\5\u00f3z\2\u03b4\u00f2\3\2\2\2\u03b5\u03b9\5\u00f5"+ - "{\2\u03b6\u03b9\5\u00f7|\2\u03b7\u03b9\5\u00f9}\2\u03b8\u03b5\3\2\2\2"+ - "\u03b8\u03b6\3\2\2\2\u03b8\u03b7\3\2\2\2\u03b9\u00f4\3\2\2\2\u03ba\u03bb"+ - "\5\u00fb~\2\u03bb\u00f6\3\2\2\2\u03bc\u03bd\7\60\2\2\u03bd\u03c7\5\u00fb"+ - "~\2\u03be\u03bf\5\u00fb~\2\u03bf\u03c3\7\60\2\2\u03c0\u03c2\t\5\2\2\u03c1"+ - "\u03c0\3\2\2\2\u03c2\u03c5\3\2\2\2\u03c3\u03c1\3\2\2\2\u03c3\u03c4\3\2"+ - "\2\2\u03c4\u03c7\3\2\2\2\u03c5\u03c3\3\2\2\2\u03c6\u03bc\3\2\2\2\u03c6"+ - "\u03be\3\2\2\2\u03c7\u00f8\3\2\2\2\u03c8\u03c9\7\60\2\2\u03c9\u03d5\5"+ - "\u00fb~\2\u03ca\u03d2\5\u00fb~\2\u03cb\u03cf\7\60\2\2\u03cc\u03ce\t\5"+ - "\2\2\u03cd\u03cc\3\2\2\2\u03ce\u03d1\3\2\2\2\u03cf\u03cd\3\2\2\2\u03cf"+ - "\u03d0\3\2\2\2\u03d0\u03d3\3\2\2\2\u03d1\u03cf\3\2\2\2\u03d2\u03cb\3\2"+ - "\2\2\u03d2\u03d3\3\2\2\2\u03d3\u03d5\3\2\2\2\u03d4\u03c8\3\2\2\2\u03d4"+ - "\u03ca\3\2\2\2\u03d5\u03d6\3\2\2\2\u03d6\u03d8\t\6\2\2\u03d7\u03d9\t\7"+ - "\2\2\u03d8\u03d7\3\2\2\2\u03d8\u03d9\3\2\2\2\u03d9\u03da\3\2\2\2\u03da"+ - "\u03db\5\u00fb~\2\u03db\u00fa\3\2\2\2\u03dc\u03de\t\5\2\2\u03dd\u03dc"+ - "\3\2\2\2\u03de\u03df\3\2\2\2\u03df\u03dd\3\2\2\2\u03df\u03e0\3\2\2\2\u03e0"+ - "\u00fc\3\2\2\2\u03e1\u03e2\t\b\2\2\u03e2\u03e3\3\2\2\2\u03e3\u03e4\b\177"+ - "\2\2\u03e4\u00fe\3\2\2\2\u03e5\u03e9\5\u0101\u0081\2\u03e6\u03e8\5\u0103"+ - "\u0082\2\u03e7\u03e6\3\2\2\2\u03e8\u03eb\3\2\2\2\u03e9\u03e7\3\2\2\2\u03e9"+ - "\u03ea\3\2\2\2\u03ea\u0100\3\2\2\2\u03eb\u03e9\3\2\2\2\u03ec\u03ee\t\t"+ - "\2\2\u03ed\u03ec\3\2\2\2\u03ee\u0102\3\2\2\2\u03ef\u03f2\5\u0101\u0081"+ - "\2\u03f0\u03f2\t\n\2\2\u03f1\u03ef\3\2\2\2\u03f1\u03f0\3\2\2\2\u03f2\u0104"+ - "\3\2\2\2\u03f3\u03f4\7*\2\2\u03f4\u03fd\7<\2\2\u03f5\u03fc\5\u0105\u0083"+ - "\2\u03f6\u03f7\7*\2\2\u03f7\u03fc\n\13\2\2\u03f8\u03f9\7<\2\2\u03f9\u03fc"+ - "\n\f\2\2\u03fa\u03fc\n\r\2\2\u03fb\u03f5\3\2\2\2\u03fb\u03f6\3\2\2\2\u03fb"+ - "\u03f8\3\2\2\2\u03fb\u03fa\3\2\2\2\u03fc\u03ff\3\2\2\2\u03fd\u03fb\3\2"+ - "\2\2\u03fd\u03fe\3\2\2\2\u03fe\u0401\3\2\2\2\u03ff\u03fd\3\2\2\2\u0400"+ - "\u0402\7<\2\2\u0401\u0400\3\2\2\2\u0402\u0403\3\2\2\2\u0403\u0401\3\2"+ - "\2\2\u0403\u0404\3\2\2\2\u0404\u0405\3\2\2\2\u0405\u0406\7+\2\2\u0406"+ - "\u0407\3\2\2\2\u0407\u0408\b\u0083\2\2\u0408\u0106\3\2\2\2\u0409\u040a"+ - "\n\16\2\2\u040a\u0108\3\2\2\2\24\2\u0398\u039a\u03a2\u03b8\u03c3\u03c6"+ - "\u03cf\u03d2\u03d4\u03d8\u03df\u03e9\u03ed\u03f1\u03fb\u03fd\u0403\3\2"+ - "\3\2"; + "\4\u0085\t\u0085\3\2\3\2\3\3\3\3\3\3\3\3\3\3\3\3\3\3\3\4\3\4\3\4\3\4\3"+ + "\4\3\4\3\4\3\4\3\4\3\4\3\5\3\5\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\6\3\7"+ + "\3\7\3\7\3\7\3\7\3\7\3\7\3\7\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3\b\3"+ + "\b\3\b\3\b\3\b\3\b\3\t\3\t\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\n"+ + "\3\n\3\n\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3"+ + "\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f"+ + "\3\f\3\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\r\3\16"+ + "\3\16\3\16\3\16\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\17\3\20\3\20\3\20"+ + "\3\20\3\20\3\20\3\20\3\20\3\20\3\20\3\21\3\21\3\21\3\21\3\21\3\21\3\21"+ + "\3\21\3\21\3\21\3\21\3\22\3\22\3\22\3\22\3\22\3\22\3\23\3\23\3\23\3\23"+ + "\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23\3\23"+ + "\3\24\3\24\3\24\3\24\3\24\3\24\3\24\3\25\3\25\3\26\3\26\3\26\3\27\3\27"+ + "\3\27\3\27\3\27\3\27\3\27\3\27\3\27\3\30\3\30\3\30\3\30\3\30\3\30\3\30"+ + "\3\30\3\30\3\31\3\31\3\32\3\32\3\33\3\33\3\34\3\34\3\35\3\35\3\35\3\35"+ + "\3\35\3\35\3\35\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\36\3\37\3\37\3\37"+ + "\3\37\3\37\3\37\3\37\3\37\3 \3 \3 \3 \3 \3!\3!\3!\3!\3!\3!\3!\3\"\3\""+ + "\3#\3#\3$\3$\3%\3%\3%\3&\3&\3&\3\'\3\'\3\'\3(\3(\3(\3)\3)\3)\3*\3*\3*"+ + "\3+\3+\3+\3,\3,\3-\3-\3-\3.\3.\3/\3/\3/\3\60\3\60\3\60\3\61\3\61\3\62"+ + "\3\62\3\63\3\63\3\63\3\63\3\64\3\64\3\64\3\64\3\64\3\65\3\65\3\65\3\65"+ + "\3\66\3\66\3\67\3\67\38\38\39\39\3:\3:\3:\3;\3;\3<\3<\3<\3=\3=\3=\3>\3"+ + ">\3>\3>\3?\3?\3?\3?\3@\3@\3@\3@\3@\3@\3A\3A\3A\3A\3A\3A\3B\3B\3B\3C\3"+ + "C\3C\3C\3C\3C\3D\3D\3D\3D\3D\3D\3D\3E\3E\3E\3F\3F\3F\3G\3G\3G\3H\3H\3"+ + "H\3I\3I\3I\3I\3I\3I\3I\3I\3I\3J\3J\3J\3J\3J\3J\3K\3K\3K\3K\3K\3K\3L\3"+ + "L\3L\3L\3L\3L\3L\3M\3M\3M\3M\3M\3M\3M\3M\3M\3M\3N\3N\3N\3N\3N\3N\3N\3"+ + "N\3N\3N\3N\3O\3O\3O\3O\3O\3P\3P\3P\3P\3P\3P\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3Q\3"+ + "Q\3Q\3R\3R\3R\3R\3R\3R\3R\3R\3R\3R\3S\3S\3S\3S\3S\3S\3S\3S\3S\3T\3T\3"+ + "T\3T\3T\3T\3U\3U\3U\3U\3U\3U\3U\3V\3V\3V\3V\3V\3W\3W\3W\3W\3X\3X\3X\3"+ + "X\3X\3X\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Y\3Z\3Z\3Z\3Z\3Z\3[\3[\3[\3[\3[\3\\\3\\"+ + "\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3\\\3]\3]\3]\3^\3^\3^\3^\3_\3_\3_\3_"+ + "\3`\3`\3`\3a\3a\3a\3a\3a\3a\3a\3a\3a\3b\3b\3b\3c\3c\3c\3c\3c\3c\3c\3c"+ + "\3c\3c\3c\3d\3d\3d\3e\3e\3e\3e\3e\3e\3f\3f\3f\3f\3f\3g\3g\3g\3g\3g\3g"+ + "\3g\3g\3g\3h\3h\3h\3h\3h\3h\3h\3h\3i\3i\3i\3i\3i\3i\3i\3j\3j\3j\3j\3j"+ + "\3j\3j\3j\3j\3j\3k\3k\3k\3k\3k\3l\3l\3l\3l\3l\3l\3m\3m\3m\3m\3m\3n\3n"+ + "\3n\3n\3n\3n\3n\3n\3n\3o\3o\3o\3o\3o\3o\3o\3o\3o\3p\3p\3p\3p\3p\3p\3p"+ + "\3p\3q\3q\3q\3q\3q\3q\3q\3q\3r\3r\3r\3r\3r\3s\3s\3s\3s\3s\3s\3s\3s\3s"+ + "\3t\3t\3t\7t\u03a4\nt\ft\16t\u03a7\13t\3t\3t\3u\3u\3u\5u\u03ae\nu\3v\3"+ + "v\3v\3v\3v\3v\3w\3w\3x\3x\3y\3y\3y\3y\3y\3z\3z\3{\3{\3{\5{\u03c4\n{\3"+ + "|\3|\3}\3}\3}\3}\3}\7}\u03cd\n}\f}\16}\u03d0\13}\5}\u03d2\n}\3~\3~\3~"+ + "\3~\3~\7~\u03d9\n~\f~\16~\u03dc\13~\5~\u03de\n~\5~\u03e0\n~\3~\3~\5~\u03e4"+ + "\n~\3~\3~\3\177\6\177\u03e9\n\177\r\177\16\177\u03ea\3\u0080\3\u0080\3"+ + "\u0080\3\u0080\3\u0081\3\u0081\7\u0081\u03f3\n\u0081\f\u0081\16\u0081"+ + "\u03f6\13\u0081\3\u0082\5\u0082\u03f9\n\u0082\3\u0083\3\u0083\5\u0083"+ + "\u03fd\n\u0083\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084\3\u0084"+ + "\3\u0084\7\u0084\u0407\n\u0084\f\u0084\16\u0084\u040a\13\u0084\3\u0084"+ + "\6\u0084\u040d\n\u0084\r\u0084\16\u0084\u040e\3\u0084\3\u0084\3\u0084"+ + "\3\u0084\3\u0085\3\u0085\2\2\u0086\3\3\5\4\7\5\t\6\13\7\r\b\17\t\21\n"+ + "\23\13\25\f\27\r\31\16\33\17\35\20\37\21!\22#\23%\24\'\25)\26+\27-\30"+ + "/\31\61\32\63\33\65\34\67\359\36;\37= ?!A\"C#E$G%I&K\'M(O)Q*S+U,W-Y.["+ + "/]\60_\61a\62c\63e\64g\65i\66k\67m8o9q:s;u{?}@\177A\u0081B\u0083"+ + "C\u0085D\u0087E\u0089F\u008bG\u008dH\u008fI\u0091J\u0093K\u0095L\u0097"+ + "M\u0099N\u009bO\u009dP\u009fQ\u00a1R\u00a3S\u00a5T\u00a7U\u00a9V\u00ab"+ + "W\u00adX\u00afY\u00b1Z\u00b3[\u00b5\\\u00b7]\u00b9^\u00bb_\u00bd`\u00bf"+ + "a\u00c1b\u00c3c\u00c5d\u00c7e\u00c9f\u00cbg\u00cdh\u00cfi\u00d1j\u00d3"+ + "k\u00d5l\u00d7m\u00d9n\u00dbo\u00ddp\u00dfq\u00e1r\u00e3s\u00e5t\u00e7"+ + "u\u00e9\2\u00eb\2\u00ed\2\u00efv\u00f1w\u00f3x\u00f5y\u00f7z\u00f9{\u00fb"+ + "|\u00fd\2\u00ff}\u0101~\u0103\2\u0105\2\u0107\177\u0109\u0080\3\2\17\4"+ + "\2$$^^\n\2$$\61\61^^ddhhppttvv\5\2\62;CHch\3\2\62;\4\2GGgg\4\2--//\5\2"+ + "\13\f\17\17\"\"\20\2C\\aac|\u00c2\u00d8\u00da\u00f8\u00fa\u0301\u0372"+ + "\u037f\u0381\u2001\u200e\u200f\u2072\u2191\u2c02\u2ff1\u3003\ud801\uf902"+ + "\ufdd1\ufdf2\uffff\7\2//\62;\u00b9\u00b9\u0302\u0371\u2041\u2042\3\2<"+ + "<\3\2++\4\2**<<\7\2$$()>>}}\177\177\2\u0422\2\3\3\2\2\2\2\5\3\2\2\2\2"+ + "\7\3\2\2\2\2\t\3\2\2\2\2\13\3\2\2\2\2\r\3\2\2\2\2\17\3\2\2\2\2\21\3\2"+ + "\2\2\2\23\3\2\2\2\2\25\3\2\2\2\2\27\3\2\2\2\2\31\3\2\2\2\2\33\3\2\2\2"+ + "\2\35\3\2\2\2\2\37\3\2\2\2\2!\3\2\2\2\2#\3\2\2\2\2%\3\2\2\2\2\'\3\2\2"+ + "\2\2)\3\2\2\2\2+\3\2\2\2\2-\3\2\2\2\2/\3\2\2\2\2\61\3\2\2\2\2\63\3\2\2"+ + "\2\2\65\3\2\2\2\2\67\3\2\2\2\29\3\2\2\2\2;\3\2\2\2\2=\3\2\2\2\2?\3\2\2"+ + "\2\2A\3\2\2\2\2C\3\2\2\2\2E\3\2\2\2\2G\3\2\2\2\2I\3\2\2\2\2K\3\2\2\2\2"+ + "M\3\2\2\2\2O\3\2\2\2\2Q\3\2\2\2\2S\3\2\2\2\2U\3\2\2\2\2W\3\2\2\2\2Y\3"+ + "\2\2\2\2[\3\2\2\2\2]\3\2\2\2\2_\3\2\2\2\2a\3\2\2\2\2c\3\2\2\2\2e\3\2\2"+ + "\2\2g\3\2\2\2\2i\3\2\2\2\2k\3\2\2\2\2m\3\2\2\2\2o\3\2\2\2\2q\3\2\2\2\2"+ + "s\3\2\2\2\2u\3\2\2\2\2w\3\2\2\2\2y\3\2\2\2\2{\3\2\2\2\2}\3\2\2\2\2\177"+ + "\3\2\2\2\2\u0081\3\2\2\2\2\u0083\3\2\2\2\2\u0085\3\2\2\2\2\u0087\3\2\2"+ + "\2\2\u0089\3\2\2\2\2\u008b\3\2\2\2\2\u008d\3\2\2\2\2\u008f\3\2\2\2\2\u0091"+ + "\3\2\2\2\2\u0093\3\2\2\2\2\u0095\3\2\2\2\2\u0097\3\2\2\2\2\u0099\3\2\2"+ + "\2\2\u009b\3\2\2\2\2\u009d\3\2\2\2\2\u009f\3\2\2\2\2\u00a1\3\2\2\2\2\u00a3"+ + "\3\2\2\2\2\u00a5\3\2\2\2\2\u00a7\3\2\2\2\2\u00a9\3\2\2\2\2\u00ab\3\2\2"+ + "\2\2\u00ad\3\2\2\2\2\u00af\3\2\2\2\2\u00b1\3\2\2\2\2\u00b3\3\2\2\2\2\u00b5"+ + "\3\2\2\2\2\u00b7\3\2\2\2\2\u00b9\3\2\2\2\2\u00bb\3\2\2\2\2\u00bd\3\2\2"+ + "\2\2\u00bf\3\2\2\2\2\u00c1\3\2\2\2\2\u00c3\3\2\2\2\2\u00c5\3\2\2\2\2\u00c7"+ + "\3\2\2\2\2\u00c9\3\2\2\2\2\u00cb\3\2\2\2\2\u00cd\3\2\2\2\2\u00cf\3\2\2"+ + "\2\2\u00d1\3\2\2\2\2\u00d3\3\2\2\2\2\u00d5\3\2\2\2\2\u00d7\3\2\2\2\2\u00d9"+ + "\3\2\2\2\2\u00db\3\2\2\2\2\u00dd\3\2\2\2\2\u00df\3\2\2\2\2\u00e1\3\2\2"+ + "\2\2\u00e3\3\2\2\2\2\u00e5\3\2\2\2\2\u00e7\3\2\2\2\2\u00ef\3\2\2\2\2\u00f1"+ + "\3\2\2\2\2\u00f3\3\2\2\2\2\u00f5\3\2\2\2\2\u00f7\3\2\2\2\2\u00f9\3\2\2"+ + "\2\2\u00fb\3\2\2\2\2\u00ff\3\2\2\2\2\u0101\3\2\2\2\2\u0107\3\2\2\2\2\u0109"+ + "\3\2\2\2\3\u010b\3\2\2\2\5\u010d\3\2\2\2\7\u0114\3\2\2\2\t\u011e\3\2\2"+ + "\2\13\u0120\3\2\2\2\r\u0129\3\2\2\2\17\u0131\3\2\2\2\21\u0140\3\2\2\2"+ + "\23\u0142\3\2\2\2\25\u0154\3\2\2\2\27\u0167\3\2\2\2\31\u0170\3\2\2\2\33"+ + "\u017b\3\2\2\2\35\u017f\3\2\2\2\37\u0187\3\2\2\2!\u0191\3\2\2\2#\u019c"+ + "\3\2\2\2%\u01a2\3\2\2\2\'\u01b4\3\2\2\2)\u01bb\3\2\2\2+\u01bd\3\2\2\2"+ + "-\u01c0\3\2\2\2/\u01c9\3\2\2\2\61\u01d2\3\2\2\2\63\u01d4\3\2\2\2\65\u01d6"+ + "\3\2\2\2\67\u01d8\3\2\2\29\u01da\3\2\2\2;\u01e1\3\2\2\2=\u01e9\3\2\2\2"+ + "?\u01f1\3\2\2\2A\u01f6\3\2\2\2C\u01fd\3\2\2\2E\u01ff\3\2\2\2G\u0201\3"+ + "\2\2\2I\u0203\3\2\2\2K\u0206\3\2\2\2M\u0209\3\2\2\2O\u020c\3\2\2\2Q\u020f"+ + "\3\2\2\2S\u0212\3\2\2\2U\u0215\3\2\2\2W\u0218\3\2\2\2Y\u021a\3\2\2\2["+ + "\u021d\3\2\2\2]\u021f\3\2\2\2_\u0222\3\2\2\2a\u0225\3\2\2\2c\u0227\3\2"+ + "\2\2e\u0229\3\2\2\2g\u022d\3\2\2\2i\u0232\3\2\2\2k\u0236\3\2\2\2m\u0238"+ + "\3\2\2\2o\u023a\3\2\2\2q\u023c\3\2\2\2s\u023e\3\2\2\2u\u0241\3\2\2\2w"+ + "\u0243\3\2\2\2y\u0246\3\2\2\2{\u0249\3\2\2\2}\u024d\3\2\2\2\177\u0251"+ + "\3\2\2\2\u0081\u0257\3\2\2\2\u0083\u025d\3\2\2\2\u0085\u0260\3\2\2\2\u0087"+ + "\u0266\3\2\2\2\u0089\u026d\3\2\2\2\u008b\u0270\3\2\2\2\u008d\u0273\3\2"+ + "\2\2\u008f\u0276\3\2\2\2\u0091\u0279\3\2\2\2\u0093\u0282\3\2\2\2\u0095"+ + "\u0288\3\2\2\2\u0097\u028e\3\2\2\2\u0099\u0295\3\2\2\2\u009b\u029f\3\2"+ + "\2\2\u009d\u02aa\3\2\2\2\u009f\u02af\3\2\2\2\u00a1\u02b5\3\2\2\2\u00a3"+ + "\u02bf\3\2\2\2\u00a5\u02c9\3\2\2\2\u00a7\u02d2\3\2\2\2\u00a9\u02d8\3\2"+ + "\2\2\u00ab\u02df\3\2\2\2\u00ad\u02e4\3\2\2\2\u00af\u02e8\3\2\2\2\u00b1"+ + "\u02ee\3\2\2\2\u00b3\u02f6\3\2\2\2\u00b5\u02fb\3\2\2\2\u00b7\u0300\3\2"+ + "\2\2\u00b9\u030b\3\2\2\2\u00bb\u030e\3\2\2\2\u00bd\u0312\3\2\2\2\u00bf"+ + "\u0316\3\2\2\2\u00c1\u0319\3\2\2\2\u00c3\u0322\3\2\2\2\u00c5\u0325\3\2"+ + "\2\2\u00c7\u0330\3\2\2\2\u00c9\u0333\3\2\2\2\u00cb\u0339\3\2\2\2\u00cd"+ + "\u033e\3\2\2\2\u00cf\u0347\3\2\2\2\u00d1\u034f\3\2\2\2\u00d3\u0356\3\2"+ + "\2\2\u00d5\u0360\3\2\2\2\u00d7\u0365\3\2\2\2\u00d9\u036b\3\2\2\2\u00db"+ + "\u0370\3\2\2\2\u00dd\u0379\3\2\2\2\u00df\u0382\3\2\2\2\u00e1\u038a\3\2"+ + "\2\2\u00e3\u0392\3\2\2\2\u00e5\u0397\3\2\2\2\u00e7\u03a0\3\2\2\2\u00e9"+ + "\u03aa\3\2\2\2\u00eb\u03af\3\2\2\2\u00ed\u03b5\3\2\2\2\u00ef\u03b7\3\2"+ + "\2\2\u00f1\u03b9\3\2\2\2\u00f3\u03be\3\2\2\2\u00f5\u03c3\3\2\2\2\u00f7"+ + "\u03c5\3\2\2\2\u00f9\u03d1\3\2\2\2\u00fb\u03df\3\2\2\2\u00fd\u03e8\3\2"+ + "\2\2\u00ff\u03ec\3\2\2\2\u0101\u03f0\3\2\2\2\u0103\u03f8\3\2\2\2\u0105"+ + "\u03fc\3\2\2\2\u0107\u03fe\3\2\2\2\u0109\u0414\3\2\2\2\u010b\u010c\7="+ + "\2\2\u010c\4\3\2\2\2\u010d\u010e\7o\2\2\u010e\u010f\7q\2\2\u010f\u0110"+ + "\7f\2\2\u0110\u0111\7w\2\2\u0111\u0112\7n\2\2\u0112\u0113\7g\2\2\u0113"+ + "\6\3\2\2\2\u0114\u0115\7p\2\2\u0115\u0116\7c\2\2\u0116\u0117\7o\2\2\u0117"+ + "\u0118\7g\2\2\u0118\u0119\7u\2\2\u0119\u011a\7r\2\2\u011a\u011b\7c\2\2"+ + "\u011b\u011c\7e\2\2\u011c\u011d\7g\2\2\u011d\b\3\2\2\2\u011e\u011f\7?"+ + "\2\2\u011f\n\3\2\2\2\u0120\u0121\7q\2\2\u0121\u0122\7t\2\2\u0122\u0123"+ + "\7f\2\2\u0123\u0124\7g\2\2\u0124\u0125\7t\2\2\u0125\u0126\7k\2\2\u0126"+ + "\u0127\7p\2\2\u0127\u0128\7i\2\2\u0128\f\3\2\2\2\u0129\u012a\7q\2\2\u012a"+ + "\u012b\7t\2\2\u012b\u012c\7f\2\2\u012c\u012d\7g\2\2\u012d\u012e\7t\2\2"+ + "\u012e\u012f\7g\2\2\u012f\u0130\7f\2\2\u0130\16\3\2\2\2\u0131\u0132\7"+ + "f\2\2\u0132\u0133\7g\2\2\u0133\u0134\7e\2\2\u0134\u0135\7k\2\2\u0135\u0136"+ + "\7o\2\2\u0136\u0137\7c\2\2\u0137\u0138\7n\2\2\u0138\u0139\7/\2\2\u0139"+ + "\u013a\7h\2\2\u013a\u013b\7q\2\2\u013b\u013c\7t\2\2\u013c\u013d\7o\2\2"+ + "\u013d\u013e\7c\2\2\u013e\u013f\7v\2\2\u013f\20\3\2\2\2\u0140\u0141\7"+ + "<\2\2\u0141\22\3\2\2\2\u0142\u0143\7f\2\2\u0143\u0144\7g\2\2\u0144\u0145"+ + "\7e\2\2\u0145\u0146\7k\2\2\u0146\u0147\7o\2\2\u0147\u0148\7c\2\2\u0148"+ + "\u0149\7n\2\2\u0149\u014a\7/\2\2\u014a\u014b\7u\2\2\u014b\u014c\7g\2\2"+ + "\u014c\u014d\7r\2\2\u014d\u014e\7c\2\2\u014e\u014f\7t\2\2\u014f\u0150"+ + "\7c\2\2\u0150\u0151\7v\2\2\u0151\u0152\7q\2\2\u0152\u0153\7t\2\2\u0153"+ + "\24\3\2\2\2\u0154\u0155\7i\2\2\u0155\u0156\7t\2\2\u0156\u0157\7q\2\2\u0157"+ + "\u0158\7w\2\2\u0158\u0159\7r\2\2\u0159\u015a\7k\2\2\u015a\u015b\7p\2\2"+ + "\u015b\u015c\7i\2\2\u015c\u015d\7/\2\2\u015d\u015e\7u\2\2\u015e\u015f"+ + "\7g\2\2\u015f\u0160\7r\2\2\u0160\u0161\7c\2\2\u0161\u0162\7t\2\2\u0162"+ + "\u0163\7c\2\2\u0163\u0164\7v\2\2\u0164\u0165\7q\2\2\u0165\u0166\7t\2\2"+ + "\u0166\26\3\2\2\2\u0167\u0168\7k\2\2\u0168\u0169\7p\2\2\u0169\u016a\7"+ + "h\2\2\u016a\u016b\7k\2\2\u016b\u016c\7p\2\2\u016c\u016d\7k\2\2\u016d\u016e"+ + "\7v\2\2\u016e\u016f\7{\2\2\u016f\30\3\2\2\2\u0170\u0171\7o\2\2\u0171\u0172"+ + "\7k\2\2\u0172\u0173\7p\2\2\u0173\u0174\7w\2\2\u0174\u0175\7u\2\2\u0175"+ + "\u0176\7/\2\2\u0176\u0177\7u\2\2\u0177\u0178\7k\2\2\u0178\u0179\7i\2\2"+ + "\u0179\u017a\7p\2\2\u017a\32\3\2\2\2\u017b\u017c\7P\2\2\u017c\u017d\7"+ + "c\2\2\u017d\u017e\7P\2\2\u017e\34\3\2\2\2\u017f\u0180\7r\2\2\u0180\u0181"+ + "\7g\2\2\u0181\u0182\7t\2\2\u0182\u0183\7e\2\2\u0183\u0184\7g\2\2\u0184"+ + "\u0185\7p\2\2\u0185\u0186\7v\2\2\u0186\36\3\2\2\2\u0187\u0188\7r\2\2\u0188"+ + "\u0189\7g\2\2\u0189\u018a\7t\2\2\u018a\u018b\7/\2\2\u018b\u018c\7o\2\2"+ + "\u018c\u018d\7k\2\2\u018d\u018e\7n\2\2\u018e\u018f\7n\2\2\u018f\u0190"+ + "\7g\2\2\u0190 \3\2\2\2\u0191\u0192\7|\2\2\u0192\u0193\7g\2\2\u0193\u0194"+ + "\7t\2\2\u0194\u0195\7q\2\2\u0195\u0196\7/\2\2\u0196\u0197\7f\2\2\u0197"+ + "\u0198\7k\2\2\u0198\u0199\7i\2\2\u0199\u019a\7k\2\2\u019a\u019b\7v\2\2"+ + "\u019b\"\3\2\2\2\u019c\u019d\7f\2\2\u019d\u019e\7k\2\2\u019e\u019f\7i"+ + "\2\2\u019f\u01a0\7k\2\2\u01a0\u01a1\7v\2\2\u01a1$\3\2\2\2\u01a2\u01a3"+ + "\7r\2\2\u01a3\u01a4\7c\2\2\u01a4\u01a5\7v\2\2\u01a5\u01a6\7v\2\2\u01a6"+ + "\u01a7\7g\2\2\u01a7\u01a8\7t\2\2\u01a8\u01a9\7p\2\2\u01a9\u01aa\7/\2\2"+ + "\u01aa\u01ab\7u\2\2\u01ab\u01ac\7g\2\2\u01ac\u01ad\7r\2\2\u01ad\u01ae"+ + "\7c\2\2\u01ae\u01af\7t\2\2\u01af\u01b0\7c\2\2\u01b0\u01b1\7v\2\2\u01b1"+ + "\u01b2\7q\2\2\u01b2\u01b3\7t\2\2\u01b3&\3\2\2\2\u01b4\u01b5\7k\2\2\u01b5"+ + "\u01b6\7o\2\2\u01b6\u01b7\7r\2\2\u01b7\u01b8\7q\2\2\u01b8\u01b9\7t\2\2"+ + "\u01b9\u01ba\7v\2\2\u01ba(\3\2\2\2\u01bb\u01bc\7.\2\2\u01bc*\3\2\2\2\u01bd"+ + "\u01be\7<\2\2\u01be\u01bf\7?\2\2\u01bf,\3\2\2\2\u01c0\u01c1\7g\2\2\u01c1"+ + "\u01c2\7z\2\2\u01c2\u01c3\7v\2\2\u01c3\u01c4\7g\2\2\u01c4\u01c5\7t\2\2"+ + "\u01c5\u01c6\7p\2\2\u01c6\u01c7\7c\2\2\u01c7\u01c8\7n\2\2\u01c8.\3\2\2"+ + "\2\u01c9\u01ca\7h\2\2\u01ca\u01cb\7w\2\2\u01cb\u01cc\7p\2\2\u01cc\u01cd"+ + "\7e\2\2\u01cd\u01ce\7v\2\2\u01ce\u01cf\7k\2\2\u01cf\u01d0\7q\2\2\u01d0"+ + "\u01d1\7p\2\2\u01d1\60\3\2\2\2\u01d2\u01d3\7*\2\2\u01d3\62\3\2\2\2\u01d4"+ + "\u01d5\7+\2\2\u01d5\64\3\2\2\2\u01d6\u01d7\7}\2\2\u01d7\66\3\2\2\2\u01d8"+ + "\u01d9\7\177\2\2\u01d98\3\2\2\2\u01da\u01db\7l\2\2\u01db\u01dc\7u\2\2"+ + "\u01dc\u01dd\7q\2\2\u01dd\u01de\7w\2\2\u01de\u01df\7p\2\2\u01df\u01e0"+ + "\7f\2\2\u01e0:\3\2\2\2\u01e1\u01e2\7e\2\2\u01e2\u01e3\7q\2\2\u01e3\u01e4"+ + "\7o\2\2\u01e4\u01e5\7r\2\2\u01e5\u01e6\7c\2\2\u01e6\u01e7\7e\2\2\u01e7"+ + "\u01e8\7v\2\2\u01e8<\3\2\2\2\u01e9\u01ea\7x\2\2\u01ea\u01eb\7g\2\2\u01eb"+ + "\u01ec\7t\2\2\u01ec\u01ed\7d\2\2\u01ed\u01ee\7q\2\2\u01ee\u01ef\7u\2\2"+ + "\u01ef\u01f0\7g\2\2\u01f0>\3\2\2\2\u01f1\u01f2\7l\2\2\u01f2\u01f3\7u\2"+ + "\2\u01f3\u01f4\7q\2\2\u01f4\u01f5\7p\2\2\u01f5@\3\2\2\2\u01f6\u01f7\7"+ + "u\2\2\u01f7\u01f8\7e\2\2\u01f8\u01f9\7j\2\2\u01f9\u01fa\7g\2\2\u01fa\u01fb"+ + "\7o\2\2\u01fb\u01fc\7c\2\2\u01fcB\3\2\2\2\u01fd\u01fe\7&\2\2\u01feD\3"+ + "\2\2\2\u01ff\u0200\7~\2\2\u0200F\3\2\2\2\u0201\u0202\7,\2\2\u0202H\3\2"+ + "\2\2\u0203\u0204\7g\2\2\u0204\u0205\7s\2\2\u0205J\3\2\2\2\u0206\u0207"+ + "\7p\2\2\u0207\u0208\7g\2\2\u0208L\3\2\2\2\u0209\u020a\7n\2\2\u020a\u020b"+ + "\7v\2\2\u020bN\3\2\2\2\u020c\u020d\7n\2\2\u020d\u020e\7g\2\2\u020eP\3"+ + "\2\2\2\u020f\u0210\7i\2\2\u0210\u0211\7v\2\2\u0211R\3\2\2\2\u0212\u0213"+ + "\7i\2\2\u0213\u0214\7g\2\2\u0214T\3\2\2\2\u0215\u0216\7#\2\2\u0216\u0217"+ + "\7?\2\2\u0217V\3\2\2\2\u0218\u0219\7>\2\2\u0219X\3\2\2\2\u021a\u021b\7"+ + ">\2\2\u021b\u021c\7?\2\2\u021cZ\3\2\2\2\u021d\u021e\7@\2\2\u021e\\\3\2"+ + "\2\2\u021f\u0220\7@\2\2\u0220\u0221\7?\2\2\u0221^\3\2\2\2\u0222\u0223"+ + "\7~\2\2\u0223\u0224\7~\2\2\u0224`\3\2\2\2\u0225\u0226\7-\2\2\u0226b\3"+ + "\2\2\2\u0227\u0228\7/\2\2\u0228d\3\2\2\2\u0229\u022a\7f\2\2\u022a\u022b"+ + "\7k\2\2\u022b\u022c\7x\2\2\u022cf\3\2\2\2\u022d\u022e\7k\2\2\u022e\u022f"+ + "\7f\2\2\u022f\u0230\7k\2\2\u0230\u0231\7x\2\2\u0231h\3\2\2\2\u0232\u0233"+ + "\7o\2\2\u0233\u0234\7q\2\2\u0234\u0235\7f\2\2\u0235j\3\2\2\2\u0236\u0237"+ + "\7#\2\2\u0237l\3\2\2\2\u0238\u0239\7]\2\2\u0239n\3\2\2\2\u023a\u023b\7"+ + "_\2\2\u023bp\3\2\2\2\u023c\u023d\7\60\2\2\u023dr\3\2\2\2\u023e\u023f\7"+ + "&\2\2\u023f\u0240\7&\2\2\u0240t\3\2\2\2\u0241\u0242\7%\2\2\u0242v\3\2"+ + "\2\2\u0243\u0244\7}\2\2\u0244\u0245\7~\2\2\u0245x\3\2\2\2\u0246\u0247"+ + "\7~\2\2\u0247\u0248\7\177\2\2\u0248z\3\2\2\2\u0249\u024a\7h\2\2\u024a"+ + "\u024b\7q\2\2\u024b\u024c\7t\2\2\u024c|\3\2\2\2\u024d\u024e\7n\2\2\u024e"+ + "\u024f\7g\2\2\u024f\u0250\7v\2\2\u0250~\3\2\2\2\u0251\u0252\7y\2\2\u0252"+ + "\u0253\7j\2\2\u0253\u0254\7g\2\2\u0254\u0255\7t\2\2\u0255\u0256\7g\2\2"+ + "\u0256\u0080\3\2\2\2\u0257\u0258\7i\2\2\u0258\u0259\7t\2\2\u0259\u025a"+ + "\7q\2\2\u025a\u025b\7w\2\2\u025b\u025c\7r\2\2\u025c\u0082\3\2\2\2\u025d"+ + "\u025e\7d\2\2\u025e\u025f\7{\2\2\u025f\u0084\3\2\2\2\u0260\u0261\7q\2"+ + "\2\u0261\u0262\7t\2\2\u0262\u0263\7f\2\2\u0263\u0264\7g\2\2\u0264\u0265"+ + "\7t\2\2\u0265\u0086\3\2\2\2\u0266\u0267\7t\2\2\u0267\u0268\7g\2\2\u0268"+ + "\u0269\7v\2\2\u0269\u026a\7w\2\2\u026a\u026b\7t\2\2\u026b\u026c\7p\2\2"+ + "\u026c\u0088\3\2\2\2\u026d\u026e\7k\2\2\u026e\u026f\7h\2\2\u026f\u008a"+ + "\3\2\2\2\u0270\u0271\7k\2\2\u0271\u0272\7p\2\2\u0272\u008c\3\2\2\2\u0273"+ + "\u0274\7c\2\2\u0274\u0275\7u\2\2\u0275\u008e\3\2\2\2\u0276\u0277\7c\2"+ + "\2\u0277\u0278\7v\2\2\u0278\u0090\3\2\2\2\u0279\u027a\7c\2\2\u027a\u027b"+ + "\7n\2\2\u027b\u027c\7n\2\2\u027c\u027d\7q\2\2\u027d\u027e\7y\2\2\u027e"+ + "\u027f\7k\2\2\u027f\u0280\7p\2\2\u0280\u0281\7i\2\2\u0281\u0092\3\2\2"+ + "\2\u0282\u0283\7g\2\2\u0283\u0284\7o\2\2\u0284\u0285\7r\2\2\u0285\u0286"+ + "\7v\2\2\u0286\u0287\7{\2\2\u0287\u0094\3\2\2\2\u0288\u0289\7e\2\2\u0289"+ + "\u028a\7q\2\2\u028a\u028b\7w\2\2\u028b\u028c\7p\2\2\u028c\u028d\7v\2\2"+ + "\u028d\u0096\3\2\2\2\u028e\u028f\7u\2\2\u028f\u0290\7v\2\2\u0290\u0291"+ + "\7c\2\2\u0291\u0292\7d\2\2\u0292\u0293\7n\2\2\u0293\u0294\7g\2\2\u0294"+ + "\u0098\3\2\2\2\u0295\u0296\7c\2\2\u0296\u0297\7u\2\2\u0297\u0298\7e\2"+ + "\2\u0298\u0299\7g\2\2\u0299\u029a\7p\2\2\u029a\u029b\7f\2\2\u029b\u029c"+ + "\7k\2\2\u029c\u029d\7p\2\2\u029d\u029e\7i\2\2\u029e\u009a\3\2\2\2\u029f"+ + "\u02a0\7f\2\2\u02a0\u02a1\7g\2\2\u02a1\u02a2\7u\2\2\u02a2\u02a3\7e\2\2"+ + "\u02a3\u02a4\7g\2\2\u02a4\u02a5\7p\2\2\u02a5\u02a6\7f\2\2\u02a6\u02a7"+ + "\7k\2\2\u02a7\u02a8\7p\2\2\u02a8\u02a9\7i\2\2\u02a9\u009c\3\2\2\2\u02aa"+ + "\u02ab\7u\2\2\u02ab\u02ac\7q\2\2\u02ac\u02ad\7o\2\2\u02ad\u02ae\7g\2\2"+ + "\u02ae\u009e\3\2\2\2\u02af\u02b0\7g\2\2\u02b0\u02b1\7x\2\2\u02b1\u02b2"+ + "\7g\2\2\u02b2\u02b3\7t\2\2\u02b3\u02b4\7{\2\2\u02b4\u00a0\3\2\2\2\u02b5"+ + "\u02b6\7u\2\2\u02b6\u02b7\7c\2\2\u02b7\u02b8\7v\2\2\u02b8\u02b9\7k\2\2"+ + "\u02b9\u02ba\7u\2\2\u02ba\u02bb\7h\2\2\u02bb\u02bc\7k\2\2\u02bc\u02bd"+ + "\7g\2\2\u02bd\u02be\7u\2\2\u02be\u00a2\3\2\2\2\u02bf\u02c0\7e\2\2\u02c0"+ + "\u02c1\7q\2\2\u02c1\u02c2\7n\2\2\u02c2\u02c3\7n\2\2\u02c3\u02c4\7c\2\2"+ + "\u02c4\u02c5\7v\2\2\u02c5\u02c6\7k\2\2\u02c6\u02c7\7q\2\2\u02c7\u02c8"+ + "\7p\2\2\u02c8\u00a4\3\2\2\2\u02c9\u02ca\7i\2\2\u02ca\u02cb\7t\2\2\u02cb"+ + "\u02cc\7g\2\2\u02cc\u02cd\7c\2\2\u02cd\u02ce\7v\2\2\u02ce\u02cf\7g\2\2"+ + "\u02cf\u02d0\7u\2\2\u02d0\u02d1\7v\2\2\u02d1\u00a6\3\2\2\2\u02d2\u02d3"+ + "\7n\2\2\u02d3\u02d4\7g\2\2\u02d4\u02d5\7c\2\2\u02d5\u02d6\7u\2\2\u02d6"+ + "\u02d7\7v\2\2\u02d7\u00a8\3\2\2\2\u02d8\u02d9\7u\2\2\u02d9\u02da\7y\2"+ + "\2\u02da\u02db\7k\2\2\u02db\u02dc\7v\2\2\u02dc\u02dd\7e\2\2\u02dd\u02de"+ + "\7j\2\2\u02de\u00aa\3\2\2\2\u02df\u02e0\7e\2\2\u02e0\u02e1\7c\2\2\u02e1"+ + "\u02e2\7u\2\2\u02e2\u02e3\7g\2\2\u02e3\u00ac\3\2\2\2\u02e4\u02e5\7v\2"+ + "\2\u02e5\u02e6\7t\2\2\u02e6\u02e7\7{\2\2\u02e7\u00ae\3\2\2\2\u02e8\u02e9"+ + "\7e\2\2\u02e9\u02ea\7c\2\2\u02ea\u02eb\7v\2\2\u02eb\u02ec\7e\2\2\u02ec"+ + "\u02ed\7j\2\2\u02ed\u00b0\3\2\2\2\u02ee\u02ef\7f\2\2\u02ef\u02f0\7g\2"+ + "\2\u02f0\u02f1\7h\2\2\u02f1\u02f2\7c\2\2\u02f2\u02f3\7w\2\2\u02f3\u02f4"+ + "\7n\2\2\u02f4\u02f5\7v\2\2\u02f5\u00b2\3\2\2\2\u02f6\u02f7\7v\2\2\u02f7"+ + "\u02f8\7j\2\2\u02f8\u02f9\7g\2\2\u02f9\u02fa\7p\2\2\u02fa\u00b4\3\2\2"+ + "\2\u02fb\u02fc\7g\2\2\u02fc\u02fd\7n\2\2\u02fd\u02fe\7u\2\2\u02fe\u02ff"+ + "\7g\2\2\u02ff\u00b6\3\2\2\2\u0300\u0301\7v\2\2\u0301\u0302\7{\2\2\u0302"+ + "\u0303\7r\2\2\u0303\u0304\7g\2\2\u0304\u0305\7u\2\2\u0305\u0306\7y\2\2"+ + "\u0306\u0307\7k\2\2\u0307\u0308\7v\2\2\u0308\u0309\7e\2\2\u0309\u030a"+ + "\7j\2\2\u030a\u00b8\3\2\2\2\u030b\u030c\7q\2\2\u030c\u030d\7t\2\2\u030d"+ + "\u00ba\3\2\2\2\u030e\u030f\7c\2\2\u030f\u0310\7p\2\2\u0310\u0311\7f\2"+ + "\2\u0311\u00bc\3\2\2\2\u0312\u0313\7p\2\2\u0313\u0314\7q\2\2\u0314\u0315"+ + "\7v\2\2\u0315\u00be\3\2\2\2\u0316\u0317\7v\2\2\u0317\u0318\7q\2\2\u0318"+ + "\u00c0\3\2\2\2\u0319\u031a\7k\2\2\u031a\u031b\7p\2\2\u031b\u031c\7u\2"+ + "\2\u031c\u031d\7v\2\2\u031d\u031e\7c\2\2\u031e\u031f\7p\2\2\u031f\u0320"+ + "\7e\2\2\u0320\u0321\7g\2\2\u0321\u00c2\3\2\2\2\u0322\u0323\7q\2\2\u0323"+ + "\u0324\7h\2\2\u0324\u00c4\3\2\2\2\u0325\u0326\7u\2\2\u0326\u0327\7v\2"+ + "\2\u0327\u0328\7c\2\2\u0328\u0329\7v\2\2\u0329\u032a\7k\2\2\u032a\u032b"+ + "\7e\2\2\u032b\u032c\7c\2\2\u032c\u032d\7n\2\2\u032d\u032e\7n\2\2\u032e"+ + "\u032f\7{\2\2\u032f\u00c6\3\2\2\2\u0330\u0331\7k\2\2\u0331\u0332\7u\2"+ + "\2\u0332\u00c8\3\2\2\2\u0333\u0334\7v\2\2\u0334\u0335\7t\2\2\u0335\u0336"+ + "\7g\2\2\u0336\u0337\7c\2\2\u0337\u0338\7v\2\2\u0338\u00ca\3\2\2\2\u0339"+ + "\u033a\7e\2\2\u033a\u033b\7c\2\2\u033b\u033c\7u\2\2\u033c\u033d\7v\2\2"+ + "\u033d\u00cc\3\2\2\2\u033e\u033f\7e\2\2\u033f\u0340\7c\2\2\u0340\u0341"+ + "\7u\2\2\u0341\u0342\7v\2\2\u0342\u0343\7c\2\2\u0343\u0344\7d\2\2\u0344"+ + "\u0345\7n\2\2\u0345\u0346\7g\2\2\u0346\u00ce\3\2\2\2\u0347\u0348\7x\2"+ + "\2\u0348\u0349\7g\2\2\u0349\u034a\7t\2\2\u034a\u034b\7u\2\2\u034b\u034c"+ + "\7k\2\2\u034c\u034d\7q\2\2\u034d\u034e\7p\2\2\u034e\u00d0\3\2\2\2\u034f"+ + "\u0350\7l\2\2\u0350\u0351\7u\2\2\u0351\u0352\7q\2\2\u0352\u0353\7p\2\2"+ + "\u0353\u0354\7k\2\2\u0354\u0355\7s\2\2\u0355\u00d2\3\2\2\2\u0356\u0357"+ + "\7w\2\2\u0357\u0358\7p\2\2\u0358\u0359\7q\2\2\u0359\u035a\7t\2\2\u035a"+ + "\u035b\7f\2\2\u035b\u035c\7g\2\2\u035c\u035d\7t\2\2\u035d\u035e\7g\2\2"+ + "\u035e\u035f\7f\2\2\u035f\u00d4\3\2\2\2\u0360\u0361\7v\2\2\u0361\u0362"+ + "\7t\2\2\u0362\u0363\7w\2\2\u0363\u0364\7g\2\2\u0364\u00d6\3\2\2\2\u0365"+ + "\u0366\7h\2\2\u0366\u0367\7c\2\2\u0367\u0368\7n\2\2\u0368\u0369\7u\2\2"+ + "\u0369\u036a\7g\2\2\u036a\u00d8\3\2\2\2\u036b\u036c\7v\2\2\u036c\u036d"+ + "\7{\2\2\u036d\u036e\7r\2\2\u036e\u036f\7g\2\2\u036f\u00da\3\2\2\2\u0370"+ + "\u0371\7x\2\2\u0371\u0372\7c\2\2\u0372\u0373\7n\2\2\u0373\u0374\7k\2\2"+ + "\u0374\u0375\7f\2\2\u0375\u0376\7c\2\2\u0376\u0377\7v\2\2\u0377\u0378"+ + "\7g\2\2\u0378\u00dc\3\2\2\2\u0379\u037a\7c\2\2\u037a\u037b\7p\2\2\u037b"+ + "\u037c\7p\2\2\u037c\u037d\7q\2\2\u037d\u037e\7v\2\2\u037e\u037f\7c\2\2"+ + "\u037f\u0380\7v\2\2\u0380\u0381\7g\2\2\u0381\u00de\3\2\2\2\u0382\u0383"+ + "\7f\2\2\u0383\u0384\7g\2\2\u0384\u0385\7e\2\2\u0385\u0386\7n\2\2\u0386"+ + "\u0387\7c\2\2\u0387\u0388\7t\2\2\u0388\u0389\7g\2\2\u0389\u00e0\3\2\2"+ + "\2\u038a\u038b\7e\2\2\u038b\u038c\7q\2\2\u038c\u038d\7p\2\2\u038d\u038e"+ + "\7v\2\2\u038e\u038f\7g\2\2\u038f\u0390\7z\2\2\u0390\u0391\7v\2\2\u0391"+ + "\u00e2\3\2\2\2\u0392\u0393\7k\2\2\u0393\u0394\7v\2\2\u0394\u0395\7g\2"+ + "\2\u0395\u0396\7o\2\2\u0396\u00e4\3\2\2\2\u0397\u0398\7x\2\2\u0398\u0399"+ + "\7c\2\2\u0399\u039a\7t\2\2\u039a\u039b\7k\2\2\u039b\u039c\7c\2\2\u039c"+ + "\u039d\7d\2\2\u039d\u039e\7n\2\2\u039e\u039f\7g\2\2\u039f\u00e6\3\2\2"+ + "\2\u03a0\u03a5\7$\2\2\u03a1\u03a4\5\u00e9u\2\u03a2\u03a4\n\2\2\2\u03a3"+ + "\u03a1\3\2\2\2\u03a3\u03a2\3\2\2\2\u03a4\u03a7\3\2\2\2\u03a5\u03a3\3\2"+ + "\2\2\u03a5\u03a6\3\2\2\2\u03a6\u03a8\3\2\2\2\u03a7\u03a5\3\2\2\2\u03a8"+ + "\u03a9\7$\2\2\u03a9\u00e8\3\2\2\2\u03aa\u03ad\7^\2\2\u03ab\u03ae\t\3\2"+ + "\2\u03ac\u03ae\5\u00ebv\2\u03ad\u03ab\3\2\2\2\u03ad\u03ac\3\2\2\2\u03ae"+ + "\u00ea\3\2\2\2\u03af\u03b0\7w\2\2\u03b0\u03b1\5\u00edw\2\u03b1\u03b2\5"+ + "\u00edw\2\u03b2\u03b3\5\u00edw\2\u03b3\u03b4\5\u00edw\2\u03b4\u00ec\3"+ + "\2\2\2\u03b5\u03b6\t\4\2\2\u03b6\u00ee\3\2\2\2\u03b7\u03b8\7A\2\2\u03b8"+ + "\u00f0\3\2\2\2\u03b9\u03ba\7p\2\2\u03ba\u03bb\7w\2\2\u03bb\u03bc\7n\2"+ + "\2\u03bc\u03bd\7n\2\2\u03bd\u00f2\3\2\2\2\u03be\u03bf\5\u00f5{\2\u03bf"+ + "\u00f4\3\2\2\2\u03c0\u03c4\5\u00f7|\2\u03c1\u03c4\5\u00f9}\2\u03c2\u03c4"+ + "\5\u00fb~\2\u03c3\u03c0\3\2\2\2\u03c3\u03c1\3\2\2\2\u03c3\u03c2\3\2\2"+ + "\2\u03c4\u00f6\3\2\2\2\u03c5\u03c6\5\u00fd\177\2\u03c6\u00f8\3\2\2\2\u03c7"+ + "\u03c8\7\60\2\2\u03c8\u03d2\5\u00fd\177\2\u03c9\u03ca\5\u00fd\177\2\u03ca"+ + "\u03ce\7\60\2\2\u03cb\u03cd\t\5\2\2\u03cc\u03cb\3\2\2\2\u03cd\u03d0\3"+ + "\2\2\2\u03ce\u03cc\3\2\2\2\u03ce\u03cf\3\2\2\2\u03cf\u03d2\3\2\2\2\u03d0"+ + "\u03ce\3\2\2\2\u03d1\u03c7\3\2\2\2\u03d1\u03c9\3\2\2\2\u03d2\u00fa\3\2"+ + "\2\2\u03d3\u03d4\7\60\2\2\u03d4\u03e0\5\u00fd\177\2\u03d5\u03dd\5\u00fd"+ + "\177\2\u03d6\u03da\7\60\2\2\u03d7\u03d9\t\5\2\2\u03d8\u03d7\3\2\2\2\u03d9"+ + "\u03dc\3\2\2\2\u03da\u03d8\3\2\2\2\u03da\u03db\3\2\2\2\u03db\u03de\3\2"+ + "\2\2\u03dc\u03da\3\2\2\2\u03dd\u03d6\3\2\2\2\u03dd\u03de\3\2\2\2\u03de"+ + "\u03e0\3\2\2\2\u03df\u03d3\3\2\2\2\u03df\u03d5\3\2\2\2\u03e0\u03e1\3\2"+ + "\2\2\u03e1\u03e3\t\6\2\2\u03e2\u03e4\t\7\2\2\u03e3\u03e2\3\2\2\2\u03e3"+ + "\u03e4\3\2\2\2\u03e4\u03e5\3\2\2\2\u03e5\u03e6\5\u00fd\177\2\u03e6\u00fc"+ + "\3\2\2\2\u03e7\u03e9\t\5\2\2\u03e8\u03e7\3\2\2\2\u03e9\u03ea\3\2\2\2\u03ea"+ + "\u03e8\3\2\2\2\u03ea\u03eb\3\2\2\2\u03eb\u00fe\3\2\2\2\u03ec\u03ed\t\b"+ + "\2\2\u03ed\u03ee\3\2\2\2\u03ee\u03ef\b\u0080\2\2\u03ef\u0100\3\2\2\2\u03f0"+ + "\u03f4\5\u0103\u0082\2\u03f1\u03f3\5\u0105\u0083\2\u03f2\u03f1\3\2\2\2"+ + "\u03f3\u03f6\3\2\2\2\u03f4\u03f2\3\2\2\2\u03f4\u03f5\3\2\2\2\u03f5\u0102"+ + "\3\2\2\2\u03f6\u03f4\3\2\2\2\u03f7\u03f9\t\t\2\2\u03f8\u03f7\3\2\2\2\u03f9"+ + "\u0104\3\2\2\2\u03fa\u03fd\5\u0103\u0082\2\u03fb\u03fd\t\n\2\2\u03fc\u03fa"+ + "\3\2\2\2\u03fc\u03fb\3\2\2\2\u03fd\u0106\3\2\2\2\u03fe\u03ff\7*\2\2\u03ff"+ + "\u0408\7<\2\2\u0400\u0407\5\u0107\u0084\2\u0401\u0402\7*\2\2\u0402\u0407"+ + "\n\13\2\2\u0403\u0404\7<\2\2\u0404\u0407\n\f\2\2\u0405\u0407\n\r\2\2\u0406"+ + "\u0400\3\2\2\2\u0406\u0401\3\2\2\2\u0406\u0403\3\2\2\2\u0406\u0405\3\2"+ + "\2\2\u0407\u040a\3\2\2\2\u0408\u0406\3\2\2\2\u0408\u0409\3\2\2\2\u0409"+ + "\u040c\3\2\2\2\u040a\u0408\3\2\2\2\u040b\u040d\7<\2\2\u040c\u040b\3\2"+ + "\2\2\u040d\u040e\3\2\2\2\u040e\u040c\3\2\2\2\u040e\u040f\3\2\2\2\u040f"+ + "\u0410\3\2\2\2\u0410\u0411\7+\2\2\u0411\u0412\3\2\2\2\u0412\u0413\b\u0084"+ + "\2\2\u0413\u0108\3\2\2\2\u0414\u0415\n\16\2\2\u0415\u010a\3\2\2\2\24\2"+ + "\u03a3\u03a5\u03ad\u03c3\u03ce\u03d1\u03da\u03dd\u03df\u03e3\u03ea\u03f4"+ + "\u03f8\u03fc\u0406\u0408\u040e\3\2\3\2"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens index 665fe0525..1a3cdf8b7 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.tokens @@ -58,71 +58,72 @@ T__56=57 T__57=58 T__58=59 T__59=60 -T__60=61 -Kfor=62 -Klet=63 -Kwhere=64 -Kgroup=65 -Kby=66 -Korder=67 -Kreturn=68 -Kif=69 -Kin=70 -Kas=71 -Kat=72 -Kallowing=73 -Kempty=74 -Kcount=75 -Kstable=76 -Kascending=77 -Kdescending=78 -Ksome=79 -Kevery=80 -Ksatisfies=81 -Kcollation=82 -Kgreatest=83 -Kleast=84 -Kswitch=85 -Kcase=86 -Ktry=87 -Kcatch=88 -Kdefault=89 -Kthen=90 -Kelse=91 -Ktypeswitch=92 -Kor=93 -Kand=94 -Knot=95 -Kto=96 -Kinstance=97 -Kof=98 -Kstatically=99 -Kis=100 -Ktreat=101 -Kcast=102 -Kcastable=103 -Kversion=104 -Kjsoniq=105 -Kunordered=106 -Ktrue=107 -Kfalse=108 -Ktype=109 -Kdeclare=110 -Kcontext=111 -Kitem=112 -Kvariable=113 -STRING=114 -ArgumentPlaceholder=115 -NullLiteral=116 -Literal=117 -NumericLiteral=118 -IntegerLiteral=119 -DecimalLiteral=120 -DoubleLiteral=121 -WS=122 -NCName=123 -XQComment=124 -ContentChar=125 +Kfor=61 +Klet=62 +Kwhere=63 +Kgroup=64 +Kby=65 +Korder=66 +Kreturn=67 +Kif=68 +Kin=69 +Kas=70 +Kat=71 +Kallowing=72 +Kempty=73 +Kcount=74 +Kstable=75 +Kascending=76 +Kdescending=77 +Ksome=78 +Kevery=79 +Ksatisfies=80 +Kcollation=81 +Kgreatest=82 +Kleast=83 +Kswitch=84 +Kcase=85 +Ktry=86 +Kcatch=87 +Kdefault=88 +Kthen=89 +Kelse=90 +Ktypeswitch=91 +Kor=92 +Kand=93 +Knot=94 +Kto=95 +Kinstance=96 +Kof=97 +Kstatically=98 +Kis=99 +Ktreat=100 +Kcast=101 +Kcastable=102 +Kversion=103 +Kjsoniq=104 +Kunordered=105 +Ktrue=106 +Kfalse=107 +Ktype=108 +Kvalidate=109 +Kannotate=110 +Kdeclare=111 +Kcontext=112 +Kitem=113 +Kvariable=114 +STRING=115 +ArgumentPlaceholder=116 +NullLiteral=117 +Literal=118 +NumericLiteral=119 +IntegerLiteral=120 +DecimalLiteral=121 +DoubleLiteral=122 +WS=123 +NCName=124 +XQComment=125 +ContentChar=126 ';'=1 'module'=2 'namespace'=3 @@ -175,66 +176,67 @@ ContentChar=125 'div'=50 'idiv'=51 'mod'=52 -'validate'=53 -'!'=54 -'['=55 -']'=56 -'.'=57 -'$$'=58 -'#'=59 -'{|'=60 -'|}'=61 -'for'=62 -'let'=63 -'where'=64 -'group'=65 -'by'=66 -'order'=67 -'return'=68 -'if'=69 -'in'=70 -'as'=71 -'at'=72 -'allowing'=73 -'empty'=74 -'count'=75 -'stable'=76 -'ascending'=77 -'descending'=78 -'some'=79 -'every'=80 -'satisfies'=81 -'collation'=82 -'greatest'=83 -'least'=84 -'switch'=85 -'case'=86 -'try'=87 -'catch'=88 -'default'=89 -'then'=90 -'else'=91 -'typeswitch'=92 -'or'=93 -'and'=94 -'not'=95 -'to'=96 -'instance'=97 -'of'=98 -'statically'=99 -'is'=100 -'treat'=101 -'cast'=102 -'castable'=103 -'version'=104 -'jsoniq'=105 -'unordered'=106 -'true'=107 -'false'=108 -'type'=109 -'declare'=110 -'context'=111 -'item'=112 -'variable'=113 -'?'=115 -'null'=116 +'!'=53 +'['=54 +']'=55 +'.'=56 +'$$'=57 +'#'=58 +'{|'=59 +'|}'=60 +'for'=61 +'let'=62 +'where'=63 +'group'=64 +'by'=65 +'order'=66 +'return'=67 +'if'=68 +'in'=69 +'as'=70 +'at'=71 +'allowing'=72 +'empty'=73 +'count'=74 +'stable'=75 +'ascending'=76 +'descending'=77 +'some'=78 +'every'=79 +'satisfies'=80 +'collation'=81 +'greatest'=82 +'least'=83 +'switch'=84 +'case'=85 +'try'=86 +'catch'=87 +'default'=88 +'then'=89 +'else'=90 +'typeswitch'=91 +'or'=92 +'and'=93 +'not'=94 +'to'=95 +'instance'=96 +'of'=97 +'statically'=98 +'is'=99 +'treat'=100 +'cast'=101 +'castable'=102 +'version'=103 +'jsoniq'=104 +'unordered'=105 +'true'=106 +'false'=107 +'type'=108 +'validate'=109 +'annotate'=110 +'declare'=111 +'context'=112 +'item'=113 +'variable'=114 +'?'=116 +'null'=117 diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index 18b06b8c1..c0ca5cfc6 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -1,4 +1,4 @@ -// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.8 +// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.7 // Java header package org.rumbledb.parser; @@ -25,7 +25,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class JsoniqParser extends Parser { - static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -39,17 +39,17 @@ public class JsoniqParser extends Parser { T__38=39, T__39=40, T__40=41, T__41=42, T__42=43, T__43=44, T__44=45, T__45=46, T__46=47, T__47=48, T__48=49, T__49=50, T__50=51, T__51=52, T__52=53, T__53=54, T__54=55, T__55=56, T__56=57, T__57=58, T__58=59, - T__59=60, T__60=61, Kfor=62, Klet=63, Kwhere=64, Kgroup=65, Kby=66, Korder=67, - Kreturn=68, Kif=69, Kin=70, Kas=71, Kat=72, Kallowing=73, Kempty=74, Kcount=75, - Kstable=76, Kascending=77, Kdescending=78, Ksome=79, Kevery=80, Ksatisfies=81, - Kcollation=82, Kgreatest=83, Kleast=84, Kswitch=85, Kcase=86, Ktry=87, - Kcatch=88, Kdefault=89, Kthen=90, Kelse=91, Ktypeswitch=92, Kor=93, Kand=94, - Knot=95, Kto=96, Kinstance=97, Kof=98, Kstatically=99, Kis=100, Ktreat=101, - Kcast=102, Kcastable=103, Kversion=104, Kjsoniq=105, Kunordered=106, Ktrue=107, - Kfalse=108, Ktype=109, Kdeclare=110, Kcontext=111, Kitem=112, Kvariable=113, - STRING=114, ArgumentPlaceholder=115, NullLiteral=116, Literal=117, NumericLiteral=118, - IntegerLiteral=119, DecimalLiteral=120, DoubleLiteral=121, WS=122, NCName=123, - XQComment=124, ContentChar=125; + T__59=60, Kfor=61, Klet=62, Kwhere=63, Kgroup=64, Kby=65, Korder=66, Kreturn=67, + Kif=68, Kin=69, Kas=70, Kat=71, Kallowing=72, Kempty=73, Kcount=74, Kstable=75, + Kascending=76, Kdescending=77, Ksome=78, Kevery=79, Ksatisfies=80, Kcollation=81, + Kgreatest=82, Kleast=83, Kswitch=84, Kcase=85, Ktry=86, Kcatch=87, Kdefault=88, + Kthen=89, Kelse=90, Ktypeswitch=91, Kor=92, Kand=93, Knot=94, Kto=95, + Kinstance=96, Kof=97, Kstatically=98, Kis=99, Ktreat=100, Kcast=101, Kcastable=102, + Kversion=103, Kjsoniq=104, Kunordered=105, Ktrue=106, Kfalse=107, Ktype=108, + Kvalidate=109, Kannotate=110, Kdeclare=111, Kcontext=112, Kitem=113, Kvariable=114, + STRING=115, ArgumentPlaceholder=116, NullLiteral=117, Literal=118, NumericLiteral=119, + IntegerLiteral=120, DecimalLiteral=121, DoubleLiteral=122, WS=123, NCName=124, + XQComment=125, ContentChar=126; public static final int RULE_moduleAndThisIsIt = 0, RULE_module = 1, RULE_mainModule = 2, RULE_libraryModule = 3, RULE_prolog = 4, RULE_setter = 5, RULE_namespaceDecl = 6, RULE_annotatedDecl = 7, @@ -68,84 +68,75 @@ public class JsoniqParser extends Parser { RULE_rangeExpr = 49, RULE_additiveExpr = 50, RULE_multiplicativeExpr = 51, RULE_instanceOfExpr = 52, RULE_isStaticallyExpr = 53, RULE_treatExpr = 54, RULE_castableExpr = 55, RULE_castExpr = 56, RULE_arrowExpr = 57, RULE_arrowFunctionSpecifier = 58, - RULE_unaryExpr = 59, RULE_valueExpr = 60, RULE_validateExpr = 61, RULE_simpleMapExpr = 62, - RULE_postFixExpr = 63, RULE_arrayLookup = 64, RULE_arrayUnboxing = 65, - RULE_predicate = 66, RULE_objectLookup = 67, RULE_primaryExpr = 68, RULE_varRef = 69, - RULE_parenthesizedExpr = 70, RULE_contextItemExpr = 71, RULE_orderedExpr = 72, - RULE_unorderedExpr = 73, RULE_functionCall = 74, RULE_argumentList = 75, - RULE_argument = 76, RULE_functionItemExpr = 77, RULE_namedFunctionRef = 78, - RULE_inlineFunctionExpr = 79, RULE_sequenceType = 80, RULE_objectConstructor = 81, - RULE_itemType = 82, RULE_functionTest = 83, RULE_anyFunctionTest = 84, - RULE_typedFunctionTest = 85, RULE_singleType = 86, RULE_pairConstructor = 87, - RULE_arrayConstructor = 88, RULE_uriLiteral = 89, RULE_stringLiteral = 90, - RULE_keyWords = 91; - private static String[] makeRuleNames() { - return new String[] { - "moduleAndThisIsIt", "module", "mainModule", "libraryModule", "prolog", - "setter", "namespaceDecl", "annotatedDecl", "defaultCollationDecl", "orderingModeDecl", - "emptyOrderDecl", "decimalFormatDecl", "qname", "dfPropertyName", "moduleImport", - "varDecl", "contextItemDecl", "functionDecl", "typeDecl", "schemaLanguage", - "paramList", "param", "expr", "exprSingle", "flowrExpr", "forClause", - "forVar", "letClause", "letVar", "whereClause", "groupByClause", "groupByVar", - "orderByClause", "orderByExpr", "countClause", "quantifiedExpr", "quantifiedExprVar", - "switchExpr", "switchCaseClause", "typeSwitchExpr", "caseClause", "ifExpr", - "tryCatchExpr", "catchClause", "orExpr", "andExpr", "notExpr", "comparisonExpr", - "stringConcatExpr", "rangeExpr", "additiveExpr", "multiplicativeExpr", - "instanceOfExpr", "isStaticallyExpr", "treatExpr", "castableExpr", "castExpr", - "arrowExpr", "arrowFunctionSpecifier", "unaryExpr", "valueExpr", "validateExpr", - "simpleMapExpr", "postFixExpr", "arrayLookup", "arrayUnboxing", "predicate", - "objectLookup", "primaryExpr", "varRef", "parenthesizedExpr", "contextItemExpr", - "orderedExpr", "unorderedExpr", "functionCall", "argumentList", "argument", - "functionItemExpr", "namedFunctionRef", "inlineFunctionExpr", "sequenceType", - "objectConstructor", "itemType", "functionTest", "anyFunctionTest", "typedFunctionTest", - "singleType", "pairConstructor", "arrayConstructor", "uriLiteral", "stringLiteral", - "keyWords" - }; - } - public static final String[] ruleNames = makeRuleNames(); - - private static String[] makeLiteralNames() { - return new String[] { - null, "';'", "'module'", "'namespace'", "'='", "'ordering'", "'ordered'", - "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", - "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", - "'digit'", "'pattern-separator'", "'import'", "','", "':='", "'external'", - "'function'", "'('", "')'", "'{'", "'}'", "'jsound'", "'compact'", "'verbose'", - "'json'", "'schema'", "'$'", "'|'", "'*'", "'eq'", "'ne'", "'lt'", "'le'", - "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", "'+'", - "'-'", "'div'", "'idiv'", "'mod'", "'validate'", "'!'", "'['", "']'", - "'.'", "'$$'", "'#'", "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", - "'by'", "'order'", "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", - "'empty'", "'count'", "'stable'", "'ascending'", "'descending'", "'some'", - "'every'", "'satisfies'", "'collation'", "'greatest'", "'least'", "'switch'", - "'case'", "'try'", "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", - "'or'", "'and'", "'not'", "'to'", "'instance'", "'of'", "'statically'", - "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", - "'true'", "'false'", "'type'", "'declare'", "'context'", "'item'", "'variable'", - null, "'?'", "'null'" - }; - } - private static final String[] _LITERAL_NAMES = makeLiteralNames(); - private static String[] makeSymbolicNames() { - return new String[] { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", - "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", - "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", - "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", - "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", - "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", - "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kdeclare", "Kcontext", - "Kitem", "Kvariable", "STRING", "ArgumentPlaceholder", "NullLiteral", - "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", - "WS", "NCName", "XQComment", "ContentChar" - }; - } - private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); + RULE_unaryExpr = 59, RULE_valueExpr = 60, RULE_validateExpr = 61, RULE_annotateExpr = 62, + RULE_simpleMapExpr = 63, RULE_postFixExpr = 64, RULE_arrayLookup = 65, + RULE_arrayUnboxing = 66, RULE_predicate = 67, RULE_objectLookup = 68, + RULE_primaryExpr = 69, RULE_varRef = 70, RULE_parenthesizedExpr = 71, + RULE_contextItemExpr = 72, RULE_orderedExpr = 73, RULE_unorderedExpr = 74, + RULE_functionCall = 75, RULE_argumentList = 76, RULE_argument = 77, RULE_functionItemExpr = 78, + RULE_namedFunctionRef = 79, RULE_inlineFunctionExpr = 80, RULE_sequenceType = 81, + RULE_objectConstructor = 82, RULE_itemType = 83, RULE_functionTest = 84, + RULE_anyFunctionTest = 85, RULE_typedFunctionTest = 86, RULE_singleType = 87, + RULE_pairConstructor = 88, RULE_arrayConstructor = 89, RULE_uriLiteral = 90, + RULE_stringLiteral = 91, RULE_keyWords = 92; + public static final String[] ruleNames = { + "moduleAndThisIsIt", "module", "mainModule", "libraryModule", "prolog", + "setter", "namespaceDecl", "annotatedDecl", "defaultCollationDecl", "orderingModeDecl", + "emptyOrderDecl", "decimalFormatDecl", "qname", "dfPropertyName", "moduleImport", + "varDecl", "contextItemDecl", "functionDecl", "typeDecl", "schemaLanguage", + "paramList", "param", "expr", "exprSingle", "flowrExpr", "forClause", + "forVar", "letClause", "letVar", "whereClause", "groupByClause", "groupByVar", + "orderByClause", "orderByExpr", "countClause", "quantifiedExpr", "quantifiedExprVar", + "switchExpr", "switchCaseClause", "typeSwitchExpr", "caseClause", "ifExpr", + "tryCatchExpr", "catchClause", "orExpr", "andExpr", "notExpr", "comparisonExpr", + "stringConcatExpr", "rangeExpr", "additiveExpr", "multiplicativeExpr", + "instanceOfExpr", "isStaticallyExpr", "treatExpr", "castableExpr", "castExpr", + "arrowExpr", "arrowFunctionSpecifier", "unaryExpr", "valueExpr", "validateExpr", + "annotateExpr", "simpleMapExpr", "postFixExpr", "arrayLookup", "arrayUnboxing", + "predicate", "objectLookup", "primaryExpr", "varRef", "parenthesizedExpr", + "contextItemExpr", "orderedExpr", "unorderedExpr", "functionCall", "argumentList", + "argument", "functionItemExpr", "namedFunctionRef", "inlineFunctionExpr", + "sequenceType", "objectConstructor", "itemType", "functionTest", "anyFunctionTest", + "typedFunctionTest", "singleType", "pairConstructor", "arrayConstructor", + "uriLiteral", "stringLiteral", "keyWords" + }; + + private static final String[] _LITERAL_NAMES = { + null, "';'", "'module'", "'namespace'", "'='", "'ordering'", "'ordered'", + "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", + "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", + "'digit'", "'pattern-separator'", "'import'", "','", "':='", "'external'", + "'function'", "'('", "')'", "'{'", "'}'", "'jsound'", "'compact'", "'verbose'", + "'json'", "'schema'", "'$'", "'|'", "'*'", "'eq'", "'ne'", "'lt'", "'le'", + "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", "'+'", "'-'", + "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'", "'$$'", "'#'", + "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", "'by'", "'order'", + "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", "'empty'", "'count'", + "'stable'", "'ascending'", "'descending'", "'some'", "'every'", "'satisfies'", + "'collation'", "'greatest'", "'least'", "'switch'", "'case'", "'try'", + "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", "'or'", "'and'", + "'not'", "'to'", "'instance'", "'of'", "'statically'", "'is'", "'treat'", + "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", "'true'", + "'false'", "'type'", "'validate'", "'annotate'", "'declare'", "'context'", + "'item'", "'variable'", null, "'?'", "'null'" + }; + private static final String[] _SYMBOLIC_NAMES = { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", + "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", + "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", + "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", + "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", + "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", + "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", + "Kdeclare", "Kcontext", "Kitem", "Kvariable", "STRING", "ArgumentPlaceholder", + "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", + "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" + }; public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); /** @@ -195,7 +186,6 @@ public JsoniqParser(TokenStream input) { super(input); _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); } - public static class ModuleAndThisIsItContext extends ParserRuleContext { public ModuleContext module() { return getRuleContext(ModuleContext.class,0); @@ -218,9 +208,9 @@ public final ModuleAndThisIsItContext moduleAndThisIsIt() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(184); + setState(186); module(); - setState(185); + setState(187); match(EOF); } } @@ -266,28 +256,28 @@ public final ModuleContext module() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(192); + setState(194); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,0,_ctx) ) { case 1: { - setState(187); + setState(189); match(Kjsoniq); - setState(188); + setState(190); match(Kversion); - setState(189); + setState(191); ((ModuleContext)_localctx).vers = stringLiteral(); - setState(190); + setState(192); match(T__0); } break; } - setState(196); + setState(198); _errHandler.sync(this); switch (_input.LA(1)) { case T__1: { - setState(194); + setState(196); libraryModule(); } break; @@ -299,10 +289,9 @@ public final ModuleContext module() throws RecognitionException { case T__32: case T__47: case T__48: - case T__52: - case T__54: - case T__57: - case T__59: + case T__53: + case T__56: + case T__58: case Kfor: case Klet: case Kwhere: @@ -351,6 +340,8 @@ public final ModuleContext module() throws RecognitionException { case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: @@ -360,7 +351,7 @@ public final ModuleContext module() throws RecognitionException { case Literal: case NCName: { - setState(195); + setState(197); ((ModuleContext)_localctx).main = mainModule(); } break; @@ -404,9 +395,9 @@ public final MainModuleContext mainModule() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(198); + setState(200); prolog(); - setState(199); + setState(201); expr(); } } @@ -446,19 +437,19 @@ public final LibraryModuleContext libraryModule() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(201); + setState(203); match(T__1); - setState(202); + setState(204); match(T__2); - setState(203); + setState(205); match(NCName); - setState(204); + setState(206); match(T__3); - setState(205); + setState(207); uriLiteral(); - setState(206); + setState(208); match(T__0); - setState(207); + setState(209); prolog(); } } @@ -516,59 +507,59 @@ public final PrologContext prolog() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(218); + setState(220); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,3,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(212); + setState(214); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,2,_ctx) ) { case 1: { - setState(209); + setState(211); setter(); } break; case 2: { - setState(210); + setState(212); namespaceDecl(); } break; case 3: { - setState(211); + setState(213); moduleImport(); } break; } - setState(214); + setState(216); match(T__0); } } } - setState(220); + setState(222); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,3,_ctx); } - setState(226); + setState(228); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(221); + setState(223); annotatedDecl(); - setState(222); + setState(224); match(T__0); } } } - setState(228); + setState(230); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,4,_ctx); } @@ -613,34 +604,34 @@ public final SetterContext setter() throws RecognitionException { SetterContext _localctx = new SetterContext(_ctx, getState()); enterRule(_localctx, 10, RULE_setter); try { - setState(233); + setState(235); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,5,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(229); + setState(231); defaultCollationDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(230); + setState(232); orderingModeDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(231); + setState(233); emptyOrderDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(232); + setState(234); decimalFormatDecl(); } break; @@ -680,15 +671,15 @@ public final NamespaceDeclContext namespaceDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(235); + setState(237); match(Kdeclare); - setState(236); + setState(238); match(T__2); - setState(237); + setState(239); match(NCName); - setState(238); + setState(240); match(T__3); - setState(239); + setState(241); uriLiteral(); } } @@ -731,34 +722,34 @@ public final AnnotatedDeclContext annotatedDecl() throws RecognitionException { AnnotatedDeclContext _localctx = new AnnotatedDeclContext(_ctx, getState()); enterRule(_localctx, 14, RULE_annotatedDecl); try { - setState(245); + setState(247); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,6,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(241); + setState(243); functionDecl(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(242); + setState(244); varDecl(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(243); + setState(245); typeDecl(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(244); + setState(246); contextItemDecl(); } break; @@ -799,13 +790,13 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti try { enterOuterAlt(_localctx, 1); { - setState(247); + setState(249); match(Kdeclare); - setState(248); + setState(250); match(Kdefault); - setState(249); + setState(251); match(Kcollation); - setState(250); + setState(252); uriLiteral(); } } @@ -822,7 +813,6 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti public static class OrderingModeDeclContext extends ParserRuleContext { public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } - public TerminalNode Kunordered() { return getToken(JsoniqParser.Kunordered, 0); } public OrderingModeDeclContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -841,11 +831,11 @@ public final OrderingModeDeclContext orderingModeDecl() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(252); + setState(254); match(Kdeclare); - setState(253); + setState(255); match(T__4); - setState(254); + setState(256); _la = _input.LA(1); if ( !(_la==T__5 || _la==Kunordered) ) { _errHandler.recoverInline(this); @@ -872,7 +862,6 @@ public static class EmptyOrderDeclContext extends ParserRuleContext { public Token emptySequenceOrder; public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } public TerminalNode Kdefault() { return getToken(JsoniqParser.Kdefault, 0); } - public TerminalNode Korder() { return getToken(JsoniqParser.Korder, 0); } public TerminalNode Kempty() { return getToken(JsoniqParser.Kempty, 0); } public TerminalNode Kgreatest() { return getToken(JsoniqParser.Kgreatest, 0); } public TerminalNode Kleast() { return getToken(JsoniqParser.Kleast, 0); } @@ -894,16 +883,16 @@ public final EmptyOrderDeclContext emptyOrderDecl() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(256); + setState(258); match(Kdeclare); - setState(257); + setState(259); match(Kdefault); - setState(258); + setState(260); match(Korder); - setState(259); + setState(261); match(Kempty); { - setState(260); + setState(262); ((EmptyOrderDeclContext)_localctx).emptySequenceOrder = _input.LT(1); _la = _input.LA(1); if ( !(_la==Kgreatest || _la==Kleast) ) { @@ -964,17 +953,17 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(262); + setState(264); match(Kdeclare); - setState(267); + setState(269); _errHandler.sync(this); switch (_input.LA(1)) { case T__6: { { - setState(263); + setState(265); match(T__6); - setState(264); + setState(266); qname(); } } @@ -982,9 +971,9 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce case Kdefault: { { - setState(265); + setState(267); match(Kdefault); - setState(266); + setState(268); match(T__6); } } @@ -992,21 +981,21 @@ public final DecimalFormatDeclContext decimalFormatDecl() throws RecognitionExce default: throw new NoViableAltException(this); } - setState(275); + setState(277); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17))) != 0)) { { { - setState(269); + setState(271); dfPropertyName(); - setState(270); + setState(272); match(T__3); - setState(271); + setState(273); stringLiteral(); } } - setState(277); + setState(279); _errHandler.sync(this); _la = _input.LA(1); } @@ -1055,17 +1044,17 @@ public final QnameContext qname() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(283); + setState(285); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,10,_ctx) ) { case 1: { - setState(280); + setState(282); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(278); + setState(280); ((QnameContext)_localctx).ns = match(NCName); } break; @@ -1117,30 +1106,32 @@ public final QnameContext qname() throws RecognitionException { case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: case Kvariable: case NullLiteral: { - setState(279); + setState(281); ((QnameContext)_localctx).nskw = keyWords(); } break; default: throw new NoViableAltException(this); } - setState(282); + setState(284); match(T__7); } break; } - setState(287); + setState(289); _errHandler.sync(this); switch (_input.LA(1)) { case NCName: { - setState(285); + setState(287); ((QnameContext)_localctx).local_name = match(NCName); } break; @@ -1192,13 +1183,15 @@ public final QnameContext qname() throws RecognitionException { case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: case Kvariable: case NullLiteral: { - setState(286); + setState(288); ((QnameContext)_localctx).local_namekw = keyWords(); } break; @@ -1237,7 +1230,7 @@ public final DfPropertyNameContext dfPropertyName() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(289); + setState(291); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__8) | (1L << T__9) | (1L << T__10) | (1L << T__11) | (1L << T__12) | (1L << T__13) | (1L << T__14) | (1L << T__15) | (1L << T__16) | (1L << T__17))) != 0)) ) { _errHandler.recoverInline(this); @@ -1289,48 +1282,48 @@ public final ModuleImportContext moduleImport() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(291); + setState(293); match(T__18); - setState(292); + setState(294); match(T__1); - setState(296); + setState(298); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__2) { { - setState(293); + setState(295); match(T__2); - setState(294); + setState(296); ((ModuleImportContext)_localctx).prefix = match(NCName); - setState(295); + setState(297); match(T__3); } } - setState(298); + setState(300); ((ModuleImportContext)_localctx).targetNamespace = uriLiteral(); - setState(308); + setState(310); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(299); + setState(301); match(Kat); - setState(300); + setState(302); uriLiteral(); - setState(305); + setState(307); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(301); + setState(303); match(T__19); - setState(302); + setState(304); uriLiteral(); } } - setState(307); + setState(309); _errHandler.sync(this); _la = _input.LA(1); } @@ -1382,33 +1375,33 @@ public final VarDeclContext varDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(310); + setState(312); match(Kdeclare); - setState(311); + setState(313); match(Kvariable); - setState(312); + setState(314); varRef(); - setState(315); + setState(317); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(313); + setState(315); match(Kas); - setState(314); + setState(316); sequenceType(); } } - setState(324); + setState(326); _errHandler.sync(this); switch (_input.LA(1)) { case T__20: { { - setState(317); + setState(319); match(T__20); - setState(318); + setState(320); exprSingle(); } } @@ -1416,16 +1409,16 @@ public final VarDeclContext varDecl() throws RecognitionException { case T__21: { { - setState(319); + setState(321); ((VarDeclContext)_localctx).external = match(T__21); - setState(322); + setState(324); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__20) { { - setState(320); + setState(322); match(T__20); - setState(321); + setState(323); exprSingle(); } } @@ -1479,33 +1472,33 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio try { enterOuterAlt(_localctx, 1); { - setState(326); + setState(328); match(Kdeclare); - setState(327); + setState(329); match(Kcontext); - setState(328); + setState(330); match(Kitem); - setState(331); + setState(333); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(329); + setState(331); match(Kas); - setState(330); + setState(332); sequenceType(); } } - setState(340); + setState(342); _errHandler.sync(this); switch (_input.LA(1)) { case T__20: { { - setState(333); + setState(335); match(T__20); - setState(334); + setState(336); exprSingle(); } } @@ -1513,16 +1506,16 @@ public final ContextItemDeclContext contextItemDecl() throws RecognitionExceptio case T__21: { { - setState(335); + setState(337); ((ContextItemDeclContext)_localctx).external = match(T__21); - setState(338); + setState(340); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__20) { { - setState(336); + setState(338); match(T__20); - setState(337); + setState(339); exprSingle(); } } @@ -1582,62 +1575,62 @@ public final FunctionDeclContext functionDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(342); + setState(344); match(Kdeclare); - setState(343); + setState(345); match(T__22); - setState(344); + setState(346); ((FunctionDeclContext)_localctx).fn_name = qname(); - setState(345); - match(T__23); setState(347); + match(T__23); + setState(349); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__32) { { - setState(346); + setState(348); paramList(); } } - setState(349); + setState(351); match(T__24); - setState(352); + setState(354); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(350); + setState(352); match(Kas); - setState(351); + setState(353); ((FunctionDeclContext)_localctx).return_type = sequenceType(); } } - setState(360); + setState(362); _errHandler.sync(this); switch (_input.LA(1)) { case T__25: { - setState(354); - match(T__25); setState(356); + match(T__25); + setState(358); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__52) | (1L << T__54) | (1L << T__57) | (1L << T__59) | (1L << Kfor) | (1L << Klet))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kwhere - 64)) | (1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { { - setState(355); + setState(357); ((FunctionDeclContext)_localctx).fn_body = expr(); } } - setState(358); + setState(360); match(T__26); } break; case T__21: { - setState(359); + setState(361); match(T__21); } break; @@ -1663,7 +1656,6 @@ public static class TypeDeclContext extends ParserRuleContext { public ExprSingleContext type_definition; public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } public TerminalNode Ktype() { return getToken(JsoniqParser.Ktype, 0); } - public TerminalNode Kas() { return getToken(JsoniqParser.Kas, 0); } public QnameContext qname() { return getRuleContext(QnameContext.class,0); } @@ -1691,25 +1683,25 @@ public final TypeDeclContext typeDecl() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(362); + setState(364); match(Kdeclare); - setState(363); + setState(365); match(Ktype); - setState(364); + setState(366); ((TypeDeclContext)_localctx).type_name = qname(); - setState(365); - match(Kas); setState(367); + match(Kas); + setState(369); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__27 || _la==T__30) { { - setState(366); + setState(368); ((TypeDeclContext)_localctx).schema = schemaLanguage(); } } - setState(369); + setState(371); ((TypeDeclContext)_localctx).type_definition = exprSingle(); } } @@ -1740,33 +1732,33 @@ public final SchemaLanguageContext schemaLanguage() throws RecognitionException SchemaLanguageContext _localctx = new SchemaLanguageContext(_ctx, getState()); enterRule(_localctx, 38, RULE_schemaLanguage); try { - setState(377); + setState(379); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,26,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(371); + setState(373); match(T__27); - setState(372); + setState(374); match(T__28); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(373); + setState(375); match(T__27); - setState(374); + setState(376); match(T__29); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(375); + setState(377); match(T__30); - setState(376); + setState(378); match(T__31); } break; @@ -1808,21 +1800,21 @@ public final ParamListContext paramList() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(379); + setState(381); param(); - setState(384); + setState(386); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(380); + setState(382); match(T__19); - setState(381); + setState(383); param(); } } - setState(386); + setState(388); _errHandler.sync(this); _la = _input.LA(1); } @@ -1865,18 +1857,18 @@ public final ParamContext param() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(387); + setState(389); match(T__32); - setState(388); + setState(390); qname(); - setState(391); + setState(393); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(389); + setState(391); match(Kas); - setState(390); + setState(392); sequenceType(); } } @@ -1919,21 +1911,21 @@ public final ExprContext expr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(393); + setState(395); exprSingle(); - setState(398); + setState(400); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(394); + setState(396); match(T__19); - setState(395); + setState(397); exprSingle(); } } - setState(400); + setState(402); _errHandler.sync(this); _la = _input.LA(1); } @@ -1987,55 +1979,55 @@ public final ExprSingleContext exprSingle() throws RecognitionException { ExprSingleContext _localctx = new ExprSingleContext(_ctx, getState()); enterRule(_localctx, 46, RULE_exprSingle); try { - setState(408); + setState(410); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,30,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(401); + setState(403); flowrExpr(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(402); + setState(404); quantifiedExpr(); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(403); + setState(405); switchExpr(); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(404); + setState(406); typeSwitchExpr(); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(405); + setState(407); ifExpr(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(406); + setState(408); tryCatchExpr(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(407); + setState(409); orExpr(); } break; @@ -2114,66 +2106,66 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(412); + setState(414); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(410); + setState(412); ((FlowrExprContext)_localctx).start_for = forClause(); } break; case Klet: { - setState(411); + setState(413); ((FlowrExprContext)_localctx).start_let = letClause(); } break; default: throw new NoViableAltException(this); } - setState(422); + setState(424); _errHandler.sync(this); _la = _input.LA(1); - while (((((_la - 62)) & ~0x3f) == 0 && ((1L << (_la - 62)) & ((1L << (Kfor - 62)) | (1L << (Klet - 62)) | (1L << (Kwhere - 62)) | (1L << (Kgroup - 62)) | (1L << (Korder - 62)) | (1L << (Kcount - 62)) | (1L << (Kstable - 62)))) != 0)) { + while (((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Korder - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)))) != 0)) { { - setState(420); + setState(422); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: { - setState(414); + setState(416); forClause(); } break; case Kwhere: { - setState(415); + setState(417); whereClause(); } break; case Klet: { - setState(416); + setState(418); letClause(); } break; case Kgroup: { - setState(417); + setState(419); groupByClause(); } break; case Korder: case Kstable: { - setState(418); + setState(420); orderByClause(); } break; case Kcount: { - setState(419); + setState(421); countClause(); } break; @@ -2181,13 +2173,13 @@ public final FlowrExprContext flowrExpr() throws RecognitionException { throw new NoViableAltException(this); } } - setState(424); + setState(426); _errHandler.sync(this); _la = _input.LA(1); } - setState(425); + setState(427); match(Kreturn); - setState(426); + setState(428); ((FlowrExprContext)_localctx).return_expr = exprSingle(); } } @@ -2230,25 +2222,25 @@ public final ForClauseContext forClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(428); + setState(430); match(Kfor); - setState(429); + setState(431); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); - setState(434); + setState(436); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(430); + setState(432); match(T__19); - setState(431); + setState(433); ((ForClauseContext)_localctx).forVar = forVar(); ((ForClauseContext)_localctx).vars.add(((ForClauseContext)_localctx).forVar); } } - setState(436); + setState(438); _errHandler.sync(this); _la = _input.LA(1); } @@ -2306,47 +2298,47 @@ public final ForVarContext forVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(437); + setState(439); ((ForVarContext)_localctx).var_ref = varRef(); - setState(440); + setState(442); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(438); + setState(440); match(Kas); - setState(439); + setState(441); ((ForVarContext)_localctx).seq = sequenceType(); } } - setState(444); + setState(446); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kallowing) { { - setState(442); + setState(444); ((ForVarContext)_localctx).flag = match(Kallowing); - setState(443); + setState(445); match(Kempty); } } - setState(448); + setState(450); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kat) { { - setState(446); + setState(448); match(Kat); - setState(447); + setState(449); ((ForVarContext)_localctx).at = varRef(); } } - setState(450); + setState(452); match(Kin); - setState(451); + setState(453); ((ForVarContext)_localctx).ex = exprSingle(); } } @@ -2389,25 +2381,25 @@ public final LetClauseContext letClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(453); + setState(455); match(Klet); - setState(454); + setState(456); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); - setState(459); + setState(461); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(455); + setState(457); match(T__19); - setState(456); + setState(458); ((LetClauseContext)_localctx).letVar = letVar(); ((LetClauseContext)_localctx).vars.add(((LetClauseContext)_localctx).letVar); } } - setState(461); + setState(463); _errHandler.sync(this); _la = _input.LA(1); } @@ -2456,23 +2448,23 @@ public final LetVarContext letVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(462); + setState(464); ((LetVarContext)_localctx).var_ref = varRef(); - setState(465); + setState(467); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(463); + setState(465); match(Kas); - setState(464); + setState(466); ((LetVarContext)_localctx).seq = sequenceType(); } } - setState(467); + setState(469); match(T__20); - setState(468); + setState(470); ((LetVarContext)_localctx).ex = exprSingle(); } } @@ -2509,9 +2501,9 @@ public final WhereClauseContext whereClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(470); + setState(472); match(Kwhere); - setState(471); + setState(473); exprSingle(); } } @@ -2555,27 +2547,27 @@ public final GroupByClauseContext groupByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(473); + setState(475); match(Kgroup); - setState(474); + setState(476); match(Kby); - setState(475); + setState(477); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); - setState(480); + setState(482); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(476); + setState(478); match(T__19); - setState(477); + setState(479); ((GroupByClauseContext)_localctx).groupByVar = groupByVar(); ((GroupByClauseContext)_localctx).vars.add(((GroupByClauseContext)_localctx).groupByVar); } } - setState(482); + setState(484); _errHandler.sync(this); _la = _input.LA(1); } @@ -2630,40 +2622,40 @@ public final GroupByVarContext groupByVar() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(483); + setState(485); ((GroupByVarContext)_localctx).var_ref = varRef(); - setState(490); + setState(492); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__20 || _la==Kas) { { - setState(486); + setState(488); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(484); + setState(486); match(Kas); - setState(485); + setState(487); ((GroupByVarContext)_localctx).seq = sequenceType(); } } - setState(488); + setState(490); ((GroupByVarContext)_localctx).decl = match(T__20); - setState(489); + setState(491); ((GroupByVarContext)_localctx).ex = exprSingle(); } } - setState(494); + setState(496); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(492); + setState(494); match(Kcollation); - setState(493); + setState(495); ((GroupByVarContext)_localctx).uri = uriLiteral(); } } @@ -2710,15 +2702,15 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(501); + setState(503); _errHandler.sync(this); switch (_input.LA(1)) { case Korder: { { - setState(496); + setState(498); match(Korder); - setState(497); + setState(499); match(Kby); } } @@ -2726,11 +2718,11 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { case Kstable: { { - setState(498); + setState(500); ((OrderByClauseContext)_localctx).stb = match(Kstable); - setState(499); + setState(501); match(Korder); - setState(500); + setState(502); match(Kby); } } @@ -2738,21 +2730,21 @@ public final OrderByClauseContext orderByClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(503); + setState(505); orderByExpr(); - setState(508); + setState(510); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(504); + setState(506); match(T__19); - setState(505); + setState(507); orderByExpr(); } } - setState(510); + setState(512); _errHandler.sync(this); _la = _input.LA(1); } @@ -2805,20 +2797,20 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(511); + setState(513); ((OrderByExprContext)_localctx).ex = exprSingle(); - setState(514); + setState(516); _errHandler.sync(this); switch (_input.LA(1)) { case Kascending: { - setState(512); + setState(514); match(Kascending); } break; case Kdescending: { - setState(513); + setState(515); ((OrderByExprContext)_localctx).desc = match(Kdescending); } break; @@ -2837,25 +2829,25 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { default: break; } - setState(521); + setState(523); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kempty) { { - setState(516); + setState(518); match(Kempty); - setState(519); + setState(521); _errHandler.sync(this); switch (_input.LA(1)) { case Kgreatest: { - setState(517); + setState(519); ((OrderByExprContext)_localctx).gr = match(Kgreatest); } break; case Kleast: { - setState(518); + setState(520); ((OrderByExprContext)_localctx).ls = match(Kleast); } break; @@ -2865,14 +2857,14 @@ public final OrderByExprContext orderByExpr() throws RecognitionException { } } - setState(525); + setState(527); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kcollation) { { - setState(523); + setState(525); match(Kcollation); - setState(524); + setState(526); ((OrderByExprContext)_localctx).uril = uriLiteral(); } } @@ -2912,9 +2904,9 @@ public final CountClauseContext countClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(527); + setState(529); match(Kcount); - setState(528); + setState(530); varRef(); } } @@ -2964,47 +2956,47 @@ public final QuantifiedExprContext quantifiedExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(532); + setState(534); _errHandler.sync(this); switch (_input.LA(1)) { case Ksome: { - setState(530); + setState(532); ((QuantifiedExprContext)_localctx).so = match(Ksome); } break; case Kevery: { - setState(531); + setState(533); ((QuantifiedExprContext)_localctx).ev = match(Kevery); } break; default: throw new NoViableAltException(this); } - setState(534); + setState(536); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); - setState(539); + setState(541); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(535); + setState(537); match(T__19); - setState(536); + setState(538); ((QuantifiedExprContext)_localctx).quantifiedExprVar = quantifiedExprVar(); ((QuantifiedExprContext)_localctx).vars.add(((QuantifiedExprContext)_localctx).quantifiedExprVar); } } - setState(541); + setState(543); _errHandler.sync(this); _la = _input.LA(1); } - setState(542); + setState(544); match(Ksatisfies); - setState(543); + setState(545); exprSingle(); } } @@ -3049,23 +3041,23 @@ public final QuantifiedExprVarContext quantifiedExprVar() throws RecognitionExce try { enterOuterAlt(_localctx, 1); { - setState(545); + setState(547); varRef(); - setState(548); + setState(550); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(546); + setState(548); match(Kas); - setState(547); + setState(549); sequenceType(); } } - setState(550); + setState(552); match(Kin); - setState(551); + setState(553); exprSingle(); } } @@ -3118,34 +3110,34 @@ public final SwitchExprContext switchExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(553); + setState(555); match(Kswitch); - setState(554); + setState(556); match(T__23); - setState(555); + setState(557); ((SwitchExprContext)_localctx).cond = expr(); - setState(556); + setState(558); match(T__24); - setState(558); + setState(560); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(557); + setState(559); ((SwitchExprContext)_localctx).switchCaseClause = switchCaseClause(); ((SwitchExprContext)_localctx).cases.add(((SwitchExprContext)_localctx).switchCaseClause); } } - setState(560); + setState(562); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(562); + setState(564); match(Kdefault); - setState(563); + setState(565); match(Kreturn); - setState(564); + setState(566); ((SwitchExprContext)_localctx).def = exprSingle(); } } @@ -3193,26 +3185,26 @@ public final SwitchCaseClauseContext switchCaseClause() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(568); + setState(570); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(566); + setState(568); match(Kcase); - setState(567); + setState(569); ((SwitchCaseClauseContext)_localctx).exprSingle = exprSingle(); ((SwitchCaseClauseContext)_localctx).cond.add(((SwitchCaseClauseContext)_localctx).exprSingle); } } - setState(570); + setState(572); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(572); + setState(574); match(Kreturn); - setState(573); + setState(575); ((SwitchCaseClauseContext)_localctx).ret = exprSingle(); } } @@ -3269,44 +3261,44 @@ public final TypeSwitchExprContext typeSwitchExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(575); + setState(577); match(Ktypeswitch); - setState(576); + setState(578); match(T__23); - setState(577); + setState(579); ((TypeSwitchExprContext)_localctx).cond = expr(); - setState(578); + setState(580); match(T__24); - setState(580); + setState(582); _errHandler.sync(this); _la = _input.LA(1); do { { { - setState(579); + setState(581); ((TypeSwitchExprContext)_localctx).caseClause = caseClause(); ((TypeSwitchExprContext)_localctx).cses.add(((TypeSwitchExprContext)_localctx).caseClause); } } - setState(582); + setState(584); _errHandler.sync(this); _la = _input.LA(1); } while ( _la==Kcase ); - setState(584); - match(Kdefault); setState(586); + match(Kdefault); + setState(588); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__32) { { - setState(585); + setState(587); ((TypeSwitchExprContext)_localctx).var_ref = varRef(); } } - setState(588); + setState(590); match(Kreturn); - setState(589); + setState(591); ((TypeSwitchExprContext)_localctx).def = exprSingle(); } } @@ -3359,43 +3351,43 @@ public final CaseClauseContext caseClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(591); + setState(593); match(Kcase); - setState(595); + setState(597); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__32) { { - setState(592); + setState(594); ((CaseClauseContext)_localctx).var_ref = varRef(); - setState(593); + setState(595); match(Kas); } } - setState(597); + setState(599); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); - setState(602); + setState(604); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__33) { { { - setState(598); + setState(600); match(T__33); - setState(599); + setState(601); ((CaseClauseContext)_localctx).sequenceType = sequenceType(); ((CaseClauseContext)_localctx).union.add(((CaseClauseContext)_localctx).sequenceType); } } - setState(604); + setState(606); _errHandler.sync(this); _la = _input.LA(1); } - setState(605); + setState(607); match(Kreturn); - setState(606); + setState(608); ((CaseClauseContext)_localctx).ret = exprSingle(); } } @@ -3443,21 +3435,21 @@ public final IfExprContext ifExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(608); + setState(610); match(Kif); - setState(609); + setState(611); match(T__23); - setState(610); + setState(612); ((IfExprContext)_localctx).test_condition = expr(); - setState(611); + setState(613); match(T__24); - setState(612); + setState(614); match(Kthen); - setState(613); + setState(615); ((IfExprContext)_localctx).branch = exprSingle(); - setState(614); + setState(616); match(Kelse); - setState(615); + setState(617); ((IfExprContext)_localctx).else_branch = exprSingle(); } } @@ -3504,15 +3496,15 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(617); + setState(619); match(Ktry); - setState(618); + setState(620); match(T__25); - setState(619); + setState(621); ((TryCatchExprContext)_localctx).try_expression = expr(); - setState(620); + setState(622); match(T__26); - setState(622); + setState(624); _errHandler.sync(this); _alt = 1; do { @@ -3520,7 +3512,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { case 1: { { - setState(621); + setState(623); ((TryCatchExprContext)_localctx).catchClause = catchClause(); ((TryCatchExprContext)_localctx).catches.add(((TryCatchExprContext)_localctx).catchClause); } @@ -3529,7 +3521,7 @@ public final TryCatchExprContext tryCatchExpr() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(624); + setState(626); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,59,_ctx); } while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ); @@ -3580,14 +3572,14 @@ public final CatchClauseContext catchClause() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(626); + setState(628); match(Kcatch); - setState(629); + setState(631); _errHandler.sync(this); switch (_input.LA(1)) { case T__34: { - setState(627); + setState(629); ((CatchClauseContext)_localctx).s35 = match(T__34); ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s35); } @@ -3640,6 +3632,8 @@ public final CatchClauseContext catchClause() throws RecognitionException { case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: @@ -3647,7 +3641,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(628); + setState(630); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -3655,20 +3649,20 @@ public final CatchClauseContext catchClause() throws RecognitionException { default: throw new NoViableAltException(this); } - setState(638); + setState(640); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__33) { { { - setState(631); + setState(633); match(T__33); - setState(634); + setState(636); _errHandler.sync(this); switch (_input.LA(1)) { case T__34: { - setState(632); + setState(634); ((CatchClauseContext)_localctx).s35 = match(T__34); ((CatchClauseContext)_localctx).jokers.add(((CatchClauseContext)_localctx).s35); } @@ -3721,6 +3715,8 @@ public final CatchClauseContext catchClause() throws RecognitionException { case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: @@ -3728,7 +3724,7 @@ public final CatchClauseContext catchClause() throws RecognitionException { case NullLiteral: case NCName: { - setState(633); + setState(635); ((CatchClauseContext)_localctx).qname = qname(); ((CatchClauseContext)_localctx).errors.add(((CatchClauseContext)_localctx).qname); } @@ -3738,15 +3734,15 @@ public final CatchClauseContext catchClause() throws RecognitionException { } } } - setState(640); + setState(642); _errHandler.sync(this); _la = _input.LA(1); } - setState(641); + setState(643); match(T__25); - setState(642); + setState(644); ((CatchClauseContext)_localctx).catch_expression = expr(); - setState(643); + setState(645); match(T__26); } } @@ -3793,24 +3789,24 @@ public final OrExprContext orExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(645); + setState(647); ((OrExprContext)_localctx).main_expr = andExpr(); - setState(650); + setState(652); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,63,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(646); + setState(648); match(Kor); - setState(647); + setState(649); ((OrExprContext)_localctx).andExpr = andExpr(); ((OrExprContext)_localctx).rhs.add(((OrExprContext)_localctx).andExpr); } } } - setState(652); + setState(654); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,63,_ctx); } @@ -3859,24 +3855,24 @@ public final AndExprContext andExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(653); + setState(655); ((AndExprContext)_localctx).main_expr = notExpr(); - setState(658); + setState(660); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,64,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(654); + setState(656); match(Kand); - setState(655); + setState(657); ((AndExprContext)_localctx).notExpr = notExpr(); ((AndExprContext)_localctx).rhs.add(((AndExprContext)_localctx).notExpr); } } } - setState(660); + setState(662); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,64,_ctx); } @@ -3918,18 +3914,18 @@ public final NotExprContext notExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(662); + setState(664); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,65,_ctx) ) { case 1: { - setState(661); + setState(663); ((NotExprContext)_localctx).Knot = match(Knot); ((NotExprContext)_localctx).op.add(((NotExprContext)_localctx).Knot); } break; } - setState(664); + setState(666); ((NotExprContext)_localctx).main_expr = comparisonExpr(); } } @@ -3986,14 +3982,14 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(666); + setState(668); ((ComparisonExprContext)_localctx).main_expr = stringConcatExpr(); - setState(669); + setState(671); _errHandler.sync(this); _la = _input.LA(1); if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) { { - setState(667); + setState(669); ((ComparisonExprContext)_localctx)._tset1256 = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__3) | (1L << T__35) | (1L << T__36) | (1L << T__37) | (1L << T__38) | (1L << T__39) | (1L << T__40) | (1L << T__41) | (1L << T__42) | (1L << T__43) | (1L << T__44) | (1L << T__45))) != 0)) ) { @@ -4005,7 +4001,7 @@ public final ComparisonExprContext comparisonExpr() throws RecognitionException consume(); } ((ComparisonExprContext)_localctx).op.add(((ComparisonExprContext)_localctx)._tset1256); - setState(668); + setState(670); ((ComparisonExprContext)_localctx).stringConcatExpr = stringConcatExpr(); ((ComparisonExprContext)_localctx).rhs.add(((ComparisonExprContext)_localctx).stringConcatExpr); } @@ -4052,22 +4048,22 @@ public final StringConcatExprContext stringConcatExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(671); + setState(673); ((StringConcatExprContext)_localctx).main_expr = rangeExpr(); - setState(676); + setState(678); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__46) { { { - setState(672); + setState(674); match(T__46); - setState(673); + setState(675); ((StringConcatExprContext)_localctx).rangeExpr = rangeExpr(); ((StringConcatExprContext)_localctx).rhs.add(((StringConcatExprContext)_localctx).rangeExpr); } } - setState(678); + setState(680); _errHandler.sync(this); _la = _input.LA(1); } @@ -4112,16 +4108,16 @@ public final RangeExprContext rangeExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(679); + setState(681); ((RangeExprContext)_localctx).main_expr = additiveExpr(); - setState(682); + setState(684); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,68,_ctx) ) { case 1: { - setState(680); + setState(682); match(Kto); - setState(681); + setState(683); ((RangeExprContext)_localctx).additiveExpr = additiveExpr(); ((RangeExprContext)_localctx).rhs.add(((RangeExprContext)_localctx).additiveExpr); } @@ -4173,16 +4169,16 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(684); + setState(686); ((AdditiveExprContext)_localctx).main_expr = multiplicativeExpr(); - setState(689); + setState(691); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,69,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { { - setState(685); + setState(687); ((AdditiveExprContext)_localctx)._tset1365 = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__47 || _la==T__48) ) { @@ -4194,13 +4190,13 @@ public final AdditiveExprContext additiveExpr() throws RecognitionException { consume(); } ((AdditiveExprContext)_localctx).op.add(((AdditiveExprContext)_localctx)._tset1365); - setState(686); + setState(688); ((AdditiveExprContext)_localctx).multiplicativeExpr = multiplicativeExpr(); ((AdditiveExprContext)_localctx).rhs.add(((AdditiveExprContext)_localctx).multiplicativeExpr); } } } - setState(691); + setState(693); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,69,_ctx); } @@ -4251,15 +4247,15 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx try { enterOuterAlt(_localctx, 1); { - setState(692); + setState(694); ((MultiplicativeExprContext)_localctx).main_expr = instanceOfExpr(); - setState(697); + setState(699); _errHandler.sync(this); _la = _input.LA(1); while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__34) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) { { { - setState(693); + setState(695); ((MultiplicativeExprContext)_localctx)._tset1393 = _input.LT(1); _la = _input.LA(1); if ( !((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__34) | (1L << T__49) | (1L << T__50) | (1L << T__51))) != 0)) ) { @@ -4271,12 +4267,12 @@ public final MultiplicativeExprContext multiplicativeExpr() throws RecognitionEx consume(); } ((MultiplicativeExprContext)_localctx).op.add(((MultiplicativeExprContext)_localctx)._tset1393); - setState(694); + setState(696); ((MultiplicativeExprContext)_localctx).instanceOfExpr = instanceOfExpr(); ((MultiplicativeExprContext)_localctx).rhs.add(((MultiplicativeExprContext)_localctx).instanceOfExpr); } } - setState(699); + setState(701); _errHandler.sync(this); _la = _input.LA(1); } @@ -4321,18 +4317,18 @@ public final InstanceOfExprContext instanceOfExpr() throws RecognitionException try { enterOuterAlt(_localctx, 1); { - setState(700); + setState(702); ((InstanceOfExprContext)_localctx).main_expr = isStaticallyExpr(); - setState(704); + setState(706); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,71,_ctx) ) { case 1: { - setState(701); + setState(703); match(Kinstance); - setState(702); + setState(704); match(Kof); - setState(703); + setState(705); ((InstanceOfExprContext)_localctx).seq = sequenceType(); } break; @@ -4378,18 +4374,18 @@ public final IsStaticallyExprContext isStaticallyExpr() throws RecognitionExcept try { enterOuterAlt(_localctx, 1); { - setState(706); + setState(708); ((IsStaticallyExprContext)_localctx).main_expr = treatExpr(); - setState(710); + setState(712); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,72,_ctx) ) { case 1: { - setState(707); + setState(709); match(Kis); - setState(708); + setState(710); match(Kstatically); - setState(709); + setState(711); ((IsStaticallyExprContext)_localctx).seq = sequenceType(); } break; @@ -4435,18 +4431,18 @@ public final TreatExprContext treatExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(712); + setState(714); ((TreatExprContext)_localctx).main_expr = castableExpr(); - setState(716); + setState(718); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,73,_ctx) ) { case 1: { - setState(713); + setState(715); match(Ktreat); - setState(714); + setState(716); match(Kas); - setState(715); + setState(717); ((TreatExprContext)_localctx).seq = sequenceType(); } break; @@ -4492,18 +4488,18 @@ public final CastableExprContext castableExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(718); + setState(720); ((CastableExprContext)_localctx).main_expr = castExpr(); - setState(722); + setState(724); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,74,_ctx) ) { case 1: { - setState(719); + setState(721); match(Kcastable); - setState(720); + setState(722); match(Kas); - setState(721); + setState(723); ((CastableExprContext)_localctx).single = singleType(); } break; @@ -4549,18 +4545,18 @@ public final CastExprContext castExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(724); + setState(726); ((CastExprContext)_localctx).main_expr = arrowExpr(); - setState(728); + setState(730); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,75,_ctx) ) { case 1: { - setState(725); + setState(727); match(Kcast); - setState(726); + setState(728); match(Kas); - setState(727); + setState(729); ((CastExprContext)_localctx).single = singleType(); } break; @@ -4617,9 +4613,9 @@ public final ArrowExprContext arrowExpr() throws RecognitionException { int _alt; enterOuterAlt(_localctx, 1); { - setState(730); + setState(732); ((ArrowExprContext)_localctx).main_expr = unaryExpr(); - setState(739); + setState(741); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,76,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { @@ -4627,21 +4623,21 @@ public final ArrowExprContext arrowExpr() throws RecognitionException { { { { - setState(731); + setState(733); match(T__3); - setState(732); + setState(734); match(T__44); } - setState(734); + setState(736); ((ArrowExprContext)_localctx).arrowFunctionSpecifier = arrowFunctionSpecifier(); ((ArrowExprContext)_localctx).function.add(((ArrowExprContext)_localctx).arrowFunctionSpecifier); - setState(735); + setState(737); ((ArrowExprContext)_localctx).argumentList = argumentList(); ((ArrowExprContext)_localctx).arguments.add(((ArrowExprContext)_localctx).argumentList); } } } - setState(741); + setState(743); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,76,_ctx); } @@ -4683,7 +4679,7 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog ArrowFunctionSpecifierContext _localctx = new ArrowFunctionSpecifierContext(_ctx, getState()); enterRule(_localctx, 116, RULE_arrowFunctionSpecifier); try { - setState(745); + setState(747); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -4734,6 +4730,8 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: @@ -4742,21 +4740,21 @@ public final ArrowFunctionSpecifierContext arrowFunctionSpecifier() throws Recog case NCName: enterOuterAlt(_localctx, 1); { - setState(742); + setState(744); qname(); } break; case T__32: enterOuterAlt(_localctx, 2); { - setState(743); + setState(745); varRef(); } break; case T__23: enterOuterAlt(_localctx, 3); { - setState(744); + setState(746); parenthesizedExpr(); } break; @@ -4802,13 +4800,13 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(750); + setState(752); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__47 || _la==T__48) { { { - setState(747); + setState(749); ((UnaryExprContext)_localctx)._tset1572 = _input.LT(1); _la = _input.LA(1); if ( !(_la==T__47 || _la==T__48) ) { @@ -4822,11 +4820,11 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { ((UnaryExprContext)_localctx).op.add(((UnaryExprContext)_localctx)._tset1572); } } - setState(752); + setState(754); _errHandler.sync(this); _la = _input.LA(1); } - setState(753); + setState(755); ((UnaryExprContext)_localctx).main_expr = valueExpr(); } } @@ -4844,12 +4842,16 @@ public final UnaryExprContext unaryExpr() throws RecognitionException { public static class ValueExprContext extends ParserRuleContext { public SimpleMapExprContext simpleMap_expr; public ValidateExprContext validate_expr; + public AnnotateExprContext annotate_expr; public SimpleMapExprContext simpleMapExpr() { return getRuleContext(SimpleMapExprContext.class,0); } public ValidateExprContext validateExpr() { return getRuleContext(ValidateExprContext.class,0); } + public AnnotateExprContext annotateExpr() { + return getRuleContext(AnnotateExprContext.class,0); + } public ValueExprContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -4865,88 +4867,30 @@ public final ValueExprContext valueExpr() throws RecognitionException { ValueExprContext _localctx = new ValueExprContext(_ctx, getState()); enterRule(_localctx, 120, RULE_valueExpr); try { - setState(757); + setState(760); _errHandler.sync(this); - switch (_input.LA(1)) { - case T__5: - case T__22: - case T__23: - case T__25: - case T__32: - case T__54: - case T__57: - case T__59: - case Kfor: - case Klet: - case Kwhere: - case Kgroup: - case Kby: - case Korder: - case Kreturn: - case Kif: - case Kin: - case Kas: - case Kat: - case Kallowing: - case Kempty: - case Kcount: - case Kstable: - case Kascending: - case Kdescending: - case Ksome: - case Kevery: - case Ksatisfies: - case Kcollation: - case Kgreatest: - case Kleast: - case Kswitch: - case Kcase: - case Ktry: - case Kcatch: - case Kdefault: - case Kthen: - case Kelse: - case Ktypeswitch: - case Kor: - case Kand: - case Knot: - case Kto: - case Kinstance: - case Kof: - case Kstatically: - case Kis: - case Ktreat: - case Kcast: - case Kcastable: - case Kversion: - case Kjsoniq: - case Kunordered: - case Ktrue: - case Kfalse: - case Ktype: - case Kdeclare: - case Kcontext: - case Kitem: - case Kvariable: - case STRING: - case NullLiteral: - case Literal: - case NCName: + switch ( getInterpreter().adaptivePredict(_input,79,_ctx) ) { + case 1: enterOuterAlt(_localctx, 1); { - setState(755); + setState(757); ((ValueExprContext)_localctx).simpleMap_expr = simpleMapExpr(); } break; - case T__52: + case 2: enterOuterAlt(_localctx, 2); { - setState(756); + setState(758); ((ValueExprContext)_localctx).validate_expr = validateExpr(); } break; - default: - throw new NoViableAltException(this); + case 3: + enterOuterAlt(_localctx, 3); + { + setState(759); + ((ValueExprContext)_localctx).annotate_expr = annotateExpr(); + } + break; } } catch (RecognitionException re) { @@ -4961,6 +4905,7 @@ public final ValueExprContext valueExpr() throws RecognitionException { } public static class ValidateExprContext extends ParserRuleContext { + public TerminalNode Kvalidate() { return getToken(JsoniqParser.Kvalidate, 0); } public TerminalNode Ktype() { return getToken(JsoniqParser.Ktype, 0); } public SequenceTypeContext sequenceType() { return getRuleContext(SequenceTypeContext.class,0); @@ -4985,17 +4930,68 @@ public final ValidateExprContext validateExpr() throws RecognitionException { try { enterOuterAlt(_localctx, 1); { - setState(759); - match(T__52); - setState(760); + setState(762); + match(Kvalidate); + setState(763); match(Ktype); - setState(761); + setState(764); sequenceType(); - setState(762); + setState(765); match(T__25); - setState(763); + setState(766); expr(); - setState(764); + setState(767); + match(T__26); + } + } + catch (RecognitionException re) { + _localctx.exception = re; + _errHandler.reportError(this, re); + _errHandler.recover(this, re); + } + finally { + exitRule(); + } + return _localctx; + } + + public static class AnnotateExprContext extends ParserRuleContext { + public TerminalNode Kannotate() { return getToken(JsoniqParser.Kannotate, 0); } + public TerminalNode Ktype() { return getToken(JsoniqParser.Ktype, 0); } + public SequenceTypeContext sequenceType() { + return getRuleContext(SequenceTypeContext.class,0); + } + public ExprContext expr() { + return getRuleContext(ExprContext.class,0); + } + public AnnotateExprContext(ParserRuleContext parent, int invokingState) { + super(parent, invokingState); + } + @Override public int getRuleIndex() { return RULE_annotateExpr; } + @Override + public T accept(ParseTreeVisitor visitor) { + if ( visitor instanceof JsoniqVisitor ) return ((JsoniqVisitor)visitor).visitAnnotateExpr(this); + else return visitor.visitChildren(this); + } + } + + public final AnnotateExprContext annotateExpr() throws RecognitionException { + AnnotateExprContext _localctx = new AnnotateExprContext(_ctx, getState()); + enterRule(_localctx, 124, RULE_annotateExpr); + try { + enterOuterAlt(_localctx, 1); + { + setState(769); + match(Kannotate); + setState(770); + match(Ktype); + setState(771); + sequenceType(); + setState(772); + match(T__25); + setState(773); + expr(); + setState(774); match(T__26); } } @@ -5033,27 +5029,27 @@ public T accept(ParseTreeVisitor visitor) { public final SimpleMapExprContext simpleMapExpr() throws RecognitionException { SimpleMapExprContext _localctx = new SimpleMapExprContext(_ctx, getState()); - enterRule(_localctx, 124, RULE_simpleMapExpr); + enterRule(_localctx, 126, RULE_simpleMapExpr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(766); + setState(776); ((SimpleMapExprContext)_localctx).main_expr = postFixExpr(); - setState(771); + setState(781); _errHandler.sync(this); _la = _input.LA(1); - while (_la==T__53) { + while (_la==T__52) { { { - setState(767); - match(T__53); - setState(768); + setState(777); + match(T__52); + setState(778); ((SimpleMapExprContext)_localctx).postFixExpr = postFixExpr(); ((SimpleMapExprContext)_localctx).map_expr.add(((SimpleMapExprContext)_localctx).postFixExpr); } } - setState(773); + setState(783); _errHandler.sync(this); _la = _input.LA(1); } @@ -5118,56 +5114,56 @@ public T accept(ParseTreeVisitor visitor) { public final PostFixExprContext postFixExpr() throws RecognitionException { PostFixExprContext _localctx = new PostFixExprContext(_ctx, getState()); - enterRule(_localctx, 126, RULE_postFixExpr); + enterRule(_localctx, 128, RULE_postFixExpr); try { int _alt; enterOuterAlt(_localctx, 1); { - setState(774); + setState(784); ((PostFixExprContext)_localctx).main_expr = primaryExpr(); - setState(782); + setState(792); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,82,_ctx); while ( _alt!=2 && _alt!=org.antlr.v4.runtime.atn.ATN.INVALID_ALT_NUMBER ) { if ( _alt==1 ) { { - setState(780); + setState(790); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,81,_ctx) ) { case 1: { - setState(775); + setState(785); arrayLookup(); } break; case 2: { - setState(776); + setState(786); predicate(); } break; case 3: { - setState(777); + setState(787); objectLookup(); } break; case 4: { - setState(778); + setState(788); arrayUnboxing(); } break; case 5: { - setState(779); + setState(789); argumentList(); } break; } } } - setState(784); + setState(794); _errHandler.sync(this); _alt = getInterpreter().adaptivePredict(_input,82,_ctx); } @@ -5201,20 +5197,20 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayLookupContext arrayLookup() throws RecognitionException { ArrayLookupContext _localctx = new ArrayLookupContext(_ctx, getState()); - enterRule(_localctx, 128, RULE_arrayLookup); + enterRule(_localctx, 130, RULE_arrayLookup); try { enterOuterAlt(_localctx, 1); { - setState(785); + setState(795); + match(T__53); + setState(796); + match(T__53); + setState(797); + expr(); + setState(798); match(T__54); - setState(786); + setState(799); match(T__54); - setState(787); - expr(); - setState(788); - match(T__55); - setState(789); - match(T__55); } } catch (RecognitionException re) { @@ -5242,14 +5238,14 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayUnboxingContext arrayUnboxing() throws RecognitionException { ArrayUnboxingContext _localctx = new ArrayUnboxingContext(_ctx, getState()); - enterRule(_localctx, 130, RULE_arrayUnboxing); + enterRule(_localctx, 132, RULE_arrayUnboxing); try { enterOuterAlt(_localctx, 1); { - setState(791); + setState(801); + match(T__53); + setState(802); match(T__54); - setState(792); - match(T__55); } } catch (RecognitionException re) { @@ -5280,16 +5276,16 @@ public T accept(ParseTreeVisitor visitor) { public final PredicateContext predicate() throws RecognitionException { PredicateContext _localctx = new PredicateContext(_ctx, getState()); - enterRule(_localctx, 132, RULE_predicate); + enterRule(_localctx, 134, RULE_predicate); try { enterOuterAlt(_localctx, 1); { - setState(794); - match(T__54); - setState(795); + setState(804); + match(T__53); + setState(805); expr(); - setState(796); - match(T__55); + setState(806); + match(T__54); } } catch (RecognitionException re) { @@ -5339,13 +5335,13 @@ public T accept(ParseTreeVisitor visitor) { public final ObjectLookupContext objectLookup() throws RecognitionException { ObjectLookupContext _localctx = new ObjectLookupContext(_ctx, getState()); - enterRule(_localctx, 134, RULE_objectLookup); + enterRule(_localctx, 136, RULE_objectLookup); try { enterOuterAlt(_localctx, 1); { - setState(798); - match(T__56); - setState(805); + setState(808); + match(T__55); + setState(815); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -5396,43 +5392,45 @@ public final ObjectLookupContext objectLookup() throws RecognitionException { case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: case Kvariable: case NullLiteral: { - setState(799); + setState(809); ((ObjectLookupContext)_localctx).kw = keyWords(); } break; case STRING: { - setState(800); + setState(810); ((ObjectLookupContext)_localctx).lt = stringLiteral(); } break; case NCName: { - setState(801); + setState(811); ((ObjectLookupContext)_localctx).nc = match(NCName); } break; case T__23: { - setState(802); + setState(812); ((ObjectLookupContext)_localctx).pe = parenthesizedExpr(); } break; case T__32: { - setState(803); + setState(813); ((ObjectLookupContext)_localctx).vr = varRef(); } break; - case T__57: + case T__56: { - setState(804); + setState(814); ((ObjectLookupContext)_localctx).ci = contextItemExpr(); } break; @@ -5500,106 +5498,106 @@ public T accept(ParseTreeVisitor visitor) { public final PrimaryExprContext primaryExpr() throws RecognitionException { PrimaryExprContext _localctx = new PrimaryExprContext(_ctx, getState()); - enterRule(_localctx, 136, RULE_primaryExpr); + enterRule(_localctx, 138, RULE_primaryExpr); try { - setState(821); + setState(831); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,84,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(807); + setState(817); match(NullLiteral); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(808); + setState(818); match(Ktrue); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(809); + setState(819); match(Kfalse); } break; case 4: enterOuterAlt(_localctx, 4); { - setState(810); + setState(820); match(Literal); } break; case 5: enterOuterAlt(_localctx, 5); { - setState(811); + setState(821); stringLiteral(); } break; case 6: enterOuterAlt(_localctx, 6); { - setState(812); + setState(822); varRef(); } break; case 7: enterOuterAlt(_localctx, 7); { - setState(813); + setState(823); parenthesizedExpr(); } break; case 8: enterOuterAlt(_localctx, 8); { - setState(814); + setState(824); contextItemExpr(); } break; case 9: enterOuterAlt(_localctx, 9); { - setState(815); + setState(825); objectConstructor(); } break; case 10: enterOuterAlt(_localctx, 10); { - setState(816); + setState(826); functionCall(); } break; case 11: enterOuterAlt(_localctx, 11); { - setState(817); + setState(827); orderedExpr(); } break; case 12: enterOuterAlt(_localctx, 12); { - setState(818); + setState(828); unorderedExpr(); } break; case 13: enterOuterAlt(_localctx, 13); { - setState(819); + setState(829); arrayConstructor(); } break; case 14: enterOuterAlt(_localctx, 14); { - setState(820); + setState(830); functionItemExpr(); } break; @@ -5634,13 +5632,13 @@ public T accept(ParseTreeVisitor visitor) { public final VarRefContext varRef() throws RecognitionException { VarRefContext _localctx = new VarRefContext(_ctx, getState()); - enterRule(_localctx, 138, RULE_varRef); + enterRule(_localctx, 140, RULE_varRef); try { enterOuterAlt(_localctx, 1); { - setState(823); + setState(833); match(T__32); - setState(824); + setState(834); ((VarRefContext)_localctx).var_name = qname(); } } @@ -5672,24 +5670,24 @@ public T accept(ParseTreeVisitor visitor) { public final ParenthesizedExprContext parenthesizedExpr() throws RecognitionException { ParenthesizedExprContext _localctx = new ParenthesizedExprContext(_ctx, getState()); - enterRule(_localctx, 140, RULE_parenthesizedExpr); + enterRule(_localctx, 142, RULE_parenthesizedExpr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(826); + setState(836); match(T__23); - setState(828); + setState(838); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__52) | (1L << T__54) | (1L << T__57) | (1L << T__59) | (1L << Kfor) | (1L << Klet))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kwhere - 64)) | (1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { { - setState(827); + setState(837); expr(); } } - setState(830); + setState(840); match(T__24); } } @@ -5718,12 +5716,12 @@ public T accept(ParseTreeVisitor visitor) { public final ContextItemExprContext contextItemExpr() throws RecognitionException { ContextItemExprContext _localctx = new ContextItemExprContext(_ctx, getState()); - enterRule(_localctx, 142, RULE_contextItemExpr); + enterRule(_localctx, 144, RULE_contextItemExpr); try { enterOuterAlt(_localctx, 1); { - setState(832); - match(T__57); + setState(842); + match(T__56); } } catch (RecognitionException re) { @@ -5754,17 +5752,17 @@ public T accept(ParseTreeVisitor visitor) { public final OrderedExprContext orderedExpr() throws RecognitionException { OrderedExprContext _localctx = new OrderedExprContext(_ctx, getState()); - enterRule(_localctx, 144, RULE_orderedExpr); + enterRule(_localctx, 146, RULE_orderedExpr); try { enterOuterAlt(_localctx, 1); { - setState(834); + setState(844); match(T__5); - setState(835); + setState(845); match(T__25); - setState(836); + setState(846); expr(); - setState(837); + setState(847); match(T__26); } } @@ -5780,7 +5778,6 @@ public final OrderedExprContext orderedExpr() throws RecognitionException { } public static class UnorderedExprContext extends ParserRuleContext { - public TerminalNode Kunordered() { return getToken(JsoniqParser.Kunordered, 0); } public ExprContext expr() { return getRuleContext(ExprContext.class,0); } @@ -5797,17 +5794,17 @@ public T accept(ParseTreeVisitor visitor) { public final UnorderedExprContext unorderedExpr() throws RecognitionException { UnorderedExprContext _localctx = new UnorderedExprContext(_ctx, getState()); - enterRule(_localctx, 146, RULE_unorderedExpr); + enterRule(_localctx, 148, RULE_unorderedExpr); try { enterOuterAlt(_localctx, 1); { - setState(839); + setState(849); match(Kunordered); - setState(840); + setState(850); match(T__25); - setState(841); + setState(851); expr(); - setState(842); + setState(852); match(T__26); } } @@ -5843,13 +5840,13 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionCallContext functionCall() throws RecognitionException { FunctionCallContext _localctx = new FunctionCallContext(_ctx, getState()); - enterRule(_localctx, 148, RULE_functionCall); + enterRule(_localctx, 150, RULE_functionCall); try { enterOuterAlt(_localctx, 1); { - setState(844); + setState(854); ((FunctionCallContext)_localctx).fn_name = qname(); - setState(845); + setState(855); argumentList(); } } @@ -5886,39 +5883,39 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentListContext argumentList() throws RecognitionException { ArgumentListContext _localctx = new ArgumentListContext(_ctx, getState()); - enterRule(_localctx, 150, RULE_argumentList); + enterRule(_localctx, 152, RULE_argumentList); int _la; try { enterOuterAlt(_localctx, 1); { - setState(847); + setState(857); match(T__23); - setState(854); + setState(864); _errHandler.sync(this); _la = _input.LA(1); - while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__52) | (1L << T__54) | (1L << T__57) | (1L << T__59) | (1L << Kfor) | (1L << Klet))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kwhere - 64)) | (1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (ArgumentPlaceholder - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { + while ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (ArgumentPlaceholder - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { { { - setState(848); + setState(858); ((ArgumentListContext)_localctx).argument = argument(); ((ArgumentListContext)_localctx).args.add(((ArgumentListContext)_localctx).argument); - setState(850); + setState(860); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__19) { { - setState(849); + setState(859); match(T__19); } } } } - setState(856); + setState(866); _errHandler.sync(this); _la = _input.LA(1); } - setState(857); + setState(867); match(T__24); } } @@ -5951,9 +5948,9 @@ public T accept(ParseTreeVisitor visitor) { public final ArgumentContext argument() throws RecognitionException { ArgumentContext _localctx = new ArgumentContext(_ctx, getState()); - enterRule(_localctx, 152, RULE_argument); + enterRule(_localctx, 154, RULE_argument); try { - setState(861); + setState(871); _errHandler.sync(this); switch (_input.LA(1)) { case T__5: @@ -5963,10 +5960,9 @@ public final ArgumentContext argument() throws RecognitionException { case T__32: case T__47: case T__48: - case T__52: - case T__54: - case T__57: - case T__59: + case T__53: + case T__56: + case T__58: case Kfor: case Klet: case Kwhere: @@ -6015,6 +6011,8 @@ public final ArgumentContext argument() throws RecognitionException { case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: @@ -6025,14 +6023,14 @@ public final ArgumentContext argument() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 1); { - setState(859); + setState(869); exprSingle(); } break; case ArgumentPlaceholder: enterOuterAlt(_localctx, 2); { - setState(860); + setState(870); match(ArgumentPlaceholder); } break; @@ -6071,9 +6069,9 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionItemExprContext functionItemExpr() throws RecognitionException { FunctionItemExprContext _localctx = new FunctionItemExprContext(_ctx, getState()); - enterRule(_localctx, 154, RULE_functionItemExpr); + enterRule(_localctx, 156, RULE_functionItemExpr); try { - setState(865); + setState(875); _errHandler.sync(this); switch (_input.LA(1)) { case Kfor: @@ -6124,6 +6122,8 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: @@ -6132,14 +6132,14 @@ public final FunctionItemExprContext functionItemExpr() throws RecognitionExcept case NCName: enterOuterAlt(_localctx, 1); { - setState(863); + setState(873); namedFunctionRef(); } break; case T__22: enterOuterAlt(_localctx, 2); { - setState(864); + setState(874); inlineFunctionExpr(); } break; @@ -6178,15 +6178,15 @@ public T accept(ParseTreeVisitor visitor) { public final NamedFunctionRefContext namedFunctionRef() throws RecognitionException { NamedFunctionRefContext _localctx = new NamedFunctionRefContext(_ctx, getState()); - enterRule(_localctx, 156, RULE_namedFunctionRef); + enterRule(_localctx, 158, RULE_namedFunctionRef); try { enterOuterAlt(_localctx, 1); { - setState(867); + setState(877); ((NamedFunctionRefContext)_localctx).fn_name = qname(); - setState(868); - match(T__58); - setState(869); + setState(878); + match(T__57); + setState(879); ((NamedFunctionRefContext)_localctx).arity = match(Literal); } } @@ -6227,53 +6227,53 @@ public T accept(ParseTreeVisitor visitor) { public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionException { InlineFunctionExprContext _localctx = new InlineFunctionExprContext(_ctx, getState()); - enterRule(_localctx, 158, RULE_inlineFunctionExpr); + enterRule(_localctx, 160, RULE_inlineFunctionExpr); int _la; try { enterOuterAlt(_localctx, 1); { - setState(871); + setState(881); match(T__22); - setState(872); + setState(882); match(T__23); - setState(874); + setState(884); _errHandler.sync(this); _la = _input.LA(1); if (_la==T__32) { { - setState(873); + setState(883); paramList(); } } - setState(876); + setState(886); match(T__24); - setState(879); + setState(889); _errHandler.sync(this); _la = _input.LA(1); if (_la==Kas) { { - setState(877); + setState(887); match(Kas); - setState(878); + setState(888); ((InlineFunctionExprContext)_localctx).return_type = sequenceType(); } } { - setState(881); + setState(891); match(T__25); - setState(883); + setState(893); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__52) | (1L << T__54) | (1L << T__57) | (1L << T__59) | (1L << Kfor) | (1L << Klet))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kwhere - 64)) | (1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { { - setState(882); + setState(892); ((InlineFunctionExprContext)_localctx).fn_body = expr(); } } - setState(885); + setState(895); match(T__26); } } @@ -6291,7 +6291,7 @@ public final InlineFunctionExprContext inlineFunctionExpr() throws RecognitionEx public static class SequenceTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s115; + public Token s116; public List question = new ArrayList(); public Token s35; public List star = new ArrayList(); @@ -6300,7 +6300,6 @@ public static class SequenceTypeContext extends ParserRuleContext { public ItemTypeContext itemType() { return getRuleContext(ItemTypeContext.class,0); } - public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } public SequenceTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -6314,17 +6313,17 @@ public T accept(ParseTreeVisitor visitor) { public final SequenceTypeContext sequenceType() throws RecognitionException { SequenceTypeContext _localctx = new SequenceTypeContext(_ctx, getState()); - enterRule(_localctx, 160, RULE_sequenceType); + enterRule(_localctx, 162, RULE_sequenceType); try { - setState(895); + setState(905); _errHandler.sync(this); switch (_input.LA(1)) { case T__23: enterOuterAlt(_localctx, 1); { - setState(887); + setState(897); match(T__23); - setState(888); + setState(898); match(T__24); } break; @@ -6377,6 +6376,8 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case Ktrue: case Kfalse: case Ktype: + case Kvalidate: + case Kannotate: case Kdeclare: case Kcontext: case Kitem: @@ -6385,28 +6386,28 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { case NCName: enterOuterAlt(_localctx, 2); { - setState(889); + setState(899); ((SequenceTypeContext)_localctx).item = itemType(); - setState(893); + setState(903); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,93,_ctx) ) { case 1: { - setState(890); - ((SequenceTypeContext)_localctx).s115 = match(ArgumentPlaceholder); - ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s115); + setState(900); + ((SequenceTypeContext)_localctx).s116 = match(ArgumentPlaceholder); + ((SequenceTypeContext)_localctx).question.add(((SequenceTypeContext)_localctx).s116); } break; case 2: { - setState(891); + setState(901); ((SequenceTypeContext)_localctx).s35 = match(T__34); ((SequenceTypeContext)_localctx).star.add(((SequenceTypeContext)_localctx).s35); } break; case 3: { - setState(892); + setState(902); ((SequenceTypeContext)_localctx).s48 = match(T__47); ((SequenceTypeContext)_localctx).plus.add(((SequenceTypeContext)_localctx).s48); } @@ -6430,7 +6431,7 @@ public final SequenceTypeContext sequenceType() throws RecognitionException { } public static class ObjectConstructorContext extends ParserRuleContext { - public Token s60; + public Token s59; public List merge_operator = new ArrayList(); public List pairConstructor() { return getRuleContexts(PairConstructorContext.class); @@ -6454,57 +6455,57 @@ public T accept(ParseTreeVisitor visitor) { public final ObjectConstructorContext objectConstructor() throws RecognitionException { ObjectConstructorContext _localctx = new ObjectConstructorContext(_ctx, getState()); - enterRule(_localctx, 162, RULE_objectConstructor); + enterRule(_localctx, 164, RULE_objectConstructor); int _la; try { - setState(913); + setState(923); _errHandler.sync(this); switch (_input.LA(1)) { case T__25: enterOuterAlt(_localctx, 1); { - setState(897); + setState(907); match(T__25); - setState(906); + setState(916); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__52) | (1L << T__54) | (1L << T__57) | (1L << T__59) | (1L << Kfor) | (1L << Klet))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kwhere - 64)) | (1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { { - setState(898); + setState(908); pairConstructor(); - setState(903); + setState(913); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(899); + setState(909); match(T__19); - setState(900); + setState(910); pairConstructor(); } } - setState(905); + setState(915); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(908); + setState(918); match(T__26); } break; - case T__59: + case T__58: enterOuterAlt(_localctx, 2); { - setState(909); - ((ObjectConstructorContext)_localctx).s60 = match(T__59); - ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s60); - setState(910); + setState(919); + ((ObjectConstructorContext)_localctx).s59 = match(T__58); + ((ObjectConstructorContext)_localctx).merge_operator.add(((ObjectConstructorContext)_localctx).s59); + setState(920); expr(); - setState(911); - match(T__60); + setState(921); + match(T__59); } break; default: @@ -6543,29 +6544,29 @@ public T accept(ParseTreeVisitor visitor) { public final ItemTypeContext itemType() throws RecognitionException { ItemTypeContext _localctx = new ItemTypeContext(_ctx, getState()); - enterRule(_localctx, 164, RULE_itemType); + enterRule(_localctx, 166, RULE_itemType); try { - setState(918); + setState(928); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,98,_ctx) ) { case 1: enterOuterAlt(_localctx, 1); { - setState(915); + setState(925); qname(); } break; case 2: enterOuterAlt(_localctx, 2); { - setState(916); + setState(926); match(NullLiteral); } break; case 3: enterOuterAlt(_localctx, 3); { - setState(917); + setState(927); functionTest(); } break; @@ -6602,22 +6603,22 @@ public T accept(ParseTreeVisitor visitor) { public final FunctionTestContext functionTest() throws RecognitionException { FunctionTestContext _localctx = new FunctionTestContext(_ctx, getState()); - enterRule(_localctx, 166, RULE_functionTest); + enterRule(_localctx, 168, RULE_functionTest); try { enterOuterAlt(_localctx, 1); { - setState(922); + setState(932); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,99,_ctx) ) { case 1: { - setState(920); + setState(930); anyFunctionTest(); } break; case 2: { - setState(921); + setState(931); typedFunctionTest(); } break; @@ -6649,17 +6650,17 @@ public T accept(ParseTreeVisitor visitor) { public final AnyFunctionTestContext anyFunctionTest() throws RecognitionException { AnyFunctionTestContext _localctx = new AnyFunctionTestContext(_ctx, getState()); - enterRule(_localctx, 168, RULE_anyFunctionTest); + enterRule(_localctx, 170, RULE_anyFunctionTest); try { enterOuterAlt(_localctx, 1); { - setState(924); + setState(934); match(T__22); - setState(925); + setState(935); match(T__23); - setState(926); + setState(936); match(T__34); - setState(927); + setState(937); match(T__24); } } @@ -6678,7 +6679,6 @@ public static class TypedFunctionTestContext extends ParserRuleContext { public SequenceTypeContext sequenceType; public List st = new ArrayList(); public SequenceTypeContext rt; - public TerminalNode Kas() { return getToken(JsoniqParser.Kas, 0); } public List sequenceType() { return getRuleContexts(SequenceTypeContext.class); } @@ -6698,48 +6698,48 @@ public T accept(ParseTreeVisitor visitor) { public final TypedFunctionTestContext typedFunctionTest() throws RecognitionException { TypedFunctionTestContext _localctx = new TypedFunctionTestContext(_ctx, getState()); - enterRule(_localctx, 170, RULE_typedFunctionTest); + enterRule(_localctx, 172, RULE_typedFunctionTest); int _la; try { enterOuterAlt(_localctx, 1); { - setState(929); + setState(939); match(T__22); - setState(930); + setState(940); match(T__23); - setState(939); + setState(949); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__22) | (1L << T__23) | (1L << Kfor) | (1L << Klet))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kwhere - 64)) | (1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (NullLiteral - 64)) | (1L << (NCName - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__22) | (1L << T__23) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (NullLiteral - 64)) | (1L << (NCName - 64)))) != 0)) { { - setState(931); + setState(941); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); - setState(936); + setState(946); _errHandler.sync(this); _la = _input.LA(1); while (_la==T__19) { { { - setState(932); + setState(942); match(T__19); - setState(933); + setState(943); ((TypedFunctionTestContext)_localctx).sequenceType = sequenceType(); ((TypedFunctionTestContext)_localctx).st.add(((TypedFunctionTestContext)_localctx).sequenceType); } } - setState(938); + setState(948); _errHandler.sync(this); _la = _input.LA(1); } } } - setState(941); + setState(951); match(T__24); - setState(942); + setState(952); match(Kas); - setState(943); + setState(953); ((TypedFunctionTestContext)_localctx).rt = sequenceType(); } } @@ -6756,12 +6756,11 @@ public final TypedFunctionTestContext typedFunctionTest() throws RecognitionExce public static class SingleTypeContext extends ParserRuleContext { public ItemTypeContext item; - public Token s115; + public Token s116; public List question = new ArrayList(); public ItemTypeContext itemType() { return getRuleContext(ItemTypeContext.class,0); } - public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } public SingleTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -6775,20 +6774,20 @@ public T accept(ParseTreeVisitor visitor) { public final SingleTypeContext singleType() throws RecognitionException { SingleTypeContext _localctx = new SingleTypeContext(_ctx, getState()); - enterRule(_localctx, 172, RULE_singleType); + enterRule(_localctx, 174, RULE_singleType); try { enterOuterAlt(_localctx, 1); { - setState(945); + setState(955); ((SingleTypeContext)_localctx).item = itemType(); - setState(947); + setState(957); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,102,_ctx) ) { case 1: { - setState(946); - ((SingleTypeContext)_localctx).s115 = match(ArgumentPlaceholder); - ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s115); + setState(956); + ((SingleTypeContext)_localctx).s116 = match(ArgumentPlaceholder); + ((SingleTypeContext)_localctx).question.add(((SingleTypeContext)_localctx).s116); } break; } @@ -6809,7 +6808,6 @@ public static class PairConstructorContext extends ParserRuleContext { public ExprSingleContext lhs; public Token name; public ExprSingleContext rhs; - public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } public List exprSingle() { return getRuleContexts(ExprSingleContext.class); } @@ -6830,28 +6828,28 @@ public T accept(ParseTreeVisitor visitor) { public final PairConstructorContext pairConstructor() throws RecognitionException { PairConstructorContext _localctx = new PairConstructorContext(_ctx, getState()); - enterRule(_localctx, 174, RULE_pairConstructor); + enterRule(_localctx, 176, RULE_pairConstructor); int _la; try { enterOuterAlt(_localctx, 1); { - setState(951); + setState(961); _errHandler.sync(this); switch ( getInterpreter().adaptivePredict(_input,103,_ctx) ) { case 1: { - setState(949); + setState(959); ((PairConstructorContext)_localctx).lhs = exprSingle(); } break; case 2: { - setState(950); + setState(960); ((PairConstructorContext)_localctx).name = match(NCName); } break; } - setState(953); + setState(963); _la = _input.LA(1); if ( !(_la==T__7 || _la==ArgumentPlaceholder) ) { _errHandler.recoverInline(this); @@ -6861,7 +6859,7 @@ public final PairConstructorContext pairConstructor() throws RecognitionExceptio _errHandler.reportMatch(this); consume(); } - setState(954); + setState(964); ((PairConstructorContext)_localctx).rhs = exprSingle(); } } @@ -6893,25 +6891,25 @@ public T accept(ParseTreeVisitor visitor) { public final ArrayConstructorContext arrayConstructor() throws RecognitionException { ArrayConstructorContext _localctx = new ArrayConstructorContext(_ctx, getState()); - enterRule(_localctx, 176, RULE_arrayConstructor); + enterRule(_localctx, 178, RULE_arrayConstructor); int _la; try { enterOuterAlt(_localctx, 1); { - setState(956); - match(T__54); - setState(958); + setState(966); + match(T__53); + setState(968); _errHandler.sync(this); _la = _input.LA(1); - if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__52) | (1L << T__54) | (1L << T__57) | (1L << T__59) | (1L << Kfor) | (1L << Klet))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kwhere - 64)) | (1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { + if ((((_la) & ~0x3f) == 0 && ((1L << _la) & ((1L << T__5) | (1L << T__22) | (1L << T__23) | (1L << T__25) | (1L << T__32) | (1L << T__47) | (1L << T__48) | (1L << T__53) | (1L << T__56) | (1L << T__58) | (1L << Kfor) | (1L << Klet) | (1L << Kwhere))) != 0) || ((((_la - 64)) & ~0x3f) == 0 && ((1L << (_la - 64)) & ((1L << (Kgroup - 64)) | (1L << (Kby - 64)) | (1L << (Korder - 64)) | (1L << (Kreturn - 64)) | (1L << (Kif - 64)) | (1L << (Kin - 64)) | (1L << (Kas - 64)) | (1L << (Kat - 64)) | (1L << (Kallowing - 64)) | (1L << (Kempty - 64)) | (1L << (Kcount - 64)) | (1L << (Kstable - 64)) | (1L << (Kascending - 64)) | (1L << (Kdescending - 64)) | (1L << (Ksome - 64)) | (1L << (Kevery - 64)) | (1L << (Ksatisfies - 64)) | (1L << (Kcollation - 64)) | (1L << (Kgreatest - 64)) | (1L << (Kleast - 64)) | (1L << (Kswitch - 64)) | (1L << (Kcase - 64)) | (1L << (Ktry - 64)) | (1L << (Kcatch - 64)) | (1L << (Kdefault - 64)) | (1L << (Kthen - 64)) | (1L << (Kelse - 64)) | (1L << (Ktypeswitch - 64)) | (1L << (Kor - 64)) | (1L << (Kand - 64)) | (1L << (Knot - 64)) | (1L << (Kto - 64)) | (1L << (Kinstance - 64)) | (1L << (Kof - 64)) | (1L << (Kstatically - 64)) | (1L << (Kis - 64)) | (1L << (Ktreat - 64)) | (1L << (Kcast - 64)) | (1L << (Kcastable - 64)) | (1L << (Kversion - 64)) | (1L << (Kjsoniq - 64)) | (1L << (Kunordered - 64)) | (1L << (Ktrue - 64)) | (1L << (Kfalse - 64)) | (1L << (Ktype - 64)) | (1L << (Kvalidate - 64)) | (1L << (Kannotate - 64)) | (1L << (Kdeclare - 64)) | (1L << (Kcontext - 64)) | (1L << (Kitem - 64)) | (1L << (Kvariable - 64)) | (1L << (STRING - 64)) | (1L << (NullLiteral - 64)) | (1L << (Literal - 64)) | (1L << (NCName - 64)))) != 0)) { { - setState(957); + setState(967); expr(); } } - setState(960); - match(T__55); + setState(970); + match(T__54); } } catch (RecognitionException re) { @@ -6942,11 +6940,11 @@ public T accept(ParseTreeVisitor visitor) { public final UriLiteralContext uriLiteral() throws RecognitionException { UriLiteralContext _localctx = new UriLiteralContext(_ctx, getState()); - enterRule(_localctx, 178, RULE_uriLiteral); + enterRule(_localctx, 180, RULE_uriLiteral); try { enterOuterAlt(_localctx, 1); { - setState(962); + setState(972); stringLiteral(); } } @@ -6976,11 +6974,11 @@ public T accept(ParseTreeVisitor visitor) { public final StringLiteralContext stringLiteral() throws RecognitionException { StringLiteralContext _localctx = new StringLiteralContext(_ctx, getState()); - enterRule(_localctx, 180, RULE_stringLiteral); + enterRule(_localctx, 182, RULE_stringLiteral); try { enterOuterAlt(_localctx, 1); { - setState(964); + setState(974); match(STRING); } } @@ -7049,6 +7047,8 @@ public static class KeyWordsContext extends ParserRuleContext { public TerminalNode Ktrue() { return getToken(JsoniqParser.Ktrue, 0); } public TerminalNode Kfalse() { return getToken(JsoniqParser.Kfalse, 0); } public TerminalNode Ktype() { return getToken(JsoniqParser.Ktype, 0); } + public TerminalNode Kvalidate() { return getToken(JsoniqParser.Kvalidate, 0); } + public TerminalNode Kannotate() { return getToken(JsoniqParser.Kannotate, 0); } public KeyWordsContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -7062,14 +7062,14 @@ public T accept(ParseTreeVisitor visitor) { public final KeyWordsContext keyWords() throws RecognitionException { KeyWordsContext _localctx = new KeyWordsContext(_ctx, getState()); - enterRule(_localctx, 182, RULE_keyWords); + enterRule(_localctx, 184, RULE_keyWords); int _la; try { enterOuterAlt(_localctx, 1); { - setState(966); + setState(976); _la = _input.LA(1); - if ( !(((((_la - 62)) & ~0x3f) == 0 && ((1L << (_la - 62)) & ((1L << (Kfor - 62)) | (1L << (Klet - 62)) | (1L << (Kwhere - 62)) | (1L << (Kgroup - 62)) | (1L << (Kby - 62)) | (1L << (Korder - 62)) | (1L << (Kreturn - 62)) | (1L << (Kif - 62)) | (1L << (Kin - 62)) | (1L << (Kas - 62)) | (1L << (Kat - 62)) | (1L << (Kallowing - 62)) | (1L << (Kempty - 62)) | (1L << (Kcount - 62)) | (1L << (Kstable - 62)) | (1L << (Kascending - 62)) | (1L << (Kdescending - 62)) | (1L << (Ksome - 62)) | (1L << (Kevery - 62)) | (1L << (Ksatisfies - 62)) | (1L << (Kcollation - 62)) | (1L << (Kgreatest - 62)) | (1L << (Kleast - 62)) | (1L << (Kswitch - 62)) | (1L << (Kcase - 62)) | (1L << (Ktry - 62)) | (1L << (Kcatch - 62)) | (1L << (Kdefault - 62)) | (1L << (Kthen - 62)) | (1L << (Kelse - 62)) | (1L << (Ktypeswitch - 62)) | (1L << (Kor - 62)) | (1L << (Kand - 62)) | (1L << (Knot - 62)) | (1L << (Kto - 62)) | (1L << (Kinstance - 62)) | (1L << (Kof - 62)) | (1L << (Kstatically - 62)) | (1L << (Kis - 62)) | (1L << (Ktreat - 62)) | (1L << (Kcast - 62)) | (1L << (Kcastable - 62)) | (1L << (Kversion - 62)) | (1L << (Kjsoniq - 62)) | (1L << (Kunordered - 62)) | (1L << (Ktrue - 62)) | (1L << (Kfalse - 62)) | (1L << (Ktype - 62)) | (1L << (Kdeclare - 62)) | (1L << (Kcontext - 62)) | (1L << (Kitem - 62)) | (1L << (Kvariable - 62)) | (1L << (NullLiteral - 62)))) != 0)) ) { + if ( !(((((_la - 61)) & ~0x3f) == 0 && ((1L << (_la - 61)) & ((1L << (Kfor - 61)) | (1L << (Klet - 61)) | (1L << (Kwhere - 61)) | (1L << (Kgroup - 61)) | (1L << (Kby - 61)) | (1L << (Korder - 61)) | (1L << (Kreturn - 61)) | (1L << (Kif - 61)) | (1L << (Kin - 61)) | (1L << (Kas - 61)) | (1L << (Kat - 61)) | (1L << (Kallowing - 61)) | (1L << (Kempty - 61)) | (1L << (Kcount - 61)) | (1L << (Kstable - 61)) | (1L << (Kascending - 61)) | (1L << (Kdescending - 61)) | (1L << (Ksome - 61)) | (1L << (Kevery - 61)) | (1L << (Ksatisfies - 61)) | (1L << (Kcollation - 61)) | (1L << (Kgreatest - 61)) | (1L << (Kleast - 61)) | (1L << (Kswitch - 61)) | (1L << (Kcase - 61)) | (1L << (Ktry - 61)) | (1L << (Kcatch - 61)) | (1L << (Kdefault - 61)) | (1L << (Kthen - 61)) | (1L << (Kelse - 61)) | (1L << (Ktypeswitch - 61)) | (1L << (Kor - 61)) | (1L << (Kand - 61)) | (1L << (Knot - 61)) | (1L << (Kto - 61)) | (1L << (Kinstance - 61)) | (1L << (Kof - 61)) | (1L << (Kstatically - 61)) | (1L << (Kis - 61)) | (1L << (Ktreat - 61)) | (1L << (Kcast - 61)) | (1L << (Kcastable - 61)) | (1L << (Kversion - 61)) | (1L << (Kjsoniq - 61)) | (1L << (Kunordered - 61)) | (1L << (Ktrue - 61)) | (1L << (Kfalse - 61)) | (1L << (Ktype - 61)) | (1L << (Kvalidate - 61)) | (1L << (Kannotate - 61)) | (1L << (Kdeclare - 61)) | (1L << (Kcontext - 61)) | (1L << (Kitem - 61)) | (1L << (Kvariable - 61)) | (1L << (NullLiteral - 61)))) != 0)) ) { _errHandler.recoverInline(this); } else { @@ -7091,8 +7091,8 @@ public final KeyWordsContext keyWords() throws RecognitionException { } public static final String _serializedATN = - "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\177\u03cb\4\2\t\2"+ - "\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ + "\3\u608b\ua72a\u8133\ub9ed\u417c\u3be7\u7786\u5964\3\u0080\u03d5\4\2\t"+ + "\2\4\3\t\3\4\4\t\4\4\5\t\5\4\6\t\6\4\7\t\7\4\b\t\b\4\t\t\t\4\n\t\n\4\13"+ "\t\13\4\f\t\f\4\r\t\r\4\16\t\16\4\17\t\17\4\20\t\20\4\21\t\21\4\22\t\22"+ "\4\23\t\23\4\24\t\24\4\25\t\25\4\26\t\26\4\27\t\27\4\30\t\30\4\31\t\31"+ "\4\32\t\32\4\33\t\33\4\34\t\34\4\35\t\35\4\36\t\36\4\37\t\37\4 \t \4!"+ @@ -7101,359 +7101,363 @@ public final KeyWordsContext keyWords() throws RecognitionException { "\64\4\65\t\65\4\66\t\66\4\67\t\67\48\t8\49\t9\4:\t:\4;\t;\4<\t<\4=\t="+ "\4>\t>\4?\t?\4@\t@\4A\tA\4B\tB\4C\tC\4D\tD\4E\tE\4F\tF\4G\tG\4H\tH\4I"+ "\tI\4J\tJ\4K\tK\4L\tL\4M\tM\4N\tN\4O\tO\4P\tP\4Q\tQ\4R\tR\4S\tS\4T\tT"+ - "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\3\2\3\2\3\2\3"+ - "\3\3\3\3\3\3\3\3\3\5\3\u00c3\n\3\3\3\3\3\5\3\u00c7\n\3\3\4\3\4\3\4\3\5"+ - "\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\5\6\u00d7\n\6\3\6\3\6\7\6\u00db"+ - "\n\6\f\6\16\6\u00de\13\6\3\6\3\6\3\6\7\6\u00e3\n\6\f\6\16\6\u00e6\13\6"+ - "\3\7\3\7\3\7\3\7\5\7\u00ec\n\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3\t\3\t"+ - "\5\t\u00f8\n\t\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3\f\3\f"+ - "\3\f\3\f\3\r\3\r\3\r\3\r\3\r\5\r\u010e\n\r\3\r\3\r\3\r\3\r\7\r\u0114\n"+ - "\r\f\r\16\r\u0117\13\r\3\16\3\16\5\16\u011b\n\16\3\16\5\16\u011e\n\16"+ - "\3\16\3\16\5\16\u0122\n\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\5\20\u012b"+ - "\n\20\3\20\3\20\3\20\3\20\3\20\7\20\u0132\n\20\f\20\16\20\u0135\13\20"+ - "\5\20\u0137\n\20\3\21\3\21\3\21\3\21\3\21\5\21\u013e\n\21\3\21\3\21\3"+ - "\21\3\21\3\21\5\21\u0145\n\21\5\21\u0147\n\21\3\22\3\22\3\22\3\22\3\22"+ - "\5\22\u014e\n\22\3\22\3\22\3\22\3\22\3\22\5\22\u0155\n\22\5\22\u0157\n"+ - "\22\3\23\3\23\3\23\3\23\3\23\5\23\u015e\n\23\3\23\3\23\3\23\5\23\u0163"+ - "\n\23\3\23\3\23\5\23\u0167\n\23\3\23\3\23\5\23\u016b\n\23\3\24\3\24\3"+ - "\24\3\24\3\24\5\24\u0172\n\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25"+ - "\5\25\u017c\n\25\3\26\3\26\3\26\7\26\u0181\n\26\f\26\16\26\u0184\13\26"+ - "\3\27\3\27\3\27\3\27\5\27\u018a\n\27\3\30\3\30\3\30\7\30\u018f\n\30\f"+ - "\30\16\30\u0192\13\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\5\31\u019b\n"+ - "\31\3\32\3\32\5\32\u019f\n\32\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u01a7"+ - "\n\32\f\32\16\32\u01aa\13\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\7\33\u01b3"+ - "\n\33\f\33\16\33\u01b6\13\33\3\34\3\34\3\34\5\34\u01bb\n\34\3\34\3\34"+ - "\5\34\u01bf\n\34\3\34\3\34\5\34\u01c3\n\34\3\34\3\34\3\34\3\35\3\35\3"+ - "\35\3\35\7\35\u01cc\n\35\f\35\16\35\u01cf\13\35\3\36\3\36\3\36\5\36\u01d4"+ - "\n\36\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3 \3 \7 \u01e1\n \f \16 "+ - "\u01e4\13 \3!\3!\3!\5!\u01e9\n!\3!\3!\5!\u01ed\n!\3!\3!\5!\u01f1\n!\3"+ - "\"\3\"\3\"\3\"\3\"\5\"\u01f8\n\"\3\"\3\"\3\"\7\"\u01fd\n\"\f\"\16\"\u0200"+ - "\13\"\3#\3#\3#\5#\u0205\n#\3#\3#\3#\5#\u020a\n#\5#\u020c\n#\3#\3#\5#\u0210"+ - "\n#\3$\3$\3$\3%\3%\5%\u0217\n%\3%\3%\3%\7%\u021c\n%\f%\16%\u021f\13%\3"+ - "%\3%\3%\3&\3&\3&\5&\u0227\n&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\6\'\u0231\n"+ - "\'\r\'\16\'\u0232\3\'\3\'\3\'\3\'\3(\3(\6(\u023b\n(\r(\16(\u023c\3(\3"+ - "(\3(\3)\3)\3)\3)\3)\6)\u0247\n)\r)\16)\u0248\3)\3)\5)\u024d\n)\3)\3)\3"+ - ")\3*\3*\3*\3*\5*\u0256\n*\3*\3*\3*\7*\u025b\n*\f*\16*\u025e\13*\3*\3*"+ - "\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\6,\u0271\n,\r,\16,\u0272"+ - "\3-\3-\3-\5-\u0278\n-\3-\3-\3-\5-\u027d\n-\7-\u027f\n-\f-\16-\u0282\13"+ - "-\3-\3-\3-\3-\3.\3.\3.\7.\u028b\n.\f.\16.\u028e\13.\3/\3/\3/\7/\u0293"+ - "\n/\f/\16/\u0296\13/\3\60\5\60\u0299\n\60\3\60\3\60\3\61\3\61\3\61\5\61"+ - "\u02a0\n\61\3\62\3\62\3\62\7\62\u02a5\n\62\f\62\16\62\u02a8\13\62\3\63"+ - "\3\63\3\63\5\63\u02ad\n\63\3\64\3\64\3\64\7\64\u02b2\n\64\f\64\16\64\u02b5"+ - "\13\64\3\65\3\65\3\65\7\65\u02ba\n\65\f\65\16\65\u02bd\13\65\3\66\3\66"+ - "\3\66\3\66\5\66\u02c3\n\66\3\67\3\67\3\67\3\67\5\67\u02c9\n\67\38\38\3"+ - "8\38\58\u02cf\n8\39\39\39\39\59\u02d5\n9\3:\3:\3:\3:\5:\u02db\n:\3;\3"+ - ";\3;\3;\3;\3;\3;\7;\u02e4\n;\f;\16;\u02e7\13;\3<\3<\3<\5<\u02ec\n<\3="+ - "\7=\u02ef\n=\f=\16=\u02f2\13=\3=\3=\3>\3>\5>\u02f8\n>\3?\3?\3?\3?\3?\3"+ - "?\3?\3@\3@\3@\7@\u0304\n@\f@\16@\u0307\13@\3A\3A\3A\3A\3A\3A\7A\u030f"+ - "\nA\fA\16A\u0312\13A\3B\3B\3B\3B\3B\3B\3C\3C\3C\3D\3D\3D\3D\3E\3E\3E\3"+ - "E\3E\3E\3E\5E\u0328\nE\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\3F\5F\u0338"+ - "\nF\3G\3G\3G\3H\3H\5H\u033f\nH\3H\3H\3I\3I\3J\3J\3J\3J\3J\3K\3K\3K\3K"+ - "\3K\3L\3L\3L\3M\3M\3M\5M\u0355\nM\7M\u0357\nM\fM\16M\u035a\13M\3M\3M\3"+ - "N\3N\5N\u0360\nN\3O\3O\5O\u0364\nO\3P\3P\3P\3P\3Q\3Q\3Q\5Q\u036d\nQ\3"+ - "Q\3Q\3Q\5Q\u0372\nQ\3Q\3Q\5Q\u0376\nQ\3Q\3Q\3R\3R\3R\3R\3R\3R\5R\u0380"+ - "\nR\5R\u0382\nR\3S\3S\3S\3S\7S\u0388\nS\fS\16S\u038b\13S\5S\u038d\nS\3"+ - "S\3S\3S\3S\3S\5S\u0394\nS\3T\3T\3T\5T\u0399\nT\3U\3U\5U\u039d\nU\3V\3"+ - "V\3V\3V\3V\3W\3W\3W\3W\3W\7W\u03a9\nW\fW\16W\u03ac\13W\5W\u03ae\nW\3W"+ - "\3W\3W\3W\3X\3X\5X\u03b6\nX\3Y\3Y\5Y\u03ba\nY\3Y\3Y\3Y\3Z\3Z\5Z\u03c1"+ - "\nZ\3Z\3Z\3[\3[\3\\\3\\\3]\3]\3]\2\2^\2\4\6\b\n\f\16\20\22\24\26\30\32"+ - "\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVXZ\\^`bdfhjlnprtvxz|~\u0080"+ - "\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090\u0092\u0094\u0096\u0098"+ - "\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8\u00aa\u00ac\u00ae\u00b0"+ - "\u00b2\u00b4\u00b6\u00b8\2\n\4\2\b\bll\3\2UV\3\2\13\24\4\2\6\6&\60\3\2"+ - "\62\63\4\2%%\64\66\4\2\n\nuu\4\2@svv\2\u03fe\2\u00ba\3\2\2\2\4\u00c2\3"+ - "\2\2\2\6\u00c8\3\2\2\2\b\u00cb\3\2\2\2\n\u00dc\3\2\2\2\f\u00eb\3\2\2\2"+ - "\16\u00ed\3\2\2\2\20\u00f7\3\2\2\2\22\u00f9\3\2\2\2\24\u00fe\3\2\2\2\26"+ - "\u0102\3\2\2\2\30\u0108\3\2\2\2\32\u011d\3\2\2\2\34\u0123\3\2\2\2\36\u0125"+ - "\3\2\2\2 \u0138\3\2\2\2\"\u0148\3\2\2\2$\u0158\3\2\2\2&\u016c\3\2\2\2"+ - "(\u017b\3\2\2\2*\u017d\3\2\2\2,\u0185\3\2\2\2.\u018b\3\2\2\2\60\u019a"+ - "\3\2\2\2\62\u019e\3\2\2\2\64\u01ae\3\2\2\2\66\u01b7\3\2\2\28\u01c7\3\2"+ - "\2\2:\u01d0\3\2\2\2<\u01d8\3\2\2\2>\u01db\3\2\2\2@\u01e5\3\2\2\2B\u01f7"+ - "\3\2\2\2D\u0201\3\2\2\2F\u0211\3\2\2\2H\u0216\3\2\2\2J\u0223\3\2\2\2L"+ - "\u022b\3\2\2\2N\u023a\3\2\2\2P\u0241\3\2\2\2R\u0251\3\2\2\2T\u0262\3\2"+ - "\2\2V\u026b\3\2\2\2X\u0274\3\2\2\2Z\u0287\3\2\2\2\\\u028f\3\2\2\2^\u0298"+ - "\3\2\2\2`\u029c\3\2\2\2b\u02a1\3\2\2\2d\u02a9\3\2\2\2f\u02ae\3\2\2\2h"+ - "\u02b6\3\2\2\2j\u02be\3\2\2\2l\u02c4\3\2\2\2n\u02ca\3\2\2\2p\u02d0\3\2"+ - "\2\2r\u02d6\3\2\2\2t\u02dc\3\2\2\2v\u02eb\3\2\2\2x\u02f0\3\2\2\2z\u02f7"+ - "\3\2\2\2|\u02f9\3\2\2\2~\u0300\3\2\2\2\u0080\u0308\3\2\2\2\u0082\u0313"+ - "\3\2\2\2\u0084\u0319\3\2\2\2\u0086\u031c\3\2\2\2\u0088\u0320\3\2\2\2\u008a"+ - "\u0337\3\2\2\2\u008c\u0339\3\2\2\2\u008e\u033c\3\2\2\2\u0090\u0342\3\2"+ - "\2\2\u0092\u0344\3\2\2\2\u0094\u0349\3\2\2\2\u0096\u034e\3\2\2\2\u0098"+ - "\u0351\3\2\2\2\u009a\u035f\3\2\2\2\u009c\u0363\3\2\2\2\u009e\u0365\3\2"+ - "\2\2\u00a0\u0369\3\2\2\2\u00a2\u0381\3\2\2\2\u00a4\u0393\3\2\2\2\u00a6"+ - "\u0398\3\2\2\2\u00a8\u039c\3\2\2\2\u00aa\u039e\3\2\2\2\u00ac\u03a3\3\2"+ - "\2\2\u00ae\u03b3\3\2\2\2\u00b0\u03b9\3\2\2\2\u00b2\u03be\3\2\2\2\u00b4"+ - "\u03c4\3\2\2\2\u00b6\u03c6\3\2\2\2\u00b8\u03c8\3\2\2\2\u00ba\u00bb\5\4"+ - "\3\2\u00bb\u00bc\7\2\2\3\u00bc\3\3\2\2\2\u00bd\u00be\7k\2\2\u00be\u00bf"+ - "\7j\2\2\u00bf\u00c0\5\u00b6\\\2\u00c0\u00c1\7\3\2\2\u00c1\u00c3\3\2\2"+ - "\2\u00c2\u00bd\3\2\2\2\u00c2\u00c3\3\2\2\2\u00c3\u00c6\3\2\2\2\u00c4\u00c7"+ - "\5\b\5\2\u00c5\u00c7\5\6\4\2\u00c6\u00c4\3\2\2\2\u00c6\u00c5\3\2\2\2\u00c7"+ - "\5\3\2\2\2\u00c8\u00c9\5\n\6\2\u00c9\u00ca\5.\30\2\u00ca\7\3\2\2\2\u00cb"+ - "\u00cc\7\4\2\2\u00cc\u00cd\7\5\2\2\u00cd\u00ce\7}\2\2\u00ce\u00cf\7\6"+ - "\2\2\u00cf\u00d0\5\u00b4[\2\u00d0\u00d1\7\3\2\2\u00d1\u00d2\5\n\6\2\u00d2"+ - "\t\3\2\2\2\u00d3\u00d7\5\f\7\2\u00d4\u00d7\5\16\b\2\u00d5\u00d7\5\36\20"+ - "\2\u00d6\u00d3\3\2\2\2\u00d6\u00d4\3\2\2\2\u00d6\u00d5\3\2\2\2\u00d7\u00d8"+ - "\3\2\2\2\u00d8\u00d9\7\3\2\2\u00d9\u00db\3\2\2\2\u00da\u00d6\3\2\2\2\u00db"+ - "\u00de\3\2\2\2\u00dc\u00da\3\2\2\2\u00dc\u00dd\3\2\2\2\u00dd\u00e4\3\2"+ - "\2\2\u00de\u00dc\3\2\2\2\u00df\u00e0\5\20\t\2\u00e0\u00e1\7\3\2\2\u00e1"+ - "\u00e3\3\2\2\2\u00e2\u00df\3\2\2\2\u00e3\u00e6\3\2\2\2\u00e4\u00e2\3\2"+ - "\2\2\u00e4\u00e5\3\2\2\2\u00e5\13\3\2\2\2\u00e6\u00e4\3\2\2\2\u00e7\u00ec"+ - "\5\22\n\2\u00e8\u00ec\5\24\13\2\u00e9\u00ec\5\26\f\2\u00ea\u00ec\5\30"+ - "\r\2\u00eb\u00e7\3\2\2\2\u00eb\u00e8\3\2\2\2\u00eb\u00e9\3\2\2\2\u00eb"+ - "\u00ea\3\2\2\2\u00ec\r\3\2\2\2\u00ed\u00ee\7p\2\2\u00ee\u00ef\7\5\2\2"+ - "\u00ef\u00f0\7}\2\2\u00f0\u00f1\7\6\2\2\u00f1\u00f2\5\u00b4[\2\u00f2\17"+ - "\3\2\2\2\u00f3\u00f8\5$\23\2\u00f4\u00f8\5 \21\2\u00f5\u00f8\5&\24\2\u00f6"+ - "\u00f8\5\"\22\2\u00f7\u00f3\3\2\2\2\u00f7\u00f4\3\2\2\2\u00f7\u00f5\3"+ - "\2\2\2\u00f7\u00f6\3\2\2\2\u00f8\21\3\2\2\2\u00f9\u00fa\7p\2\2\u00fa\u00fb"+ - "\7[\2\2\u00fb\u00fc\7T\2\2\u00fc\u00fd\5\u00b4[\2\u00fd\23\3\2\2\2\u00fe"+ - "\u00ff\7p\2\2\u00ff\u0100\7\7\2\2\u0100\u0101\t\2\2\2\u0101\25\3\2\2\2"+ - "\u0102\u0103\7p\2\2\u0103\u0104\7[\2\2\u0104\u0105\7E\2\2\u0105\u0106"+ - "\7L\2\2\u0106\u0107\t\3\2\2\u0107\27\3\2\2\2\u0108\u010d\7p\2\2\u0109"+ - "\u010a\7\t\2\2\u010a\u010e\5\32\16\2\u010b\u010c\7[\2\2\u010c\u010e\7"+ - "\t\2\2\u010d\u0109\3\2\2\2\u010d\u010b\3\2\2\2\u010e\u0115\3\2\2\2\u010f"+ - "\u0110\5\34\17\2\u0110\u0111\7\6\2\2\u0111\u0112\5\u00b6\\\2\u0112\u0114"+ - "\3\2\2\2\u0113\u010f\3\2\2\2\u0114\u0117\3\2\2\2\u0115\u0113\3\2\2\2\u0115"+ - "\u0116\3\2\2\2\u0116\31\3\2\2\2\u0117\u0115\3\2\2\2\u0118\u011b\7}\2\2"+ - "\u0119\u011b\5\u00b8]\2\u011a\u0118\3\2\2\2\u011a\u0119\3\2\2\2\u011b"+ - "\u011c\3\2\2\2\u011c\u011e\7\n\2\2\u011d\u011a\3\2\2\2\u011d\u011e\3\2"+ - "\2\2\u011e\u0121\3\2\2\2\u011f\u0122\7}\2\2\u0120\u0122\5\u00b8]\2\u0121"+ - "\u011f\3\2\2\2\u0121\u0120\3\2\2\2\u0122\33\3\2\2\2\u0123\u0124\t\4\2"+ - "\2\u0124\35\3\2\2\2\u0125\u0126\7\25\2\2\u0126\u012a\7\4\2\2\u0127\u0128"+ - "\7\5\2\2\u0128\u0129\7}\2\2\u0129\u012b\7\6\2\2\u012a\u0127\3\2\2\2\u012a"+ - "\u012b\3\2\2\2\u012b\u012c\3\2\2\2\u012c\u0136\5\u00b4[\2\u012d\u012e"+ - "\7J\2\2\u012e\u0133\5\u00b4[\2\u012f\u0130\7\26\2\2\u0130\u0132\5\u00b4"+ - "[\2\u0131\u012f\3\2\2\2\u0132\u0135\3\2\2\2\u0133\u0131\3\2\2\2\u0133"+ - "\u0134\3\2\2\2\u0134\u0137\3\2\2\2\u0135\u0133\3\2\2\2\u0136\u012d\3\2"+ - "\2\2\u0136\u0137\3\2\2\2\u0137\37\3\2\2\2\u0138\u0139\7p\2\2\u0139\u013a"+ - "\7s\2\2\u013a\u013d\5\u008cG\2\u013b\u013c\7I\2\2\u013c\u013e\5\u00a2"+ - "R\2\u013d\u013b\3\2\2\2\u013d\u013e\3\2\2\2\u013e\u0146\3\2\2\2\u013f"+ - "\u0140\7\27\2\2\u0140\u0147\5\60\31\2\u0141\u0144\7\30\2\2\u0142\u0143"+ - "\7\27\2\2\u0143\u0145\5\60\31\2\u0144\u0142\3\2\2\2\u0144\u0145\3\2\2"+ - "\2\u0145\u0147\3\2\2\2\u0146\u013f\3\2\2\2\u0146\u0141\3\2\2\2\u0147!"+ - "\3\2\2\2\u0148\u0149\7p\2\2\u0149\u014a\7q\2\2\u014a\u014d\7r\2\2\u014b"+ - "\u014c\7I\2\2\u014c\u014e\5\u00a2R\2\u014d\u014b\3\2\2\2\u014d\u014e\3"+ - "\2\2\2\u014e\u0156\3\2\2\2\u014f\u0150\7\27\2\2\u0150\u0157\5\60\31\2"+ - "\u0151\u0154\7\30\2\2\u0152\u0153\7\27\2\2\u0153\u0155\5\60\31\2\u0154"+ - "\u0152\3\2\2\2\u0154\u0155\3\2\2\2\u0155\u0157\3\2\2\2\u0156\u014f\3\2"+ - "\2\2\u0156\u0151\3\2\2\2\u0157#\3\2\2\2\u0158\u0159\7p\2\2\u0159\u015a"+ - "\7\31\2\2\u015a\u015b\5\32\16\2\u015b\u015d\7\32\2\2\u015c\u015e\5*\26"+ - "\2\u015d\u015c\3\2\2\2\u015d\u015e\3\2\2\2\u015e\u015f\3\2\2\2\u015f\u0162"+ - "\7\33\2\2\u0160\u0161\7I\2\2\u0161\u0163\5\u00a2R\2\u0162\u0160\3\2\2"+ - "\2\u0162\u0163\3\2\2\2\u0163\u016a\3\2\2\2\u0164\u0166\7\34\2\2\u0165"+ - "\u0167\5.\30\2\u0166\u0165\3\2\2\2\u0166\u0167\3\2\2\2\u0167\u0168\3\2"+ - "\2\2\u0168\u016b\7\35\2\2\u0169\u016b\7\30\2\2\u016a\u0164\3\2\2\2\u016a"+ - "\u0169\3\2\2\2\u016b%\3\2\2\2\u016c\u016d\7p\2\2\u016d\u016e\7o\2\2\u016e"+ - "\u016f\5\32\16\2\u016f\u0171\7I\2\2\u0170\u0172\5(\25\2\u0171\u0170\3"+ - "\2\2\2\u0171\u0172\3\2\2\2\u0172\u0173\3\2\2\2\u0173\u0174\5\60\31\2\u0174"+ - "\'\3\2\2\2\u0175\u0176\7\36\2\2\u0176\u017c\7\37\2\2\u0177\u0178\7\36"+ - "\2\2\u0178\u017c\7 \2\2\u0179\u017a\7!\2\2\u017a\u017c\7\"\2\2\u017b\u0175"+ - "\3\2\2\2\u017b\u0177\3\2\2\2\u017b\u0179\3\2\2\2\u017c)\3\2\2\2\u017d"+ - "\u0182\5,\27\2\u017e\u017f\7\26\2\2\u017f\u0181\5,\27\2\u0180\u017e\3"+ - "\2\2\2\u0181\u0184\3\2\2\2\u0182\u0180\3\2\2\2\u0182\u0183\3\2\2\2\u0183"+ - "+\3\2\2\2\u0184\u0182\3\2\2\2\u0185\u0186\7#\2\2\u0186\u0189\5\32\16\2"+ - "\u0187\u0188\7I\2\2\u0188\u018a\5\u00a2R\2\u0189\u0187\3\2\2\2\u0189\u018a"+ - "\3\2\2\2\u018a-\3\2\2\2\u018b\u0190\5\60\31\2\u018c\u018d\7\26\2\2\u018d"+ - "\u018f\5\60\31\2\u018e\u018c\3\2\2\2\u018f\u0192\3\2\2\2\u0190\u018e\3"+ - "\2\2\2\u0190\u0191\3\2\2\2\u0191/\3\2\2\2\u0192\u0190\3\2\2\2\u0193\u019b"+ - "\5\62\32\2\u0194\u019b\5H%\2\u0195\u019b\5L\'\2\u0196\u019b\5P)\2\u0197"+ - "\u019b\5T+\2\u0198\u019b\5V,\2\u0199\u019b\5Z.\2\u019a\u0193\3\2\2\2\u019a"+ - "\u0194\3\2\2\2\u019a\u0195\3\2\2\2\u019a\u0196\3\2\2\2\u019a\u0197\3\2"+ - "\2\2\u019a\u0198\3\2\2\2\u019a\u0199\3\2\2\2\u019b\61\3\2\2\2\u019c\u019f"+ - "\5\64\33\2\u019d\u019f\58\35\2\u019e\u019c\3\2\2\2\u019e\u019d\3\2\2\2"+ - "\u019f\u01a8\3\2\2\2\u01a0\u01a7\5\64\33\2\u01a1\u01a7\5<\37\2\u01a2\u01a7"+ - "\58\35\2\u01a3\u01a7\5> \2\u01a4\u01a7\5B\"\2\u01a5\u01a7\5F$\2\u01a6"+ - "\u01a0\3\2\2\2\u01a6\u01a1\3\2\2\2\u01a6\u01a2\3\2\2\2\u01a6\u01a3\3\2"+ - "\2\2\u01a6\u01a4\3\2\2\2\u01a6\u01a5\3\2\2\2\u01a7\u01aa\3\2\2\2\u01a8"+ - "\u01a6\3\2\2\2\u01a8\u01a9\3\2\2\2\u01a9\u01ab\3\2\2\2\u01aa\u01a8\3\2"+ - "\2\2\u01ab\u01ac\7F\2\2\u01ac\u01ad\5\60\31\2\u01ad\63\3\2\2\2\u01ae\u01af"+ - "\7@\2\2\u01af\u01b4\5\66\34\2\u01b0\u01b1\7\26\2\2\u01b1\u01b3\5\66\34"+ - "\2\u01b2\u01b0\3\2\2\2\u01b3\u01b6\3\2\2\2\u01b4\u01b2\3\2\2\2\u01b4\u01b5"+ - "\3\2\2\2\u01b5\65\3\2\2\2\u01b6\u01b4\3\2\2\2\u01b7\u01ba\5\u008cG\2\u01b8"+ - "\u01b9\7I\2\2\u01b9\u01bb\5\u00a2R\2\u01ba\u01b8\3\2\2\2\u01ba\u01bb\3"+ - "\2\2\2\u01bb\u01be\3\2\2\2\u01bc\u01bd\7K\2\2\u01bd\u01bf\7L\2\2\u01be"+ - "\u01bc\3\2\2\2\u01be\u01bf\3\2\2\2\u01bf\u01c2\3\2\2\2\u01c0\u01c1\7J"+ - "\2\2\u01c1\u01c3\5\u008cG\2\u01c2\u01c0\3\2\2\2\u01c2\u01c3\3\2\2\2\u01c3"+ - "\u01c4\3\2\2\2\u01c4\u01c5\7H\2\2\u01c5\u01c6\5\60\31\2\u01c6\67\3\2\2"+ - "\2\u01c7\u01c8\7A\2\2\u01c8\u01cd\5:\36\2\u01c9\u01ca\7\26\2\2\u01ca\u01cc"+ - "\5:\36\2\u01cb\u01c9\3\2\2\2\u01cc\u01cf\3\2\2\2\u01cd\u01cb\3\2\2\2\u01cd"+ - "\u01ce\3\2\2\2\u01ce9\3\2\2\2\u01cf\u01cd\3\2\2\2\u01d0\u01d3\5\u008c"+ - "G\2\u01d1\u01d2\7I\2\2\u01d2\u01d4\5\u00a2R\2\u01d3\u01d1\3\2\2\2\u01d3"+ - "\u01d4\3\2\2\2\u01d4\u01d5\3\2\2\2\u01d5\u01d6\7\27\2\2\u01d6\u01d7\5"+ - "\60\31\2\u01d7;\3\2\2\2\u01d8\u01d9\7B\2\2\u01d9\u01da\5\60\31\2\u01da"+ - "=\3\2\2\2\u01db\u01dc\7C\2\2\u01dc\u01dd\7D\2\2\u01dd\u01e2\5@!\2\u01de"+ - "\u01df\7\26\2\2\u01df\u01e1\5@!\2\u01e0\u01de\3\2\2\2\u01e1\u01e4\3\2"+ - "\2\2\u01e2\u01e0\3\2\2\2\u01e2\u01e3\3\2\2\2\u01e3?\3\2\2\2\u01e4\u01e2"+ - "\3\2\2\2\u01e5\u01ec\5\u008cG\2\u01e6\u01e7\7I\2\2\u01e7\u01e9\5\u00a2"+ - "R\2\u01e8\u01e6\3\2\2\2\u01e8\u01e9\3\2\2\2\u01e9\u01ea\3\2\2\2\u01ea"+ - "\u01eb\7\27\2\2\u01eb\u01ed\5\60\31\2\u01ec\u01e8\3\2\2\2\u01ec\u01ed"+ - "\3\2\2\2\u01ed\u01f0\3\2\2\2\u01ee\u01ef\7T\2\2\u01ef\u01f1\5\u00b4[\2"+ - "\u01f0\u01ee\3\2\2\2\u01f0\u01f1\3\2\2\2\u01f1A\3\2\2\2\u01f2\u01f3\7"+ - "E\2\2\u01f3\u01f8\7D\2\2\u01f4\u01f5\7N\2\2\u01f5\u01f6\7E\2\2\u01f6\u01f8"+ - "\7D\2\2\u01f7\u01f2\3\2\2\2\u01f7\u01f4\3\2\2\2\u01f8\u01f9\3\2\2\2\u01f9"+ - "\u01fe\5D#\2\u01fa\u01fb\7\26\2\2\u01fb\u01fd\5D#\2\u01fc\u01fa\3\2\2"+ - "\2\u01fd\u0200\3\2\2\2\u01fe\u01fc\3\2\2\2\u01fe\u01ff\3\2\2\2\u01ffC"+ - "\3\2\2\2\u0200\u01fe\3\2\2\2\u0201\u0204\5\60\31\2\u0202\u0205\7O\2\2"+ - "\u0203\u0205\7P\2\2\u0204\u0202\3\2\2\2\u0204\u0203\3\2\2\2\u0204\u0205"+ - "\3\2\2\2\u0205\u020b\3\2\2\2\u0206\u0209\7L\2\2\u0207\u020a\7U\2\2\u0208"+ - "\u020a\7V\2\2\u0209\u0207\3\2\2\2\u0209\u0208\3\2\2\2\u020a\u020c\3\2"+ - "\2\2\u020b\u0206\3\2\2\2\u020b\u020c\3\2\2\2\u020c\u020f\3\2\2\2\u020d"+ - "\u020e\7T\2\2\u020e\u0210\5\u00b4[\2\u020f\u020d\3\2\2\2\u020f\u0210\3"+ - "\2\2\2\u0210E\3\2\2\2\u0211\u0212\7M\2\2\u0212\u0213\5\u008cG\2\u0213"+ - "G\3\2\2\2\u0214\u0217\7Q\2\2\u0215\u0217\7R\2\2\u0216\u0214\3\2\2\2\u0216"+ - "\u0215\3\2\2\2\u0217\u0218\3\2\2\2\u0218\u021d\5J&\2\u0219\u021a\7\26"+ - "\2\2\u021a\u021c\5J&\2\u021b\u0219\3\2\2\2\u021c\u021f\3\2\2\2\u021d\u021b"+ - "\3\2\2\2\u021d\u021e\3\2\2\2\u021e\u0220\3\2\2\2\u021f\u021d\3\2\2\2\u0220"+ - "\u0221\7S\2\2\u0221\u0222\5\60\31\2\u0222I\3\2\2\2\u0223\u0226\5\u008c"+ - "G\2\u0224\u0225\7I\2\2\u0225\u0227\5\u00a2R\2\u0226\u0224\3\2\2\2\u0226"+ - "\u0227\3\2\2\2\u0227\u0228\3\2\2\2\u0228\u0229\7H\2\2\u0229\u022a\5\60"+ - "\31\2\u022aK\3\2\2\2\u022b\u022c\7W\2\2\u022c\u022d\7\32\2\2\u022d\u022e"+ - "\5.\30\2\u022e\u0230\7\33\2\2\u022f\u0231\5N(\2\u0230\u022f\3\2\2\2\u0231"+ - "\u0232\3\2\2\2\u0232\u0230\3\2\2\2\u0232\u0233\3\2\2\2\u0233\u0234\3\2"+ - "\2\2\u0234\u0235\7[\2\2\u0235\u0236\7F\2\2\u0236\u0237\5\60\31\2\u0237"+ - "M\3\2\2\2\u0238\u0239\7X\2\2\u0239\u023b\5\60\31\2\u023a\u0238\3\2\2\2"+ - "\u023b\u023c\3\2\2\2\u023c\u023a\3\2\2\2\u023c\u023d\3\2\2\2\u023d\u023e"+ - "\3\2\2\2\u023e\u023f\7F\2\2\u023f\u0240\5\60\31\2\u0240O\3\2\2\2\u0241"+ - "\u0242\7^\2\2\u0242\u0243\7\32\2\2\u0243\u0244\5.\30\2\u0244\u0246\7\33"+ - "\2\2\u0245\u0247\5R*\2\u0246\u0245\3\2\2\2\u0247\u0248\3\2\2\2\u0248\u0246"+ - "\3\2\2\2\u0248\u0249\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u024c\7[\2\2\u024b"+ - "\u024d\5\u008cG\2\u024c\u024b\3\2\2\2\u024c\u024d\3\2\2\2\u024d\u024e"+ - "\3\2\2\2\u024e\u024f\7F\2\2\u024f\u0250\5\60\31\2\u0250Q\3\2\2\2\u0251"+ - "\u0255\7X\2\2\u0252\u0253\5\u008cG\2\u0253\u0254\7I\2\2\u0254\u0256\3"+ - "\2\2\2\u0255\u0252\3\2\2\2\u0255\u0256\3\2\2\2\u0256\u0257\3\2\2\2\u0257"+ - "\u025c\5\u00a2R\2\u0258\u0259\7$\2\2\u0259\u025b\5\u00a2R\2\u025a\u0258"+ - "\3\2\2\2\u025b\u025e\3\2\2\2\u025c\u025a\3\2\2\2\u025c\u025d\3\2\2\2\u025d"+ - "\u025f\3\2\2\2\u025e\u025c\3\2\2\2\u025f\u0260\7F\2\2\u0260\u0261\5\60"+ - "\31\2\u0261S\3\2\2\2\u0262\u0263\7G\2\2\u0263\u0264\7\32\2\2\u0264\u0265"+ - "\5.\30\2\u0265\u0266\7\33\2\2\u0266\u0267\7\\\2\2\u0267\u0268\5\60\31"+ - "\2\u0268\u0269\7]\2\2\u0269\u026a\5\60\31\2\u026aU\3\2\2\2\u026b\u026c"+ - "\7Y\2\2\u026c\u026d\7\34\2\2\u026d\u026e\5.\30\2\u026e\u0270\7\35\2\2"+ - "\u026f\u0271\5X-\2\u0270\u026f\3\2\2\2\u0271\u0272\3\2\2\2\u0272\u0270"+ - "\3\2\2\2\u0272\u0273\3\2\2\2\u0273W\3\2\2\2\u0274\u0277\7Z\2\2\u0275\u0278"+ - "\7%\2\2\u0276\u0278\5\32\16\2\u0277\u0275\3\2\2\2\u0277\u0276\3\2\2\2"+ - "\u0278\u0280\3\2\2\2\u0279\u027c\7$\2\2\u027a\u027d\7%\2\2\u027b\u027d"+ - "\5\32\16\2\u027c\u027a\3\2\2\2\u027c\u027b\3\2\2\2\u027d\u027f\3\2\2\2"+ - "\u027e\u0279\3\2\2\2\u027f\u0282\3\2\2\2\u0280\u027e\3\2\2\2\u0280\u0281"+ - "\3\2\2\2\u0281\u0283\3\2\2\2\u0282\u0280\3\2\2\2\u0283\u0284\7\34\2\2"+ - "\u0284\u0285\5.\30\2\u0285\u0286\7\35\2\2\u0286Y\3\2\2\2\u0287\u028c\5"+ - "\\/\2\u0288\u0289\7_\2\2\u0289\u028b\5\\/\2\u028a\u0288\3\2\2\2\u028b"+ - "\u028e\3\2\2\2\u028c\u028a\3\2\2\2\u028c\u028d\3\2\2\2\u028d[\3\2\2\2"+ - "\u028e\u028c\3\2\2\2\u028f\u0294\5^\60\2\u0290\u0291\7`\2\2\u0291\u0293"+ - "\5^\60\2\u0292\u0290\3\2\2\2\u0293\u0296\3\2\2\2\u0294\u0292\3\2\2\2\u0294"+ - "\u0295\3\2\2\2\u0295]\3\2\2\2\u0296\u0294\3\2\2\2\u0297\u0299\7a\2\2\u0298"+ - "\u0297\3\2\2\2\u0298\u0299\3\2\2\2\u0299\u029a\3\2\2\2\u029a\u029b\5`"+ - "\61\2\u029b_\3\2\2\2\u029c\u029f\5b\62\2\u029d\u029e\t\5\2\2\u029e\u02a0"+ - "\5b\62\2\u029f\u029d\3\2\2\2\u029f\u02a0\3\2\2\2\u02a0a\3\2\2\2\u02a1"+ - "\u02a6\5d\63\2\u02a2\u02a3\7\61\2\2\u02a3\u02a5\5d\63\2\u02a4\u02a2\3"+ - "\2\2\2\u02a5\u02a8\3\2\2\2\u02a6\u02a4\3\2\2\2\u02a6\u02a7\3\2\2\2\u02a7"+ - "c\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a9\u02ac\5f\64\2\u02aa\u02ab\7b\2\2\u02ab"+ - "\u02ad\5f\64\2\u02ac\u02aa\3\2\2\2\u02ac\u02ad\3\2\2\2\u02ade\3\2\2\2"+ - "\u02ae\u02b3\5h\65\2\u02af\u02b0\t\6\2\2\u02b0\u02b2\5h\65\2\u02b1\u02af"+ - "\3\2\2\2\u02b2\u02b5\3\2\2\2\u02b3\u02b1\3\2\2\2\u02b3\u02b4\3\2\2\2\u02b4"+ - "g\3\2\2\2\u02b5\u02b3\3\2\2\2\u02b6\u02bb\5j\66\2\u02b7\u02b8\t\7\2\2"+ - "\u02b8\u02ba\5j\66\2\u02b9\u02b7\3\2\2\2\u02ba\u02bd\3\2\2\2\u02bb\u02b9"+ - "\3\2\2\2\u02bb\u02bc\3\2\2\2\u02bci\3\2\2\2\u02bd\u02bb\3\2\2\2\u02be"+ - "\u02c2\5l\67\2\u02bf\u02c0\7c\2\2\u02c0\u02c1\7d\2\2\u02c1\u02c3\5\u00a2"+ - "R\2\u02c2\u02bf\3\2\2\2\u02c2\u02c3\3\2\2\2\u02c3k\3\2\2\2\u02c4\u02c8"+ - "\5n8\2\u02c5\u02c6\7f\2\2\u02c6\u02c7\7e\2\2\u02c7\u02c9\5\u00a2R\2\u02c8"+ - "\u02c5\3\2\2\2\u02c8\u02c9\3\2\2\2\u02c9m\3\2\2\2\u02ca\u02ce\5p9\2\u02cb"+ - "\u02cc\7g\2\2\u02cc\u02cd\7I\2\2\u02cd\u02cf\5\u00a2R\2\u02ce\u02cb\3"+ - "\2\2\2\u02ce\u02cf\3\2\2\2\u02cfo\3\2\2\2\u02d0\u02d4\5r:\2\u02d1\u02d2"+ - "\7i\2\2\u02d2\u02d3\7I\2\2\u02d3\u02d5\5\u00aeX\2\u02d4\u02d1\3\2\2\2"+ - "\u02d4\u02d5\3\2\2\2\u02d5q\3\2\2\2\u02d6\u02da\5t;\2\u02d7\u02d8\7h\2"+ - "\2\u02d8\u02d9\7I\2\2\u02d9\u02db\5\u00aeX\2\u02da\u02d7\3\2\2\2\u02da"+ - "\u02db\3\2\2\2\u02dbs\3\2\2\2\u02dc\u02e5\5x=\2\u02dd\u02de\7\6\2\2\u02de"+ - "\u02df\7/\2\2\u02df\u02e0\3\2\2\2\u02e0\u02e1\5v<\2\u02e1\u02e2\5\u0098"+ - "M\2\u02e2\u02e4\3\2\2\2\u02e3\u02dd\3\2\2\2\u02e4\u02e7\3\2\2\2\u02e5"+ - "\u02e3\3\2\2\2\u02e5\u02e6\3\2\2\2\u02e6u\3\2\2\2\u02e7\u02e5\3\2\2\2"+ - "\u02e8\u02ec\5\32\16\2\u02e9\u02ec\5\u008cG\2\u02ea\u02ec\5\u008eH\2\u02eb"+ - "\u02e8\3\2\2\2\u02eb\u02e9\3\2\2\2\u02eb\u02ea\3\2\2\2\u02ecw\3\2\2\2"+ - "\u02ed\u02ef\t\6\2\2\u02ee\u02ed\3\2\2\2\u02ef\u02f2\3\2\2\2\u02f0\u02ee"+ - "\3\2\2\2\u02f0\u02f1\3\2\2\2\u02f1\u02f3\3\2\2\2\u02f2\u02f0\3\2\2\2\u02f3"+ - "\u02f4\5z>\2\u02f4y\3\2\2\2\u02f5\u02f8\5~@\2\u02f6\u02f8\5|?\2\u02f7"+ - "\u02f5\3\2\2\2\u02f7\u02f6\3\2\2\2\u02f8{\3\2\2\2\u02f9\u02fa\7\67\2\2"+ - "\u02fa\u02fb\7o\2\2\u02fb\u02fc\5\u00a2R\2\u02fc\u02fd\7\34\2\2\u02fd"+ - "\u02fe\5.\30\2\u02fe\u02ff\7\35\2\2\u02ff}\3\2\2\2\u0300\u0305\5\u0080"+ - "A\2\u0301\u0302\78\2\2\u0302\u0304\5\u0080A\2\u0303\u0301\3\2\2\2\u0304"+ - "\u0307\3\2\2\2\u0305\u0303\3\2\2\2\u0305\u0306\3\2\2\2\u0306\177\3\2\2"+ - "\2\u0307\u0305\3\2\2\2\u0308\u0310\5\u008aF\2\u0309\u030f\5\u0082B\2\u030a"+ - "\u030f\5\u0086D\2\u030b\u030f\5\u0088E\2\u030c\u030f\5\u0084C\2\u030d"+ - "\u030f\5\u0098M\2\u030e\u0309\3\2\2\2\u030e\u030a\3\2\2\2\u030e\u030b"+ - "\3\2\2\2\u030e\u030c\3\2\2\2\u030e\u030d\3\2\2\2\u030f\u0312\3\2\2\2\u0310"+ - "\u030e\3\2\2\2\u0310\u0311\3\2\2\2\u0311\u0081\3\2\2\2\u0312\u0310\3\2"+ - "\2\2\u0313\u0314\79\2\2\u0314\u0315\79\2\2\u0315\u0316\5.\30\2\u0316\u0317"+ - "\7:\2\2\u0317\u0318\7:\2\2\u0318\u0083\3\2\2\2\u0319\u031a\79\2\2\u031a"+ - "\u031b\7:\2\2\u031b\u0085\3\2\2\2\u031c\u031d\79\2\2\u031d\u031e\5.\30"+ - "\2\u031e\u031f\7:\2\2\u031f\u0087\3\2\2\2\u0320\u0327\7;\2\2\u0321\u0328"+ - "\5\u00b8]\2\u0322\u0328\5\u00b6\\\2\u0323\u0328\7}\2\2\u0324\u0328\5\u008e"+ - "H\2\u0325\u0328\5\u008cG\2\u0326\u0328\5\u0090I\2\u0327\u0321\3\2\2\2"+ - "\u0327\u0322\3\2\2\2\u0327\u0323\3\2\2\2\u0327\u0324\3\2\2\2\u0327\u0325"+ - "\3\2\2\2\u0327\u0326\3\2\2\2\u0328\u0089\3\2\2\2\u0329\u0338\7v\2\2\u032a"+ - "\u0338\7m\2\2\u032b\u0338\7n\2\2\u032c\u0338\7w\2\2\u032d\u0338\5\u00b6"+ - "\\\2\u032e\u0338\5\u008cG\2\u032f\u0338\5\u008eH\2\u0330\u0338\5\u0090"+ - "I\2\u0331\u0338\5\u00a4S\2\u0332\u0338\5\u0096L\2\u0333\u0338\5\u0092"+ - "J\2\u0334\u0338\5\u0094K\2\u0335\u0338\5\u00b2Z\2\u0336\u0338\5\u009c"+ - "O\2\u0337\u0329\3\2\2\2\u0337\u032a\3\2\2\2\u0337\u032b\3\2\2\2\u0337"+ - "\u032c\3\2\2\2\u0337\u032d\3\2\2\2\u0337\u032e\3\2\2\2\u0337\u032f\3\2"+ - "\2\2\u0337\u0330\3\2\2\2\u0337\u0331\3\2\2\2\u0337\u0332\3\2\2\2\u0337"+ - "\u0333\3\2\2\2\u0337\u0334\3\2\2\2\u0337\u0335\3\2\2\2\u0337\u0336\3\2"+ - "\2\2\u0338\u008b\3\2\2\2\u0339\u033a\7#\2\2\u033a\u033b\5\32\16\2\u033b"+ - "\u008d\3\2\2\2\u033c\u033e\7\32\2\2\u033d\u033f\5.\30\2\u033e\u033d\3"+ - "\2\2\2\u033e\u033f\3\2\2\2\u033f\u0340\3\2\2\2\u0340\u0341\7\33\2\2\u0341"+ - "\u008f\3\2\2\2\u0342\u0343\7<\2\2\u0343\u0091\3\2\2\2\u0344\u0345\7\b"+ - "\2\2\u0345\u0346\7\34\2\2\u0346\u0347\5.\30\2\u0347\u0348\7\35\2\2\u0348"+ - "\u0093\3\2\2\2\u0349\u034a\7l\2\2\u034a\u034b\7\34\2\2\u034b\u034c\5."+ - "\30\2\u034c\u034d\7\35\2\2\u034d\u0095\3\2\2\2\u034e\u034f\5\32\16\2\u034f"+ - "\u0350\5\u0098M\2\u0350\u0097\3\2\2\2\u0351\u0358\7\32\2\2\u0352\u0354"+ - "\5\u009aN\2\u0353\u0355\7\26\2\2\u0354\u0353\3\2\2\2\u0354\u0355\3\2\2"+ - "\2\u0355\u0357\3\2\2\2\u0356\u0352\3\2\2\2\u0357\u035a\3\2\2\2\u0358\u0356"+ - "\3\2\2\2\u0358\u0359\3\2\2\2\u0359\u035b\3\2\2\2\u035a\u0358\3\2\2\2\u035b"+ - "\u035c\7\33\2\2\u035c\u0099\3\2\2\2\u035d\u0360\5\60\31\2\u035e\u0360"+ - "\7u\2\2\u035f\u035d\3\2\2\2\u035f\u035e\3\2\2\2\u0360\u009b\3\2\2\2\u0361"+ - "\u0364\5\u009eP\2\u0362\u0364\5\u00a0Q\2\u0363\u0361\3\2\2\2\u0363\u0362"+ - "\3\2\2\2\u0364\u009d\3\2\2\2\u0365\u0366\5\32\16\2\u0366\u0367\7=\2\2"+ - "\u0367\u0368\7w\2\2\u0368\u009f\3\2\2\2\u0369\u036a\7\31\2\2\u036a\u036c"+ - "\7\32\2\2\u036b\u036d\5*\26\2\u036c\u036b\3\2\2\2\u036c\u036d\3\2\2\2"+ - "\u036d\u036e\3\2\2\2\u036e\u0371\7\33\2\2\u036f\u0370\7I\2\2\u0370\u0372"+ - "\5\u00a2R\2\u0371\u036f\3\2\2\2\u0371\u0372\3\2\2\2\u0372\u0373\3\2\2"+ - "\2\u0373\u0375\7\34\2\2\u0374\u0376\5.\30\2\u0375\u0374\3\2\2\2\u0375"+ - "\u0376\3\2\2\2\u0376\u0377\3\2\2\2\u0377\u0378\7\35\2\2\u0378\u00a1\3"+ - "\2\2\2\u0379\u037a\7\32\2\2\u037a\u0382\7\33\2\2\u037b\u037f\5\u00a6T"+ - "\2\u037c\u0380\7u\2\2\u037d\u0380\7%\2\2\u037e\u0380\7\62\2\2\u037f\u037c"+ - "\3\2\2\2\u037f\u037d\3\2\2\2\u037f\u037e\3\2\2\2\u037f\u0380\3\2\2\2\u0380"+ - "\u0382\3\2\2\2\u0381\u0379\3\2\2\2\u0381\u037b\3\2\2\2\u0382\u00a3\3\2"+ - "\2\2\u0383\u038c\7\34\2\2\u0384\u0389\5\u00b0Y\2\u0385\u0386\7\26\2\2"+ - "\u0386\u0388\5\u00b0Y\2\u0387\u0385\3\2\2\2\u0388\u038b\3\2\2\2\u0389"+ - "\u0387\3\2\2\2\u0389\u038a\3\2\2\2\u038a\u038d\3\2\2\2\u038b\u0389\3\2"+ - "\2\2\u038c\u0384\3\2\2\2\u038c\u038d\3\2\2\2\u038d\u038e\3\2\2\2\u038e"+ - "\u0394\7\35\2\2\u038f\u0390\7>\2\2\u0390\u0391\5.\30\2\u0391\u0392\7?"+ - "\2\2\u0392\u0394\3\2\2\2\u0393\u0383\3\2\2\2\u0393\u038f\3\2\2\2\u0394"+ - "\u00a5\3\2\2\2\u0395\u0399\5\32\16\2\u0396\u0399\7v\2\2\u0397\u0399\5"+ - "\u00a8U\2\u0398\u0395\3\2\2\2\u0398\u0396\3\2\2\2\u0398\u0397\3\2\2\2"+ - "\u0399\u00a7\3\2\2\2\u039a\u039d\5\u00aaV\2\u039b\u039d\5\u00acW\2\u039c"+ - "\u039a\3\2\2\2\u039c\u039b\3\2\2\2\u039d\u00a9\3\2\2\2\u039e\u039f\7\31"+ - "\2\2\u039f\u03a0\7\32\2\2\u03a0\u03a1\7%\2\2\u03a1\u03a2\7\33\2\2\u03a2"+ - "\u00ab\3\2\2\2\u03a3\u03a4\7\31\2\2\u03a4\u03ad\7\32\2\2\u03a5\u03aa\5"+ - "\u00a2R\2\u03a6\u03a7\7\26\2\2\u03a7\u03a9\5\u00a2R\2\u03a8\u03a6\3\2"+ - "\2\2\u03a9\u03ac\3\2\2\2\u03aa\u03a8\3\2\2\2\u03aa\u03ab\3\2\2\2\u03ab"+ - "\u03ae\3\2\2\2\u03ac\u03aa\3\2\2\2\u03ad\u03a5\3\2\2\2\u03ad\u03ae\3\2"+ - "\2\2\u03ae\u03af\3\2\2\2\u03af\u03b0\7\33\2\2\u03b0\u03b1\7I\2\2\u03b1"+ - "\u03b2\5\u00a2R\2\u03b2\u00ad\3\2\2\2\u03b3\u03b5\5\u00a6T\2\u03b4\u03b6"+ - "\7u\2\2\u03b5\u03b4\3\2\2\2\u03b5\u03b6\3\2\2\2\u03b6\u00af\3\2\2\2\u03b7"+ - "\u03ba\5\60\31\2\u03b8\u03ba\7}\2\2\u03b9\u03b7\3\2\2\2\u03b9\u03b8\3"+ - "\2\2\2\u03ba\u03bb\3\2\2\2\u03bb\u03bc\t\b\2\2\u03bc\u03bd\5\60\31\2\u03bd"+ - "\u00b1\3\2\2\2\u03be\u03c0\79\2\2\u03bf\u03c1\5.\30\2\u03c0\u03bf\3\2"+ - "\2\2\u03c0\u03c1\3\2\2\2\u03c1\u03c2\3\2\2\2\u03c2\u03c3\7:\2\2\u03c3"+ - "\u00b3\3\2\2\2\u03c4\u03c5\5\u00b6\\\2\u03c5\u00b5\3\2\2\2\u03c6\u03c7"+ - "\7t\2\2\u03c7\u00b7\3\2\2\2\u03c8\u03c9\t\t\2\2\u03c9\u00b9\3\2\2\2k\u00c2"+ - "\u00c6\u00d6\u00dc\u00e4\u00eb\u00f7\u010d\u0115\u011a\u011d\u0121\u012a"+ - "\u0133\u0136\u013d\u0144\u0146\u014d\u0154\u0156\u015d\u0162\u0166\u016a"+ - "\u0171\u017b\u0182\u0189\u0190\u019a\u019e\u01a6\u01a8\u01b4\u01ba\u01be"+ - "\u01c2\u01cd\u01d3\u01e2\u01e8\u01ec\u01f0\u01f7\u01fe\u0204\u0209\u020b"+ - "\u020f\u0216\u021d\u0226\u0232\u023c\u0248\u024c\u0255\u025c\u0272\u0277"+ - "\u027c\u0280\u028c\u0294\u0298\u029f\u02a6\u02ac\u02b3\u02bb\u02c2\u02c8"+ - "\u02ce\u02d4\u02da\u02e5\u02eb\u02f0\u02f7\u0305\u030e\u0310\u0327\u0337"+ - "\u033e\u0354\u0358\u035f\u0363\u036c\u0371\u0375\u037f\u0381\u0389\u038c"+ - "\u0393\u0398\u039c\u03aa\u03ad\u03b5\u03b9\u03c0"; + "\4U\tU\4V\tV\4W\tW\4X\tX\4Y\tY\4Z\tZ\4[\t[\4\\\t\\\4]\t]\4^\t^\3\2\3\2"+ + "\3\2\3\3\3\3\3\3\3\3\3\3\5\3\u00c5\n\3\3\3\3\3\5\3\u00c9\n\3\3\4\3\4\3"+ + "\4\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\5\3\6\3\6\3\6\5\6\u00d9\n\6\3\6\3\6\7"+ + "\6\u00dd\n\6\f\6\16\6\u00e0\13\6\3\6\3\6\3\6\7\6\u00e5\n\6\f\6\16\6\u00e8"+ + "\13\6\3\7\3\7\3\7\3\7\5\7\u00ee\n\7\3\b\3\b\3\b\3\b\3\b\3\b\3\t\3\t\3"+ + "\t\3\t\5\t\u00fa\n\t\3\n\3\n\3\n\3\n\3\n\3\13\3\13\3\13\3\13\3\f\3\f\3"+ + "\f\3\f\3\f\3\f\3\r\3\r\3\r\3\r\3\r\5\r\u0110\n\r\3\r\3\r\3\r\3\r\7\r\u0116"+ + "\n\r\f\r\16\r\u0119\13\r\3\16\3\16\5\16\u011d\n\16\3\16\5\16\u0120\n\16"+ + "\3\16\3\16\5\16\u0124\n\16\3\17\3\17\3\20\3\20\3\20\3\20\3\20\5\20\u012d"+ + "\n\20\3\20\3\20\3\20\3\20\3\20\7\20\u0134\n\20\f\20\16\20\u0137\13\20"+ + "\5\20\u0139\n\20\3\21\3\21\3\21\3\21\3\21\5\21\u0140\n\21\3\21\3\21\3"+ + "\21\3\21\3\21\5\21\u0147\n\21\5\21\u0149\n\21\3\22\3\22\3\22\3\22\3\22"+ + "\5\22\u0150\n\22\3\22\3\22\3\22\3\22\3\22\5\22\u0157\n\22\5\22\u0159\n"+ + "\22\3\23\3\23\3\23\3\23\3\23\5\23\u0160\n\23\3\23\3\23\3\23\5\23\u0165"+ + "\n\23\3\23\3\23\5\23\u0169\n\23\3\23\3\23\5\23\u016d\n\23\3\24\3\24\3"+ + "\24\3\24\3\24\5\24\u0174\n\24\3\24\3\24\3\25\3\25\3\25\3\25\3\25\3\25"+ + "\5\25\u017e\n\25\3\26\3\26\3\26\7\26\u0183\n\26\f\26\16\26\u0186\13\26"+ + "\3\27\3\27\3\27\3\27\5\27\u018c\n\27\3\30\3\30\3\30\7\30\u0191\n\30\f"+ + "\30\16\30\u0194\13\30\3\31\3\31\3\31\3\31\3\31\3\31\3\31\5\31\u019d\n"+ + "\31\3\32\3\32\5\32\u01a1\n\32\3\32\3\32\3\32\3\32\3\32\3\32\7\32\u01a9"+ + "\n\32\f\32\16\32\u01ac\13\32\3\32\3\32\3\32\3\33\3\33\3\33\3\33\7\33\u01b5"+ + "\n\33\f\33\16\33\u01b8\13\33\3\34\3\34\3\34\5\34\u01bd\n\34\3\34\3\34"+ + "\5\34\u01c1\n\34\3\34\3\34\5\34\u01c5\n\34\3\34\3\34\3\34\3\35\3\35\3"+ + "\35\3\35\7\35\u01ce\n\35\f\35\16\35\u01d1\13\35\3\36\3\36\3\36\5\36\u01d6"+ + "\n\36\3\36\3\36\3\36\3\37\3\37\3\37\3 \3 \3 \3 \3 \7 \u01e3\n \f \16 "+ + "\u01e6\13 \3!\3!\3!\5!\u01eb\n!\3!\3!\5!\u01ef\n!\3!\3!\5!\u01f3\n!\3"+ + "\"\3\"\3\"\3\"\3\"\5\"\u01fa\n\"\3\"\3\"\3\"\7\"\u01ff\n\"\f\"\16\"\u0202"+ + "\13\"\3#\3#\3#\5#\u0207\n#\3#\3#\3#\5#\u020c\n#\5#\u020e\n#\3#\3#\5#\u0212"+ + "\n#\3$\3$\3$\3%\3%\5%\u0219\n%\3%\3%\3%\7%\u021e\n%\f%\16%\u0221\13%\3"+ + "%\3%\3%\3&\3&\3&\5&\u0229\n&\3&\3&\3&\3\'\3\'\3\'\3\'\3\'\6\'\u0233\n"+ + "\'\r\'\16\'\u0234\3\'\3\'\3\'\3\'\3(\3(\6(\u023d\n(\r(\16(\u023e\3(\3"+ + "(\3(\3)\3)\3)\3)\3)\6)\u0249\n)\r)\16)\u024a\3)\3)\5)\u024f\n)\3)\3)\3"+ + ")\3*\3*\3*\3*\5*\u0258\n*\3*\3*\3*\7*\u025d\n*\f*\16*\u0260\13*\3*\3*"+ + "\3*\3+\3+\3+\3+\3+\3+\3+\3+\3+\3,\3,\3,\3,\3,\6,\u0273\n,\r,\16,\u0274"+ + "\3-\3-\3-\5-\u027a\n-\3-\3-\3-\5-\u027f\n-\7-\u0281\n-\f-\16-\u0284\13"+ + "-\3-\3-\3-\3-\3.\3.\3.\7.\u028d\n.\f.\16.\u0290\13.\3/\3/\3/\7/\u0295"+ + "\n/\f/\16/\u0298\13/\3\60\5\60\u029b\n\60\3\60\3\60\3\61\3\61\3\61\5\61"+ + "\u02a2\n\61\3\62\3\62\3\62\7\62\u02a7\n\62\f\62\16\62\u02aa\13\62\3\63"+ + "\3\63\3\63\5\63\u02af\n\63\3\64\3\64\3\64\7\64\u02b4\n\64\f\64\16\64\u02b7"+ + "\13\64\3\65\3\65\3\65\7\65\u02bc\n\65\f\65\16\65\u02bf\13\65\3\66\3\66"+ + "\3\66\3\66\5\66\u02c5\n\66\3\67\3\67\3\67\3\67\5\67\u02cb\n\67\38\38\3"+ + "8\38\58\u02d1\n8\39\39\39\39\59\u02d7\n9\3:\3:\3:\3:\5:\u02dd\n:\3;\3"+ + ";\3;\3;\3;\3;\3;\7;\u02e6\n;\f;\16;\u02e9\13;\3<\3<\3<\5<\u02ee\n<\3="+ + "\7=\u02f1\n=\f=\16=\u02f4\13=\3=\3=\3>\3>\3>\5>\u02fb\n>\3?\3?\3?\3?\3"+ + "?\3?\3?\3@\3@\3@\3@\3@\3@\3@\3A\3A\3A\7A\u030e\nA\fA\16A\u0311\13A\3B"+ + "\3B\3B\3B\3B\3B\7B\u0319\nB\fB\16B\u031c\13B\3C\3C\3C\3C\3C\3C\3D\3D\3"+ + "D\3E\3E\3E\3E\3F\3F\3F\3F\3F\3F\3F\5F\u0332\nF\3G\3G\3G\3G\3G\3G\3G\3"+ + "G\3G\3G\3G\3G\3G\3G\5G\u0342\nG\3H\3H\3H\3I\3I\5I\u0349\nI\3I\3I\3J\3"+ + "J\3K\3K\3K\3K\3K\3L\3L\3L\3L\3L\3M\3M\3M\3N\3N\3N\5N\u035f\nN\7N\u0361"+ + "\nN\fN\16N\u0364\13N\3N\3N\3O\3O\5O\u036a\nO\3P\3P\5P\u036e\nP\3Q\3Q\3"+ + "Q\3Q\3R\3R\3R\5R\u0377\nR\3R\3R\3R\5R\u037c\nR\3R\3R\5R\u0380\nR\3R\3"+ + "R\3S\3S\3S\3S\3S\3S\5S\u038a\nS\5S\u038c\nS\3T\3T\3T\3T\7T\u0392\nT\f"+ + "T\16T\u0395\13T\5T\u0397\nT\3T\3T\3T\3T\3T\5T\u039e\nT\3U\3U\3U\5U\u03a3"+ + "\nU\3V\3V\5V\u03a7\nV\3W\3W\3W\3W\3W\3X\3X\3X\3X\3X\7X\u03b3\nX\fX\16"+ + "X\u03b6\13X\5X\u03b8\nX\3X\3X\3X\3X\3Y\3Y\5Y\u03c0\nY\3Z\3Z\5Z\u03c4\n"+ + "Z\3Z\3Z\3Z\3[\3[\5[\u03cb\n[\3[\3[\3\\\3\\\3]\3]\3^\3^\3^\2\2_\2\4\6\b"+ + "\n\f\16\20\22\24\26\30\32\34\36 \"$&(*,.\60\62\64\668:<>@BDFHJLNPRTVX"+ + "Z\\^`bdfhjlnprtvxz|~\u0080\u0082\u0084\u0086\u0088\u008a\u008c\u008e\u0090"+ + "\u0092\u0094\u0096\u0098\u009a\u009c\u009e\u00a0\u00a2\u00a4\u00a6\u00a8"+ + "\u00aa\u00ac\u00ae\u00b0\u00b2\u00b4\u00b6\u00b8\u00ba\2\n\4\2\b\bkk\3"+ + "\2TU\3\2\13\24\4\2\6\6&\60\3\2\62\63\4\2%%\64\66\4\2\n\nvv\4\2?tww\2\u0408"+ + "\2\u00bc\3\2\2\2\4\u00c4\3\2\2\2\6\u00ca\3\2\2\2\b\u00cd\3\2\2\2\n\u00de"+ + "\3\2\2\2\f\u00ed\3\2\2\2\16\u00ef\3\2\2\2\20\u00f9\3\2\2\2\22\u00fb\3"+ + "\2\2\2\24\u0100\3\2\2\2\26\u0104\3\2\2\2\30\u010a\3\2\2\2\32\u011f\3\2"+ + "\2\2\34\u0125\3\2\2\2\36\u0127\3\2\2\2 \u013a\3\2\2\2\"\u014a\3\2\2\2"+ + "$\u015a\3\2\2\2&\u016e\3\2\2\2(\u017d\3\2\2\2*\u017f\3\2\2\2,\u0187\3"+ + "\2\2\2.\u018d\3\2\2\2\60\u019c\3\2\2\2\62\u01a0\3\2\2\2\64\u01b0\3\2\2"+ + "\2\66\u01b9\3\2\2\28\u01c9\3\2\2\2:\u01d2\3\2\2\2<\u01da\3\2\2\2>\u01dd"+ + "\3\2\2\2@\u01e7\3\2\2\2B\u01f9\3\2\2\2D\u0203\3\2\2\2F\u0213\3\2\2\2H"+ + "\u0218\3\2\2\2J\u0225\3\2\2\2L\u022d\3\2\2\2N\u023c\3\2\2\2P\u0243\3\2"+ + "\2\2R\u0253\3\2\2\2T\u0264\3\2\2\2V\u026d\3\2\2\2X\u0276\3\2\2\2Z\u0289"+ + "\3\2\2\2\\\u0291\3\2\2\2^\u029a\3\2\2\2`\u029e\3\2\2\2b\u02a3\3\2\2\2"+ + "d\u02ab\3\2\2\2f\u02b0\3\2\2\2h\u02b8\3\2\2\2j\u02c0\3\2\2\2l\u02c6\3"+ + "\2\2\2n\u02cc\3\2\2\2p\u02d2\3\2\2\2r\u02d8\3\2\2\2t\u02de\3\2\2\2v\u02ed"+ + "\3\2\2\2x\u02f2\3\2\2\2z\u02fa\3\2\2\2|\u02fc\3\2\2\2~\u0303\3\2\2\2\u0080"+ + "\u030a\3\2\2\2\u0082\u0312\3\2\2\2\u0084\u031d\3\2\2\2\u0086\u0323\3\2"+ + "\2\2\u0088\u0326\3\2\2\2\u008a\u032a\3\2\2\2\u008c\u0341\3\2\2\2\u008e"+ + "\u0343\3\2\2\2\u0090\u0346\3\2\2\2\u0092\u034c\3\2\2\2\u0094\u034e\3\2"+ + "\2\2\u0096\u0353\3\2\2\2\u0098\u0358\3\2\2\2\u009a\u035b\3\2\2\2\u009c"+ + "\u0369\3\2\2\2\u009e\u036d\3\2\2\2\u00a0\u036f\3\2\2\2\u00a2\u0373\3\2"+ + "\2\2\u00a4\u038b\3\2\2\2\u00a6\u039d\3\2\2\2\u00a8\u03a2\3\2\2\2\u00aa"+ + "\u03a6\3\2\2\2\u00ac\u03a8\3\2\2\2\u00ae\u03ad\3\2\2\2\u00b0\u03bd\3\2"+ + "\2\2\u00b2\u03c3\3\2\2\2\u00b4\u03c8\3\2\2\2\u00b6\u03ce\3\2\2\2\u00b8"+ + "\u03d0\3\2\2\2\u00ba\u03d2\3\2\2\2\u00bc\u00bd\5\4\3\2\u00bd\u00be\7\2"+ + "\2\3\u00be\3\3\2\2\2\u00bf\u00c0\7j\2\2\u00c0\u00c1\7i\2\2\u00c1\u00c2"+ + "\5\u00b8]\2\u00c2\u00c3\7\3\2\2\u00c3\u00c5\3\2\2\2\u00c4\u00bf\3\2\2"+ + "\2\u00c4\u00c5\3\2\2\2\u00c5\u00c8\3\2\2\2\u00c6\u00c9\5\b\5\2\u00c7\u00c9"+ + "\5\6\4\2\u00c8\u00c6\3\2\2\2\u00c8\u00c7\3\2\2\2\u00c9\5\3\2\2\2\u00ca"+ + "\u00cb\5\n\6\2\u00cb\u00cc\5.\30\2\u00cc\7\3\2\2\2\u00cd\u00ce\7\4\2\2"+ + "\u00ce\u00cf\7\5\2\2\u00cf\u00d0\7~\2\2\u00d0\u00d1\7\6\2\2\u00d1\u00d2"+ + "\5\u00b6\\\2\u00d2\u00d3\7\3\2\2\u00d3\u00d4\5\n\6\2\u00d4\t\3\2\2\2\u00d5"+ + "\u00d9\5\f\7\2\u00d6\u00d9\5\16\b\2\u00d7\u00d9\5\36\20\2\u00d8\u00d5"+ + "\3\2\2\2\u00d8\u00d6\3\2\2\2\u00d8\u00d7\3\2\2\2\u00d9\u00da\3\2\2\2\u00da"+ + "\u00db\7\3\2\2\u00db\u00dd\3\2\2\2\u00dc\u00d8\3\2\2\2\u00dd\u00e0\3\2"+ + "\2\2\u00de\u00dc\3\2\2\2\u00de\u00df\3\2\2\2\u00df\u00e6\3\2\2\2\u00e0"+ + "\u00de\3\2\2\2\u00e1\u00e2\5\20\t\2\u00e2\u00e3\7\3\2\2\u00e3\u00e5\3"+ + "\2\2\2\u00e4\u00e1\3\2\2\2\u00e5\u00e8\3\2\2\2\u00e6\u00e4\3\2\2\2\u00e6"+ + "\u00e7\3\2\2\2\u00e7\13\3\2\2\2\u00e8\u00e6\3\2\2\2\u00e9\u00ee\5\22\n"+ + "\2\u00ea\u00ee\5\24\13\2\u00eb\u00ee\5\26\f\2\u00ec\u00ee\5\30\r\2\u00ed"+ + "\u00e9\3\2\2\2\u00ed\u00ea\3\2\2\2\u00ed\u00eb\3\2\2\2\u00ed\u00ec\3\2"+ + "\2\2\u00ee\r\3\2\2\2\u00ef\u00f0\7q\2\2\u00f0\u00f1\7\5\2\2\u00f1\u00f2"+ + "\7~\2\2\u00f2\u00f3\7\6\2\2\u00f3\u00f4\5\u00b6\\\2\u00f4\17\3\2\2\2\u00f5"+ + "\u00fa\5$\23\2\u00f6\u00fa\5 \21\2\u00f7\u00fa\5&\24\2\u00f8\u00fa\5\""+ + "\22\2\u00f9\u00f5\3\2\2\2\u00f9\u00f6\3\2\2\2\u00f9\u00f7\3\2\2\2\u00f9"+ + "\u00f8\3\2\2\2\u00fa\21\3\2\2\2\u00fb\u00fc\7q\2\2\u00fc\u00fd\7Z\2\2"+ + "\u00fd\u00fe\7S\2\2\u00fe\u00ff\5\u00b6\\\2\u00ff\23\3\2\2\2\u0100\u0101"+ + "\7q\2\2\u0101\u0102\7\7\2\2\u0102\u0103\t\2\2\2\u0103\25\3\2\2\2\u0104"+ + "\u0105\7q\2\2\u0105\u0106\7Z\2\2\u0106\u0107\7D\2\2\u0107\u0108\7K\2\2"+ + "\u0108\u0109\t\3\2\2\u0109\27\3\2\2\2\u010a\u010f\7q\2\2\u010b\u010c\7"+ + "\t\2\2\u010c\u0110\5\32\16\2\u010d\u010e\7Z\2\2\u010e\u0110\7\t\2\2\u010f"+ + "\u010b\3\2\2\2\u010f\u010d\3\2\2\2\u0110\u0117\3\2\2\2\u0111\u0112\5\34"+ + "\17\2\u0112\u0113\7\6\2\2\u0113\u0114\5\u00b8]\2\u0114\u0116\3\2\2\2\u0115"+ + "\u0111\3\2\2\2\u0116\u0119\3\2\2\2\u0117\u0115\3\2\2\2\u0117\u0118\3\2"+ + "\2\2\u0118\31\3\2\2\2\u0119\u0117\3\2\2\2\u011a\u011d\7~\2\2\u011b\u011d"+ + "\5\u00ba^\2\u011c\u011a\3\2\2\2\u011c\u011b\3\2\2\2\u011d\u011e\3\2\2"+ + "\2\u011e\u0120\7\n\2\2\u011f\u011c\3\2\2\2\u011f\u0120\3\2\2\2\u0120\u0123"+ + "\3\2\2\2\u0121\u0124\7~\2\2\u0122\u0124\5\u00ba^\2\u0123\u0121\3\2\2\2"+ + "\u0123\u0122\3\2\2\2\u0124\33\3\2\2\2\u0125\u0126\t\4\2\2\u0126\35\3\2"+ + "\2\2\u0127\u0128\7\25\2\2\u0128\u012c\7\4\2\2\u0129\u012a\7\5\2\2\u012a"+ + "\u012b\7~\2\2\u012b\u012d\7\6\2\2\u012c\u0129\3\2\2\2\u012c\u012d\3\2"+ + "\2\2\u012d\u012e\3\2\2\2\u012e\u0138\5\u00b6\\\2\u012f\u0130\7I\2\2\u0130"+ + "\u0135\5\u00b6\\\2\u0131\u0132\7\26\2\2\u0132\u0134\5\u00b6\\\2\u0133"+ + "\u0131\3\2\2\2\u0134\u0137\3\2\2\2\u0135\u0133\3\2\2\2\u0135\u0136\3\2"+ + "\2\2\u0136\u0139\3\2\2\2\u0137\u0135\3\2\2\2\u0138\u012f\3\2\2\2\u0138"+ + "\u0139\3\2\2\2\u0139\37\3\2\2\2\u013a\u013b\7q\2\2\u013b\u013c\7t\2\2"+ + "\u013c\u013f\5\u008eH\2\u013d\u013e\7H\2\2\u013e\u0140\5\u00a4S\2\u013f"+ + "\u013d\3\2\2\2\u013f\u0140\3\2\2\2\u0140\u0148\3\2\2\2\u0141\u0142\7\27"+ + "\2\2\u0142\u0149\5\60\31\2\u0143\u0146\7\30\2\2\u0144\u0145\7\27\2\2\u0145"+ + "\u0147\5\60\31\2\u0146\u0144\3\2\2\2\u0146\u0147\3\2\2\2\u0147\u0149\3"+ + "\2\2\2\u0148\u0141\3\2\2\2\u0148\u0143\3\2\2\2\u0149!\3\2\2\2\u014a\u014b"+ + "\7q\2\2\u014b\u014c\7r\2\2\u014c\u014f\7s\2\2\u014d\u014e\7H\2\2\u014e"+ + "\u0150\5\u00a4S\2\u014f\u014d\3\2\2\2\u014f\u0150\3\2\2\2\u0150\u0158"+ + "\3\2\2\2\u0151\u0152\7\27\2\2\u0152\u0159\5\60\31\2\u0153\u0156\7\30\2"+ + "\2\u0154\u0155\7\27\2\2\u0155\u0157\5\60\31\2\u0156\u0154\3\2\2\2\u0156"+ + "\u0157\3\2\2\2\u0157\u0159\3\2\2\2\u0158\u0151\3\2\2\2\u0158\u0153\3\2"+ + "\2\2\u0159#\3\2\2\2\u015a\u015b\7q\2\2\u015b\u015c\7\31\2\2\u015c\u015d"+ + "\5\32\16\2\u015d\u015f\7\32\2\2\u015e\u0160\5*\26\2\u015f\u015e\3\2\2"+ + "\2\u015f\u0160\3\2\2\2\u0160\u0161\3\2\2\2\u0161\u0164\7\33\2\2\u0162"+ + "\u0163\7H\2\2\u0163\u0165\5\u00a4S\2\u0164\u0162\3\2\2\2\u0164\u0165\3"+ + "\2\2\2\u0165\u016c\3\2\2\2\u0166\u0168\7\34\2\2\u0167\u0169\5.\30\2\u0168"+ + "\u0167\3\2\2\2\u0168\u0169\3\2\2\2\u0169\u016a\3\2\2\2\u016a\u016d\7\35"+ + "\2\2\u016b\u016d\7\30\2\2\u016c\u0166\3\2\2\2\u016c\u016b\3\2\2\2\u016d"+ + "%\3\2\2\2\u016e\u016f\7q\2\2\u016f\u0170\7n\2\2\u0170\u0171\5\32\16\2"+ + "\u0171\u0173\7H\2\2\u0172\u0174\5(\25\2\u0173\u0172\3\2\2\2\u0173\u0174"+ + "\3\2\2\2\u0174\u0175\3\2\2\2\u0175\u0176\5\60\31\2\u0176\'\3\2\2\2\u0177"+ + "\u0178\7\36\2\2\u0178\u017e\7\37\2\2\u0179\u017a\7\36\2\2\u017a\u017e"+ + "\7 \2\2\u017b\u017c\7!\2\2\u017c\u017e\7\"\2\2\u017d\u0177\3\2\2\2\u017d"+ + "\u0179\3\2\2\2\u017d\u017b\3\2\2\2\u017e)\3\2\2\2\u017f\u0184\5,\27\2"+ + "\u0180\u0181\7\26\2\2\u0181\u0183\5,\27\2\u0182\u0180\3\2\2\2\u0183\u0186"+ + "\3\2\2\2\u0184\u0182\3\2\2\2\u0184\u0185\3\2\2\2\u0185+\3\2\2\2\u0186"+ + "\u0184\3\2\2\2\u0187\u0188\7#\2\2\u0188\u018b\5\32\16\2\u0189\u018a\7"+ + "H\2\2\u018a\u018c\5\u00a4S\2\u018b\u0189\3\2\2\2\u018b\u018c\3\2\2\2\u018c"+ + "-\3\2\2\2\u018d\u0192\5\60\31\2\u018e\u018f\7\26\2\2\u018f\u0191\5\60"+ + "\31\2\u0190\u018e\3\2\2\2\u0191\u0194\3\2\2\2\u0192\u0190\3\2\2\2\u0192"+ + "\u0193\3\2\2\2\u0193/\3\2\2\2\u0194\u0192\3\2\2\2\u0195\u019d\5\62\32"+ + "\2\u0196\u019d\5H%\2\u0197\u019d\5L\'\2\u0198\u019d\5P)\2\u0199\u019d"+ + "\5T+\2\u019a\u019d\5V,\2\u019b\u019d\5Z.\2\u019c\u0195\3\2\2\2\u019c\u0196"+ + "\3\2\2\2\u019c\u0197\3\2\2\2\u019c\u0198\3\2\2\2\u019c\u0199\3\2\2\2\u019c"+ + "\u019a\3\2\2\2\u019c\u019b\3\2\2\2\u019d\61\3\2\2\2\u019e\u01a1\5\64\33"+ + "\2\u019f\u01a1\58\35\2\u01a0\u019e\3\2\2\2\u01a0\u019f\3\2\2\2\u01a1\u01aa"+ + "\3\2\2\2\u01a2\u01a9\5\64\33\2\u01a3\u01a9\5<\37\2\u01a4\u01a9\58\35\2"+ + "\u01a5\u01a9\5> \2\u01a6\u01a9\5B\"\2\u01a7\u01a9\5F$\2\u01a8\u01a2\3"+ + "\2\2\2\u01a8\u01a3\3\2\2\2\u01a8\u01a4\3\2\2\2\u01a8\u01a5\3\2\2\2\u01a8"+ + "\u01a6\3\2\2\2\u01a8\u01a7\3\2\2\2\u01a9\u01ac\3\2\2\2\u01aa\u01a8\3\2"+ + "\2\2\u01aa\u01ab\3\2\2\2\u01ab\u01ad\3\2\2\2\u01ac\u01aa\3\2\2\2\u01ad"+ + "\u01ae\7E\2\2\u01ae\u01af\5\60\31\2\u01af\63\3\2\2\2\u01b0\u01b1\7?\2"+ + "\2\u01b1\u01b6\5\66\34\2\u01b2\u01b3\7\26\2\2\u01b3\u01b5\5\66\34\2\u01b4"+ + "\u01b2\3\2\2\2\u01b5\u01b8\3\2\2\2\u01b6\u01b4\3\2\2\2\u01b6\u01b7\3\2"+ + "\2\2\u01b7\65\3\2\2\2\u01b8\u01b6\3\2\2\2\u01b9\u01bc\5\u008eH\2\u01ba"+ + "\u01bb\7H\2\2\u01bb\u01bd\5\u00a4S\2\u01bc\u01ba\3\2\2\2\u01bc\u01bd\3"+ + "\2\2\2\u01bd\u01c0\3\2\2\2\u01be\u01bf\7J\2\2\u01bf\u01c1\7K\2\2\u01c0"+ + "\u01be\3\2\2\2\u01c0\u01c1\3\2\2\2\u01c1\u01c4\3\2\2\2\u01c2\u01c3\7I"+ + "\2\2\u01c3\u01c5\5\u008eH\2\u01c4\u01c2\3\2\2\2\u01c4\u01c5\3\2\2\2\u01c5"+ + "\u01c6\3\2\2\2\u01c6\u01c7\7G\2\2\u01c7\u01c8\5\60\31\2\u01c8\67\3\2\2"+ + "\2\u01c9\u01ca\7@\2\2\u01ca\u01cf\5:\36\2\u01cb\u01cc\7\26\2\2\u01cc\u01ce"+ + "\5:\36\2\u01cd\u01cb\3\2\2\2\u01ce\u01d1\3\2\2\2\u01cf\u01cd\3\2\2\2\u01cf"+ + "\u01d0\3\2\2\2\u01d09\3\2\2\2\u01d1\u01cf\3\2\2\2\u01d2\u01d5\5\u008e"+ + "H\2\u01d3\u01d4\7H\2\2\u01d4\u01d6\5\u00a4S\2\u01d5\u01d3\3\2\2\2\u01d5"+ + "\u01d6\3\2\2\2\u01d6\u01d7\3\2\2\2\u01d7\u01d8\7\27\2\2\u01d8\u01d9\5"+ + "\60\31\2\u01d9;\3\2\2\2\u01da\u01db\7A\2\2\u01db\u01dc\5\60\31\2\u01dc"+ + "=\3\2\2\2\u01dd\u01de\7B\2\2\u01de\u01df\7C\2\2\u01df\u01e4\5@!\2\u01e0"+ + "\u01e1\7\26\2\2\u01e1\u01e3\5@!\2\u01e2\u01e0\3\2\2\2\u01e3\u01e6\3\2"+ + "\2\2\u01e4\u01e2\3\2\2\2\u01e4\u01e5\3\2\2\2\u01e5?\3\2\2\2\u01e6\u01e4"+ + "\3\2\2\2\u01e7\u01ee\5\u008eH\2\u01e8\u01e9\7H\2\2\u01e9\u01eb\5\u00a4"+ + "S\2\u01ea\u01e8\3\2\2\2\u01ea\u01eb\3\2\2\2\u01eb\u01ec\3\2\2\2\u01ec"+ + "\u01ed\7\27\2\2\u01ed\u01ef\5\60\31\2\u01ee\u01ea\3\2\2\2\u01ee\u01ef"+ + "\3\2\2\2\u01ef\u01f2\3\2\2\2\u01f0\u01f1\7S\2\2\u01f1\u01f3\5\u00b6\\"+ + "\2\u01f2\u01f0\3\2\2\2\u01f2\u01f3\3\2\2\2\u01f3A\3\2\2\2\u01f4\u01f5"+ + "\7D\2\2\u01f5\u01fa\7C\2\2\u01f6\u01f7\7M\2\2\u01f7\u01f8\7D\2\2\u01f8"+ + "\u01fa\7C\2\2\u01f9\u01f4\3\2\2\2\u01f9\u01f6\3\2\2\2\u01fa\u01fb\3\2"+ + "\2\2\u01fb\u0200\5D#\2\u01fc\u01fd\7\26\2\2\u01fd\u01ff\5D#\2\u01fe\u01fc"+ + "\3\2\2\2\u01ff\u0202\3\2\2\2\u0200\u01fe\3\2\2\2\u0200\u0201\3\2\2\2\u0201"+ + "C\3\2\2\2\u0202\u0200\3\2\2\2\u0203\u0206\5\60\31\2\u0204\u0207\7N\2\2"+ + "\u0205\u0207\7O\2\2\u0206\u0204\3\2\2\2\u0206\u0205\3\2\2\2\u0206\u0207"+ + "\3\2\2\2\u0207\u020d\3\2\2\2\u0208\u020b\7K\2\2\u0209\u020c\7T\2\2\u020a"+ + "\u020c\7U\2\2\u020b\u0209\3\2\2\2\u020b\u020a\3\2\2\2\u020c\u020e\3\2"+ + "\2\2\u020d\u0208\3\2\2\2\u020d\u020e\3\2\2\2\u020e\u0211\3\2\2\2\u020f"+ + "\u0210\7S\2\2\u0210\u0212\5\u00b6\\\2\u0211\u020f\3\2\2\2\u0211\u0212"+ + "\3\2\2\2\u0212E\3\2\2\2\u0213\u0214\7L\2\2\u0214\u0215\5\u008eH\2\u0215"+ + "G\3\2\2\2\u0216\u0219\7P\2\2\u0217\u0219\7Q\2\2\u0218\u0216\3\2\2\2\u0218"+ + "\u0217\3\2\2\2\u0219\u021a\3\2\2\2\u021a\u021f\5J&\2\u021b\u021c\7\26"+ + "\2\2\u021c\u021e\5J&\2\u021d\u021b\3\2\2\2\u021e\u0221\3\2\2\2\u021f\u021d"+ + "\3\2\2\2\u021f\u0220\3\2\2\2\u0220\u0222\3\2\2\2\u0221\u021f\3\2\2\2\u0222"+ + "\u0223\7R\2\2\u0223\u0224\5\60\31\2\u0224I\3\2\2\2\u0225\u0228\5\u008e"+ + "H\2\u0226\u0227\7H\2\2\u0227\u0229\5\u00a4S\2\u0228\u0226\3\2\2\2\u0228"+ + "\u0229\3\2\2\2\u0229\u022a\3\2\2\2\u022a\u022b\7G\2\2\u022b\u022c\5\60"+ + "\31\2\u022cK\3\2\2\2\u022d\u022e\7V\2\2\u022e\u022f\7\32\2\2\u022f\u0230"+ + "\5.\30\2\u0230\u0232\7\33\2\2\u0231\u0233\5N(\2\u0232\u0231\3\2\2\2\u0233"+ + "\u0234\3\2\2\2\u0234\u0232\3\2\2\2\u0234\u0235\3\2\2\2\u0235\u0236\3\2"+ + "\2\2\u0236\u0237\7Z\2\2\u0237\u0238\7E\2\2\u0238\u0239\5\60\31\2\u0239"+ + "M\3\2\2\2\u023a\u023b\7W\2\2\u023b\u023d\5\60\31\2\u023c\u023a\3\2\2\2"+ + "\u023d\u023e\3\2\2\2\u023e\u023c\3\2\2\2\u023e\u023f\3\2\2\2\u023f\u0240"+ + "\3\2\2\2\u0240\u0241\7E\2\2\u0241\u0242\5\60\31\2\u0242O\3\2\2\2\u0243"+ + "\u0244\7]\2\2\u0244\u0245\7\32\2\2\u0245\u0246\5.\30\2\u0246\u0248\7\33"+ + "\2\2\u0247\u0249\5R*\2\u0248\u0247\3\2\2\2\u0249\u024a\3\2\2\2\u024a\u0248"+ + "\3\2\2\2\u024a\u024b\3\2\2\2\u024b\u024c\3\2\2\2\u024c\u024e\7Z\2\2\u024d"+ + "\u024f\5\u008eH\2\u024e\u024d\3\2\2\2\u024e\u024f\3\2\2\2\u024f\u0250"+ + "\3\2\2\2\u0250\u0251\7E\2\2\u0251\u0252\5\60\31\2\u0252Q\3\2\2\2\u0253"+ + "\u0257\7W\2\2\u0254\u0255\5\u008eH\2\u0255\u0256\7H\2\2\u0256\u0258\3"+ + "\2\2\2\u0257\u0254\3\2\2\2\u0257\u0258\3\2\2\2\u0258\u0259\3\2\2\2\u0259"+ + "\u025e\5\u00a4S\2\u025a\u025b\7$\2\2\u025b\u025d\5\u00a4S\2\u025c\u025a"+ + "\3\2\2\2\u025d\u0260\3\2\2\2\u025e\u025c\3\2\2\2\u025e\u025f\3\2\2\2\u025f"+ + "\u0261\3\2\2\2\u0260\u025e\3\2\2\2\u0261\u0262\7E\2\2\u0262\u0263\5\60"+ + "\31\2\u0263S\3\2\2\2\u0264\u0265\7F\2\2\u0265\u0266\7\32\2\2\u0266\u0267"+ + "\5.\30\2\u0267\u0268\7\33\2\2\u0268\u0269\7[\2\2\u0269\u026a\5\60\31\2"+ + "\u026a\u026b\7\\\2\2\u026b\u026c\5\60\31\2\u026cU\3\2\2\2\u026d\u026e"+ + "\7X\2\2\u026e\u026f\7\34\2\2\u026f\u0270\5.\30\2\u0270\u0272\7\35\2\2"+ + "\u0271\u0273\5X-\2\u0272\u0271\3\2\2\2\u0273\u0274\3\2\2\2\u0274\u0272"+ + "\3\2\2\2\u0274\u0275\3\2\2\2\u0275W\3\2\2\2\u0276\u0279\7Y\2\2\u0277\u027a"+ + "\7%\2\2\u0278\u027a\5\32\16\2\u0279\u0277\3\2\2\2\u0279\u0278\3\2\2\2"+ + "\u027a\u0282\3\2\2\2\u027b\u027e\7$\2\2\u027c\u027f\7%\2\2\u027d\u027f"+ + "\5\32\16\2\u027e\u027c\3\2\2\2\u027e\u027d\3\2\2\2\u027f\u0281\3\2\2\2"+ + "\u0280\u027b\3\2\2\2\u0281\u0284\3\2\2\2\u0282\u0280\3\2\2\2\u0282\u0283"+ + "\3\2\2\2\u0283\u0285\3\2\2\2\u0284\u0282\3\2\2\2\u0285\u0286\7\34\2\2"+ + "\u0286\u0287\5.\30\2\u0287\u0288\7\35\2\2\u0288Y\3\2\2\2\u0289\u028e\5"+ + "\\/\2\u028a\u028b\7^\2\2\u028b\u028d\5\\/\2\u028c\u028a\3\2\2\2\u028d"+ + "\u0290\3\2\2\2\u028e\u028c\3\2\2\2\u028e\u028f\3\2\2\2\u028f[\3\2\2\2"+ + "\u0290\u028e\3\2\2\2\u0291\u0296\5^\60\2\u0292\u0293\7_\2\2\u0293\u0295"+ + "\5^\60\2\u0294\u0292\3\2\2\2\u0295\u0298\3\2\2\2\u0296\u0294\3\2\2\2\u0296"+ + "\u0297\3\2\2\2\u0297]\3\2\2\2\u0298\u0296\3\2\2\2\u0299\u029b\7`\2\2\u029a"+ + "\u0299\3\2\2\2\u029a\u029b\3\2\2\2\u029b\u029c\3\2\2\2\u029c\u029d\5`"+ + "\61\2\u029d_\3\2\2\2\u029e\u02a1\5b\62\2\u029f\u02a0\t\5\2\2\u02a0\u02a2"+ + "\5b\62\2\u02a1\u029f\3\2\2\2\u02a1\u02a2\3\2\2\2\u02a2a\3\2\2\2\u02a3"+ + "\u02a8\5d\63\2\u02a4\u02a5\7\61\2\2\u02a5\u02a7\5d\63\2\u02a6\u02a4\3"+ + "\2\2\2\u02a7\u02aa\3\2\2\2\u02a8\u02a6\3\2\2\2\u02a8\u02a9\3\2\2\2\u02a9"+ + "c\3\2\2\2\u02aa\u02a8\3\2\2\2\u02ab\u02ae\5f\64\2\u02ac\u02ad\7a\2\2\u02ad"+ + "\u02af\5f\64\2\u02ae\u02ac\3\2\2\2\u02ae\u02af\3\2\2\2\u02afe\3\2\2\2"+ + "\u02b0\u02b5\5h\65\2\u02b1\u02b2\t\6\2\2\u02b2\u02b4\5h\65\2\u02b3\u02b1"+ + "\3\2\2\2\u02b4\u02b7\3\2\2\2\u02b5\u02b3\3\2\2\2\u02b5\u02b6\3\2\2\2\u02b6"+ + "g\3\2\2\2\u02b7\u02b5\3\2\2\2\u02b8\u02bd\5j\66\2\u02b9\u02ba\t\7\2\2"+ + "\u02ba\u02bc\5j\66\2\u02bb\u02b9\3\2\2\2\u02bc\u02bf\3\2\2\2\u02bd\u02bb"+ + "\3\2\2\2\u02bd\u02be\3\2\2\2\u02bei\3\2\2\2\u02bf\u02bd\3\2\2\2\u02c0"+ + "\u02c4\5l\67\2\u02c1\u02c2\7b\2\2\u02c2\u02c3\7c\2\2\u02c3\u02c5\5\u00a4"+ + "S\2\u02c4\u02c1\3\2\2\2\u02c4\u02c5\3\2\2\2\u02c5k\3\2\2\2\u02c6\u02ca"+ + "\5n8\2\u02c7\u02c8\7e\2\2\u02c8\u02c9\7d\2\2\u02c9\u02cb\5\u00a4S\2\u02ca"+ + "\u02c7\3\2\2\2\u02ca\u02cb\3\2\2\2\u02cbm\3\2\2\2\u02cc\u02d0\5p9\2\u02cd"+ + "\u02ce\7f\2\2\u02ce\u02cf\7H\2\2\u02cf\u02d1\5\u00a4S\2\u02d0\u02cd\3"+ + "\2\2\2\u02d0\u02d1\3\2\2\2\u02d1o\3\2\2\2\u02d2\u02d6\5r:\2\u02d3\u02d4"+ + "\7h\2\2\u02d4\u02d5\7H\2\2\u02d5\u02d7\5\u00b0Y\2\u02d6\u02d3\3\2\2\2"+ + "\u02d6\u02d7\3\2\2\2\u02d7q\3\2\2\2\u02d8\u02dc\5t;\2\u02d9\u02da\7g\2"+ + "\2\u02da\u02db\7H\2\2\u02db\u02dd\5\u00b0Y\2\u02dc\u02d9\3\2\2\2\u02dc"+ + "\u02dd\3\2\2\2\u02dds\3\2\2\2\u02de\u02e7\5x=\2\u02df\u02e0\7\6\2\2\u02e0"+ + "\u02e1\7/\2\2\u02e1\u02e2\3\2\2\2\u02e2\u02e3\5v<\2\u02e3\u02e4\5\u009a"+ + "N\2\u02e4\u02e6\3\2\2\2\u02e5\u02df\3\2\2\2\u02e6\u02e9\3\2\2\2\u02e7"+ + "\u02e5\3\2\2\2\u02e7\u02e8\3\2\2\2\u02e8u\3\2\2\2\u02e9\u02e7\3\2\2\2"+ + "\u02ea\u02ee\5\32\16\2\u02eb\u02ee\5\u008eH\2\u02ec\u02ee\5\u0090I\2\u02ed"+ + "\u02ea\3\2\2\2\u02ed\u02eb\3\2\2\2\u02ed\u02ec\3\2\2\2\u02eew\3\2\2\2"+ + "\u02ef\u02f1\t\6\2\2\u02f0\u02ef\3\2\2\2\u02f1\u02f4\3\2\2\2\u02f2\u02f0"+ + "\3\2\2\2\u02f2\u02f3\3\2\2\2\u02f3\u02f5\3\2\2\2\u02f4\u02f2\3\2\2\2\u02f5"+ + "\u02f6\5z>\2\u02f6y\3\2\2\2\u02f7\u02fb\5\u0080A\2\u02f8\u02fb\5|?\2\u02f9"+ + "\u02fb\5~@\2\u02fa\u02f7\3\2\2\2\u02fa\u02f8\3\2\2\2\u02fa\u02f9\3\2\2"+ + "\2\u02fb{\3\2\2\2\u02fc\u02fd\7o\2\2\u02fd\u02fe\7n\2\2\u02fe\u02ff\5"+ + "\u00a4S\2\u02ff\u0300\7\34\2\2\u0300\u0301\5.\30\2\u0301\u0302\7\35\2"+ + "\2\u0302}\3\2\2\2\u0303\u0304\7p\2\2\u0304\u0305\7n\2\2\u0305\u0306\5"+ + "\u00a4S\2\u0306\u0307\7\34\2\2\u0307\u0308\5.\30\2\u0308\u0309\7\35\2"+ + "\2\u0309\177\3\2\2\2\u030a\u030f\5\u0082B\2\u030b\u030c\7\67\2\2\u030c"+ + "\u030e\5\u0082B\2\u030d\u030b\3\2\2\2\u030e\u0311\3\2\2\2\u030f\u030d"+ + "\3\2\2\2\u030f\u0310\3\2\2\2\u0310\u0081\3\2\2\2\u0311\u030f\3\2\2\2\u0312"+ + "\u031a\5\u008cG\2\u0313\u0319\5\u0084C\2\u0314\u0319\5\u0088E\2\u0315"+ + "\u0319\5\u008aF\2\u0316\u0319\5\u0086D\2\u0317\u0319\5\u009aN\2\u0318"+ + "\u0313\3\2\2\2\u0318\u0314\3\2\2\2\u0318\u0315\3\2\2\2\u0318\u0316\3\2"+ + "\2\2\u0318\u0317\3\2\2\2\u0319\u031c\3\2\2\2\u031a\u0318\3\2\2\2\u031a"+ + "\u031b\3\2\2\2\u031b\u0083\3\2\2\2\u031c\u031a\3\2\2\2\u031d\u031e\78"+ + "\2\2\u031e\u031f\78\2\2\u031f\u0320\5.\30\2\u0320\u0321\79\2\2\u0321\u0322"+ + "\79\2\2\u0322\u0085\3\2\2\2\u0323\u0324\78\2\2\u0324\u0325\79\2\2\u0325"+ + "\u0087\3\2\2\2\u0326\u0327\78\2\2\u0327\u0328\5.\30\2\u0328\u0329\79\2"+ + "\2\u0329\u0089\3\2\2\2\u032a\u0331\7:\2\2\u032b\u0332\5\u00ba^\2\u032c"+ + "\u0332\5\u00b8]\2\u032d\u0332\7~\2\2\u032e\u0332\5\u0090I\2\u032f\u0332"+ + "\5\u008eH\2\u0330\u0332\5\u0092J\2\u0331\u032b\3\2\2\2\u0331\u032c\3\2"+ + "\2\2\u0331\u032d\3\2\2\2\u0331\u032e\3\2\2\2\u0331\u032f\3\2\2\2\u0331"+ + "\u0330\3\2\2\2\u0332\u008b\3\2\2\2\u0333\u0342\7w\2\2\u0334\u0342\7l\2"+ + "\2\u0335\u0342\7m\2\2\u0336\u0342\7x\2\2\u0337\u0342\5\u00b8]\2\u0338"+ + "\u0342\5\u008eH\2\u0339\u0342\5\u0090I\2\u033a\u0342\5\u0092J\2\u033b"+ + "\u0342\5\u00a6T\2\u033c\u0342\5\u0098M\2\u033d\u0342\5\u0094K\2\u033e"+ + "\u0342\5\u0096L\2\u033f\u0342\5\u00b4[\2\u0340\u0342\5\u009eP\2\u0341"+ + "\u0333\3\2\2\2\u0341\u0334\3\2\2\2\u0341\u0335\3\2\2\2\u0341\u0336\3\2"+ + "\2\2\u0341\u0337\3\2\2\2\u0341\u0338\3\2\2\2\u0341\u0339\3\2\2\2\u0341"+ + "\u033a\3\2\2\2\u0341\u033b\3\2\2\2\u0341\u033c\3\2\2\2\u0341\u033d\3\2"+ + "\2\2\u0341\u033e\3\2\2\2\u0341\u033f\3\2\2\2\u0341\u0340\3\2\2\2\u0342"+ + "\u008d\3\2\2\2\u0343\u0344\7#\2\2\u0344\u0345\5\32\16\2\u0345\u008f\3"+ + "\2\2\2\u0346\u0348\7\32\2\2\u0347\u0349\5.\30\2\u0348\u0347\3\2\2\2\u0348"+ + "\u0349\3\2\2\2\u0349\u034a\3\2\2\2\u034a\u034b\7\33\2\2\u034b\u0091\3"+ + "\2\2\2\u034c\u034d\7;\2\2\u034d\u0093\3\2\2\2\u034e\u034f\7\b\2\2\u034f"+ + "\u0350\7\34\2\2\u0350\u0351\5.\30\2\u0351\u0352\7\35\2\2\u0352\u0095\3"+ + "\2\2\2\u0353\u0354\7k\2\2\u0354\u0355\7\34\2\2\u0355\u0356\5.\30\2\u0356"+ + "\u0357\7\35\2\2\u0357\u0097\3\2\2\2\u0358\u0359\5\32\16\2\u0359\u035a"+ + "\5\u009aN\2\u035a\u0099\3\2\2\2\u035b\u0362\7\32\2\2\u035c\u035e\5\u009c"+ + "O\2\u035d\u035f\7\26\2\2\u035e\u035d\3\2\2\2\u035e\u035f\3\2\2\2\u035f"+ + "\u0361\3\2\2\2\u0360\u035c\3\2\2\2\u0361\u0364\3\2\2\2\u0362\u0360\3\2"+ + "\2\2\u0362\u0363\3\2\2\2\u0363\u0365\3\2\2\2\u0364\u0362\3\2\2\2\u0365"+ + "\u0366\7\33\2\2\u0366\u009b\3\2\2\2\u0367\u036a\5\60\31\2\u0368\u036a"+ + "\7v\2\2\u0369\u0367\3\2\2\2\u0369\u0368\3\2\2\2\u036a\u009d\3\2\2\2\u036b"+ + "\u036e\5\u00a0Q\2\u036c\u036e\5\u00a2R\2\u036d\u036b\3\2\2\2\u036d\u036c"+ + "\3\2\2\2\u036e\u009f\3\2\2\2\u036f\u0370\5\32\16\2\u0370\u0371\7<\2\2"+ + "\u0371\u0372\7x\2\2\u0372\u00a1\3\2\2\2\u0373\u0374\7\31\2\2\u0374\u0376"+ + "\7\32\2\2\u0375\u0377\5*\26\2\u0376\u0375\3\2\2\2\u0376\u0377\3\2\2\2"+ + "\u0377\u0378\3\2\2\2\u0378\u037b\7\33\2\2\u0379\u037a\7H\2\2\u037a\u037c"+ + "\5\u00a4S\2\u037b\u0379\3\2\2\2\u037b\u037c\3\2\2\2\u037c\u037d\3\2\2"+ + "\2\u037d\u037f\7\34\2\2\u037e\u0380\5.\30\2\u037f\u037e\3\2\2\2\u037f"+ + "\u0380\3\2\2\2\u0380\u0381\3\2\2\2\u0381\u0382\7\35\2\2\u0382\u00a3\3"+ + "\2\2\2\u0383\u0384\7\32\2\2\u0384\u038c\7\33\2\2\u0385\u0389\5\u00a8U"+ + "\2\u0386\u038a\7v\2\2\u0387\u038a\7%\2\2\u0388\u038a\7\62\2\2\u0389\u0386"+ + "\3\2\2\2\u0389\u0387\3\2\2\2\u0389\u0388\3\2\2\2\u0389\u038a\3\2\2\2\u038a"+ + "\u038c\3\2\2\2\u038b\u0383\3\2\2\2\u038b\u0385\3\2\2\2\u038c\u00a5\3\2"+ + "\2\2\u038d\u0396\7\34\2\2\u038e\u0393\5\u00b2Z\2\u038f\u0390\7\26\2\2"+ + "\u0390\u0392\5\u00b2Z\2\u0391\u038f\3\2\2\2\u0392\u0395\3\2\2\2\u0393"+ + "\u0391\3\2\2\2\u0393\u0394\3\2\2\2\u0394\u0397\3\2\2\2\u0395\u0393\3\2"+ + "\2\2\u0396\u038e\3\2\2\2\u0396\u0397\3\2\2\2\u0397\u0398\3\2\2\2\u0398"+ + "\u039e\7\35\2\2\u0399\u039a\7=\2\2\u039a\u039b\5.\30\2\u039b\u039c\7>"+ + "\2\2\u039c\u039e\3\2\2\2\u039d\u038d\3\2\2\2\u039d\u0399\3\2\2\2\u039e"+ + "\u00a7\3\2\2\2\u039f\u03a3\5\32\16\2\u03a0\u03a3\7w\2\2\u03a1\u03a3\5"+ + "\u00aaV\2\u03a2\u039f\3\2\2\2\u03a2\u03a0\3\2\2\2\u03a2\u03a1\3\2\2\2"+ + "\u03a3\u00a9\3\2\2\2\u03a4\u03a7\5\u00acW\2\u03a5\u03a7\5\u00aeX\2\u03a6"+ + "\u03a4\3\2\2\2\u03a6\u03a5\3\2\2\2\u03a7\u00ab\3\2\2\2\u03a8\u03a9\7\31"+ + "\2\2\u03a9\u03aa\7\32\2\2\u03aa\u03ab\7%\2\2\u03ab\u03ac\7\33\2\2\u03ac"+ + "\u00ad\3\2\2\2\u03ad\u03ae\7\31\2\2\u03ae\u03b7\7\32\2\2\u03af\u03b4\5"+ + "\u00a4S\2\u03b0\u03b1\7\26\2\2\u03b1\u03b3\5\u00a4S\2\u03b2\u03b0\3\2"+ + "\2\2\u03b3\u03b6\3\2\2\2\u03b4\u03b2\3\2\2\2\u03b4\u03b5\3\2\2\2\u03b5"+ + "\u03b8\3\2\2\2\u03b6\u03b4\3\2\2\2\u03b7\u03af\3\2\2\2\u03b7\u03b8\3\2"+ + "\2\2\u03b8\u03b9\3\2\2\2\u03b9\u03ba\7\33\2\2\u03ba\u03bb\7H\2\2\u03bb"+ + "\u03bc\5\u00a4S\2\u03bc\u00af\3\2\2\2\u03bd\u03bf\5\u00a8U\2\u03be\u03c0"+ + "\7v\2\2\u03bf\u03be\3\2\2\2\u03bf\u03c0\3\2\2\2\u03c0\u00b1\3\2\2\2\u03c1"+ + "\u03c4\5\60\31\2\u03c2\u03c4\7~\2\2\u03c3\u03c1\3\2\2\2\u03c3\u03c2\3"+ + "\2\2\2\u03c4\u03c5\3\2\2\2\u03c5\u03c6\t\b\2\2\u03c6\u03c7\5\60\31\2\u03c7"+ + "\u00b3\3\2\2\2\u03c8\u03ca\78\2\2\u03c9\u03cb\5.\30\2\u03ca\u03c9\3\2"+ + "\2\2\u03ca\u03cb\3\2\2\2\u03cb\u03cc\3\2\2\2\u03cc\u03cd\79\2\2\u03cd"+ + "\u00b5\3\2\2\2\u03ce\u03cf\5\u00b8]\2\u03cf\u00b7\3\2\2\2\u03d0\u03d1"+ + "\7u\2\2\u03d1\u00b9\3\2\2\2\u03d2\u03d3\t\t\2\2\u03d3\u00bb\3\2\2\2k\u00c4"+ + "\u00c8\u00d8\u00de\u00e6\u00ed\u00f9\u010f\u0117\u011c\u011f\u0123\u012c"+ + "\u0135\u0138\u013f\u0146\u0148\u014f\u0156\u0158\u015f\u0164\u0168\u016c"+ + "\u0173\u017d\u0184\u018b\u0192\u019c\u01a0\u01a8\u01aa\u01b6\u01bc\u01c0"+ + "\u01c4\u01cf\u01d5\u01e4\u01ea\u01ee\u01f2\u01f9\u0200\u0206\u020b\u020d"+ + "\u0211\u0218\u021f\u0228\u0234\u023e\u024a\u024e\u0257\u025e\u0274\u0279"+ + "\u027e\u0282\u028e\u0296\u029a\u02a1\u02a8\u02ae\u02b5\u02bd\u02c4\u02ca"+ + "\u02d0\u02d6\u02dc\u02e7\u02ed\u02f2\u02fa\u030f\u0318\u031a\u0331\u0341"+ + "\u0348\u035e\u0362\u0369\u036d\u0376\u037b\u037f\u0389\u038b\u0393\u0396"+ + "\u039d\u03a2\u03a6\u03b4\u03b7\u03bf\u03c3\u03ca"; public static final ATN _ATN = new ATNDeserializer().deserialize(_serializedATN.toCharArray()); static { diff --git a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java index 625fa7374..b519eb374 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java +++ b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java @@ -1,4 +1,4 @@ -// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.8 +// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.7 // Java header package org.rumbledb.parser; @@ -385,6 +385,12 @@ public interface JsoniqVisitor extends ParseTreeVisitor { * @return the visitor result */ T visitValidateExpr(JsoniqParser.ValidateExprContext ctx); + /** + * Visit a parse tree produced by {@link JsoniqParser#annotateExpr}. + * @param ctx the parse tree + * @return the visitor result + */ + T visitAnnotateExpr(JsoniqParser.AnnotateExprContext ctx); /** * Visit a parse tree produced by {@link JsoniqParser#simpleMapExpr}. * @param ctx the parse tree diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java index a6482c85f..3e45c13a3 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java @@ -209,7 +209,7 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { } JavaRDD rdd = getRDDAux(context); - return ValidateTypeIterator.convertRDDToValidDataFrame(rdd, this.sequenceType.getItemType(), context); + return ValidateTypeIterator.convertRDDToValidDataFrame(rdd, this.sequenceType.getItemType(), context, false); } @Override diff --git a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java index 9b1c76563..f70651b9b 100644 --- a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java @@ -22,6 +22,7 @@ import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.FieldDescriptor; import org.rumbledb.types.ItemType; import org.rumbledb.types.TypeMappings; @@ -41,15 +42,19 @@ public class ValidateTypeIterator extends HybridRuntimeIterator { private ItemType itemType; + private boolean isValidate; + public ValidateTypeIterator( RuntimeIterator instance, ItemType itemType, + boolean isValidate, ExecutionMode executionMode, RumbleRuntimeConfiguration configuration, ExceptionMetadata iteratorMetadata ) { super(Collections.singletonList(instance), executionMode, iteratorMetadata); this.itemType = itemType; + this.isValidate = isValidate; } @Override @@ -74,16 +79,16 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { return inputDataAsDataFrame; } JavaRDD inputDataAsRDDOfItems = dataFrameToRDDOfItems(inputDataAsDataFrame, getMetadata()); - return convertRDDToValidDataFrame(inputDataAsRDDOfItems, this.itemType, context); + return convertRDDToValidDataFrame(inputDataAsRDDOfItems, this.itemType, context, this.isValidate); } if (inputDataIterator.isRDDOrDataFrame()) { JavaRDD rdd = inputDataIterator.getRDD(context); - return convertRDDToValidDataFrame(rdd, this.itemType, context); + return convertRDDToValidDataFrame(rdd, this.itemType, context, this.isValidate); } List items = inputDataIterator.materialize(context); - JSoundDataFrame jdf = convertLocalItemsToDataFrame(items, this.itemType, context); + JSoundDataFrame jdf = convertLocalItemsToDataFrame(items, this.itemType, context, this.isValidate); return jdf; } catch (InvalidInstanceException ex) { InvalidInstanceException e = new InvalidInstanceException( @@ -98,7 +103,8 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { public static JSoundDataFrame convertRDDToValidDataFrame( JavaRDD itemRDD, ItemType itemType, - DynamicContext context + DynamicContext context, + boolean isValidate ) { if (!itemType.isCompatibleWithDataFrames(context.getRumbleRuntimeConfiguration())) { throw new OurBadException( @@ -112,7 +118,7 @@ public static JSoundDataFrame convertRDDToValidDataFrame( @Override public Row call(Item item) { - item = validate(item, itemType, ExceptionMetadata.EMPTY_METADATA); + item = validate(item, itemType, ExceptionMetadata.EMPTY_METADATA, isValidate); return convertLocalItemToRow(item, schema, context); } } @@ -183,7 +189,8 @@ private static DataType convertToDataType(ItemType itemType) { public static JSoundDataFrame convertLocalItemsToDataFrame( List items, ItemType itemType, - DynamicContext context + DynamicContext context, + boolean isValidate ) { if (items.size() == 0) { return new JSoundDataFrame( @@ -194,7 +201,7 @@ public static JSoundDataFrame convertLocalItemsToDataFrame( StructType schema = convertToDataFrameSchema(itemType); List rows = new ArrayList<>(); for (Item item : items) { - item = validate(item, itemType, ExceptionMetadata.EMPTY_METADATA); + item = validate(item, itemType, ExceptionMetadata.EMPTY_METADATA, isValidate); Row row = convertLocalItemToRow(item, schema, context); rows.add(row); } @@ -319,7 +326,7 @@ private static Object getRowColumnFromItemUsingDataType( @Override protected JavaRDD getRDDAux(DynamicContext context) { JavaRDD childrenItems = this.children.get(0).getRDD(context); - return childrenItems.map(x -> validate(x, this.itemType, getMetadata())); + return childrenItems.map(x -> validate(x, this.itemType, getMetadata(), this.isValidate)); } @Override @@ -344,11 +351,14 @@ protected boolean hasNextLocal() { @Override protected Item nextLocal() { - Item i = validate(this.children.get(0).next(), this.itemType, getMetadata()); + Item i = validate(this.children.get(0).next(), this.itemType, getMetadata(), this.isValidate); return i; } - private static Item validate(Item item, ItemType itemType, ExceptionMetadata metadata) { + private static Item validate(Item item, ItemType itemType, ExceptionMetadata metadata, boolean isValidate) { + if (!isValidate) { + return item; + } if (itemType.isAtomicItemType()) { if (!item.isAtomic()) { throw new InvalidInstanceException( @@ -378,7 +388,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met } List members = new ArrayList<>(); for (Item member : item.getItems()) { - members.add(validate(member, itemType.getArrayContentFacet(), metadata)); + members.add(validate(member, itemType.getArrayContentFacet(), metadata, true)); } Integer minLength = itemType.getMinLengthFacet(); Integer maxLength = itemType.getMaxLengthFacet(); @@ -414,7 +424,7 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met for (String key : item.getKeys()) { if (facets.containsKey(key)) { keys.add(key); - values.add(validate(item.getItemByKey(key), facets.get(key).getType(), metadata)); + values.add(validate(item.getItemByKey(key), facets.get(key).getType(), metadata, true)); } else { if (itemType.getClosedFacet()) { throw new InvalidInstanceException( @@ -462,4 +472,12 @@ private static Item validate(Item item, ItemType itemType, ExceptionMetadata met } return item; } + + @Override + public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseContext) { + if (this.isValidate) { + return NativeClauseContext.NoNativeQuery; + } + return this.children.get(0).generateNativeQuery(nativeClauseContext); + } } diff --git a/src/main/java/sparksoniq/spark/ml/AnnotateFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/AnnotateFunctionIterator.java index 2925209b6..7841915ff 100644 --- a/src/main/java/sparksoniq/spark/ml/AnnotateFunctionIterator.java +++ b/src/main/java/sparksoniq/spark/ml/AnnotateFunctionIterator.java @@ -45,19 +45,25 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { return inputDataAsDataFrame; } JavaRDD inputDataAsRDDOfItems = dataFrameToRDDOfItems(inputDataAsDataFrame, getMetadata()); - return ValidateTypeIterator.convertRDDToValidDataFrame(inputDataAsRDDOfItems, schemaType, context); + return ValidateTypeIterator.convertRDDToValidDataFrame( + inputDataAsRDDOfItems, + schemaType, + context, + true + ); } if (inputDataIterator.isRDDOrDataFrame()) { JavaRDD rdd = inputDataIterator.getRDD(context); - return ValidateTypeIterator.convertRDDToValidDataFrame(rdd, schemaType, context); + return ValidateTypeIterator.convertRDDToValidDataFrame(rdd, schemaType, context, true); } List items = inputDataIterator.materialize(context); return ValidateTypeIterator.convertLocalItemsToDataFrame( items, schemaType, - context + context, + true ); } catch (InvalidInstanceException ex) { InvalidInstanceException e = new InvalidInstanceException( From fc3b7310ba57361da0ca215d7007fde76a44e1e8 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 14:09:29 +0200 Subject: [PATCH 033/136] Make sure annotate flags the type. --- .../java/org/rumbledb/runtime/typing/ValidateTypeIterator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java index f70651b9b..bc068ee7b 100644 --- a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java @@ -357,7 +357,7 @@ protected Item nextLocal() { private static Item validate(Item item, ItemType itemType, ExceptionMetadata metadata, boolean isValidate) { if (!isValidate) { - return item; + return ItemFactory.getInstance().createAnnotatedItem(item, itemType); } if (itemType.isAtomicItemType()) { if (!item.isAtomic()) { From ee1a29eadcd566e484e35a6c04fde1a991d9e3f5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 5 Apr 2023 14:11:03 +0200 Subject: [PATCH 034/136] Remove warning. --- .../runtime/functions/input/JsonFileFunctionIterator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java index 6f1b39fea..e8801dc8d 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java @@ -186,7 +186,7 @@ protected boolean hasNextLocal() { @Override protected Item nextLocal() { - Item result = nextItem; + Item result = this.nextItem; fetchNext(); return result; } From c03a5fbcb34c87ffa230d7a53ed9f194eb3f3d33 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 19 Apr 2023 11:47:23 +0200 Subject: [PATCH 035/136] Allow any sequences for native contexts. --- .../compiler/ExecutionModeVisitor.java | 8 +- .../java/org/rumbledb/items/DecimalItem.java | 4 +- .../java/org/rumbledb/items/DoubleItem.java | 4 +- .../java/org/rumbledb/items/FloatItem.java | 4 +- src/main/java/org/rumbledb/items/IntItem.java | 4 +- .../java/org/rumbledb/items/IntegerItem.java | 4 +- .../java/org/rumbledb/items/StringItem.java | 4 +- .../AdditiveOperationIterator.java | 68 ++++++++++++----- .../MultiplicativeOperationIterator.java | 75 ++++++++++++++----- .../arithmetics/UnaryOperationIterator.java | 4 +- .../AtMostOneItemIfRuntimeIterator.java | 10 +-- .../runtime/flwor/NativeClauseContext.java | 10 +-- .../numerics/FloorFunctionIterator.java | 6 +- .../numerics/RoundFunctionIterator.java | 6 +- .../runtime/logics/AndOperationIterator.java | 4 +- .../runtime/logics/NotOperationIterator.java | 4 +- .../runtime/logics/OrOperationIterator.java | 4 +- .../runtime/misc/ComparisonIterator.java | 33 ++++++-- .../navigation/ArrayLookupIterator.java | 19 ++++- .../navigation/ArrayUnboxingIterator.java | 18 +++-- .../navigation/ObjectLookupIterator.java | 6 +- .../primary/ContextExpressionIterator.java | 7 +- .../primary/DecimalRuntimeIterator.java | 4 +- .../primary/DoubleRuntimeIterator.java | 4 +- .../primary/IntegerRuntimeIterator.java | 4 +- .../primary/StringRuntimeIterator.java | 4 +- .../primary/VariableReferenceIterator.java | 3 +- .../AtMostOneItemTypePromotionIterator.java | 2 +- .../java/org/rumbledb/types/SequenceType.java | 60 +++++++++++++++ 29 files changed, 280 insertions(+), 107 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 48e003d32..56fb59c28 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -502,7 +502,7 @@ public StaticContext visitTypeSwitchExpression(TypeSwitchExpression expression, ExecutionMode defaultMode = expression.getDefaultCase() .getReturnExpression() - .getHighestExecutionMode(visitorConfig); + .getHighestExecutionMode(this.visitorConfig); if (defaultMode.isUnset()) { expression.setHighestExecutionMode(ExecutionMode.UNSET); @@ -510,7 +510,7 @@ public StaticContext visitTypeSwitchExpression(TypeSwitchExpression expression, } for (TypeswitchCase c : expression.getCases()) { - ExecutionMode mode = c.getReturnExpression().getHighestExecutionMode(visitorConfig); + ExecutionMode mode = c.getReturnExpression().getHighestExecutionMode(this.visitorConfig); if (mode.isUnset()) { expression.setHighestExecutionMode(ExecutionMode.UNSET); return argument; @@ -533,7 +533,7 @@ public StaticContext visitTypeSwitchExpression(TypeSwitchExpression expression, public StaticContext visitSwitchExpression(SwitchExpression expression, StaticContext argument) { visitDescendants(expression, argument); - ExecutionMode defaultMode = expression.getDefaultExpression().getHighestExecutionMode(visitorConfig); + ExecutionMode defaultMode = expression.getDefaultExpression().getHighestExecutionMode(this.visitorConfig); if (defaultMode.isUnset()) { expression.setHighestExecutionMode(ExecutionMode.UNSET); @@ -541,7 +541,7 @@ public StaticContext visitSwitchExpression(SwitchExpression expression, StaticCo } for (SwitchCase c : expression.getCases()) { - ExecutionMode mode = c.getReturnExpression().getHighestExecutionMode(visitorConfig); + ExecutionMode mode = c.getReturnExpression().getHighestExecutionMode(this.visitorConfig); if (mode.isUnset()) { expression.setHighestExecutionMode(ExecutionMode.UNSET); return argument; diff --git a/src/main/java/org/rumbledb/items/DecimalItem.java b/src/main/java/org/rumbledb/items/DecimalItem.java index 0514e1ada..bc140b411 100644 --- a/src/main/java/org/rumbledb/items/DecimalItem.java +++ b/src/main/java/org/rumbledb/items/DecimalItem.java @@ -30,6 +30,8 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; + import java.math.BigDecimal; import java.math.BigInteger; @@ -131,7 +133,7 @@ public ItemType getDynamicType() { @Override public NativeClauseContext generateNativeQuery(NativeClauseContext context) { - return new NativeClauseContext(context, this.value.toString(), BuiltinTypesCatalogue.stringItem); + return new NativeClauseContext(context, this.value.toString(), SequenceType.DECIMAL); } public boolean isNumeric() { diff --git a/src/main/java/org/rumbledb/items/DoubleItem.java b/src/main/java/org/rumbledb/items/DoubleItem.java index 15e29d0d8..fab38f624 100644 --- a/src/main/java/org/rumbledb/items/DoubleItem.java +++ b/src/main/java/org/rumbledb/items/DoubleItem.java @@ -33,6 +33,8 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; + import java.math.BigDecimal; import java.math.BigInteger; @@ -172,7 +174,7 @@ public ItemType getDynamicType() { @Override public NativeClauseContext generateNativeQuery(NativeClauseContext context) { - return new NativeClauseContext(context, "" + this.value, BuiltinTypesCatalogue.doubleItem); + return new NativeClauseContext(context, "" + this.value, SequenceType.DOUBLE); } @Override diff --git a/src/main/java/org/rumbledb/items/FloatItem.java b/src/main/java/org/rumbledb/items/FloatItem.java index ff99ec2c8..d9dca106c 100644 --- a/src/main/java/org/rumbledb/items/FloatItem.java +++ b/src/main/java/org/rumbledb/items/FloatItem.java @@ -33,6 +33,8 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; + import java.math.BigDecimal; import java.math.BigInteger; @@ -186,6 +188,6 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext context) { if (Float.isNaN(this.value)) { return NativeClauseContext.NoNativeQuery; } - return new NativeClauseContext(context, "CAST (" + this.value + "D AS FLOAT)", BuiltinTypesCatalogue.floatItem); + return new NativeClauseContext(context, "CAST (" + this.value + "D AS FLOAT)", SequenceType.FLOAT); } } diff --git a/src/main/java/org/rumbledb/items/IntItem.java b/src/main/java/org/rumbledb/items/IntItem.java index ec26117d5..1998a0521 100644 --- a/src/main/java/org/rumbledb/items/IntItem.java +++ b/src/main/java/org/rumbledb/items/IntItem.java @@ -31,6 +31,8 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; + import java.math.BigDecimal; import java.math.BigInteger; @@ -149,7 +151,7 @@ public ItemType getDynamicType() { @Override public NativeClauseContext generateNativeQuery(NativeClauseContext context) { - return new NativeClauseContext(context, "" + this.value, BuiltinTypesCatalogue.intItem); + return new NativeClauseContext(context, "" + this.value, SequenceType.INT); } public boolean isNumeric() { diff --git a/src/main/java/org/rumbledb/items/IntegerItem.java b/src/main/java/org/rumbledb/items/IntegerItem.java index 2e648af45..0ca1de182 100644 --- a/src/main/java/org/rumbledb/items/IntegerItem.java +++ b/src/main/java/org/rumbledb/items/IntegerItem.java @@ -30,6 +30,8 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; + import java.math.BigDecimal; import java.math.BigInteger; @@ -138,7 +140,7 @@ public ItemType getDynamicType() { @Override public NativeClauseContext generateNativeQuery(NativeClauseContext context) { - return new NativeClauseContext(context, this.value.toString(), BuiltinTypesCatalogue.integerItem); + return new NativeClauseContext(context, this.value.toString(), SequenceType.INTEGER); } public boolean isNumeric() { diff --git a/src/main/java/org/rumbledb/items/StringItem.java b/src/main/java/org/rumbledb/items/StringItem.java index 6509b37f0..130a929bc 100644 --- a/src/main/java/org/rumbledb/items/StringItem.java +++ b/src/main/java/org/rumbledb/items/StringItem.java @@ -31,6 +31,8 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; + import java.math.BigDecimal; import java.math.BigInteger; @@ -145,7 +147,7 @@ public ItemType getDynamicType() { @Override public NativeClauseContext generateNativeQuery(NativeClauseContext context) { - return new NativeClauseContext(context, '"' + this.value + '"', BuiltinTypesCatalogue.stringItem); + return new NativeClauseContext(context, '"' + this.value + '"', SequenceType.STRING); } @Override diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java index f73421e98..51167a3d7 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java @@ -40,6 +40,8 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; public class AdditiveOperationIterator extends AtMostOneItemLocalRuntimeIterator { @@ -425,79 +427,107 @@ private static Item processDateTimeDurationDateTime( @Override public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseContext) { NativeClauseContext leftResult = this.leftIterator.generateNativeQuery(nativeClauseContext); + if (leftResult == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); - if (leftResult == NativeClauseContext.NoNativeQuery || rightResult == NativeClauseContext.NoNativeQuery) { + if (rightResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } ItemType resultType = null; String leftQuery = leftResult.getResultingQuery(); String rightQuery = rightResult.getResultingQuery(); if ( - leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.doubleItem) + leftResult.getResultingType().isSubtypeOf(SequenceType.DOUBLE_QM) && - rightResult.getResultingType().isNumeric() + rightResult.getResultingType().getItemType().isNumeric() ) { - if (!rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.doubleItem)) { + if (!rightResult.getResultingType().isSubtypeOf(SequenceType.DOUBLE_QM)) { rightQuery = "(CAST (" + rightQuery + " AS DOUBLE))"; } resultType = BuiltinTypesCatalogue.doubleItem; } else if ( - rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.doubleItem) + rightResult.getResultingType().isSubtypeOf(SequenceType.DOUBLE_QM) && - leftResult.getResultingType().isNumeric() + leftResult.getResultingType().getItemType().isNumeric() ) { - if (!leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.doubleItem)) { + if (!leftResult.getResultingType().isSubtypeOf(SequenceType.DOUBLE_QM)) { leftQuery = "(CAST (" + leftQuery + " AS DOUBLE))"; } resultType = BuiltinTypesCatalogue.doubleItem; } else if ( - leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.floatItem) + leftResult.getResultingType().isSubtypeOf(SequenceType.FLOAT_QM) && - rightResult.getResultingType().isNumeric() + rightResult.getResultingType().getItemType().isNumeric() ) { - if (!rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.floatItem)) { + if (!rightResult.getResultingType().isSubtypeOf(SequenceType.FLOAT_QM)) { rightQuery = "(CAST (" + rightQuery + " AS FLOAT))"; } resultType = BuiltinTypesCatalogue.floatItem; } else if ( - rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.floatItem) + rightResult.getResultingType().isSubtypeOf(SequenceType.FLOAT_QM) && - leftResult.getResultingType().isNumeric() + leftResult.getResultingType().getItemType().isNumeric() ) { - if (!leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.floatItem)) { + if (!leftResult.getResultingType().isSubtypeOf(SequenceType.FLOAT_QM)) { leftQuery = "(CAST (" + leftQuery + " AS FLOAT))"; } resultType = BuiltinTypesCatalogue.floatItem; } else if ( - leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.integerItem) + leftResult.getResultingType().isSubtypeOf(SequenceType.INTEGER_QM) && - rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.integerItem) + rightResult.getResultingType().isSubtypeOf(SequenceType.INTEGER_QM) ) { resultType = BuiltinTypesCatalogue.integerItem; } else if ( - leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.decimalItem) + leftResult.getResultingType().isSubtypeOf(SequenceType.DECIMAL_QM) && - rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.decimalItem) + rightResult.getResultingType().isSubtypeOf(SequenceType.DECIMAL_QM) ) { resultType = BuiltinTypesCatalogue.decimalItem; } else { return NativeClauseContext.NoNativeQuery; } + SequenceType.Arity resultingArity = + leftResult.getResultingType() + .getArity() + .multiplyWith( + rightResult.getResultingType().getArity() + ); + + if (resultingArity.equals(Arity.OneOrMore) || resultingArity.equals(Arity.ZeroOrMore)) { + throw new UnexpectedTypeException( + " \"+\": operation not possible with parameters of type \"" + + this.left.getDynamicType().toString() + + "\" and \"" + + this.right.getDynamicType().toString() + + "\"", + getMetadata() + ); + } if (this.isMinus) { String resultingQuery = "( " + leftQuery + " - " + rightQuery + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, resultType); + return new NativeClauseContext( + nativeClauseContext, + resultingQuery, + new SequenceType(resultType, resultingArity) + ); } else { String resultingQuery = "( " + leftQuery + " + " + rightQuery + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, resultType); + return new NativeClauseContext( + nativeClauseContext, + resultingQuery, + new SequenceType(resultType, resultingArity) + ); } } } diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java index 8d6769f25..ec2397d73 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java @@ -41,6 +41,8 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; public class MultiplicativeOperationIterator extends AtMostOneItemLocalRuntimeIterator { @@ -547,53 +549,56 @@ private static Item processDayTimeDurationDouble( @Override public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseContext) { NativeClauseContext leftResult = this.leftIterator.generateNativeQuery(nativeClauseContext); + if (leftResult == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); - if (leftResult == NativeClauseContext.NoNativeQuery || rightResult == NativeClauseContext.NoNativeQuery) { + if (rightResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } ItemType resultType = null; String leftQuery = leftResult.getResultingQuery(); String rightQuery = rightResult.getResultingQuery(); if ( - leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.doubleItem) + leftResult.getResultingType().isSubtypeOf(SequenceType.DOUBLE_QM) && - rightResult.getResultingType().isNumeric() + rightResult.getResultingType().getItemType().isNumeric() ) { - if (!rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.doubleItem)) { + if (!rightResult.getResultingType().isSubtypeOf(SequenceType.DOUBLE_QM)) { rightQuery = "(CAST (" + rightQuery + " AS DOUBLE))"; } resultType = BuiltinTypesCatalogue.doubleItem; } else if ( - rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.doubleItem) + rightResult.getResultingType().isSubtypeOf(SequenceType.DOUBLE_QM) && - leftResult.getResultingType().isNumeric() + leftResult.getResultingType().getItemType().isNumeric() ) { - if (!leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.doubleItem)) { + if (!leftResult.getResultingType().isSubtypeOf(SequenceType.DOUBLE_QM)) { leftQuery = "(CAST (" + leftQuery + " AS DOUBLE))"; } resultType = BuiltinTypesCatalogue.doubleItem; } else if ( - leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.floatItem) + leftResult.getResultingType().isSubtypeOf(SequenceType.FLOAT_QM) && - rightResult.getResultingType().isNumeric() + rightResult.getResultingType().getItemType().isNumeric() ) { - if (!rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.floatItem)) { + if (!rightResult.getResultingType().isSubtypeOf(SequenceType.FLOAT_QM)) { rightQuery = "(CAST (" + rightQuery + " AS FLOAT))"; } resultType = BuiltinTypesCatalogue.floatItem; } else if ( - rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.floatItem) + rightResult.getResultingType().isSubtypeOf(SequenceType.FLOAT_QM) && - leftResult.getResultingType().isNumeric() + leftResult.getResultingType().getItemType().isNumeric() ) { - if (!leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.floatItem)) { + if (!leftResult.getResultingType().isSubtypeOf(SequenceType.FLOAT_QM)) { leftQuery = "(CAST (" + leftQuery + " AS FLOAT))"; } resultType = BuiltinTypesCatalogue.floatItem; } else if ( - leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.integerItem) + leftResult.getResultingType().isSubtypeOf(SequenceType.INTEGER_QM) && - rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.integerItem) + rightResult.getResultingType().isSubtypeOf(SequenceType.INTEGER_QM) ) { if (this.multiplicativeOperator.equals(MultiplicativeExpression.MultiplicativeOperator.DIV)) { resultType = BuiltinTypesCatalogue.decimalItem; @@ -601,15 +606,33 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC resultType = BuiltinTypesCatalogue.integerItem; } } else if ( - leftResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.decimalItem) + leftResult.getResultingType().isSubtypeOf(SequenceType.DECIMAL_QM) && - rightResult.getResultingType().isSubtypeOf(BuiltinTypesCatalogue.decimalItem) + rightResult.getResultingType().isSubtypeOf(SequenceType.DECIMAL_QM) ) { resultType = BuiltinTypesCatalogue.decimalItem; } else { return NativeClauseContext.NoNativeQuery; } String resultingQuery = null; + + SequenceType.Arity resultingArity = + leftResult.getResultingType() + .getArity() + .multiplyWith( + rightResult.getResultingType().getArity() + ); + + if (resultingArity.equals(Arity.OneOrMore) || resultingArity.equals(Arity.ZeroOrMore)) { + throw new UnexpectedTypeException( + " \"+\": operation not possible with parameters of type \"" + + this.left.getDynamicType().toString() + + "\" and \"" + + this.right.getDynamicType().toString() + + "\"", + getMetadata() + ); + } switch (this.multiplicativeOperator) { case MUL: resultingQuery = "( " @@ -617,21 +640,33 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC + " * " + rightQuery + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, resultType); + return new NativeClauseContext( + nativeClauseContext, + resultingQuery, + new SequenceType(resultType, resultingArity) + ); case DIV: resultingQuery = "( " + leftQuery + " / " + rightQuery + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, resultType); + return new NativeClauseContext( + nativeClauseContext, + resultingQuery, + new SequenceType(resultType, resultingArity) + ); case MOD: resultingQuery = "( " + leftQuery + " % " + rightQuery + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, resultType); + return new NativeClauseContext( + nativeClauseContext, + resultingQuery, + new SequenceType(resultType, resultingArity) + ); default: return NativeClauseContext.NoNativeQuery; } diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java index 4ba3362f5..f44894242 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java @@ -30,7 +30,7 @@ import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; import java.math.BigDecimal; import java.math.BigInteger; @@ -104,7 +104,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC return NativeClauseContext.NoNativeQuery; } String leftQuery = leftResult.getResultingQuery(); - ItemType resultType = leftResult.getResultingType(); + SequenceType resultType = leftResult.getResultingType(); if (this.negated) { String resultingQuery = "( " + " - " diff --git a/src/main/java/org/rumbledb/runtime/control/AtMostOneItemIfRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/control/AtMostOneItemIfRuntimeIterator.java index e681dfbfd..57e985c14 100644 --- a/src/main/java/org/rumbledb/runtime/control/AtMostOneItemIfRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/control/AtMostOneItemIfRuntimeIterator.java @@ -29,7 +29,7 @@ import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; public class AtMostOneItemIfRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { @@ -72,13 +72,13 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ) { return NativeClauseContext.NoNativeQuery; } - if (!conditionResult.getResultingType().equals(BuiltinTypesCatalogue.booleanItem)) { + if (!conditionResult.getResultingType().equals(SequenceType.BOOLEAN)) { return NativeClauseContext.NoNativeQuery; } - if (!thenResult.getResultingType().equals(BuiltinTypesCatalogue.floatItem)) { + if (!thenResult.getResultingType().equals(SequenceType.FLOAT)) { return NativeClauseContext.NoNativeQuery; } - if (!elseResult.getResultingType().equals(BuiltinTypesCatalogue.floatItem)) { + if (!elseResult.getResultingType().equals(SequenceType.FLOAT)) { return NativeClauseContext.NoNativeQuery; } String resultingQuery = "( " @@ -89,6 +89,6 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC + ", " + elseResult.getResultingQuery() + " ) )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, BuiltinTypesCatalogue.floatItem); + return new NativeClauseContext(nativeClauseContext, resultingQuery, SequenceType.FLOAT); } } diff --git a/src/main/java/org/rumbledb/runtime/flwor/NativeClauseContext.java b/src/main/java/org/rumbledb/runtime/flwor/NativeClauseContext.java index 58e1eae2b..5f1ba059b 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/NativeClauseContext.java +++ b/src/main/java/org/rumbledb/runtime/flwor/NativeClauseContext.java @@ -4,7 +4,7 @@ import org.apache.spark.sql.types.StructType; import org.rumbledb.context.DynamicContext; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; -import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; import java.util.ArrayList; import java.util.List; @@ -20,7 +20,7 @@ public class NativeClauseContext { private DynamicContext context; private String resultingQuery; private List lateralViewPart; // used in array unboxing to generate the correct lateral view - private ItemType resultingType; + private SequenceType resultingType; private NativeClauseContext() { } @@ -43,7 +43,7 @@ public NativeClauseContext(NativeClauseContext parent) { this.resultingType = parent.resultingType; } - public NativeClauseContext(NativeClauseContext parent, String newResultingQuery, ItemType resultingType) { + public NativeClauseContext(NativeClauseContext parent, String newResultingQuery, SequenceType resultingType) { this.clauseType = parent.clauseType; this.schema = parent.schema; this.context = parent.context; @@ -80,11 +80,11 @@ public List getLateralViewPart() { return this.lateralViewPart; } - public ItemType getResultingType() { + public SequenceType getResultingType() { return this.resultingType; } - public void setResultingType(ItemType resultingType) { + public void setResultingType(SequenceType resultingType) { this.resultingType = resultingType; } } diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/FloorFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/FloorFunctionIterator.java index 6c4398bdf..999495344 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/FloorFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/FloorFunctionIterator.java @@ -29,7 +29,7 @@ import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; import java.math.BigDecimal; import java.math.RoundingMode; @@ -105,7 +105,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (value == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } - if (!value.getResultingType().equals(BuiltinTypesCatalogue.floatItem)) { + if (!value.getResultingType().equals(SequenceType.FLOAT)) { return NativeClauseContext.NoNativeQuery; } String resultingQuery = "( CAST (" @@ -113,7 +113,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC + value.getResultingQuery() + " ) AS FLOAT)" + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, BuiltinTypesCatalogue.floatItem); + return new NativeClauseContext(nativeClauseContext, resultingQuery, SequenceType.FLOAT); } diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/RoundFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/RoundFunctionIterator.java index 3d9c8a354..20bc96010 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/RoundFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/RoundFunctionIterator.java @@ -30,7 +30,7 @@ import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; import java.math.BigDecimal; import java.math.RoundingMode; @@ -145,7 +145,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (value == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } - if (!value.getResultingType().equals(BuiltinTypesCatalogue.floatItem)) { + if (!value.getResultingType().equals(SequenceType.FLOAT)) { return NativeClauseContext.NoNativeQuery; } String resultingQuery = "( CAST (" @@ -153,6 +153,6 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC + value.getResultingQuery() + " ) AS FLOAT)" + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, BuiltinTypesCatalogue.floatItem); + return new NativeClauseContext(nativeClauseContext, resultingQuery, SequenceType.FLOAT); } } diff --git a/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java index 77d9b591c..a29d73a94 100644 --- a/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java @@ -30,7 +30,7 @@ import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; public class AndOperationIterator extends AtMostOneItemLocalRuntimeIterator { @@ -81,6 +81,6 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC + " AND " + rightResult.getResultingQuery() + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, BuiltinTypesCatalogue.booleanItem); + return new NativeClauseContext(nativeClauseContext, resultingQuery, SequenceType.BOOLEAN); } } diff --git a/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java index 871468a60..6b690694d 100644 --- a/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java @@ -30,7 +30,7 @@ import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; public class NotOperationIterator extends AtMostOneItemLocalRuntimeIterator { @@ -60,6 +60,6 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC } String resultingQuery = "( NOT " + childResult.getResultingQuery() + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, BuiltinTypesCatalogue.booleanItem); + return new NativeClauseContext(nativeClauseContext, resultingQuery, SequenceType.BOOLEAN); } } diff --git a/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java index 85669c4e3..1bfe80ba1 100644 --- a/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java @@ -30,7 +30,7 @@ import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; public class OrOperationIterator extends AtMostOneItemLocalRuntimeIterator { @@ -67,6 +67,6 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC } String resultingQuery = "( " + leftResult.getResultingQuery() + " OR " + rightResult.getResultingQuery() + " )"; - return new NativeClauseContext(nativeClauseContext, resultingQuery, BuiltinTypesCatalogue.booleanItem); + return new NativeClauseContext(nativeClauseContext, resultingQuery, SequenceType.BOOLEAN); } } diff --git a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java index b7b506786..caceb2bca 100644 --- a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java +++ b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java @@ -39,6 +39,7 @@ import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; import java.math.BigDecimal; import java.math.BigInteger; @@ -507,9 +508,20 @@ private static Item comparisonResultToBooleanItem( public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseContext) { if (this.comparisonOperator.isValueComparison()) { NativeClauseContext leftResult = this.leftIterator.generateNativeQuery(nativeClauseContext); - NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); - - if (leftResult == NativeClauseContext.NoNativeQuery || rightResult == NativeClauseContext.NoNativeQuery) { + if (leftResult == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } + NativeClauseContext rightResult = this.rightIterator.generateNativeQuery( + new NativeClauseContext(leftResult, null, null) + ); + if (rightResult == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } + if ( + SequenceType.Arity.OneOrMore.isSubtypeOf(leftResult.getResultingType().getArity()) + || + SequenceType.Arity.OneOrMore.isSubtypeOf(rightResult.getResultingType().getArity()) + ) { return NativeClauseContext.NoNativeQuery; } @@ -517,9 +529,9 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if ( !(leftResult.getResultingType() != null && rightResult.getResultingType() != null - && leftResult.getResultingType().isNumeric() - && rightResult.getResultingType().isNumeric() - || leftResult.getResultingType() == rightResult.getResultingType()) + && leftResult.getResultingType().getItemType().isNumeric() + && rightResult.getResultingType().getItemType().isNumeric() + || leftResult.getResultingType().getItemType().equals(rightResult.getResultingType().getItemType())) ) { return NativeClauseContext.NoNativeQuery; } @@ -547,8 +559,15 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC default: return NativeClauseContext.NoNativeQuery; } + SequenceType.Arity resultingArity = leftResult.getResultingType() + .getArity() + .multiplyWith(rightResult.getResultingType().getArity()); String query = "( " + leftResult.getResultingQuery() + operator + rightResult.getResultingQuery() + " )"; - return new NativeClauseContext(nativeClauseContext, query, BuiltinTypesCatalogue.booleanItem); + return new NativeClauseContext( + nativeClauseContext, + query, + new SequenceType(BuiltinTypesCatalogue.booleanItem, resultingArity) + ); } else { return NativeClauseContext.NoNativeQuery; } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java index ef1294e7b..336be6e14 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java @@ -37,7 +37,7 @@ import org.rumbledb.runtime.flwor.FlworDataFrameUtils; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; -import org.rumbledb.types.TypeMappings; +import org.rumbledb.types.SequenceType; import sparksoniq.spark.SparkSessionManager; @@ -163,6 +163,9 @@ public boolean implementsDataFrames() { public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseContext) { NativeClauseContext newContext = this.iterator.generateNativeQuery(nativeClauseContext); if (newContext != NativeClauseContext.NoNativeQuery) { + if (SequenceType.Arity.OneOrMore.isSubtypeOf(newContext.getResultingType().getArity())) { + return NativeClauseContext.NoNativeQuery; + } // check if the key has variable dependencies inside the FLWOR expression // in that case we switch over to UDF Map keyDependencies = this.children.get(1) @@ -182,13 +185,21 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC initLookupPosition(newContext.getContext()); + ItemType resultType = newContext.getResultingType().getItemType(); + if (!(resultType.isArrayItemType())) { + return NativeClauseContext.NoNativeQuery; + } + schema = newContext.getSchema(); if (!(schema instanceof ArrayType)) { return NativeClauseContext.NoNativeQuery; } - ArrayType arraySchema = (ArrayType) schema; - newContext.setSchema(arraySchema.elementType()); - newContext.setResultingType(TypeMappings.getItemTypeFromDataFrameDataType(arraySchema.elementType())); + newContext.setResultingType( + new SequenceType( + resultType.getArrayContentFacet(), + SequenceType.Arity.OneOrZero + ) + ); newContext.setResultingQuery(newContext.getResultingQuery() + "[" + (this.lookup - 1) + "]"); } return newContext; diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java index 7c61950a5..c71a7a2af 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java @@ -22,8 +22,6 @@ import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; -import org.apache.spark.sql.types.ArrayType; -import org.apache.spark.sql.types.DataType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.exceptions.ExceptionMetadata; @@ -37,7 +35,7 @@ import org.rumbledb.runtime.flwor.FlworDataFrameUtils; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; -import org.rumbledb.types.TypeMappings; +import org.rumbledb.types.SequenceType; import sparksoniq.spark.SparkSessionManager; @@ -137,14 +135,18 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC } NativeClauseContext newContext = this.iterator.generateNativeQuery(nativeClauseContext); if (newContext != NativeClauseContext.NoNativeQuery) { - DataType schema = newContext.getSchema(); - if (!(schema instanceof ArrayType)) { + ItemType newContextType = newContext.getResultingType().getItemType(); + if (!newContextType.isArrayItemType()) { // let control to UDF when what we are unboxing is not an array return NativeClauseContext.NoNativeQuery; } - ArrayType arraySchema = (ArrayType) schema; - newContext.setSchema(arraySchema.elementType()); - newContext.setResultingType(TypeMappings.getItemTypeFromDataFrameDataType(arraySchema.elementType())); + newContext.setResultingType( + new SequenceType( + newContextType.getArrayContentFacet(), + SequenceType.Arity.ZeroOrMore + ) + ); + List lateralViewPart = newContext.getLateralViewPart(); if (lateralViewPart.size() == 0) { lateralViewPart.add("explode(" + newContext.getResultingQuery() + ")"); diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index 05f9c285d..0a65f546b 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -43,6 +43,8 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.FieldDescriptor; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import org.rumbledb.types.TypeMappings; import sparksoniq.spark.SparkSessionManager; @@ -300,7 +302,9 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC } StructField field = structSchema.fields()[structSchema.fieldIndex(key)]; newContext.setSchema(field.dataType()); - newContext.setResultingType(TypeMappings.getItemTypeFromDataFrameDataType(field.dataType())); + newContext.setResultingType( + new SequenceType(TypeMappings.getItemTypeFromDataFrameDataType(field.dataType()), Arity.One) + ); } else { if (this.children.get(1) instanceof StringRuntimeIterator) { throw new UnexpectedStaticTypeException( diff --git a/src/main/java/org/rumbledb/runtime/primary/ContextExpressionIterator.java b/src/main/java/org/rumbledb/runtime/primary/ContextExpressionIterator.java index 06f720e56..9422f6a88 100644 --- a/src/main/java/org/rumbledb/runtime/primary/ContextExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/ContextExpressionIterator.java @@ -32,6 +32,7 @@ import org.rumbledb.runtime.flwor.FlworDataFrameUtils; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; +import org.rumbledb.types.SequenceType; import org.rumbledb.types.TypeMappings; import sparksoniq.spark.SparkSessionManager; @@ -88,12 +89,10 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC )]; DataType fieldType = field.dataType(); ItemType variableType = TypeMappings.getItemTypeFromDataFrameDataType(fieldType); - NativeClauseContext newContext = new NativeClauseContext( + return new NativeClauseContext( nativeClauseContext, "`" + SparkSessionManager.atomicJSONiqItemColumnName + "`", - variableType + new SequenceType(variableType, SequenceType.Arity.One) ); - newContext.setSchema(fieldType); - return newContext; } } diff --git a/src/main/java/org/rumbledb/runtime/primary/DecimalRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/DecimalRuntimeIterator.java index d97161b1b..bca8ad702 100644 --- a/src/main/java/org/rumbledb/runtime/primary/DecimalRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/DecimalRuntimeIterator.java @@ -26,7 +26,7 @@ import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import java.math.BigDecimal; @@ -52,7 +52,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC return new NativeClauseContext( nativeClauseContext, "" + this.item.getDecimalValue(), - BuiltinTypesCatalogue.decimalItem + SequenceType.DECIMAL ); } } diff --git a/src/main/java/org/rumbledb/runtime/primary/DoubleRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/DoubleRuntimeIterator.java index 0fd867f3f..1dbbaaf84 100644 --- a/src/main/java/org/rumbledb/runtime/primary/DoubleRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/DoubleRuntimeIterator.java @@ -26,7 +26,7 @@ import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; public class DoubleRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { @@ -51,7 +51,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC return new NativeClauseContext( nativeClauseContext, "" + this.item.getDoubleValue(), - BuiltinTypesCatalogue.doubleItem + SequenceType.DOUBLE ); } } diff --git a/src/main/java/org/rumbledb/runtime/primary/IntegerRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/IntegerRuntimeIterator.java index e6fcb7201..7dfcaccf9 100644 --- a/src/main/java/org/rumbledb/runtime/primary/IntegerRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/IntegerRuntimeIterator.java @@ -26,7 +26,7 @@ import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; public class IntegerRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { @@ -54,7 +54,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC return new NativeClauseContext( nativeClauseContext, "" + this.item.getIntValue(), - BuiltinTypesCatalogue.integerItem + SequenceType.INTEGER ); } } diff --git a/src/main/java/org/rumbledb/runtime/primary/StringRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/StringRuntimeIterator.java index 2c86e683b..821fae8f7 100644 --- a/src/main/java/org/rumbledb/runtime/primary/StringRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/StringRuntimeIterator.java @@ -28,7 +28,7 @@ import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; -import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; public class StringRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { @@ -50,7 +50,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC return new NativeClauseContext( nativeClauseContext, '"' + this.item.getStringValue() + '"', - BuiltinTypesCatalogue.stringItem + SequenceType.STRING ); } } diff --git a/src/main/java/org/rumbledb/runtime/primary/VariableReferenceIterator.java b/src/main/java/org/rumbledb/runtime/primary/VariableReferenceIterator.java index 22bec9a46..ceb41a17e 100644 --- a/src/main/java/org/rumbledb/runtime/primary/VariableReferenceIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/VariableReferenceIterator.java @@ -38,6 +38,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import org.rumbledb.types.TypeMappings; import java.util.List; @@ -113,7 +114,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC NativeClauseContext newContext = new NativeClauseContext( nativeClauseContext, "`" + escapedName + "`", - variableType + new SequenceType(variableType, Arity.One) ); newContext.setSchema(fieldType); return newContext; diff --git a/src/main/java/org/rumbledb/runtime/typing/AtMostOneItemTypePromotionIterator.java b/src/main/java/org/rumbledb/runtime/typing/AtMostOneItemTypePromotionIterator.java index f761a502c..6e6a76c80 100644 --- a/src/main/java/org/rumbledb/runtime/typing/AtMostOneItemTypePromotionIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/AtMostOneItemTypePromotionIterator.java @@ -125,7 +125,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (value.equals(NativeClauseContext.NoNativeQuery)) { return NativeClauseContext.NoNativeQuery; } - if (!value.getResultingType().equals(BuiltinTypesCatalogue.floatItem)) { + if (!value.getResultingType().equals(SequenceType.FLOAT)) { return NativeClauseContext.NoNativeQuery; } if ( diff --git a/src/main/java/org/rumbledb/types/SequenceType.java b/src/main/java/org/rumbledb/types/SequenceType.java index 9938c0df2..9b491067a 100644 --- a/src/main/java/org/rumbledb/types/SequenceType.java +++ b/src/main/java/org/rumbledb/types/SequenceType.java @@ -53,6 +53,66 @@ public class SequenceType implements Serializable { Arity.One ); + public final static SequenceType DECIMAL = new SequenceType( + BuiltinTypesCatalogue.decimalItem, + Arity.One + ); + + public final static SequenceType DOUBLE = new SequenceType( + BuiltinTypesCatalogue.doubleItem, + Arity.One + ); + + public final static SequenceType FLOAT = new SequenceType( + BuiltinTypesCatalogue.floatItem, + Arity.One + ); + + public final static SequenceType INT = new SequenceType( + BuiltinTypesCatalogue.intItem, + Arity.One + ); + + public final static SequenceType STRING = new SequenceType( + BuiltinTypesCatalogue.stringItem, + Arity.One + ); + + public final static SequenceType BOOLEAN = new SequenceType( + BuiltinTypesCatalogue.stringItem, + Arity.One + ); + + public final static SequenceType INTEGER_QM = new SequenceType( + BuiltinTypesCatalogue.integerItem, + Arity.OneOrZero + ); + + public final static SequenceType DECIMAL_QM = new SequenceType( + BuiltinTypesCatalogue.decimalItem, + Arity.OneOrZero + ); + + public final static SequenceType DOUBLE_QM = new SequenceType( + BuiltinTypesCatalogue.doubleItem, + Arity.OneOrZero + ); + + public final static SequenceType FLOAT_QM = new SequenceType( + BuiltinTypesCatalogue.floatItem, + Arity.OneOrZero + ); + + public final static SequenceType INT_QM = new SequenceType( + BuiltinTypesCatalogue.intItem, + Arity.OneOrZero + ); + + public final static SequenceType STRING_QM = new SequenceType( + BuiltinTypesCatalogue.stringItem, + Arity.OneOrZero + ); + public final static SequenceType EMPTY_SEQUENCE = new SequenceType(); From 6b6b328ac07c05f5003fd219b8a72ac5d9b02e31 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 19 Apr 2023 11:54:33 +0200 Subject: [PATCH 036/136] Fix BOOLEAN to boolean. --- src/main/java/org/rumbledb/types/SequenceType.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/types/SequenceType.java b/src/main/java/org/rumbledb/types/SequenceType.java index 9b491067a..bb52b6b76 100644 --- a/src/main/java/org/rumbledb/types/SequenceType.java +++ b/src/main/java/org/rumbledb/types/SequenceType.java @@ -79,7 +79,7 @@ public class SequenceType implements Serializable { ); public final static SequenceType BOOLEAN = new SequenceType( - BuiltinTypesCatalogue.stringItem, + BuiltinTypesCatalogue.booleanItem, Arity.One ); From 9a50e85015f0b7ee60f8ac4c95c7a07c0570aac4 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 24 Apr 2023 15:42:24 +0200 Subject: [PATCH 037/136] Fix test. --- .../java/org/rumbledb/runtime/misc/ComparisonIterator.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java index caceb2bca..cadb15868 100644 --- a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java +++ b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java @@ -511,9 +511,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (leftResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } - NativeClauseContext rightResult = this.rightIterator.generateNativeQuery( - new NativeClauseContext(leftResult, null, null) - ); + NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); if (rightResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } From 13189a2402dd85192a6a36e8f43cc7fb8e9ab8ba Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 24 Apr 2023 15:57:32 +0200 Subject: [PATCH 038/136] Fix test. --- .../runtime/flwor/clauses/OrderByClauseSparkIterator.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index ae8e20ec4..1db7c45dc 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -50,6 +50,7 @@ import org.rumbledb.runtime.flwor.udfs.OrderClauseCreateColumnsUDF; import org.rumbledb.runtime.flwor.udfs.OrderClauseDetermineTypeUDF; import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; import org.rumbledb.types.TypeMappings; import sparksoniq.jsoniq.tuple.FlworKey; @@ -544,8 +545,8 @@ public static FlworDataFrame tryNativeQuery( // because of meaning mismatch between sparksql (where it is supposed to order by the i-th col) // and jsoniq (order by a costant, so no actual ordering is performed) if ( - (nativeQuery.getResultingType() == BuiltinTypesCatalogue.integerItem - || nativeQuery.getResultingType() == BuiltinTypesCatalogue.intItem) + (nativeQuery.getResultingType().isSubtypeOf(SequenceType.INTEGER_QM) + || nativeQuery.getResultingType().isSubtypeOf(SequenceType.INT_QM)) && nativeQuery.getResultingQuery().matches("\\s*-?\\s*\\d+\\s*") ) { orderSql.append('"'); From 9f18ae151111278e19f330e750959f2a16612ea8 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 24 Apr 2023 15:58:59 +0200 Subject: [PATCH 039/136] Filter. --- .../runtime/flwor/clauses/OrderByClauseSparkIterator.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index 1db7c45dc..9df349e57 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -51,6 +51,7 @@ import org.rumbledb.runtime.flwor.udfs.OrderClauseDetermineTypeUDF; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import org.rumbledb.types.TypeMappings; import sparksoniq.jsoniq.tuple.FlworKey; @@ -538,6 +539,11 @@ public static FlworDataFrame tryNativeQuery( if (nativeQuery == NativeClauseContext.NoNativeQuery) { return null; } + // For now we are conservative and do not support arities other than one. + if(!nativeQuery.getResultingType().getArity().equals(Arity.One)) + { + return null; + } orderSql.append(orderSeparator); orderSeparator = ", "; // special check to avoid ordering by an integer constant in an ordering clause From 425ac33dda9f964f991ddb4b8135c70ef0d3d404 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 24 Apr 2023 16:06:40 +0200 Subject: [PATCH 040/136] Conservatively do not use native queries if arity not one. --- .../runtime/arithmetics/AdditiveOperationIterator.java | 6 ++++++ .../arithmetics/MultiplicativeOperationIterator.java | 6 ++++++ .../runtime/arithmetics/UnaryOperationIterator.java | 4 ++++ .../runtime/flwor/clauses/OrderByClauseSparkIterator.java | 5 ++--- .../org/rumbledb/runtime/misc/ComparisonIterator.java | 7 +++++++ .../rumbledb/runtime/navigation/ArrayLookupIterator.java | 6 +++++- .../runtime/navigation/ArrayUnboxingIterator.java | 4 ++++ .../rumbledb/runtime/navigation/ObjectLookupIterator.java | 8 +++++--- 8 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java index 51167a3d7..ef2217ecb 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java @@ -430,10 +430,16 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (leftResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } + if (!leftResult.getResultingType().getArity().equals(Arity.One)) { + return NativeClauseContext.NoNativeQuery; + } NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); if (rightResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } + if (!rightResult.getResultingType().getArity().equals(Arity.One)) { + return NativeClauseContext.NoNativeQuery; + } ItemType resultType = null; String leftQuery = leftResult.getResultingQuery(); String rightQuery = rightResult.getResultingQuery(); diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java index ec2397d73..f912d2c3e 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java @@ -552,10 +552,16 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (leftResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } + if (!leftResult.getResultingType().getArity().equals(Arity.One)) { + return NativeClauseContext.NoNativeQuery; + } NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); if (rightResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } + if (!rightResult.getResultingType().getArity().equals(Arity.One)) { + return NativeClauseContext.NoNativeQuery; + } ItemType resultType = null; String leftQuery = leftResult.getResultingQuery(); String rightQuery = rightResult.getResultingQuery(); diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java index f44894242..93b3dcdfd 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java @@ -31,6 +31,7 @@ import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import java.math.BigDecimal; import java.math.BigInteger; @@ -103,6 +104,9 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (leftResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } + if (!leftResult.getResultingType().getArity().equals(Arity.One)) { + return NativeClauseContext.NoNativeQuery; + } String leftQuery = leftResult.getResultingQuery(); SequenceType resultType = leftResult.getResultingType(); if (this.negated) { diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index 9df349e57..c738ec347 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -540,9 +540,8 @@ public static FlworDataFrame tryNativeQuery( return null; } // For now we are conservative and do not support arities other than one. - if(!nativeQuery.getResultingType().getArity().equals(Arity.One)) - { - return null; + if (!nativeQuery.getResultingType().getArity().equals(Arity.One)) { + return null; } orderSql.append(orderSeparator); orderSeparator = ", "; diff --git a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java index cadb15868..acd381a28 100644 --- a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java +++ b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java @@ -40,6 +40,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import java.math.BigDecimal; import java.math.BigInteger; @@ -511,10 +512,16 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (leftResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } + if (!leftResult.getResultingType().getArity().equals(Arity.One)) { + return NativeClauseContext.NoNativeQuery; + } NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); if (rightResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } + if (!rightResult.getResultingType().getArity().equals(Arity.One)) { + return NativeClauseContext.NoNativeQuery; + } if ( SequenceType.Arity.OneOrMore.isSubtypeOf(leftResult.getResultingType().getArity()) || diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java index 336be6e14..ae0f496a6 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java @@ -38,6 +38,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import sparksoniq.spark.SparkSessionManager; @@ -163,7 +164,10 @@ public boolean implementsDataFrames() { public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseContext) { NativeClauseContext newContext = this.iterator.generateNativeQuery(nativeClauseContext); if (newContext != NativeClauseContext.NoNativeQuery) { - if (SequenceType.Arity.OneOrMore.isSubtypeOf(newContext.getResultingType().getArity())) { + // if (SequenceType.Arity.OneOrMore.isSubtypeOf(newContext.getResultingType().getArity())) { + // return NativeClauseContext.NoNativeQuery; + // } + if (!newContext.getResultingType().getArity().equals(Arity.One)) { return NativeClauseContext.NoNativeQuery; } // check if the key has variable dependencies inside the FLWOR expression diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java index c71a7a2af..27450df62 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java @@ -36,6 +36,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import sparksoniq.spark.SparkSessionManager; @@ -135,6 +136,9 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC } NativeClauseContext newContext = this.iterator.generateNativeQuery(nativeClauseContext); if (newContext != NativeClauseContext.NoNativeQuery) { + if (!newContext.getResultingType().getArity().equals(Arity.One)) { + return NativeClauseContext.NoNativeQuery; + } ItemType newContextType = newContext.getResultingType().getItemType(); if (!newContextType.isArrayItemType()) { // let control to UDF when what we are unboxing is not an array diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index 0a65f546b..696ad9cec 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -267,11 +267,13 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC } } else { newContext = this.iterator.generateNativeQuery(nativeClauseContext); - if (newContext != NativeClauseContext.NoNativeQuery) { - leftSchema = newContext.getSchema(); - } else { + if (newContext == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } + if (!newContext.getResultingType().getArity().equals(Arity.One)) { return NativeClauseContext.NoNativeQuery; } + leftSchema = newContext.getSchema(); } From b722666b3cedb5665299fd2855d80678c9aff467 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 25 Apr 2023 13:36:36 +0200 Subject: [PATCH 041/136] More conservative boolean and or not. --- .../rumbledb/runtime/logics/AndOperationIterator.java | 11 ++++++++++- .../rumbledb/runtime/logics/NotOperationIterator.java | 3 +++ .../rumbledb/runtime/logics/OrOperationIterator.java | 11 ++++++++++- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java index a29d73a94..7f54928e7 100644 --- a/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java @@ -72,7 +72,16 @@ public Item materializeFirstItemOrNull( public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseContext) { NativeClauseContext leftResult = this.leftIterator.generateNativeQuery(nativeClauseContext); NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); - if (leftResult == NativeClauseContext.NoNativeQuery || rightResult == NativeClauseContext.NoNativeQuery) { + if (leftResult == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } + if (rightResult == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } + if (!leftResult.getResultingType().equals(SequenceType.BOOLEAN)) { + return NativeClauseContext.NoNativeQuery; + } + if (!rightResult.getResultingType().equals(SequenceType.BOOLEAN)) { return NativeClauseContext.NoNativeQuery; } diff --git a/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java index 6b690694d..5792f9f68 100644 --- a/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java @@ -58,6 +58,9 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (childResult == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } + if (!childResult.getResultingType().equals(SequenceType.BOOLEAN)) { + return NativeClauseContext.NoNativeQuery; + } String resultingQuery = "( NOT " + childResult.getResultingQuery() + " )"; return new NativeClauseContext(nativeClauseContext, resultingQuery, SequenceType.BOOLEAN); diff --git a/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java index 1bfe80ba1..5f20ae5ee 100644 --- a/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java @@ -62,7 +62,16 @@ public Item materializeFirstItemOrNull(DynamicContext dynamicContext) { public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseContext) { NativeClauseContext leftResult = this.leftIterator.generateNativeQuery(nativeClauseContext); NativeClauseContext rightResult = this.rightIterator.generateNativeQuery(nativeClauseContext); - if (leftResult == NativeClauseContext.NoNativeQuery || rightResult == NativeClauseContext.NoNativeQuery) { + if (leftResult == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } + if (rightResult == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } + if (!leftResult.getResultingType().equals(SequenceType.BOOLEAN)) { + return NativeClauseContext.NoNativeQuery; + } + if (!rightResult.getResultingType().equals(SequenceType.BOOLEAN)) { return NativeClauseContext.NoNativeQuery; } From 5aefbe33df63a6540a66651a64a8a89d0306ca39 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 25 Apr 2023 14:29:39 +0200 Subject: [PATCH 042/136] Fix nested native queries. --- .../runtime/flwor/NativeClauseContext.java | 15 ++++++ .../navigation/ArrayLookupIterator.java | 5 +- .../navigation/ArrayUnboxingIterator.java | 53 +++++++++---------- .../navigation/ObjectLookupIterator.java | 3 -- .../java/org/rumbledb/types/TypeMappings.java | 4 +- .../runtime-native-flwor/group-by/GroupBy7.jq | 3 +- .../runtime-native-flwor/group-by/GroupBy8.jq | 3 +- 7 files changed, 49 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/NativeClauseContext.java b/src/main/java/org/rumbledb/runtime/flwor/NativeClauseContext.java index 5f1ba059b..1fa4e36a7 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/NativeClauseContext.java +++ b/src/main/java/org/rumbledb/runtime/flwor/NativeClauseContext.java @@ -87,4 +87,19 @@ public SequenceType getResultingType() { public void setResultingType(SequenceType resultingType) { this.resultingType = resultingType; } + + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("Native clause context.\n"); + sb.append("Query: " + this.resultingQuery + "\n"); + sb.append("Clause type: " + this.clauseType + "\n"); + sb.append("Schema: " + this.schema.toString() + "\n"); + sb.append("Context: " + this.context.toString() + "\n"); + sb.append("Resulting type: " + this.resultingType + "\n"); + sb.append("Lateral views:\n"); + for (String s : this.lateralViewPart) { + sb.append(s + "\n"); + } + return sb.toString(); + } } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java index ae0f496a6..c4e0d6aa7 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java @@ -38,7 +38,6 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; -import org.rumbledb.types.SequenceType.Arity; import sparksoniq.spark.SparkSessionManager; @@ -167,9 +166,6 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC // if (SequenceType.Arity.OneOrMore.isSubtypeOf(newContext.getResultingType().getArity())) { // return NativeClauseContext.NoNativeQuery; // } - if (!newContext.getResultingType().getArity().equals(Arity.One)) { - return NativeClauseContext.NoNativeQuery; - } // check if the key has variable dependencies inside the FLWOR expression // in that case we switch over to UDF Map keyDependencies = this.children.get(1) @@ -204,6 +200,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC SequenceType.Arity.OneOrZero ) ); + newContext.setSchema(((ArrayType) newContext.getSchema()).elementType()); newContext.setResultingQuery(newContext.getResultingQuery() + "[" + (this.lookup - 1) + "]"); } return newContext; diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java index 27450df62..f9dc9e1c6 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java @@ -22,6 +22,7 @@ import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; +import org.apache.spark.sql.types.ArrayType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.exceptions.ExceptionMetadata; @@ -36,7 +37,6 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.ItemType; import org.rumbledb.types.SequenceType; -import org.rumbledb.types.SequenceType.Arity; import sparksoniq.spark.SparkSessionManager; @@ -135,34 +135,33 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC return NativeClauseContext.NoNativeQuery; } NativeClauseContext newContext = this.iterator.generateNativeQuery(nativeClauseContext); - if (newContext != NativeClauseContext.NoNativeQuery) { - if (!newContext.getResultingType().getArity().equals(Arity.One)) { - return NativeClauseContext.NoNativeQuery; - } - ItemType newContextType = newContext.getResultingType().getItemType(); - if (!newContextType.isArrayItemType()) { - // let control to UDF when what we are unboxing is not an array - return NativeClauseContext.NoNativeQuery; - } - newContext.setResultingType( - new SequenceType( - newContextType.getArrayContentFacet(), - SequenceType.Arity.ZeroOrMore - ) + if (newContext == NativeClauseContext.NoNativeQuery) { + return NativeClauseContext.NoNativeQuery; + } + ItemType newContextType = newContext.getResultingType().getItemType(); + if (!newContextType.isArrayItemType()) { + // let control to UDF when what we are unboxing is not an array + return NativeClauseContext.NoNativeQuery; + } + newContext.setResultingType( + new SequenceType( + newContextType.getArrayContentFacet(), + SequenceType.Arity.ZeroOrMore + ) + ); + + List lateralViewPart = newContext.getLateralViewPart(); + if (lateralViewPart.size() == 0) { + lateralViewPart.add("explode(" + newContext.getResultingQuery() + ")"); + } else { + // if we have multiple array unboxing we stack multiple lateral views and each one takes from the + // previous + lateralViewPart.add( + "explode( arr" + lateralViewPart.size() + ".col" + newContext.getResultingQuery() + ")" ); - - List lateralViewPart = newContext.getLateralViewPart(); - if (lateralViewPart.size() == 0) { - lateralViewPart.add("explode(" + newContext.getResultingQuery() + ")"); - } else { - // if we have multiple array unboxing we stack multiple lateral views and each one takes from the - // previous - lateralViewPart.add( - "explode( arr" + lateralViewPart.size() + ".col" + newContext.getResultingQuery() + ")" - ); - } - newContext.setResultingQuery(""); // dealt by for clause } + newContext.setSchema(((ArrayType) newContext.getSchema()).elementType()); + newContext.setResultingQuery(""); // dealt by for clause return newContext; } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index 696ad9cec..d15afd998 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -270,9 +270,6 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC if (newContext == NativeClauseContext.NoNativeQuery) { return NativeClauseContext.NoNativeQuery; } - if (!newContext.getResultingType().getArity().equals(Arity.One)) { - return NativeClauseContext.NoNativeQuery; - } leftSchema = newContext.getSchema(); } diff --git a/src/main/java/org/rumbledb/types/TypeMappings.java b/src/main/java/org/rumbledb/types/TypeMappings.java index f637cc18d..e37bb117a 100644 --- a/src/main/java/org/rumbledb/types/TypeMappings.java +++ b/src/main/java/org/rumbledb/types/TypeMappings.java @@ -112,7 +112,9 @@ public static ItemType getItemTypeFromDataFrameDataType(DataType dataType) { return BuiltinTypesCatalogue.objectItem; } if (dataType instanceof ArrayType) { - return BuiltinTypesCatalogue.arrayItem; + ArrayType arrayType = (ArrayType) dataType; + ItemType itemType = getItemTypeFromDataFrameDataType(arrayType.elementType()); + return new ArrayItemType(null, BuiltinTypesCatalogue.arrayItem, itemType, null, null, null); } if (dataType instanceof StructType) { return BuiltinTypesCatalogue.objectItem; diff --git a/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy7.jq b/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy7.jq index 227971f92..450a7ec4b 100644 --- a/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy7.jq +++ b/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy7.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="({ "k" : 2, "c" : [ { "key" : 2, "foo" : { "bar" : [ 0, 1, 2 ] } }, { "key" : 2, "foo" : { "bar" : [ 3, 4, 5 ] } }, { "key" : 2, "foo" : { "bar" : [ 6, 7, 8 ] } } ], "d" : [ 2, 2, 2 ], "e" : [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ], "f" : [ [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ] ] }, { "k" : 1, "c" : [ { "key" : 1, "foo" : { "bar" : [ -1, 0, 1 ] } }, { "key" : 1, "foo" : { "bar" : [ 2, 3, 4 ] } }, { "key" : 1, "foo" : { "bar" : [ 5, 6, 7 ] } }, { "key" : 1, "foo" : { "bar" : [ 8, 9, 10 ] } } ], "d" : [ 1, 1, 1, 1 ], "e" : [ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], "f" : [ [ -1, 0, 1 ], [ 2, 3, 4 ], [ 5, 6, 7 ], [ 8, 9, 10 ] ] }, { "k" : 0, "c" : [ { "key" : 0, "foo" : { "bar" : [ 1, 2, 3 ] } }, { "key" : 0, "foo" : { "bar" : [ 4, 5, 6 ] } }, { "key" : 0, "foo" : { "bar" : [ 7, 8, 9 ] } } ], "d" : [ 0, 0, 0 ], "e" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "f" : [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] })" :) +(:JIQS: ShouldRun; Output="({ "k" : 0, "c" : [ { "key" : 0, "foo" : { "bar" : [ 1, 2, 3 ] } }, { "key" : 0, "foo" : { "bar" : [ 4, 5, 6 ] } }, { "key" : 0, "foo" : { "bar" : [ 7, 8, 9 ] } } ], "d" : [ 0, 0, 0 ], "e" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "f" : [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] }, { "k" : 1, "c" : [ { "key" : 1, "foo" : { "bar" : [ -1, 0, 1 ] } }, { "key" : 1, "foo" : { "bar" : [ 2, 3, 4 ] } }, { "key" : 1, "foo" : { "bar" : [ 5, 6, 7 ] } }, { "key" : 1, "foo" : { "bar" : [ 8, 9, 10 ] } } ], "d" : [ 1, 1, 1, 1 ], "e" : [ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], "f" : [ [ -1, 0, 1 ], [ 2, 3, 4 ], [ 5, 6, 7 ], [ 8, 9, 10 ] ] }, { "k" : 2, "c" : [ { "key" : 2, "foo" : { "bar" : [ 0, 1, 2 ] } }, { "key" : 2, "foo" : { "bar" : [ 3, 4, 5 ] } }, { "key" : 2, "foo" : { "bar" : [ 6, 7, 8 ] } } ], "d" : [ 2, 2, 2 ], "e" : [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ], "f" : [ [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ] ] })" :) for $i in annotate( for $j in 1 to 10 return {"key" : $j mod 3, "foo":{"bar":[ $j - 2 to $j ]}}, {"key" : "integer", "foo":{"bar":["integer"]}} @@ -7,4 +7,5 @@ let $j := $i.key let $l := $i.foo.bar[] let $m := $i.foo.bar group by $k := ($i.key || "") cast as integer +order by $k return { "k": $k, "c" : [ $i ], "d" : [ $j ], "e" : [ $l ], "f" : [ $m ] } diff --git a/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy8.jq b/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy8.jq index cb5ae31b6..7581fcc8a 100644 --- a/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy8.jq +++ b/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy8.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="({ "k" : 2, "c" : [ { "key" : 2, "foo" : { "bar" : [ 0, 1, 2 ] } }, { "key" : 2, "foo" : { "bar" : [ 3, 4, 5 ] } }, { "key" : 2, "foo" : { "bar" : [ 6, 7, 8 ] } } ], "d" : [ 2, 2, 2 ], "e" : [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ], "f" : [ [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ] ] }, { "k" : 1, "c" : [ { "key" : 1, "foo" : { "bar" : [ -1, 0, 1 ] } }, { "key" : 1, "foo" : { "bar" : [ 2, 3, 4 ] } }, { "key" : 1, "foo" : { "bar" : [ 5, 6, 7 ] } }, { "key" : 1, "foo" : { "bar" : [ 8, 9, 10 ] } } ], "d" : [ 1, 1, 1, 1 ], "e" : [ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], "f" : [ [ -1, 0, 1 ], [ 2, 3, 4 ], [ 5, 6, 7 ], [ 8, 9, 10 ] ] }, { "k" : 0, "c" : [ { "key" : 0, "foo" : { "bar" : [ 1, 2, 3 ] } }, { "key" : 0, "foo" : { "bar" : [ 4, 5, 6 ] } }, { "key" : 0, "foo" : { "bar" : [ 7, 8, 9 ] } } ], "d" : [ 0, 0, 0 ], "e" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "f" : [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] })" :) +(:JIQS: ShouldRun; Output="({ "k" : 0, "c" : [ { "key" : 0, "foo" : { "bar" : [ 1, 2, 3 ] } }, { "key" : 0, "foo" : { "bar" : [ 4, 5, 6 ] } }, { "key" : 0, "foo" : { "bar" : [ 7, 8, 9 ] } } ], "d" : [ 0, 0, 0 ], "e" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9 ], "f" : [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] }, { "k" : 1, "c" : [ { "key" : 1, "foo" : { "bar" : [ -1, 0, 1 ] } }, { "key" : 1, "foo" : { "bar" : [ 2, 3, 4 ] } }, { "key" : 1, "foo" : { "bar" : [ 5, 6, 7 ] } }, { "key" : 1, "foo" : { "bar" : [ 8, 9, 10 ] } } ], "d" : [ 1, 1, 1, 1 ], "e" : [ -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ], "f" : [ [ -1, 0, 1 ], [ 2, 3, 4 ], [ 5, 6, 7 ], [ 8, 9, 10 ] ] }, { "k" : 2, "c" : [ { "key" : 2, "foo" : { "bar" : [ 0, 1, 2 ] } }, { "key" : 2, "foo" : { "bar" : [ 3, 4, 5 ] } }, { "key" : 2, "foo" : { "bar" : [ 6, 7, 8 ] } } ], "d" : [ 2, 2, 2 ], "e" : [ 0, 1, 2, 3, 4, 5, 6, 7, 8 ], "f" : [ [ 0, 1, 2 ], [ 3, 4, 5 ], [ 6, 7, 8 ] ] })" :) for $i in annotate( for $j in 1 to 10 return {"key" : $j mod 3, "foo":{"bar":[ $j - 2 to $j ]}}, {"key" : "integer", "foo":{"bar":["integer"]}} @@ -7,4 +7,5 @@ let $j := $i.key let $l := $i.foo.bar[] let $m := $i.foo.bar group by $k := $i.key +order by $k return { "k": $k, "c" : [ $i ], "d" : [ $j ], "e" : [ $l ], "f" : [ $m ] } From bc1f48232acc3019e0bfb5358bf22f63f614cdf5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 27 Apr 2023 16:09:22 +0200 Subject: [PATCH 043/136] Add static context at runtime. --- .../compiler/RuntimeIteratorVisitor.java | 156 ++++++------------ .../config/RumbleRuntimeConfiguration.java | 15 ++ .../org/rumbledb/context/DynamicContext.java | 2 +- .../org/rumbledb/context/NamedFunctions.java | 54 ++++-- .../org/rumbledb/expressions/Expression.java | 15 ++ .../java/org/rumbledb/expressions/Node.java | 14 ++ .../rumbledb/expressions/flowr/Clause.java | 13 ++ .../AtMostOneItemLocalRuntimeIterator.java | 9 +- .../runtime/CommaExpressionIterator.java | 8 +- .../runtime/ConstantRDDRuntimeIterator.java | 7 +- .../runtime/ConstantRuntimeIterator.java | 8 +- .../runtime/DataFrameRuntimeIterator.java | 8 +- .../runtime/EmptySequenceIterator.java | 7 +- .../runtime/HybridRuntimeIterator.java | 10 +- .../runtime/LocalRuntimeIterator.java | 9 +- .../rumbledb/runtime/RDDRuntimeIterator.java | 8 +- .../org/rumbledb/runtime/RuntimeIterator.java | 44 +++-- .../runtime/RuntimeTupleIterator.java | 24 +-- .../AdditiveOperationIterator.java | 8 +- .../MultiplicativeOperationIterator.java | 7 +- .../arithmetics/UnaryOperationIterator.java | 8 +- .../AtMostOneItemIfRuntimeIterator.java | 8 +- .../runtime/control/IfRuntimeIterator.java | 8 +- .../control/SwitchRuntimeIterator.java | 8 +- .../control/TryCatchRuntimeIterator.java | 8 +- .../control/TypeswitchRuntimeIterator.java | 8 +- .../clauses/CountClauseSparkIterator.java | 10 +- .../flwor/clauses/ForClauseSparkIterator.java | 13 +- .../clauses/GroupByClauseSparkIterator.java | 10 +- .../clauses/JoinClauseSparkIterator.java | 41 +++-- .../flwor/clauses/LetClauseSparkIterator.java | 24 ++- .../clauses/OrderByClauseSparkIterator.java | 10 +- .../clauses/ReturnClauseSparkIterator.java | 18 +- .../clauses/WhereClauseSparkIterator.java | 12 +- .../SimpleMapExpressionIterator.java | 18 +- .../DynamicFunctionCallIterator.java | 8 +- .../functions/FunctionItemCallIterator.java | 24 ++- .../functions/FunctionRuntimeIterator.java | 8 +- .../NamedFunctionRefRuntimeIterator.java | 8 +- .../functions/NullFunctionIterator.java | 8 +- ...StaticUserDefinedFunctionCallIterator.java | 8 +- .../ArrayDescendantFunctionIterator.java | 8 +- .../arrays/ArrayFlattenFunctionIterator.java | 8 +- .../arrays/ArrayMembersFunctionIterator.java | 8 +- .../arrays/ArraySizeFunctionIterator.java | 8 +- .../base/LocalFunctionCallIterator.java | 8 +- .../booleans/BooleanFunctionIterator.java | 8 +- .../booleans/FalseFunctionIterator.java | 8 +- .../booleans/NotFunctionIterator.java | 8 +- .../booleans/TrueFunctionIterator.java | 8 +- .../context/LastFunctionIterator.java | 8 +- .../context/PositionFunctionIterator.java | 8 +- .../datetime/CurrentDateFunctionIterator.java | 8 +- .../CurrentDateTimeFunctionIterator.java | 8 +- .../datetime/CurrentTimeFunctionIterator.java | 8 +- .../datetime/DateTimeFunctionIterator.java | 7 +- .../datetime/FormatDateFunctionIterator.java | 8 +- .../FormatDateTimeFunctionIterator.java | 8 +- .../datetime/FormatTimeFunctionIterator.java | 8 +- .../components/AdjustDateTimeToTimezone.java | 8 +- .../components/AdjustDateToTimezone.java | 8 +- .../components/AdjustTimeToTimezone.java | 8 +- .../DayFromDateFunctionIterator.java | 8 +- .../DayFromDateTimeFunctionIterator.java | 8 +- .../HoursFromDateTimeFunctionIterator.java | 8 +- .../HoursFromTimeFunctionIterator.java | 8 +- .../MinutesFromDateTimeFunctionIterator.java | 8 +- .../MinutesFromTimeFunctionIterator.java | 8 +- .../MonthFromDateFunctionIterator.java | 8 +- .../MonthFromDateTimeFunctionIterator.java | 8 +- .../SecondsFromDateTimeFunctionIterator.java | 8 +- .../SecondsFromTimeFunctionIterator.java | 8 +- .../TimezoneFromDateFunctionIterator.java | 8 +- .../TimezoneFromDateTimeFunctionIterator.java | 8 +- .../TimezoneFromTimeFunctionIterator.java | 8 +- .../YearFromDateFunctionIterator.java | 8 +- .../YearFromDateTimeFunctionIterator.java | 8 +- .../DaysFromDurationFunctionIterator.java | 8 +- .../HoursFromDurationFunctionIterator.java | 8 +- .../components/ImplicitTimezoneIterator.java | 8 +- .../MinutesFromDurationFunctionIterator.java | 8 +- .../MonthsFromDurationFunctionIterator.java | 8 +- .../SecondsFromDurationFunctionIterator.java | 8 +- .../YearsFromDurationFunctionIterator.java | 8 +- .../input/AvroFileFunctionIterator.java | 8 +- .../input/CSVFileFunctionIterator.java | 8 +- .../input/JsonFileFunctionIterator.java | 8 +- .../input/LibSVMFileFunctionIterator.java | 8 +- .../input/ParallelizeFunctionIterator.java | 8 +- .../input/ParquetFileFunctionIterator.java | 8 +- .../input/RepartitionFunctionIterator.java | 8 +- .../input/RootFileFunctionIterator.java | 8 +- .../StructuredJsonFileFunctionIterator.java | 8 +- .../UnparsedTextLinesFunctionIterator.java | 8 +- .../io/CollectionFunctionIterator.java | 8 +- .../functions/io/JsonDocFunctionIterator.java | 8 +- .../io/LocalTextFileFunctionIterator.java | 8 +- .../io/ParseJsonFunctionIterator.java | 8 +- .../functions/io/TraceFunctionIterator.java | 8 +- .../io/UnparsedTextFunctionIterator.java | 8 +- .../functions/io/YamlDocFunctionIterator.java | 8 +- .../numerics/AbsFunctionIterator.java | 8 +- .../numerics/CeilingFunctionIterator.java | 8 +- .../numerics/FloorFunctionIterator.java | 8 +- .../numerics/NumberFunctionIterator.java | 8 +- .../numerics/PiFunctionIterator.java | 8 +- .../numerics/RoundFunctionIterator.java | 8 +- .../RoundHalfToEvenFunctionIterator.java | 8 +- .../exponential/Exp10FunctionIterator.java | 8 +- .../exponential/ExpFunctionIterator.java | 8 +- .../exponential/Log10FunctionIterator.java | 8 +- .../exponential/LogFunctionIterator.java | 8 +- .../exponential/PowFunctionIterator.java | 8 +- .../exponential/SqrtFunctionIterator.java | 8 +- .../trigonometric/ACosFunctionIterator.java | 8 +- .../trigonometric/ASinFunctionIterator.java | 8 +- .../trigonometric/ATan2FunctionIterator.java | 8 +- .../trigonometric/ATanFunctionIterator.java | 8 +- .../trigonometric/CosFunctionIterator.java | 8 +- .../trigonometric/CoshFunctionIterator.java | 8 +- .../trigonometric/SinFunctionIterator.java | 8 +- .../trigonometric/SinhFunctionIterator.java | 8 +- .../trigonometric/TanFunctionIterator.java | 8 +- .../ObjectAccumulateFunctionIterator.java | 8 +- .../ObjectDescendantFunctionIterator.java | 8 +- ...ObjectDescendantPairsFunctionIterator.java | 8 +- .../ObjectIntersectFunctionIterator.java | 8 +- .../object/ObjectKeysFunctionIterator.java | 8 +- .../object/ObjectProjectFunctionIterator.java | 8 +- .../ObjectRemoveKeysFunctionIterator.java | 8 +- .../object/ObjectValuesFunctionIterator.java | 8 +- .../aggregate/AvgFunctionIterator.java | 8 +- .../aggregate/CountFunctionIterator.java | 7 +- .../aggregate/MaxFunctionIterator.java | 7 +- .../aggregate/MinFunctionIterator.java | 7 +- .../aggregate/SumFunctionIterator.java | 7 +- .../CardinalityFunctionIterator.java | 8 +- .../cardinality/ExactlyOneIterator.java | 8 +- .../cardinality/OneOrMoreIterator.java | 8 +- .../cardinality/ZeroOrOneIterator.java | 8 +- .../general/EmptyFunctionIterator.java | 8 +- .../general/ExistsFunctionIterator.java | 8 +- .../general/HeadFunctionIterator.java | 8 +- .../general/InsertBeforeFunctionIterator.java | 8 +- .../general/RemoveFunctionIterator.java | 8 +- .../general/ReverseFunctionIterator.java | 8 +- .../general/SubsequenceFunctionIterator.java | 8 +- .../general/TailFunctionIterator.java | 8 +- .../general/UnorderedFunctionIterator.java | 8 +- .../value/DeepEqualFunctionIterator.java | 8 +- .../value/DistinctValuesFunctionIterator.java | 8 +- .../value/IndexOfFunctionIterator.java | 7 +- .../CodepointEqualFunctionIterator.java | 8 +- .../CodepointsToStringFunctionIterator.java | 8 +- .../strings/ConcatFunctionIterator.java | 8 +- .../strings/ContainsFunctionIterator.java | 8 +- .../DefaultCollationFunctionIterator.java | 8 +- .../strings/EncodeForURIFunctionIterator.java | 8 +- .../strings/EndsWithFunctionIterator.java | 8 +- .../strings/LowerCaseFunctionIterator.java | 8 +- .../strings/MatchesFunctionIterator.java | 8 +- .../NormalizeSpaceFunctionIterator.java | 8 +- .../NormalizeUnicodeFunctionIterator.java | 8 +- .../strings/ReplaceFunctionIterator.java | 8 +- .../strings/ResolveURIFunctionIterator.java | 8 +- .../strings/SerializeFunctionIterator.java | 8 +- .../strings/StartsWithFunctionIterator.java | 8 +- .../StaticBaseURIFunctionIterator.java | 8 +- .../strings/StringFunctionIterator.java | 8 +- .../strings/StringJoinFunctionIterator.java | 8 +- .../strings/StringLengthFunctionIterator.java | 8 +- .../StringToCodepointsFunctionIterator.java | 8 +- .../SubstringAfterFunctionIterator.java | 8 +- .../SubstringBeforeFunctionIterator.java | 8 +- .../strings/SubstringFunctionIterator.java | 8 +- .../strings/TokenizeFunctionIterator.java | 8 +- .../strings/TranslateFunctionIterator.java | 8 +- .../strings/UpperCaseFunctionIterator.java | 8 +- .../runtime/logics/AndOperationIterator.java | 8 +- .../runtime/logics/NotOperationIterator.java | 8 +- .../runtime/logics/OrOperationIterator.java | 8 +- .../runtime/misc/ComparisonIterator.java | 7 +- .../runtime/misc/RangeOperationIterator.java | 8 +- .../runtime/misc/StringConcatIterator.java | 8 +- .../navigation/ArrayLookupIterator.java | 7 +- .../navigation/ArrayUnboxingIterator.java | 8 +- .../navigation/ObjectLookupIterator.java | 7 +- .../runtime/navigation/PredicateIterator.java | 8 +- .../navigation/SequenceLookupIterator.java | 8 +- .../runtime/primary/ArrayRuntimeIterator.java | 8 +- .../primary/BooleanRuntimeIterator.java | 7 +- .../primary/ContextExpressionIterator.java | 7 +- .../primary/DecimalRuntimeIterator.java | 7 +- .../primary/DoubleRuntimeIterator.java | 7 +- .../primary/IntegerRuntimeIterator.java | 8 +- .../runtime/primary/NullRuntimeIterator.java | 7 +- .../ObjectConstructorRuntimeIterator.java | 13 +- .../primary/StringRuntimeIterator.java | 7 +- .../primary/VariableReferenceIterator.java | 15 +- .../AtMostOneItemTypePromotionIterator.java | 9 +- .../rumbledb/runtime/typing/CastIterator.java | 7 +- .../runtime/typing/CastableIterator.java | 7 +- .../runtime/typing/InstanceOfIterator.java | 8 +- .../runtime/typing/TreatIterator.java | 9 +- .../runtime/typing/TypePromotionIterator.java | 8 +- .../runtime/typing/ValidateTypeIterator.java | 9 +- .../java/org/rumbledb/types/SequenceType.java | 11 ++ .../spark/ml/AnnotateFunctionIterator.java | 8 +- .../ml/ApplyEstimatorRuntimeIterator.java | 16 +- .../ml/ApplyTransformerRuntimeIterator.java | 8 +- ...ClassificationMetricsFunctionIterator.java | 32 +++- .../ml/GetEstimatorFunctionIterator.java | 15 +- .../ml/GetTransformerFunctionIterator.java | 15 +- 213 files changed, 920 insertions(+), 1197 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 7670eb3d9..6cf674c4c 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -187,8 +187,7 @@ public RuntimeIterator visitCommaExpression(CommaExpression expression, RuntimeI } else { RuntimeIterator runtimeIterator = new CommaExpressionIterator( result, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -215,9 +214,7 @@ public RuntimeIterator visitFlowrExpression(FlworExpression expression, RuntimeI (expression.getReturnClause()).getReturnExpr(), argument ), - expression.getReturnClause().getHighestExecutionMode(this.visitorConfig), - expression.getReturnClause().getMetadata(), - expression.getStaticSequenceType() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -240,8 +237,7 @@ private RuntimeTupleIterator visitFlowrClause( forClause.getPositionalVariableName(), forClause.isAllowEmpty(), assignmentIterator, - forClause.getHighestExecutionMode(this.visitorConfig), - clause.getMetadata() + forClause.getStaticContextForRuntime(this.config, this.visitorConfig) ); } else if (clause instanceof LetClause) { LetClause letClause = (LetClause) clause; @@ -251,8 +247,7 @@ private RuntimeTupleIterator visitFlowrClause( letClause.getVariableName(), letClause.getActualSequenceType(), assignmentIterator, - letClause.getHighestExecutionMode(this.visitorConfig), - clause.getMetadata() + letClause.getStaticContextForRuntime(this.config, this.visitorConfig) ); } else if (clause instanceof GroupByClause) { List groupingExpressions = new ArrayList<>(); @@ -276,8 +271,7 @@ private RuntimeTupleIterator visitFlowrClause( return new GroupByClauseSparkIterator( previousIterator, groupingExpressions, - clause.getHighestExecutionMode(this.visitorConfig), - clause.getMetadata() + clause.getStaticContextForRuntime(this.config, this.visitorConfig) ); } else if (clause instanceof OrderByClause) { List expressionsWithIterator = new ArrayList<>(); @@ -303,22 +297,19 @@ private RuntimeTupleIterator visitFlowrClause( previousIterator, expressionsWithIterator, ((OrderByClause) clause).isStable(), - clause.getHighestExecutionMode(this.visitorConfig), - clause.getMetadata() + clause.getStaticContextForRuntime(this.config, this.visitorConfig) ); } else if (clause instanceof WhereClause) { return new WhereClauseSparkIterator( previousIterator, this.visit(((WhereClause) clause).getWhereExpression(), argument), - clause.getHighestExecutionMode(this.visitorConfig), - clause.getMetadata() + clause.getStaticContextForRuntime(this.config, this.visitorConfig) ); } else if (clause instanceof CountClause) { return new CountClauseSparkIterator( previousIterator, ((CountClause) clause).getCountVariableName(), - clause.getHighestExecutionMode(this.visitorConfig), - clause.getMetadata() + clause.getStaticContextForRuntime(this.config, this.visitorConfig) ); } throw new OurBadException("Clause unrecognized."); @@ -328,9 +319,7 @@ private RuntimeTupleIterator visitFlowrClause( public RuntimeIterator visitVariableReference(VariableReferenceExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new VariableReferenceIterator( expression.getVariableName(), - expression.getType(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -349,8 +338,7 @@ public RuntimeIterator visitFilterExpression(FilterExpression expression, Runtim RuntimeIterator runtimeIterator = new SequenceLookupIterator( mainIterator, n, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -361,8 +349,7 @@ public RuntimeIterator visitFilterExpression(FilterExpression expression, Runtim RuntimeIterator runtimeIterator = new PredicateIterator( mainIterator, filterIterator, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -375,8 +362,7 @@ public RuntimeIterator visitArrayLookupExpression(ArrayLookupExpression expressi RuntimeIterator runtimeIterator = new ArrayLookupIterator( mainIterator, lookupIterator, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -389,8 +375,7 @@ public RuntimeIterator visitObjectLookupExpression(ObjectLookupExpression expres RuntimeIterator runtimeIterator = new ObjectLookupIterator( mainIterator, lookupIterator, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -413,8 +398,7 @@ public RuntimeIterator visitDynamicFunctionCallExpression( RuntimeIterator runtimeIterator = new DynamicFunctionCallIterator( mainIterator, arguments, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -425,8 +409,7 @@ public RuntimeIterator visitArrayUnboxingExpression(ArrayUnboxingExpression expr RuntimeIterator mainIterator = this.visit(expression.getMainExpression(), argument); RuntimeIterator runtimeIterator = new ArrayUnboxingIterator( mainIterator, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -440,8 +423,7 @@ public RuntimeIterator visitArrayConstructor(ArrayConstructorExpression expressi } RuntimeIterator runtimeIterator = new ArrayRuntimeIterator( result, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -456,8 +438,7 @@ public RuntimeIterator visitObjectConstructor(ObjectConstructorExpression expres .stream() .map(arg -> this.visit(arg, argument)) .collect(Collectors.toList()), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -473,8 +454,7 @@ public RuntimeIterator visitObjectConstructor(ObjectConstructorExpression expres runtimeIterator = new ObjectConstructorRuntimeIterator( keys, values, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -484,8 +464,7 @@ public RuntimeIterator visitObjectConstructor(ObjectConstructorExpression expres @Override public RuntimeIterator visitContextExpr(ContextItemExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new ContextExpressionIterator( - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -504,8 +483,7 @@ public RuntimeIterator visitInlineFunctionExpr(InlineFunctionExpression expressi paramNameToSequenceTypes, returnType, bodyIterator, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -536,16 +514,15 @@ public RuntimeIterator visitFunctionCall(FunctionCallExpression expression, Runt // all builtin functions static-context-dependent. // This might be worth a more fine-grained adjustment later. expression.getStaticContext(), + this.config, expression.getHighestExecutionMode(this.visitorConfig), - this.config.isCheckReturnTypeOfBuiltinFunctions(), iteratorMetadata ); } else { runtimeIterator = new StaticUserDefinedFunctionCallIterator( identifier, arguments, - expression.getHighestExecutionMode(this.visitorConfig), - iteratorMetadata + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); } runtimeIterator.setStaticContext(expression.getStaticContext()); @@ -566,8 +543,7 @@ public RuntimeIterator visitNamedFunctionRef( } RuntimeIterator runtimeIterator = new NamedFunctionRefRuntimeIterator( identifier, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -579,8 +555,7 @@ public RuntimeIterator visitNamedFunctionRef( public RuntimeIterator visitInteger(IntegerLiteralExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new IntegerRuntimeIterator( expression.getLexicalValue(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -590,8 +565,7 @@ public RuntimeIterator visitInteger(IntegerLiteralExpression expression, Runtime public RuntimeIterator visitString(StringLiteralExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new StringRuntimeIterator( expression.getValue(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -601,8 +575,7 @@ public RuntimeIterator visitString(StringLiteralExpression expression, RuntimeIt public RuntimeIterator visitDouble(DoubleLiteralExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new DoubleRuntimeIterator( expression.getValue(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -612,8 +585,7 @@ public RuntimeIterator visitDouble(DoubleLiteralExpression expression, RuntimeIt public RuntimeIterator visitDecimal(DecimalLiteralExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new DecimalRuntimeIterator( expression.getValue(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -622,8 +594,7 @@ public RuntimeIterator visitDecimal(DecimalLiteralExpression expression, Runtime @Override public RuntimeIterator visitNull(NullLiteralExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new NullRuntimeIterator( - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -633,8 +604,7 @@ public RuntimeIterator visitNull(NullLiteralExpression expression, RuntimeIterat public RuntimeIterator visitBoolean(BooleanLiteralExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new BooleanRuntimeIterator( expression.getValue(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -659,8 +629,7 @@ public RuntimeIterator visitAdditiveExpr(AdditiveExpression expression, RuntimeI left, right, expression.isMinus(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -683,8 +652,7 @@ public RuntimeIterator visitMultiplicativeExpr(MultiplicativeExpression expressi left, right, expression.getMultiplicativeOperator(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -706,9 +674,7 @@ public RuntimeIterator visitSimpleMapExpr(SimpleMapExpression expression, Runtim RuntimeIterator runtimeIterator = new SimpleMapExpressionIterator( left, right, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getStaticSequenceType(), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -730,8 +696,7 @@ public RuntimeIterator visitAndExpr(AndExpression expression, RuntimeIterator ar RuntimeIterator runtimeIterator = new AndOperationIterator( left, right, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -753,8 +718,7 @@ public RuntimeIterator visitOrExpr(OrExpression expression, RuntimeIterator argu RuntimeIterator runtimeIterator = new OrOperationIterator( left, right, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -764,8 +728,7 @@ public RuntimeIterator visitOrExpr(OrExpression expression, RuntimeIterator argu public RuntimeIterator visitNotExpr(NotExpression expression, RuntimeIterator argument) { RuntimeIterator runtimeIterator = new NotOperationIterator( this.visit(expression.getMainExpression(), argument), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -777,8 +740,7 @@ public RuntimeIterator visitUnaryExpr(UnaryExpression expression, RuntimeIterato RuntimeIterator runtimeIterator = new UnaryOperationIterator( this.visit(expression.getMainExpression(), argument), expression.isNegated(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -791,8 +753,7 @@ public RuntimeIterator visitRangeExpr(RangeExpression expression, RuntimeIterato RuntimeIterator runtimeIterator = new RangeOperationIterator( left, right, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -806,8 +767,7 @@ public RuntimeIterator visitComparisonExpr(ComparisonExpression expression, Runt left, right, expression.getComparisonOperator(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -820,8 +780,7 @@ public RuntimeIterator visitStringConcatExpr(StringConcatExpression expression, RuntimeIterator runtimeIterator = new StringConcatIterator( left, right, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -833,8 +792,7 @@ public RuntimeIterator visitInstanceOfExpression(InstanceOfExpression expression RuntimeIterator runtimeIterator = new InstanceOfIterator( childExpression, expression.getSequenceType(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -847,17 +805,14 @@ public RuntimeIterator visitValidateTypeExpression(ValidateTypeExpression expres childExpression, expression.getSequenceType().getItemType(), expression.isValidate(), - expression.getHighestExecutionMode(this.visitorConfig), - this.config, - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); RuntimeIterator resultIterator = new TreatIterator( runtimeIterator, new SequenceType(BuiltinTypesCatalogue.item, expression.getSequenceType().getArity()), ErrorCode.InvalidInstance, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); resultIterator.setStaticContext(expression.getStaticContext()); return resultIterator; @@ -870,8 +825,7 @@ public RuntimeIterator visitTreatExpression(TreatExpression expression, RuntimeI childExpression, expression.getsequenceType(), expression.errorCodeThatShouldBeThrown(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -883,8 +837,7 @@ public RuntimeIterator visitCastableExpression(CastableExpression expression, Ru RuntimeIterator runtimeIterator = new CastableIterator( childExpression, expression.getSequenceType(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -896,8 +849,7 @@ public RuntimeIterator visitCastExpression(CastExpression expression, RuntimeIte RuntimeIterator runtimeIterator = new CastIterator( childExpression, expression.getSequenceType(), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -920,16 +872,14 @@ public RuntimeIterator visitConditionalExpression(ConditionalExpression expressi conditionIterator, thenIterator, elseIterator, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); } else { runtimeIterator = new IfRuntimeIterator( conditionIterator, thenIterator, elseIterator, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); } runtimeIterator.setStaticContext(expression.getStaticContext()); @@ -950,8 +900,7 @@ public RuntimeIterator visitSwitchExpression(SwitchExpression expression, Runtim this.visit(expression.getTestCondition(), argument), cases, this.visit(expression.getDefaultExpression(), argument), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -980,8 +929,7 @@ public RuntimeIterator visitTypeSwitchExpression(TypeSwitchExpression expression this.visit(expression.getTestCondition(), argument), cases, defaultCase, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; @@ -1001,16 +949,14 @@ public RuntimeIterator visitTryCatchExpression(TryCatchExpression expression, Ru this.visit(expression.getTryExpression(), argument), cases, null, - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); } else { return new TryCatchRuntimeIterator( this.visit(expression.getTryExpression(), argument), cases, this.visit(expression.getExpressionCatchingAll(), argument), - expression.getHighestExecutionMode(this.visitorConfig), - expression.getMetadata() + expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); } } diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java index d669d01e7..b338da2a8 100644 --- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java +++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java @@ -69,6 +69,7 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl private boolean datesWithTimeZone; private boolean optimizeGeneralComparisonToValueComparison; private boolean localExecutionOnly; + private boolean nativeExecution; private boolean thirdFeature; private Map shortcutMap; @@ -401,6 +402,12 @@ public void init() { this.localExecutionOnly = false; } + if (this.arguments.containsKey("native-execution")) { + this.nativeExecution = this.arguments.get("native-execution").equals("yes"); + } else { + this.nativeExecution = true; + } + if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) { this.optimizeGeneralComparisonToValueComparison = this.arguments.get( "optimize-general-comparison-to-value-comparison" @@ -599,6 +606,14 @@ public void setLocalExecutionOnly(boolean b) { this.localExecutionOnly = b; } + public boolean nativeExecution() { + return this.nativeExecution; + } + + public void setnativeExecution(boolean b) { + this.nativeExecution = b; + } + public boolean optimizeGeneralComparisonToValueComparison() { return this.optimizeGeneralComparisonToValueComparison; } diff --git a/src/main/java/org/rumbledb/context/DynamicContext.java b/src/main/java/org/rumbledb/context/DynamicContext.java index 236deef58..a7850a407 100644 --- a/src/main/java/org/rumbledb/context/DynamicContext.java +++ b/src/main/java/org/rumbledb/context/DynamicContext.java @@ -69,7 +69,7 @@ public DynamicContext(RumbleRuntimeConfiguration conf) { this.parent = null; this.variableValues = new VariableValues(); this.conf = conf; - this.namedFunctions = new NamedFunctions(); + this.namedFunctions = new NamedFunctions(conf); this.inScopeSchemaTypes = new InScopeSchemaTypes(); this.currentDateTime = new DateTime(); } diff --git a/src/main/java/org/rumbledb/context/NamedFunctions.java b/src/main/java/org/rumbledb/context/NamedFunctions.java index ce1916834..d4b0fae58 100644 --- a/src/main/java/org/rumbledb/context/NamedFunctions.java +++ b/src/main/java/org/rumbledb/context/NamedFunctions.java @@ -21,6 +21,7 @@ package org.rumbledb.context; import org.rumbledb.api.Item; +import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.exceptions.DuplicateFunctionIdentifierException; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; @@ -51,9 +52,11 @@ public class NamedFunctions implements Serializable, KryoSerializable { // two maps for User defined function are needed as execution mode is known at static analysis phase // but functions items are fully known at runtimeIterator generation private HashMap userDefinedFunctions; + private RumbleRuntimeConfiguration conf; - public NamedFunctions() { + public NamedFunctions(RumbleRuntimeConfiguration conf) { this.userDefinedFunctions = new HashMap<>(); + this.conf = conf; } public void clearUserDefinedFunctions() { @@ -69,6 +72,7 @@ public RuntimeIterator getUserDefinedFunctionCallIterator( if (checkUserDefinedFunctionExists(identifier)) { return buildUserDefinedFunctionCallIterator( getUserDefinedFunction(identifier), + this.conf, executionMode, metadata, arguments @@ -84,17 +88,25 @@ public RuntimeIterator getUserDefinedFunctionCallIterator( public static RuntimeIterator buildUserDefinedFunctionCallIterator( Item functionItem, + RumbleRuntimeConfiguration conf, ExecutionMode executionMode, ExceptionMetadata metadata, List arguments ) { + SequenceType sequenceType = functionItem.getSignature().getReturnType(); + SequenceType innerSequenceType = functionItem.getBodyIterator().getStaticType(); + RuntimeStaticContext staticContext = new RuntimeStaticContext(conf, sequenceType, executionMode, metadata); + RuntimeStaticContext innerStaticContext = new RuntimeStaticContext( + conf, + innerSequenceType, + executionMode, + metadata + ); FunctionItemCallIterator functionCallIterator = new FunctionItemCallIterator( functionItem, arguments, - executionMode, - metadata + innerStaticContext ); - SequenceType sequenceType = functionItem.getSignature().getReturnType(); if (sequenceType.equals(SequenceType.ITEM_STAR)) { return functionCallIterator; } @@ -111,8 +123,7 @@ public static RuntimeIterator buildUserDefinedFunctionCallIterator( ? "" : (functionItem.getIdentifier().getName()) + " ") + "function. ", - executionMode, - metadata + staticContext ); } else { return new TypePromotionIterator( @@ -123,11 +134,9 @@ public static RuntimeIterator buildUserDefinedFunctionCallIterator( ? "" : (functionItem.getIdentifier().getName()) + " ") + "function. ", - executionMode, - metadata + staticContext ); } - } public void addUserDefinedFunction(Item function, ExceptionMetadata meta) { @@ -157,10 +166,11 @@ public static RuntimeIterator getBuiltInFunctionIterator( FunctionIdentifier identifier, List arguments, StaticContext staticContext, + RumbleRuntimeConfiguration conf, ExecutionMode executionMode, - boolean checkReturnTypesOfBuiltinFunctions, ExceptionMetadata metadata ) { + boolean checkReturnTypesOfBuiltinFunctions = conf.isCheckReturnTypeOfBuiltinFunctions(); BuiltinFunction builtinFunction = BuiltinFunctionCatalogue.getBuiltinFunction(identifier); if (builtinFunction == null) { throw new UnknownFunctionCallException(identifier.getName(), identifier.getArity(), metadata); @@ -173,6 +183,12 @@ public static RuntimeIterator getBuiltInFunctionIterator( .equals(SequenceType.ITEM_STAR) ) { SequenceType sequenceType = builtinFunction.getSignature().getParameterTypes().get(i); + RuntimeStaticContext runtimeStaticContext = new RuntimeStaticContext( + conf, + sequenceType, + arguments.get(i).getHighestExecutionMode(), + arguments.get(i).getMetadata() + ); if ( sequenceType.isEmptySequence() || sequenceType.getArity().equals(Arity.One) @@ -182,8 +198,7 @@ public static RuntimeIterator getBuiltInFunctionIterator( arguments.get(i), sequenceType, "Invalid argument for function " + identifier.getName() + ". ", - arguments.get(i).getHighestExecutionMode(), - arguments.get(i).getMetadata() + runtimeStaticContext ); arguments.set(i, typePromotionIterator); @@ -192,8 +207,7 @@ public static RuntimeIterator getBuiltInFunctionIterator( arguments.get(i), sequenceType, "Invalid argument for function " + identifier.getName() + ". ", - arguments.get(i).getHighestExecutionMode(), - arguments.get(i).getMetadata() + runtimeStaticContext ); arguments.set(i, typePromotionIterator); @@ -226,6 +240,12 @@ public static RuntimeIterator getBuiltInFunctionIterator( } functionCallIterator.setStaticContext(staticContext); SequenceType sequenceType = builtinFunction.getSignature().getReturnType(); + RuntimeStaticContext runtimeStaticContext = new RuntimeStaticContext( + conf, + sequenceType, + functionCallIterator.getHighestExecutionMode(), + functionCallIterator.getMetadata() + ); if ( sequenceType.isEmptySequence() || sequenceType.getArity().equals(Arity.One) @@ -235,16 +255,14 @@ public static RuntimeIterator getBuiltInFunctionIterator( functionCallIterator, sequenceType, "Invalid return type for function " + identifier.getName() + ". ", - functionCallIterator.getHighestExecutionMode(), - functionCallIterator.getMetadata() + runtimeStaticContext ); } else { return new TypePromotionIterator( functionCallIterator, sequenceType, "Invalid return type for function " + identifier.getName() + ". ", - functionCallIterator.getHighestExecutionMode(), - functionCallIterator.getMetadata() + runtimeStaticContext ); } } diff --git a/src/main/java/org/rumbledb/expressions/Expression.java b/src/main/java/org/rumbledb/expressions/Expression.java index 3d866bbea..e0009d33c 100644 --- a/src/main/java/org/rumbledb/expressions/Expression.java +++ b/src/main/java/org/rumbledb/expressions/Expression.java @@ -21,6 +21,9 @@ package org.rumbledb.expressions; +import org.rumbledb.compiler.VisitorConfig; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.context.StaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.types.SequenceType; @@ -64,6 +67,18 @@ public void setStaticContext(StaticContext staticContext) { this.staticContext = staticContext; } + public RuntimeStaticContext getStaticContextForRuntime( + RumbleRuntimeConfiguration conf, + VisitorConfig visitorConfig + ) { + return new RuntimeStaticContext( + conf, + getStaticSequenceType(), + getHighestExecutionMode(visitorConfig), + getMetadata() + ); + } + /** * Provides the inferred static type, only if static analysis * is activated. diff --git a/src/main/java/org/rumbledb/expressions/Node.java b/src/main/java/org/rumbledb/expressions/Node.java index 1ebd4b5ab..e17eeeecb 100644 --- a/src/main/java/org/rumbledb/expressions/Node.java +++ b/src/main/java/org/rumbledb/expressions/Node.java @@ -101,6 +101,20 @@ public ExecutionMode getHighestExecutionMode(VisitorConfig visitorConfig) { return this.highestExecutionMode; } + /** + * Gets the highest execution mode of this node, which determines + * whether evaluation will be done locally, with RDDs or with DataFrames. + * + * This method is used during the static analysis. It is meant to be + * overridden by subclasses that support higher execution modes. By + * default, the highest execution mode is assumed to be local. + * + * @return the highest execution mode. + */ + public ExecutionMode getHighestExecutionMode() { + return this.highestExecutionMode; + } + public int numberOfUnsetExecutionModes() { int result = 0; for (Node n : this.getChildren()) { diff --git a/src/main/java/org/rumbledb/expressions/flowr/Clause.java b/src/main/java/org/rumbledb/expressions/flowr/Clause.java index 25f6319ac..58cfec4a1 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/Clause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/Clause.java @@ -21,6 +21,8 @@ package org.rumbledb.expressions.flowr; import org.rumbledb.compiler.VisitorConfig; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.context.StaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; @@ -181,4 +183,15 @@ public StaticContext getStaticContext() { public void setStaticContext(StaticContext staticContext) { this.staticContext = staticContext; } + + public RuntimeStaticContext getStaticContextForRuntime( + RumbleRuntimeConfiguration conf, + VisitorConfig visitorConfig + ) { + return new RuntimeStaticContext( + conf, + getHighestExecutionMode(visitorConfig), + getMetadata() + ); + } } diff --git a/src/main/java/org/rumbledb/runtime/AtMostOneItemLocalRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/AtMostOneItemLocalRuntimeIterator.java index e2332bc28..0cb26058c 100644 --- a/src/main/java/org/rumbledb/runtime/AtMostOneItemLocalRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/AtMostOneItemLocalRuntimeIterator.java @@ -22,7 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidArgumentTypeException; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.MoreThanOneItemException; @@ -44,11 +44,10 @@ public abstract class AtMostOneItemLocalRuntimeIterator extends RuntimeIterator protected AtMostOneItemLocalRuntimeIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); - if (executionMode != ExecutionMode.LOCAL) { + super(children, staticContext); + if (getHighestExecutionMode() != ExecutionMode.LOCAL) { throw new OurBadException("At-most-one-item runtime iterators support only the local execution mode"); } } diff --git a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java index b6b4ae8f2..bfbf567e8 100644 --- a/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/CommaExpressionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.JavaSparkContext; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import sparksoniq.spark.SparkSessionManager; @@ -41,10 +40,9 @@ public class CommaExpressionIterator extends HybridRuntimeIterator { public CommaExpressionIterator( List childIterators, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(childIterators, executionMode, iteratorMetadata); + super(childIterators, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/ConstantRDDRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/ConstantRDDRuntimeIterator.java index cf2f8ff78..eb7654215 100644 --- a/src/main/java/org/rumbledb/runtime/ConstantRDDRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/ConstantRDDRuntimeIterator.java @@ -23,8 +23,7 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; public class ConstantRDDRuntimeIterator extends HybridRuntimeIterator { @@ -33,9 +32,9 @@ public class ConstantRDDRuntimeIterator extends HybridRuntimeIterator { public ConstantRDDRuntimeIterator( JavaRDD items, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, ExecutionMode.RDD, iteratorMetadata); + super(null, staticContext); this.items = items; } diff --git a/src/main/java/org/rumbledb/runtime/ConstantRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/ConstantRuntimeIterator.java index 897f99167..8b14ff6e3 100644 --- a/src/main/java/org/rumbledb/runtime/ConstantRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/ConstantRuntimeIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; public class ConstantRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { @@ -32,10 +31,9 @@ public class ConstantRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { public ConstantRuntimeIterator( Item item, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.item = item; } diff --git a/src/main/java/org/rumbledb/runtime/DataFrameRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/DataFrameRuntimeIterator.java index fb05f3601..c5fca2f34 100644 --- a/src/main/java/org/rumbledb/runtime/DataFrameRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/DataFrameRuntimeIterator.java @@ -20,8 +20,7 @@ package org.rumbledb.runtime; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import java.util.List; @@ -31,10 +30,9 @@ public abstract class DataFrameRuntimeIterator extends RDDRuntimeIterator { protected DataFrameRuntimeIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); + super(children, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/EmptySequenceIterator.java b/src/main/java/org/rumbledb/runtime/EmptySequenceIterator.java index 3fb492500..c5165cf09 100644 --- a/src/main/java/org/rumbledb/runtime/EmptySequenceIterator.java +++ b/src/main/java/org/rumbledb/runtime/EmptySequenceIterator.java @@ -22,16 +22,15 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; public class EmptySequenceIterator extends AtMostOneItemLocalRuntimeIterator { private static final long serialVersionUID = 1L; - public EmptySequenceIterator(ExecutionMode executionMode, ExceptionMetadata iteratorMetadata) { - super(null, executionMode, iteratorMetadata); + public EmptySequenceIterator(RuntimeStaticContext staticContext) { + super(null, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java index d33dd9b0e..8b6869f1d 100644 --- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java @@ -24,6 +24,7 @@ import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.MoreThanOneItemException; @@ -44,11 +45,10 @@ public abstract class HybridRuntimeIterator extends RuntimeIterator { protected HybridRuntimeIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); - fallbackToRDDIfDFNotImplemented(executionMode); + super(children, staticContext); + fallbackToRDDIfDFNotImplemented(getHighestExecutionMode()); } protected boolean implementsDataFrames() { @@ -61,7 +61,7 @@ protected boolean implementsLocal() { protected void fallbackToRDDIfDFNotImplemented(ExecutionMode executionMode) { if (executionMode == ExecutionMode.DATAFRAME && !this.implementsDataFrames()) { - this.highestExecutionMode = ExecutionMode.RDD; + this.staticContext.setExecutionMode(ExecutionMode.RDD); } } diff --git a/src/main/java/org/rumbledb/runtime/LocalRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/LocalRuntimeIterator.java index 42d691845..cb5af7e55 100644 --- a/src/main/java/org/rumbledb/runtime/LocalRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/LocalRuntimeIterator.java @@ -20,7 +20,7 @@ package org.rumbledb.runtime; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.ExecutionMode; @@ -32,11 +32,10 @@ public abstract class LocalRuntimeIterator extends RuntimeIterator { protected LocalRuntimeIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); - if (executionMode != ExecutionMode.LOCAL) { + super(children, staticContext); + if (getHighestExecutionMode() != ExecutionMode.LOCAL) { throw new OurBadException("Local runtime iterators support only the local execution mode"); } } diff --git a/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java index 6fe382999..2b5fdaad3 100644 --- a/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java @@ -23,9 +23,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import java.util.List; @@ -35,10 +34,9 @@ public abstract class RDDRuntimeIterator extends HybridRuntimeIterator { protected RDDRuntimeIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); + super(children, staticContext); } protected JavaRDD getRDDAux(DynamicContext context) { diff --git a/src/main/java/org/rumbledb/runtime/RuntimeIterator.java b/src/main/java/org/rumbledb/runtime/RuntimeIterator.java index a6786464c..4975c079f 100644 --- a/src/main/java/org/rumbledb/runtime/RuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/RuntimeIterator.java @@ -35,8 +35,10 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; +import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.context.StaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.InvalidArgumentTypeException; @@ -51,6 +53,7 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; import com.esotericsoftware.kryo.Kryo; import com.esotericsoftware.kryo.KryoSerializable; @@ -65,16 +68,13 @@ public abstract class RuntimeIterator implements RuntimeIteratorInterface, KryoS protected transient boolean isOpen; protected List children; protected transient DynamicContext currentDynamicContextForLocalExecution; - private ExceptionMetadata metadata; + protected RuntimeStaticContext staticContext; protected URI staticURI; // private StaticContext staticContext; - protected ExecutionMode highestExecutionMode; - - protected RuntimeIterator(List children, ExecutionMode executionMode, ExceptionMetadata metadata) { - this.metadata = metadata; + protected RuntimeIterator(List children, RuntimeStaticContext staticContext) { + this.staticContext = staticContext; this.isOpen = false; - this.highestExecutionMode = executionMode; this.children = new ArrayList<>(); if (children != null && !children.isEmpty()) { this.children.addAll(children); @@ -238,32 +238,40 @@ public boolean isOpen() { } public ExceptionMetadata getMetadata() { - return this.metadata; + return this.staticContext.getMetadata(); } public ExecutionMode getHighestExecutionMode() { - return this.highestExecutionMode; + return this.staticContext.getExecutionMode(); + } + + public SequenceType getStaticType() { + return this.staticContext.getStaticType(); + } + + public RumbleRuntimeConfiguration getConfiguration() { + return this.staticContext.getConfiguration(); } public boolean isRDDOrDataFrame() { - if (this.highestExecutionMode == ExecutionMode.UNSET) { + if (this.staticContext.getExecutionMode() == ExecutionMode.UNSET) { throw new OurBadException("isRDDorDataFrame field in iterator without execution mode being set."); } - return this.highestExecutionMode.isRDDOrDataFrame(); + return this.staticContext.getExecutionMode().isRDDOrDataFrame(); } public boolean isRDD() { - if (this.highestExecutionMode == ExecutionMode.UNSET) { + if (this.staticContext.getExecutionMode() == ExecutionMode.UNSET) { throw new OurBadException("isRDD field in iterator without execution mode being set."); } - return this.highestExecutionMode.isRDD(); + return this.staticContext.getExecutionMode().isRDD(); } public boolean isLocal() { - if (this.highestExecutionMode == ExecutionMode.UNSET) { + if (this.staticContext.getExecutionMode() == ExecutionMode.UNSET) { throw new OurBadException("isLocal field in iterator without execution mode being set."); } - return this.highestExecutionMode.isLocal(); + return this.staticContext.getExecutionMode().isLocal(); } public JavaRDD getRDD(DynamicContext context) { @@ -274,10 +282,10 @@ public JavaRDD getRDD(DynamicContext context) { } public boolean isDataFrame() { - if (this.highestExecutionMode == ExecutionMode.UNSET) { + if (this.staticContext.getExecutionMode() == ExecutionMode.UNSET) { throw new OurBadException("isDataFrame accessed in iterator without execution mode being set."); } - return this.highestExecutionMode.isDataFrame(); + return this.staticContext.getExecutionMode().isDataFrame(); } public JSoundDataFrame getDataFrame(DynamicContext context) { @@ -390,7 +398,7 @@ public void print(StringBuffer buffer, int indent) { } buffer.append(getClass().getSimpleName()); buffer.append(" | "); - buffer.append(this.highestExecutionMode); + buffer.append(this.staticContext.getExecutionMode()); buffer.append(" | "); buffer.append("Variable dependencies: "); @@ -460,7 +468,7 @@ public boolean isSparkJobNeeded() { return true; } } - switch (this.highestExecutionMode) { + switch (this.staticContext.getExecutionMode()) { case DATAFRAME: return true; case LOCAL: diff --git a/src/main/java/org/rumbledb/runtime/RuntimeTupleIterator.java b/src/main/java/org/rumbledb/runtime/RuntimeTupleIterator.java index a0c2a8dd5..50dbc8010 100644 --- a/src/main/java/org/rumbledb/runtime/RuntimeTupleIterator.java +++ b/src/main/java/org/rumbledb/runtime/RuntimeTupleIterator.java @@ -24,8 +24,11 @@ import com.esotericsoftware.kryo.KryoSerializable; import com.esotericsoftware.kryo.io.Input; import com.esotericsoftware.kryo.io.Output; + +import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.OurBadException; @@ -46,9 +49,8 @@ public abstract class RuntimeTupleIterator implements RuntimeTupleIteratorInterf private static final long serialVersionUID = 1L; protected static final String FLOW_EXCEPTION_MESSAGE = "Invalid next() call; "; - private final ExceptionMetadata metadata; + private final RuntimeStaticContext staticContext; protected RuntimeTupleIterator child; - protected ExecutionMode highestExecutionMode; protected int evaluationDepthLimit; protected transient DynamicContext currentDynamicContext; @@ -59,12 +61,10 @@ public abstract class RuntimeTupleIterator implements RuntimeTupleIteratorInterf protected RuntimeTupleIterator( RuntimeTupleIterator child, - ExecutionMode executionMode, - ExceptionMetadata metadata + RuntimeStaticContext staticContext ) { - this.metadata = metadata; + this.staticContext = staticContext; this.isOpen = false; - this.highestExecutionMode = executionMode; this.child = child; this.evaluationDepthLimit = -1; } @@ -123,18 +123,22 @@ public boolean hasNext() { public abstract FlworTuple next(); public ExceptionMetadata getMetadata() { - return this.metadata; + return this.staticContext.getMetadata(); } public ExecutionMode getHighestExecutionMode() { - return this.highestExecutionMode; + return this.staticContext.getExecutionMode(); + } + + public RumbleRuntimeConfiguration getConfiguration() { + return this.staticContext.getConfiguration(); } public boolean isDataFrame() { - if (this.highestExecutionMode == ExecutionMode.UNSET) { + if (this.staticContext.getExecutionMode() == ExecutionMode.UNSET) { throw new OurBadException("isDataFrame accessed in iterator without execution mode being set."); } - return this.highestExecutionMode.isDataFrame(); + return this.staticContext.getExecutionMode().isDataFrame(); } /** diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java index ef2217ecb..910ce3bc8 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/AdditiveOperationIterator.java @@ -29,11 +29,10 @@ import org.joda.time.PeriodType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.NonAtomicKeyException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -58,10 +57,9 @@ public AdditiveOperationIterator( RuntimeIterator leftIterator, RuntimeIterator rightIterator, boolean isMinus, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(leftIterator, rightIterator), executionMode, iteratorMetadata); + super(Arrays.asList(leftIterator, rightIterator), staticContext); this.leftIterator = leftIterator; this.rightIterator = rightIterator; this.isMinus = isMinus; diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java index f912d2c3e..2d99afdc8 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/MultiplicativeOperationIterator.java @@ -30,8 +30,8 @@ import org.joda.time.PeriodType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.*; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.arithmetic.MultiplicativeExpression; import org.rumbledb.expressions.arithmetic.MultiplicativeExpression.MultiplicativeOperator; import org.rumbledb.items.ItemFactory; @@ -59,10 +59,9 @@ public MultiplicativeOperationIterator( RuntimeIterator leftIterator, RuntimeIterator rightIterator, MultiplicativeExpression.MultiplicativeOperator multiplicativeOperator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(leftIterator, rightIterator), executionMode, iteratorMetadata); + super(Arrays.asList(leftIterator, rightIterator), staticContext); this.leftIterator = leftIterator; this.rightIterator = rightIterator; this.multiplicativeOperator = multiplicativeOperator; diff --git a/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java b/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java index 93b3dcdfd..dc1c3f571 100644 --- a/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/arithmetics/UnaryOperationIterator.java @@ -22,10 +22,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -47,10 +46,9 @@ public class UnaryOperationIterator extends AtMostOneItemLocalRuntimeIterator { public UnaryOperationIterator( RuntimeIterator child, boolean negated, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(child), executionMode, iteratorMetadata); + super(Collections.singletonList(child), staticContext); this.child = child; this.negated = negated; this.item = null; diff --git a/src/main/java/org/rumbledb/runtime/control/AtMostOneItemIfRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/control/AtMostOneItemIfRuntimeIterator.java index 57e985c14..ccbb99b22 100644 --- a/src/main/java/org/rumbledb/runtime/control/AtMostOneItemIfRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/control/AtMostOneItemIfRuntimeIterator.java @@ -24,8 +24,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; @@ -40,10 +39,9 @@ public AtMostOneItemIfRuntimeIterator( RuntimeIterator condition, RuntimeIterator branch, RuntimeIterator elseBranch, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(condition, branch, elseBranch), executionMode, iteratorMetadata); + super(Arrays.asList(condition, branch, elseBranch), staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/control/IfRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/control/IfRuntimeIterator.java index 852ff162f..f111d0297 100644 --- a/src/main/java/org/rumbledb/runtime/control/IfRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/control/IfRuntimeIterator.java @@ -23,9 +23,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -40,10 +39,9 @@ public IfRuntimeIterator( RuntimeIterator condition, RuntimeIterator branch, RuntimeIterator elseBranch, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.children.add(condition); this.children.add(branch); this.children.add(elseBranch); diff --git a/src/main/java/org/rumbledb/runtime/control/SwitchRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/control/SwitchRuntimeIterator.java index 9a50b62ec..b1b74b493 100644 --- a/src/main/java/org/rumbledb/runtime/control/SwitchRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/control/SwitchRuntimeIterator.java @@ -23,10 +23,9 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.NonAtomicKeyException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.comparison.ComparisonExpression.ComparisonOperator; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -48,10 +47,9 @@ public SwitchRuntimeIterator( RuntimeIterator test, Map cases, RuntimeIterator defaultReturn, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.children.add(test); this.children.addAll(cases.keySet()); this.children.addAll(cases.values()); diff --git a/src/main/java/org/rumbledb/runtime/control/TryCatchRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/control/TryCatchRuntimeIterator.java index 99b1029cf..98ce9a4fa 100644 --- a/src/main/java/org/rumbledb/runtime/control/TryCatchRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/control/TryCatchRuntimeIterator.java @@ -20,10 +20,8 @@ package org.rumbledb.runtime.control; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.RumbleException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.LocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -33,6 +31,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; public class TryCatchRuntimeIterator extends LocalRuntimeIterator { @@ -50,10 +49,9 @@ public TryCatchRuntimeIterator( RuntimeIterator tryExpression, Map catchExpressions, RuntimeIterator catchAllExpression, - ExecutionMode mode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, mode, iteratorMetadata); + super(null, staticContext); this.children.add(tryExpression); for (RuntimeIterator value : catchExpressions.values()) this.children.add(value); diff --git a/src/main/java/org/rumbledb/runtime/control/TypeswitchRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/control/TypeswitchRuntimeIterator.java index 9a3aa848d..ce63cefe6 100644 --- a/src/main/java/org/rumbledb/runtime/control/TypeswitchRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/control/TypeswitchRuntimeIterator.java @@ -3,9 +3,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.typing.InstanceOfIterator; @@ -28,10 +27,9 @@ public TypeswitchRuntimeIterator( RuntimeIterator test, List cases, TypeswitchRuntimeIteratorCase defaultCase, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.children.add(test); for (TypeswitchRuntimeIteratorCase typeSwitchCase : cases) { this.children.add(typeSwitchCase.getReturnIterator()); diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/CountClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/CountClauseSparkIterator.java index 3e38bf8d9..2eb790a95 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/CountClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/CountClauseSparkIterator.java @@ -27,10 +27,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeTupleIterator; @@ -59,10 +58,9 @@ public class CountClauseSparkIterator extends RuntimeTupleIterator { public CountClauseSparkIterator( RuntimeTupleIterator child, Name variableName, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(child, executionMode, iteratorMetadata); + super(child, staticContext); this.variableName = variableName; this.currentCountIndex = 1; // indices start at 1 in JSONiq } @@ -242,7 +240,7 @@ public boolean isSparkJobNeeded() { if (this.child.isSparkJobNeeded()) { return true; } - switch (this.highestExecutionMode) { + switch (getHighestExecutionMode()) { case DATAFRAME: return true; case LOCAL: diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java index 9b685457a..4c4011abd 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java @@ -33,11 +33,10 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.DynamicContext.VariableDependency; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; import org.rumbledb.exceptions.UnsupportedFeatureException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; @@ -97,10 +96,9 @@ public ForClauseSparkIterator( Name positionalVariableName, boolean allowingEmpty, RuntimeIterator assignmentIterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(child, executionMode, iteratorMetadata); + super(child, staticContext); this.variableName = variableName; this.positionalVariableName = positionalVariableName; this.assignmentIterator = assignmentIterator; @@ -501,7 +499,8 @@ private FlworDataFrame getDataFrameFromJoin( predicateIterator, this.allowingEmpty, this.variableName, - getMetadata() + getMetadata(), + getConfiguration() ); } @@ -1370,7 +1369,7 @@ public boolean isSparkJobNeeded() { if (this.assignmentIterator.isSparkJobNeeded()) { return true; } - switch (this.highestExecutionMode) { + switch (getHighestExecutionMode()) { case DATAFRAME: return true; case LOCAL: diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java index 184795945..4537e3c34 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java @@ -30,13 +30,12 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidGroupVariableException; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; import org.rumbledb.exceptions.NonAtomicKeyException; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.RuntimeTupleIterator; @@ -71,10 +70,9 @@ public class GroupByClauseSparkIterator extends RuntimeTupleIterator { public GroupByClauseSparkIterator( RuntimeTupleIterator child, List groupingExpressions, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(child, executionMode, iteratorMetadata); + super(child, staticContext); this.groupingExpressions = groupingExpressions; this.dependencies = new TreeMap<>(); for (GroupByClauseSparkIteratorExpression e : this.groupingExpressions) { @@ -627,7 +625,7 @@ public boolean isSparkJobNeeded() { } } } - switch (this.highestExecutionMode) { + switch (getHighestExecutionMode()) { case DATAFRAME: return true; case LOCAL: diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/JoinClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/JoinClauseSparkIterator.java index cbb59396d..fb898ca12 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/JoinClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/JoinClauseSparkIterator.java @@ -25,9 +25,11 @@ import org.apache.spark.sql.Row; import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.StructType; +import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.DynamicContext.VariableDependency; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; @@ -43,6 +45,7 @@ import org.rumbledb.runtime.logics.AndOperationIterator; import org.rumbledb.runtime.misc.ComparisonIterator; import org.rumbledb.runtime.primary.ArrayRuntimeIterator; +import org.rumbledb.types.SequenceType; import sparksoniq.jsoniq.tuple.FlworTuple; import sparksoniq.spark.SparkSessionManager; @@ -82,10 +85,9 @@ public JoinClauseSparkIterator( RuntimeTupleIterator leftChild, RuntimeTupleIterator rightChild, boolean isLeftOuterJoin, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(leftChild, executionMode, iteratorMetadata); + super(leftChild, staticContext); this.isLeftOuterJoin = isLeftOuterJoin; this.dataFrameContext = new DataFrameContext(); } @@ -119,7 +121,8 @@ public static FlworDataFrame joinInputTupleWithSequenceOnPredicate( RuntimeIterator predicateIterator, boolean isLeftOuterJoin, Name newRightSideVariableName, // really needed? - ExceptionMetadata metadata + ExceptionMetadata metadata, + RumbleRuntimeConfiguration conf ) { FlworDataFrame result = tryNativeQueryStatically( context, @@ -204,11 +207,19 @@ public static FlworDataFrame joinInputTupleWithSequenceOnPredicate( rightHandSideEqualityCriterion = new ArrayRuntimeIterator( new CommaExpressionIterator( rightTupleSideEqualityCriteria, + new RuntimeStaticContext( + conf, + SequenceType.ITEM_STAR, + ExecutionMode.LOCAL, + metadata + ) + ), + new RuntimeStaticContext( + conf, + SequenceType.ITEM_STAR, ExecutionMode.LOCAL, metadata - ), - ExecutionMode.LOCAL, - metadata + ) ); } if (leftTupleSideEqualityCriteria.size() == 1) { @@ -217,11 +228,19 @@ public static FlworDataFrame joinInputTupleWithSequenceOnPredicate( leftHandSideEqualityCriterion = new ArrayRuntimeIterator( new CommaExpressionIterator( leftTupleSideEqualityCriteria, + new RuntimeStaticContext( + conf, + SequenceType.ITEM_STAR, + ExecutionMode.LOCAL, + metadata + ) + ), + new RuntimeStaticContext( + conf, + SequenceType.ITEM_STAR, ExecutionMode.LOCAL, metadata - ), - ExecutionMode.LOCAL, - metadata + ) ); } @@ -501,7 +520,7 @@ public boolean isSparkJobNeeded() { if (this.child.isSparkJobNeeded()) { return true; } - switch (this.highestExecutionMode) { + switch (getHighestExecutionMode()) { case DATAFRAME: return true; case LOCAL: diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java index 603f6d173..e527d48c7 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java @@ -29,8 +29,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.context.DynamicContext.VariableDependency; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; import org.rumbledb.exceptions.UnsupportedFeatureException; @@ -84,10 +84,9 @@ public LetClauseSparkIterator( Name variableName, SequenceType sequenceType, RuntimeIterator assignmentIterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(child, executionMode, iteratorMetadata); + super(child, staticContext); this.variableName = variableName; this.sequenceType = sequenceType; this.assignmentIterator = assignmentIterator; @@ -443,13 +442,20 @@ public FlworDataFrame getDataFrameAsJoin( RuntimeIterator filteringPredicateIterator = new PredicateIterator( new VariableReferenceIterator( this.variableName, + new RuntimeStaticContext( + getConfiguration(), + SequenceType.ITEM_STAR, + ExecutionMode.LOCAL, + getMetadata() + ) + ), + predicateIterator, + new RuntimeStaticContext( + getConfiguration(), SequenceType.ITEM_STAR, ExecutionMode.LOCAL, getMetadata() - ), - predicateIterator, - ExecutionMode.LOCAL, - getMetadata() + ) ); inputDF = LetClauseSparkIterator.bindLetVariableInDataFrame( inputDF, @@ -853,7 +859,7 @@ public boolean isSparkJobNeeded() { if (this.assignmentIterator.isSparkJobNeeded()) { return true; } - switch (this.highestExecutionMode) { + switch (getHighestExecutionMode()) { case DATAFRAME: return true; case LOCAL: diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index c738ec347..7547a0d2c 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -30,14 +30,13 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.NoTypedValueException; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.expressions.flowr.OrderByClauseSortingKey.EMPTY_ORDER; import org.rumbledb.runtime.RuntimeIterator; @@ -80,10 +79,9 @@ public OrderByClauseSparkIterator( RuntimeTupleIterator child, List expressionsWithIterator, boolean stable, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(child, executionMode, iteratorMetadata); + super(child, staticContext); this.expressionsWithIterator = expressionsWithIterator; this.dependencies = new TreeMap<>(); for (OrderByClauseAnnotatedChildIterator e : this.expressionsWithIterator) { @@ -613,7 +611,7 @@ public boolean isSparkJobNeeded() { return true; } } - switch (this.highestExecutionMode) { + switch (getHighestExecutionMode()) { case DATAFRAME: return true; case LOCAL: diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java index 3e45c13a3..b7f56d93c 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java @@ -29,11 +29,10 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.DynamicContext.VariableDependency; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -44,7 +43,6 @@ import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.runtime.flwor.closures.ReturnFlatMapClosure; import org.rumbledb.runtime.typing.ValidateTypeIterator; -import org.rumbledb.types.SequenceType; import sparksoniq.jsoniq.tuple.FlworTuple; import sparksoniq.spark.SparkSessionManager; @@ -67,19 +65,15 @@ public class ReturnClauseSparkIterator extends HybridRuntimeIterator { private DynamicContext tupleContext; // re-use same DynamicContext object for efficiency private RuntimeIterator expression; private Item nextResult; - private SequenceType sequenceType; public ReturnClauseSparkIterator( RuntimeTupleIterator child, RuntimeIterator expression, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata, - SequenceType sequenceType + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(expression), executionMode, iteratorMetadata); + super(Collections.singletonList(expression), staticContext); this.child = child; this.expression = expression; - this.sequenceType = sequenceType; setInputAndOutputTupleVariableDependencies(); } @@ -189,7 +183,7 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { context ); if (nativeQueryResult != null) { - if (this.sequenceType.getItemType().isObjectItemType()) { + if (getStaticType().getItemType().isObjectItemType()) { String input = FlworDataFrameUtils.createTempView(nativeQueryResult); nativeQueryResult = nativeQueryResult.sparkSession() @@ -203,13 +197,13 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { } JSoundDataFrame result = new JSoundDataFrame( nativeQueryResult, - this.sequenceType.getItemType() + getStaticType().getItemType() ); return result; } JavaRDD rdd = getRDDAux(context); - return ValidateTypeIterator.convertRDDToValidDataFrame(rdd, this.sequenceType.getItemType(), context, false); + return ValidateTypeIterator.convertRDDToValidDataFrame(rdd, getStaticType().getItemType(), context, false); } @Override diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/WhereClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/WhereClauseSparkIterator.java index 69cba9d60..3980a9833 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/WhereClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/WhereClauseSparkIterator.java @@ -26,7 +26,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.DynamicContext.VariableDependency; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; import org.rumbledb.exceptions.OurBadException; @@ -64,10 +64,9 @@ public class WhereClauseSparkIterator extends RuntimeTupleIterator { public WhereClauseSparkIterator( RuntimeTupleIterator child, RuntimeIterator whereExpression, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(child, executionMode, iteratorMetadata); + super(child, staticContext); this.expression = whereExpression; this.expression.getVariableDependencies(); } @@ -350,7 +349,8 @@ private FlworDataFrame getDataFrameIfJoinPossible(DynamicContext context) { this.expression, false, null, - getMetadata() + getMetadata(), + getConfiguration() ); return result; } catch (Exception e) { @@ -480,7 +480,7 @@ public boolean isSparkJobNeeded() { if (this.expression.isSparkJobNeeded()) { return true; } - switch (this.highestExecutionMode) { + switch (getHighestExecutionMode()) { case DATAFRAME: return true; case LOCAL: diff --git a/src/main/java/org/rumbledb/runtime/flwor/expression/SimpleMapExpressionIterator.java b/src/main/java/org/rumbledb/runtime/flwor/expression/SimpleMapExpressionIterator.java index b5f31d2b7..d7719b8f8 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/expression/SimpleMapExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/expression/SimpleMapExpressionIterator.java @@ -30,9 +30,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -40,7 +39,6 @@ import org.rumbledb.runtime.flwor.FlworDataFrameUtils; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.runtime.typing.ValidateTypeIterator; -import org.rumbledb.types.SequenceType; import sparksoniq.spark.SparkSessionManager; @@ -58,7 +56,6 @@ public class SimpleMapExpressionIterator extends HybridRuntimeIterator { private RuntimeIterator leftIterator; private RuntimeIterator rightIterator; private Item nextResult; - private SequenceType staticType; private DynamicContext mapDynamicContext; private Queue mapValues; @@ -66,15 +63,12 @@ public class SimpleMapExpressionIterator extends HybridRuntimeIterator { public SimpleMapExpressionIterator( RuntimeIterator sequence, RuntimeIterator mapExpression, - ExecutionMode executionMode, - SequenceType staticType, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(sequence, mapExpression), executionMode, iteratorMetadata); + super(Arrays.asList(sequence, mapExpression), staticContext); this.leftIterator = sequence; this.rightIterator = mapExpression; this.mapDynamicContext = null; - this.staticType = staticType; } @Override @@ -184,12 +178,12 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { if (nativeQuery == NativeClauseContext.NoNativeQuery) { JavaRDD rdd = getRDDAux(context); JavaRDD rowRDD = rdd.map(i -> RowFactory.create(i.castToDecimalValue())); - StructType schema = ValidateTypeIterator.convertToDataFrameSchema(this.staticType.getItemType()); + StructType schema = ValidateTypeIterator.convertToDataFrameSchema(getStaticType().getItemType()); schema.printTreeString(); Dataset result = SparkSessionManager.getInstance() .getOrCreateSession() .createDataFrame(rowRDD, schema); - return new JSoundDataFrame(result, this.staticType.getItemType()); + return new JSoundDataFrame(result, getStaticType().getItemType()); } LogManager.getLogger("SimpleMapExpressionIterator") .info("Rumble was able to optimize a simple map expression to a native SQL query."); @@ -205,7 +199,7 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { ) ); // execute query - return new JSoundDataFrame(result, this.staticType.getItemType()); + return new JSoundDataFrame(result, getStaticType().getItemType()); } diff --git a/src/main/java/org/rumbledb/runtime/functions/DynamicFunctionCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/DynamicFunctionCallIterator.java index 1fa5b6bae..90223668f 100644 --- a/src/main/java/org/rumbledb/runtime/functions/DynamicFunctionCallIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/DynamicFunctionCallIterator.java @@ -24,7 +24,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.NamedFunctions; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidRumbleMLParamException; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.MoreThanOneItemException; @@ -55,10 +55,9 @@ public class DynamicFunctionCallIterator extends HybridRuntimeIterator { public DynamicFunctionCallIterator( RuntimeIterator functionItemIterator, List functionArguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.isPartialApplication = false; for (RuntimeIterator arg : functionArguments) { if (arg != null) { @@ -152,6 +151,7 @@ private void setFunctionItemAndIteratorWithCurrentContext(DynamicContext context } this.functionCallIterator = NamedFunctions.buildUserDefinedFunctionCallIterator( this.functionItem, + getConfiguration(), this.isPartialApplication ? ExecutionMode.LOCAL : this.functionItem.getBodyIterator().getHighestExecutionMode(), diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java index 3816b736e..2949304cf 100644 --- a/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/FunctionItemCallIterator.java @@ -25,7 +25,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnexpectedTypeException; @@ -65,10 +65,9 @@ public class FunctionItemCallIterator extends HybridRuntimeIterator { public FunctionItemCallIterator( Item functionItem, List functionArguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); for (RuntimeIterator arg : functionArguments) { if (arg == null) { this.isPartialApplication = true; @@ -135,6 +134,12 @@ private void wrapArgumentIteratorsWithTypeCheckingIterators() { ) { executionMode = ExecutionMode.LOCAL; } + RuntimeStaticContext runtimeStaticContext = new RuntimeStaticContext( + getConfiguration(), + sequenceType, + executionMode, + this.functionArguments.get(i).getMetadata() + ); if ( sequenceType.isEmptySequence() || sequenceType.getArity().equals(Arity.One) @@ -144,8 +149,7 @@ private void wrapArgumentIteratorsWithTypeCheckingIterators() { this.functionArguments.get(i), sequenceType, "Invalid argument for " + this.functionItem.getIdentifier().getName() + " function. ", - executionMode, - getMetadata() + runtimeStaticContext ); this.functionArguments.set(i, typePromotionIterator); } else { @@ -153,8 +157,7 @@ private void wrapArgumentIteratorsWithTypeCheckingIterators() { this.functionArguments.get(i), sequenceType, "Invalid argument for " + this.functionItem.getIdentifier().getName() + " function. ", - executionMode, - getMetadata() + runtimeStaticContext ); this.functionArguments.set(i, typePromotionIterator); } @@ -237,7 +240,10 @@ private RuntimeIterator generatePartiallyAppliedFunction(DynamicContext context) RDDArgumentValues, DFArgumentValues ); - return new ConstantRuntimeIterator(partiallyAppliedFunction, ExecutionMode.LOCAL, getMetadata()); + return new ConstantRuntimeIterator( + partiallyAppliedFunction, + new RuntimeStaticContext(getConfiguration(), SequenceType.FUNCTION, ExecutionMode.LOCAL, getMetadata()) + ); } private void populateDynamicContextWithArguments(DynamicContext context) { diff --git a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java index f57ad0206..f78db26be 100644 --- a/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/FunctionRuntimeIterator.java @@ -25,8 +25,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.FunctionItem; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -45,10 +44,9 @@ public FunctionRuntimeIterator( Map paramNameToSequenceTypes, SequenceType returnType, RuntimeIterator bodyIterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.functionName = functionName; this.paramNameToSequenceTypes = paramNameToSequenceTypes; this.returnType = returnType; diff --git a/src/main/java/org/rumbledb/runtime/functions/NamedFunctionRefRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/functions/NamedFunctionRefRuntimeIterator.java index 0ddadf2e2..1dc91eb71 100644 --- a/src/main/java/org/rumbledb/runtime/functions/NamedFunctionRefRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/NamedFunctionRefRuntimeIterator.java @@ -23,9 +23,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.FunctionIdentifier; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnknownFunctionCallException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.FunctionItem; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -37,10 +36,9 @@ public class NamedFunctionRefRuntimeIterator extends AtMostOneItemLocalRuntimeIt public NamedFunctionRefRuntimeIterator( FunctionIdentifier functionIdentifier, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.functionIdentifier = functionIdentifier; } diff --git a/src/main/java/org/rumbledb/runtime/functions/NullFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/NullFunctionIterator.java index 064ce7bee..332c9af1a 100644 --- a/src/main/java/org/rumbledb/runtime/functions/NullFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/NullFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class NullFunctionIterator extends AtMostOneItemLocalRuntimeIterator { protected NullFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java index 1fa478bc1..f10b1c3fa 100644 --- a/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/StaticUserDefinedFunctionCallIterator.java @@ -25,9 +25,8 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -52,10 +51,9 @@ public class StaticUserDefinedFunctionCallIterator extends HybridRuntimeIterator public StaticUserDefinedFunctionCallIterator( FunctionIdentifier functionIdentifier, List functionArguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.functionIdentifier = functionIdentifier; this.functionArguments = functionArguments; this.userDefinedFunctionCallIterator = null; diff --git a/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayDescendantFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayDescendantFunctionIterator.java index 86452a2e2..edf74338a 100644 --- a/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayDescendantFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayDescendantFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.function.FlatMapFunction; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -45,10 +44,9 @@ public class ArrayDescendantFunctionIterator extends HybridRuntimeIterator { public ArrayDescendantFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = arguments.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayFlattenFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayFlattenFunctionIterator.java index c9c51a0f4..45cc88704 100644 --- a/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayFlattenFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayFlattenFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.function.FlatMapFunction; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -44,10 +43,9 @@ public class ArrayFlattenFunctionIterator extends HybridRuntimeIterator { public ArrayFlattenFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = arguments.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayMembersFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayMembersFunctionIterator.java index e46ec8918..07f86f567 100644 --- a/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayMembersFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/arrays/ArrayMembersFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.function.FlatMapFunction; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.navigation.ArrayMembersClosure; @@ -44,10 +43,9 @@ public class ArrayMembersFunctionIterator extends HybridRuntimeIterator { public ArrayMembersFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = this.children.get(0); this.nextResults = new LinkedList<>(); } diff --git a/src/main/java/org/rumbledb/runtime/functions/arrays/ArraySizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/arrays/ArraySizeFunctionIterator.java index 25790c8c4..8b96cdadf 100644 --- a/src/main/java/org/rumbledb/runtime/functions/arrays/ArraySizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/arrays/ArraySizeFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class ArraySizeFunctionIterator extends AtMostOneItemLocalRuntimeIterator public ArraySizeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/base/LocalFunctionCallIterator.java b/src/main/java/org/rumbledb/runtime/functions/base/LocalFunctionCallIterator.java index 9f5273502..c6c355d4d 100644 --- a/src/main/java/org/rumbledb/runtime/functions/base/LocalFunctionCallIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/base/LocalFunctionCallIterator.java @@ -20,8 +20,7 @@ package org.rumbledb.runtime.functions.base; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.runtime.LocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -33,9 +32,8 @@ public abstract class LocalFunctionCallIterator extends LocalRuntimeIterator { protected LocalFunctionCallIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); } } diff --git a/src/main/java/org/rumbledb/runtime/functions/booleans/BooleanFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/booleans/BooleanFunctionIterator.java index f9f68a285..a84c8d3d6 100644 --- a/src/main/java/org/rumbledb/runtime/functions/booleans/BooleanFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/booleans/BooleanFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class BooleanFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public BooleanFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/booleans/FalseFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/booleans/FalseFunctionIterator.java index 4ca6cab48..34601dbbc 100644 --- a/src/main/java/org/rumbledb/runtime/functions/booleans/FalseFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/booleans/FalseFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class FalseFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public FalseFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/booleans/NotFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/booleans/NotFunctionIterator.java index ca3094c15..dfd5ac364 100644 --- a/src/main/java/org/rumbledb/runtime/functions/booleans/NotFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/booleans/NotFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class NotFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public NotFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/booleans/TrueFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/booleans/TrueFunctionIterator.java index fdc48f24c..cdac28bf0 100644 --- a/src/main/java/org/rumbledb/runtime/functions/booleans/TrueFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/booleans/TrueFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -16,10 +15,9 @@ public class TrueFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public TrueFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/context/LastFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/context/LastFunctionIterator.java index 7094815ef..a784562ee 100644 --- a/src/main/java/org/rumbledb/runtime/functions/context/LastFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/context/LastFunctionIterator.java @@ -23,9 +23,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.AbsentPartOfDynamicContextException; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -40,10 +39,9 @@ public class LastFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public LastFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/context/PositionFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/context/PositionFunctionIterator.java index db9dba61b..93a504d87 100644 --- a/src/main/java/org/rumbledb/runtime/functions/context/PositionFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/context/PositionFunctionIterator.java @@ -23,9 +23,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.AbsentPartOfDynamicContextException; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -40,10 +39,9 @@ public class PositionFunctionIterator extends AtMostOneItemLocalRuntimeIterator public PositionFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentDateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentDateFunctionIterator.java index 737b29c01..6989efcf0 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentDateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentDateFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -16,10 +15,9 @@ public class CurrentDateFunctionIterator extends AtMostOneItemLocalRuntimeIterat public CurrentDateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentDateTimeFunctionIterator.java index 35b6ea50f..c8228cf3e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentDateTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -16,10 +15,9 @@ public class CurrentDateTimeFunctionIterator extends AtMostOneItemLocalRuntimeIt public CurrentDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentTimeFunctionIterator.java index 21c23a4c8..6dd23b4dc 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/CurrentTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -16,10 +15,9 @@ public class CurrentTimeFunctionIterator extends AtMostOneItemLocalRuntimeIterat public CurrentTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/DateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/DateTimeFunctionIterator.java index 066b719ca..42ad98a75 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/DateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/DateTimeFunctionIterator.java @@ -3,8 +3,8 @@ import org.joda.time.DateTime; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.*; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -19,10 +19,9 @@ public class DateTimeFunctionIterator extends AtMostOneItemLocalRuntimeIterator public DateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/FormatDateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/FormatDateFunctionIterator.java index 37e8b8310..ef0e1d5aa 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/FormatDateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/FormatDateFunctionIterator.java @@ -3,12 +3,11 @@ import org.joda.time.DateTime; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CastException; import org.rumbledb.exceptions.ComponentSpecifierNotAvailableException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IncorrectSyntaxFormatDateTimeException; import org.rumbledb.exceptions.UnsupportedFeatureException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -26,10 +25,9 @@ public class FormatDateFunctionIterator extends AtMostOneItemLocalRuntimeIterato public FormatDateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/FormatDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/FormatDateTimeFunctionIterator.java index d66bd9d8c..5112d1966 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/FormatDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/FormatDateTimeFunctionIterator.java @@ -3,12 +3,11 @@ import org.joda.time.DateTime; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CastException; import org.rumbledb.exceptions.ComponentSpecifierNotAvailableException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IncorrectSyntaxFormatDateTimeException; import org.rumbledb.exceptions.UnsupportedFeatureException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -26,10 +25,9 @@ public class FormatDateTimeFunctionIterator extends AtMostOneItemLocalRuntimeIte public FormatDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/FormatTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/FormatTimeFunctionIterator.java index 9b68e53af..5f0493e94 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/FormatTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/FormatTimeFunctionIterator.java @@ -3,12 +3,11 @@ import org.joda.time.DateTime; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CastException; import org.rumbledb.exceptions.ComponentSpecifierNotAvailableException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IncorrectSyntaxFormatDateTimeException; import org.rumbledb.exceptions.UnsupportedFeatureException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -26,10 +25,9 @@ public class FormatTimeFunctionIterator extends AtMostOneItemLocalRuntimeIterato public FormatTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustDateTimeToTimezone.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustDateTimeToTimezone.java index e5abe9197..b6c15a87c 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustDateTimeToTimezone.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustDateTimeToTimezone.java @@ -4,9 +4,8 @@ import org.joda.time.Instant; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidTimezoneException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -21,10 +20,9 @@ public class AdjustDateTimeToTimezone extends AtMostOneItemLocalRuntimeIterator public AdjustDateTimeToTimezone( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustDateToTimezone.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustDateToTimezone.java index 8f87fabec..25b3c5405 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustDateToTimezone.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustDateToTimezone.java @@ -4,9 +4,8 @@ import org.joda.time.Instant; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidTimezoneException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -21,10 +20,9 @@ public class AdjustDateToTimezone extends AtMostOneItemLocalRuntimeIterator { public AdjustDateToTimezone( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustTimeToTimezone.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustTimeToTimezone.java index c9af1b24e..a801c0d53 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustTimeToTimezone.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/AdjustTimeToTimezone.java @@ -4,9 +4,8 @@ import org.joda.time.Instant; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidTimezoneException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -21,10 +20,9 @@ public class AdjustTimeToTimezone extends AtMostOneItemLocalRuntimeIterator { public AdjustTimeToTimezone( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/DayFromDateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/DayFromDateFunctionIterator.java index 7b00705fc..0e53b659d 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/DayFromDateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/DayFromDateFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class DayFromDateFunctionIterator extends AtMostOneItemLocalRuntimeIterat public DayFromDateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/DayFromDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/DayFromDateTimeFunctionIterator.java index e1c7dca54..2f4135102 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/DayFromDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/DayFromDateTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class DayFromDateTimeFunctionIterator extends AtMostOneItemLocalRuntimeIt public DayFromDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/HoursFromDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/HoursFromDateTimeFunctionIterator.java index dcef0581c..3f335bd3a 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/HoursFromDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/HoursFromDateTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class HoursFromDateTimeFunctionIterator extends AtMostOneItemLocalRuntime public HoursFromDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/HoursFromTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/HoursFromTimeFunctionIterator.java index 6c2ab1168..b492ca8a9 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/HoursFromTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/HoursFromTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class HoursFromTimeFunctionIterator extends AtMostOneItemLocalRuntimeIter public HoursFromTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/MinutesFromDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/MinutesFromDateTimeFunctionIterator.java index fe23568a4..62af3dc49 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/MinutesFromDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/MinutesFromDateTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class MinutesFromDateTimeFunctionIterator extends AtMostOneItemLocalRunti public MinutesFromDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/MinutesFromTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/MinutesFromTimeFunctionIterator.java index ff3e3016a..b4eb6bffc 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/MinutesFromTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/MinutesFromTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class MinutesFromTimeFunctionIterator extends AtMostOneItemLocalRuntimeIt public MinutesFromTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/MonthFromDateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/MonthFromDateFunctionIterator.java index 91c573575..4c68eda68 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/MonthFromDateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/MonthFromDateFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class MonthFromDateFunctionIterator extends AtMostOneItemLocalRuntimeIter public MonthFromDateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/MonthFromDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/MonthFromDateTimeFunctionIterator.java index 6766fa3f1..a9017717b 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/MonthFromDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/MonthFromDateTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class MonthFromDateTimeFunctionIterator extends AtMostOneItemLocalRuntime public MonthFromDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/SecondsFromDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/SecondsFromDateTimeFunctionIterator.java index 40c7baea0..b7995f049 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/SecondsFromDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/SecondsFromDateTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class SecondsFromDateTimeFunctionIterator extends AtMostOneItemLocalRunti public SecondsFromDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/SecondsFromTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/SecondsFromTimeFunctionIterator.java index 33e6e95e0..d663c9ac4 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/SecondsFromTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/SecondsFromTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class SecondsFromTimeFunctionIterator extends AtMostOneItemLocalRuntimeIt public SecondsFromTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromDateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromDateFunctionIterator.java index 7499bd6d5..816fb6dd9 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromDateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromDateFunctionIterator.java @@ -3,8 +3,7 @@ import org.joda.time.Period; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class TimezoneFromDateFunctionIterator extends AtMostOneItemLocalRuntimeI public TimezoneFromDateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromDateTimeFunctionIterator.java index d157dddb3..fb292ce17 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromDateTimeFunctionIterator.java @@ -3,8 +3,7 @@ import org.joda.time.Period; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class TimezoneFromDateTimeFunctionIterator extends AtMostOneItemLocalRunt public TimezoneFromDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromTimeFunctionIterator.java index 9b08f5e1d..0782af4a5 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/TimezoneFromTimeFunctionIterator.java @@ -3,8 +3,7 @@ import org.joda.time.Period; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class TimezoneFromTimeFunctionIterator extends AtMostOneItemLocalRuntimeI public TimezoneFromTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/YearFromDateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/YearFromDateFunctionIterator.java index 4b5248903..b5e1bab08 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/YearFromDateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/YearFromDateFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class YearFromDateFunctionIterator extends AtMostOneItemLocalRuntimeItera public YearFromDateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/datetime/components/YearFromDateTimeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/datetime/components/YearFromDateTimeFunctionIterator.java index 67415c969..401861ada 100644 --- a/src/main/java/org/rumbledb/runtime/functions/datetime/components/YearFromDateTimeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/datetime/components/YearFromDateTimeFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class YearFromDateTimeFunctionIterator extends AtMostOneItemLocalRuntimeI public YearFromDateTimeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/durations/components/DaysFromDurationFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/durations/components/DaysFromDurationFunctionIterator.java index 2554d8fbb..40d8ca16e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/durations/components/DaysFromDurationFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/durations/components/DaysFromDurationFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class DaysFromDurationFunctionIterator extends AtMostOneItemLocalRuntimeI public DaysFromDurationFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/durations/components/HoursFromDurationFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/durations/components/HoursFromDurationFunctionIterator.java index a406efecc..c48d551be 100644 --- a/src/main/java/org/rumbledb/runtime/functions/durations/components/HoursFromDurationFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/durations/components/HoursFromDurationFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class HoursFromDurationFunctionIterator extends AtMostOneItemLocalRuntime public HoursFromDurationFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/durations/components/ImplicitTimezoneIterator.java b/src/main/java/org/rumbledb/runtime/functions/durations/components/ImplicitTimezoneIterator.java index 39ac5e8c9..24bc36d32 100644 --- a/src/main/java/org/rumbledb/runtime/functions/durations/components/ImplicitTimezoneIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/durations/components/ImplicitTimezoneIterator.java @@ -4,8 +4,7 @@ import org.joda.time.Period; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class ImplicitTimezoneIterator extends AtMostOneItemLocalRuntimeIterator public ImplicitTimezoneIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/durations/components/MinutesFromDurationFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/durations/components/MinutesFromDurationFunctionIterator.java index b0f092a4b..11d42203c 100644 --- a/src/main/java/org/rumbledb/runtime/functions/durations/components/MinutesFromDurationFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/durations/components/MinutesFromDurationFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class MinutesFromDurationFunctionIterator extends AtMostOneItemLocalRunti public MinutesFromDurationFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/durations/components/MonthsFromDurationFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/durations/components/MonthsFromDurationFunctionIterator.java index a9cb39361..0bdbe1feb 100644 --- a/src/main/java/org/rumbledb/runtime/functions/durations/components/MonthsFromDurationFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/durations/components/MonthsFromDurationFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class MonthsFromDurationFunctionIterator extends AtMostOneItemLocalRuntim public MonthsFromDurationFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/durations/components/SecondsFromDurationFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/durations/components/SecondsFromDurationFunctionIterator.java index 9fe0e3900..78936df42 100644 --- a/src/main/java/org/rumbledb/runtime/functions/durations/components/SecondsFromDurationFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/durations/components/SecondsFromDurationFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class SecondsFromDurationFunctionIterator extends AtMostOneItemLocalRunti public SecondsFromDurationFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/durations/components/YearsFromDurationFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/durations/components/YearsFromDurationFunctionIterator.java index 5c1d6d772..5a07d52eb 100644 --- a/src/main/java/org/rumbledb/runtime/functions/durations/components/YearsFromDurationFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/durations/components/YearsFromDurationFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class YearsFromDurationFunctionIterator extends AtMostOneItemLocalRuntime public YearsFromDurationFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/input/AvroFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/AvroFileFunctionIterator.java index c933cfeb5..96f506c00 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/AvroFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/AvroFileFunctionIterator.java @@ -25,10 +25,9 @@ import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ObjectItem; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; @@ -45,10 +44,9 @@ public class AvroFileFunctionIterator extends DataFrameRuntimeIterator { public AvroFileFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/input/CSVFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/CSVFileFunctionIterator.java index 4e8f92545..d139125b6 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/CSVFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/CSVFileFunctionIterator.java @@ -26,10 +26,9 @@ import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ObjectItem; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; @@ -46,10 +45,9 @@ public class CSVFileFunctionIterator extends DataFrameRuntimeIterator { public CSVFileFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java index e8801dc8d..63f3cb125 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/JsonFileFunctionIterator.java @@ -23,11 +23,10 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.RumbleException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.parsing.ItemParser; import org.rumbledb.items.parsing.JSONSyntaxToItemMapper; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -56,10 +55,9 @@ public class JsonFileFunctionIterator extends HybridRuntimeIterator { public JsonFileFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = this.children.get(0); this.reader = null; this.nextItem = null; diff --git a/src/main/java/org/rumbledb/runtime/functions/input/LibSVMFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/LibSVMFileFunctionIterator.java index 27b229fa3..3db5931d7 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/LibSVMFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/LibSVMFileFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -42,10 +41,9 @@ public class LibSVMFileFunctionIterator extends DataFrameRuntimeIterator { public LibSVMFileFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata metadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, metadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java index d25fe824e..a149ee98e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java @@ -23,9 +23,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -40,10 +39,9 @@ public class ParallelizeFunctionIterator extends HybridRuntimeIterator { public ParallelizeFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParquetFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParquetFileFunctionIterator.java index 5864c2cc1..b051a04ed 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParquetFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParquetFileFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -42,10 +41,9 @@ public class ParquetFileFunctionIterator extends DataFrameRuntimeIterator { public ParquetFileFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/input/RepartitionFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/RepartitionFunctionIterator.java index 2e90cb632..abbf47207 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/RepartitionFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/RepartitionFunctionIterator.java @@ -23,8 +23,7 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -41,10 +40,9 @@ public class RepartitionFunctionIterator extends HybridRuntimeIterator { public RepartitionFunctionIterator( List inputIterators, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(inputIterators, executionMode, iteratorMetadata); + super(inputIterators, staticContext); this.iterator = inputIterators.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/input/RootFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/RootFileFunctionIterator.java index 73f9ecd73..fdde19e82 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/RootFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/RootFileFunctionIterator.java @@ -26,9 +26,8 @@ import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -44,10 +43,9 @@ public class RootFileFunctionIterator extends DataFrameRuntimeIterator { public RootFileFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/input/StructuredJsonFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/StructuredJsonFileFunctionIterator.java index b34551fe6..40ad4b792 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/StructuredJsonFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/StructuredJsonFileFunctionIterator.java @@ -25,10 +25,9 @@ import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.RumbleException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -44,10 +43,9 @@ public class StructuredJsonFileFunctionIterator extends DataFrameRuntimeIterator public StructuredJsonFileFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/input/UnparsedTextLinesFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/UnparsedTextLinesFunctionIterator.java index be39d9c7c..9d751705f 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/UnparsedTextLinesFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/UnparsedTextLinesFunctionIterator.java @@ -23,9 +23,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.parsing.StringToStringItemMapper; import org.rumbledb.runtime.RDDRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -47,10 +46,9 @@ public class UnparsedTextLinesFunctionIterator extends RDDRuntimeIterator { public UnparsedTextLinesFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/io/CollectionFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/CollectionFunctionIterator.java index 237d8df5e..b2bc6c274 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/CollectionFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/CollectionFunctionIterator.java @@ -2,9 +2,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class CollectionFunctionIterator extends DataFrameRuntimeIterator { public CollectionFunctionIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); + super(children, staticContext); } // TODO: implement collection function diff --git a/src/main/java/org/rumbledb/runtime/functions/io/JsonDocFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/JsonDocFunctionIterator.java index c5bdb69ef..cefbbc208 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/JsonDocFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/JsonDocFunctionIterator.java @@ -23,9 +23,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.parsing.ItemParser; import com.google.gson.stream.JsonReader; import org.rumbledb.runtime.RuntimeIterator; @@ -44,10 +43,9 @@ public class JsonDocFunctionIterator extends LocalFunctionCallIterator { public JsonDocFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/io/LocalTextFileFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/LocalTextFileFunctionIterator.java index 73be225a7..dfc0b7339 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/LocalTextFileFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/LocalTextFileFunctionIterator.java @@ -23,10 +23,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CannotRetrieveResourceException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; @@ -50,10 +49,9 @@ public class LocalTextFileFunctionIterator extends LocalFunctionCallIterator { public LocalTextFileFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/io/ParseJsonFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/ParseJsonFunctionIterator.java index 69206fb9b..a9e46cf8b 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/ParseJsonFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/ParseJsonFunctionIterator.java @@ -24,10 +24,9 @@ import com.google.gson.stream.JsonReader; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.RumbleException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.parsing.ItemParser; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -43,10 +42,9 @@ public class ParseJsonFunctionIterator extends AtMostOneItemLocalRuntimeIterator public ParseJsonFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/io/TraceFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/TraceFunctionIterator.java index 3d690d8b9..25c09eb16 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/TraceFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/TraceFunctionIterator.java @@ -24,9 +24,8 @@ import org.rumbledb.api.Item; import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; import org.rumbledb.runtime.functions.input.FileSystemUtil; @@ -45,10 +44,9 @@ public class TraceFunctionIterator extends LocalFunctionCallIterator { public TraceFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.position = 0; } diff --git a/src/main/java/org/rumbledb/runtime/functions/io/UnparsedTextFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/UnparsedTextFunctionIterator.java index 7a4687ae4..3684a5dea 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/UnparsedTextFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/UnparsedTextFunctionIterator.java @@ -23,9 +23,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; @@ -43,10 +42,9 @@ public class UnparsedTextFunctionIterator extends LocalFunctionCallIterator { public UnparsedTextFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/io/YamlDocFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/io/YamlDocFunctionIterator.java index 41c8ba612..04b220d64 100644 --- a/src/main/java/org/rumbledb/runtime/functions/io/YamlDocFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/io/YamlDocFunctionIterator.java @@ -23,9 +23,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.parsing.ItemParser; import com.fasterxml.jackson.dataformat.yaml.YAMLFactory; @@ -52,10 +51,9 @@ public class YamlDocFunctionIterator extends LocalFunctionCallIterator { public YamlDocFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/AbsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/AbsFunctionIterator.java index 71ed3730e..33a0a8e42 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/AbsFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/AbsFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class AbsFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public AbsFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/CeilingFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/CeilingFunctionIterator.java index 2a0335c7e..9ed67669c 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/CeilingFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/CeilingFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -40,10 +39,9 @@ public class CeilingFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public CeilingFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/FloorFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/FloorFunctionIterator.java index 999495344..1bac2688e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/FloorFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/FloorFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -42,10 +41,9 @@ public class FloorFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public FloorFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/NumberFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/NumberFunctionIterator.java index 3a17f005b..21f1d866a 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/NumberFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/NumberFunctionIterator.java @@ -23,8 +23,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -38,10 +37,9 @@ public class NumberFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public NumberFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/PiFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/PiFunctionIterator.java index a7faf61a5..302d5519a 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/PiFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/PiFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class PiFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public PiFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/RoundFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/RoundFunctionIterator.java index 20bc96010..319112b53 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/RoundFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/RoundFunctionIterator.java @@ -22,10 +22,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -42,10 +41,9 @@ public class RoundFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public RoundFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/RoundHalfToEvenFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/RoundHalfToEvenFunctionIterator.java index b37a19284..0b638cbe7 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/RoundHalfToEvenFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/RoundHalfToEvenFunctionIterator.java @@ -22,10 +22,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -41,10 +40,9 @@ public class RoundHalfToEvenFunctionIterator extends AtMostOneItemLocalRuntimeIt public RoundHalfToEvenFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/Exp10FunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/Exp10FunctionIterator.java index 1a8c78cd3..6a142c404 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/Exp10FunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/Exp10FunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class Exp10FunctionIterator extends AtMostOneItemLocalRuntimeIterator { public Exp10FunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/ExpFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/ExpFunctionIterator.java index f0ee8f753..a7e2e52df 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/ExpFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/ExpFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -35,10 +34,9 @@ public class ExpFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public ExpFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/Log10FunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/Log10FunctionIterator.java index 3591e711b..4d3344258 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/Log10FunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/Log10FunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class Log10FunctionIterator extends AtMostOneItemLocalRuntimeIterator { public Log10FunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/LogFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/LogFunctionIterator.java index b2f64b231..00a22f307 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/LogFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/LogFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -35,10 +34,9 @@ public class LogFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public LogFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/PowFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/PowFunctionIterator.java index 30ea6a472..6c0c24483 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/PowFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/PowFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -38,10 +37,9 @@ public class PowFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public PowFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/SqrtFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/SqrtFunctionIterator.java index 79be0612f..9fad1a12b 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/SqrtFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/exponential/SqrtFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class SqrtFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public SqrtFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ACosFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ACosFunctionIterator.java index 925ae189c..31c97f5f4 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ACosFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ACosFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class ACosFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public ACosFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ASinFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ASinFunctionIterator.java index 1f236216b..3504dfc02 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ASinFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ASinFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class ASinFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public ASinFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ATan2FunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ATan2FunctionIterator.java index 02666bfa7..ec7ba4a68 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ATan2FunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ATan2FunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -35,10 +34,9 @@ public class ATan2FunctionIterator extends AtMostOneItemLocalRuntimeIterator { public ATan2FunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ATanFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ATanFunctionIterator.java index 959605444..41b4e5ac7 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ATanFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/ATanFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class ATanFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public ATanFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CosFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CosFunctionIterator.java index dbf006706..ded789eb0 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CosFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CosFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -35,10 +34,9 @@ public class CosFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public CosFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CoshFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CoshFunctionIterator.java index f346ac86b..58b5feb0b 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CoshFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/CoshFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class CoshFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public CoshFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinFunctionIterator.java index e4b5ba6bf..25f768920 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -35,10 +34,9 @@ public class SinFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public SinFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinhFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinhFunctionIterator.java index ce50c61fa..23d609214 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinhFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/SinhFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class SinhFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public SinhFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/TanFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/TanFunctionIterator.java index b12253614..77d5f223c 100644 --- a/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/TanFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/numerics/trigonometric/TanFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class TanFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public TanFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java index 754fe99f3..ae28047e8 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectAccumulateFunctionIterator.java @@ -25,8 +25,7 @@ import org.apache.spark.api.java.function.Function2; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -43,10 +42,9 @@ public class ObjectAccumulateFunctionIterator extends AtMostOneItemLocalRuntimeI public ObjectAccumulateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantFunctionIterator.java index a0c4ac088..6230efd86 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.function.FlatMapFunction; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -44,10 +43,9 @@ public class ObjectDescendantFunctionIterator extends HybridRuntimeIterator { public ObjectDescendantFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = arguments.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java index f0100468a..edf66d1b5 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectDescendantPairsFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; @@ -44,10 +43,9 @@ public class ObjectDescendantPairsFunctionIterator extends LocalFunctionCallIter public ObjectDescendantPairsFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java index 4f475ab0d..ee05ad56c 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectIntersectFunctionIterator.java @@ -25,8 +25,7 @@ import org.apache.spark.api.java.function.Function; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -46,10 +45,9 @@ public class ObjectIntersectFunctionIterator extends AtMostOneItemLocalRuntimeIt public ObjectIntersectFunctionIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); + super(children, staticContext); this.iterator = this.children.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java index de0619c4a..840c4f029 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectKeysFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.function.FlatMapFunction; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -48,10 +47,9 @@ public class ObjectKeysFunctionIterator extends HybridRuntimeIterator { public ObjectKeysFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = arguments.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java index b6d461e23..72a385ec2 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectProjectFunctionIterator.java @@ -24,10 +24,9 @@ import org.apache.spark.api.java.function.FlatMapFunction; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidSelectorException; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -49,10 +48,9 @@ public class ObjectProjectFunctionIterator extends HybridRuntimeIterator { public ObjectProjectFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = arguments.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java index b827f5e38..6b5dd20f0 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectRemoveKeysFunctionIterator.java @@ -24,11 +24,10 @@ import org.apache.spark.api.java.function.FlatMapFunction; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidSelectorException; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -46,10 +45,9 @@ public class ObjectRemoveKeysFunctionIterator extends HybridRuntimeIterator { public ObjectRemoveKeysFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = arguments.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/object/ObjectValuesFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/object/ObjectValuesFunctionIterator.java index 77791ffbc..9ac16899e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/object/ObjectValuesFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/object/ObjectValuesFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.function.FlatMapFunction; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -42,10 +41,9 @@ public class ObjectValuesFunctionIterator extends HybridRuntimeIterator { public ObjectValuesFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = arguments.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/AvgFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/AvgFunctionIterator.java index 6554108e6..ca0875c16 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/AvgFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/AvgFunctionIterator.java @@ -23,8 +23,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.expressions.arithmetic.MultiplicativeExpression; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -45,10 +44,9 @@ public class AvgFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public AvgFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/CountFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/CountFunctionIterator.java index 02fadd7de..51c0f5d35 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/CountFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/CountFunctionIterator.java @@ -23,9 +23,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -43,10 +43,9 @@ public class CountFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public CountFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java index 989ff14bb..cbda4f4ad 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MaxFunctionIterator.java @@ -27,8 +27,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.*; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemComparator; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; @@ -73,10 +73,9 @@ public class MaxFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public MaxFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = this.children.get(0); this.comparator = new ItemComparator( false, diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MinFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MinFunctionIterator.java index 9af411578..32fe12873 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MinFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/MinFunctionIterator.java @@ -27,8 +27,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.*; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemComparator; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; @@ -72,10 +72,9 @@ public class MinFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public MinFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = this.children.get(0); this.comparator = new ItemComparator( true, diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/SumFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/SumFunctionIterator.java index 1d585cd5d..432a3ad91 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/SumFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/aggregate/SumFunctionIterator.java @@ -24,9 +24,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.InvalidArgumentTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -50,10 +50,9 @@ public class SumFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public SumFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/CardinalityFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/CardinalityFunctionIterator.java index e775cbb6f..6c483c6eb 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/CardinalityFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/CardinalityFunctionIterator.java @@ -20,8 +20,7 @@ package org.rumbledb.runtime.functions.sequences.cardinality; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -34,10 +33,9 @@ public abstract class CardinalityFunctionIterator extends AtMostOneItemLocalRunt protected CardinalityFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/ExactlyOneIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/ExactlyOneIterator.java index 180130f11..14e799da3 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/ExactlyOneIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/ExactlyOneIterator.java @@ -22,10 +22,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.SequenceExceptionExactlyOne; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; @@ -39,10 +38,9 @@ public class ExactlyOneIterator extends AtMostOneItemLocalRuntimeIterator { public ExactlyOneIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/OneOrMoreIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/OneOrMoreIterator.java index 3785f6b3c..6842cc8e9 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/OneOrMoreIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/OneOrMoreIterator.java @@ -23,10 +23,9 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.SequenceExceptionOneOrMore; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -41,10 +40,9 @@ public class OneOrMoreIterator extends HybridRuntimeIterator { public OneOrMoreIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.iterator = this.children.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/ZeroOrOneIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/ZeroOrOneIterator.java index 1101974b3..5dc794bcc 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/ZeroOrOneIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/cardinality/ZeroOrOneIterator.java @@ -22,10 +22,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.SequenceExceptionZeroOrOne; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -38,10 +37,9 @@ public class ZeroOrOneIterator extends AtMostOneItemLocalRuntimeIterator { public ZeroOrOneIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/EmptyFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/EmptyFunctionIterator.java index ac3585f4e..95dfd6e3e 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/EmptyFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/EmptyFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class EmptyFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public EmptyFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/ExistsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/ExistsFunctionIterator.java index 39f025489..c4c943036 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/ExistsFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/ExistsFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class ExistsFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public ExistsFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/HeadFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/HeadFunctionIterator.java index 5d9c268d5..4fd60f710 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/HeadFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/HeadFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class HeadFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public HeadFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/InsertBeforeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/InsertBeforeFunctionIterator.java index c8983b745..d5cd4e3aa 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/InsertBeforeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/InsertBeforeFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import scala.Tuple2; @@ -49,10 +48,9 @@ public class InsertBeforeFunctionIterator extends HybridRuntimeIterator { public InsertBeforeFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); this.sequenceIterator = this.children.get(0); this.positionIterator = this.children.get(1); this.insertIterator = this.children.get(2); diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/RemoveFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/RemoveFunctionIterator.java index e17774557..29d347488 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/RemoveFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/RemoveFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -45,10 +44,9 @@ public class RemoveFunctionIterator extends HybridRuntimeIterator { public RemoveFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); this.sequenceIterator = this.children.get(0); this.positionIterator = this.children.get(1); } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/ReverseFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/ReverseFunctionIterator.java index 64726ffa9..71653d533 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/ReverseFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/ReverseFunctionIterator.java @@ -25,9 +25,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -49,10 +48,9 @@ public class ReverseFunctionIterator extends HybridRuntimeIterator { public ReverseFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); this.sequenceIterator = this.children.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/SubsequenceFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/SubsequenceFunctionIterator.java index 6e46f6324..70b81fcaf 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/SubsequenceFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/SubsequenceFunctionIterator.java @@ -26,10 +26,9 @@ import org.apache.spark.sql.Row; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -54,10 +53,9 @@ public class SubsequenceFunctionIterator extends HybridRuntimeIterator { public SubsequenceFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); this.sequenceIterator = this.children.get(0); this.positionIterator = this.children.get(1); if (this.children.size() == 3) { diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/TailFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/TailFunctionIterator.java index 5f717ecd9..83040afb2 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/TailFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/TailFunctionIterator.java @@ -24,9 +24,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -41,10 +40,9 @@ public class TailFunctionIterator extends HybridRuntimeIterator { public TailFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); this.iterator = this.children.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/general/UnorderedFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/general/UnorderedFunctionIterator.java index d548a16e6..75d76b228 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/general/UnorderedFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/general/UnorderedFunctionIterator.java @@ -23,9 +23,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -41,10 +40,9 @@ public class UnorderedFunctionIterator extends HybridRuntimeIterator { public UnorderedFunctionIterator( List parameters, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(parameters, executionMode, iteratorMetadata); + super(parameters, staticContext); this.iterator = this.children.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/value/DeepEqualFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/value/DeepEqualFunctionIterator.java index a0861156d..1f7b8fbc8 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/value/DeepEqualFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/value/DeepEqualFunctionIterator.java @@ -26,9 +26,8 @@ import org.apache.spark.api.java.function.FlatMapFunction2; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.DefaultCollationException; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -45,10 +44,9 @@ public class DeepEqualFunctionIterator extends AtMostOneItemLocalRuntimeIterator public DeepEqualFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/value/DistinctValuesFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/value/DistinctValuesFunctionIterator.java index 119165155..e4464da60 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/value/DistinctValuesFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/value/DistinctValuesFunctionIterator.java @@ -23,10 +23,9 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.DefaultCollationException; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -44,10 +43,9 @@ public class DistinctValuesFunctionIterator extends HybridRuntimeIterator { public DistinctValuesFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.sequenceIterator = arguments.get(0); } diff --git a/src/main/java/org/rumbledb/runtime/functions/sequences/value/IndexOfFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/sequences/value/IndexOfFunctionIterator.java index 662ed94d5..7d180f9f4 100644 --- a/src/main/java/org/rumbledb/runtime/functions/sequences/value/IndexOfFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/sequences/value/IndexOfFunctionIterator.java @@ -24,8 +24,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.*; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.comparison.ComparisonExpression.ComparisonOperator; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -46,10 +46,9 @@ public class IndexOfFunctionIterator extends HybridRuntimeIterator { public IndexOfFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); this.sequenceIterator = this.children.get(0); this.searchIterator = this.children.get(1); } diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/CodepointEqualFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/CodepointEqualFunctionIterator.java index 2dd47fc64..a8f103207 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/CodepointEqualFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/CodepointEqualFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -39,10 +38,9 @@ public class CodepointEqualFunctionIterator extends AtMostOneItemLocalRuntimeIte public CodepointEqualFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/CodepointsToStringFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/CodepointsToStringFunctionIterator.java index 35a9dca6d..2f3f67580 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/CodepointsToStringFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/CodepointsToStringFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.exceptions.CodepointNotValidException; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -38,10 +37,9 @@ public class CodepointsToStringFunctionIterator extends AtMostOneItemLocalRuntim public CodepointsToStringFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/ConcatFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/ConcatFunctionIterator.java index eee61095e..0700342cb 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/ConcatFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/ConcatFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class ConcatFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public ConcatFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/ContainsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/ContainsFunctionIterator.java index 4ccdc0a53..b131325c9 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/ContainsFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/ContainsFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnsupportedCollationException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class ContainsFunctionIterator extends AtMostOneItemLocalRuntimeIterator public ContainsFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/DefaultCollationFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/DefaultCollationFunctionIterator.java index 995a3756c..4f4354fbe 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/DefaultCollationFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/DefaultCollationFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -16,10 +15,9 @@ public class DefaultCollationFunctionIterator extends AtMostOneItemLocalRuntimeI public DefaultCollationFunctionIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); + super(children, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/EncodeForURIFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/EncodeForURIFunctionIterator.java index 6f3b57cd7..bfbd5c55c 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/EncodeForURIFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/EncodeForURIFunctionIterator.java @@ -21,10 +21,9 @@ package org.rumbledb.runtime.functions.strings; import org.rumbledb.api.Item; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; @@ -49,10 +48,9 @@ public class EncodeForURIFunctionIterator extends LocalFunctionCallIterator { public EncodeForURIFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/EndsWithFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/EndsWithFunctionIterator.java index 9a9b19591..2d7f208ba 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/EndsWithFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/EndsWithFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnsupportedCollationException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class EndsWithFunctionIterator extends AtMostOneItemLocalRuntimeIterator public EndsWithFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/LowerCaseFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/LowerCaseFunctionIterator.java index 450afbad4..515a07659 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/LowerCaseFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/LowerCaseFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class LowerCaseFunctionIterator extends AtMostOneItemLocalRuntimeIterator public LowerCaseFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/MatchesFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/MatchesFunctionIterator.java index a616a4ba6..ebb602603 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/MatchesFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/MatchesFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -38,10 +37,9 @@ public class MatchesFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public MatchesFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/NormalizeSpaceFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/NormalizeSpaceFunctionIterator.java index 4426dff4c..9b19d0b89 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/NormalizeSpaceFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/NormalizeSpaceFunctionIterator.java @@ -24,8 +24,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -38,10 +37,9 @@ public class NormalizeSpaceFunctionIterator extends AtMostOneItemLocalRuntimeIte public NormalizeSpaceFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/NormalizeUnicodeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/NormalizeUnicodeFunctionIterator.java index 606871c5f..393060345 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/NormalizeUnicodeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/NormalizeUnicodeFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidNormalizationException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -126,10 +125,9 @@ public class NormalizeUnicodeFunctionIterator extends AtMostOneItemLocalRuntimeI public NormalizeUnicodeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/ReplaceFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/ReplaceFunctionIterator.java index 4e1b23afd..fedbc1a0a 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/ReplaceFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/ReplaceFunctionIterator.java @@ -22,10 +22,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidRegexPatternException; import org.rumbledb.exceptions.MatchesEmptyStringException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.exceptions.InvalidReplacementStringException; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -42,10 +41,9 @@ public class ReplaceFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public ReplaceFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/ResolveURIFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/ResolveURIFunctionIterator.java index 5bddc2597..d322c87f5 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/ResolveURIFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/ResolveURIFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -18,10 +17,9 @@ public class ResolveURIFunctionIterator extends AtMostOneItemLocalRuntimeIterato public ResolveURIFunctionIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); + super(children, staticContext); } diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/SerializeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/SerializeFunctionIterator.java index be4c993ed..74815dc13 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/SerializeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/SerializeFunctionIterator.java @@ -21,9 +21,8 @@ package org.rumbledb.runtime.functions.strings; import org.rumbledb.api.Item; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; @@ -36,10 +35,9 @@ public class SerializeFunctionIterator extends LocalFunctionCallIterator { public SerializeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/StartsWithFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/StartsWithFunctionIterator.java index 63b8291f3..9592fa1e3 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/StartsWithFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/StartsWithFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnsupportedCollationException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class StartsWithFunctionIterator extends AtMostOneItemLocalRuntimeIterato public StartsWithFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/StaticBaseURIFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/StaticBaseURIFunctionIterator.java index d9d30bbde..3156a9918 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/StaticBaseURIFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/StaticBaseURIFunctionIterator.java @@ -2,8 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -16,10 +15,9 @@ public class StaticBaseURIFunctionIterator extends AtMostOneItemLocalRuntimeIter public StaticBaseURIFunctionIterator( List children, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(children, executionMode, iteratorMetadata); + super(children, staticContext); } diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/StringFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/StringFunctionIterator.java index 3817c6b70..f0d39493d 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/StringFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/StringFunctionIterator.java @@ -23,8 +23,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class StringFunctionIterator extends AtMostOneItemLocalRuntimeIterator { public StringFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/StringJoinFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/StringJoinFunctionIterator.java index 08ca254a6..817f84614 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/StringJoinFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/StringJoinFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class StringJoinFunctionIterator extends AtMostOneItemLocalRuntimeIterato public StringJoinFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/StringLengthFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/StringLengthFunctionIterator.java index 21f2a158a..a3baad686 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/StringLengthFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/StringLengthFunctionIterator.java @@ -23,8 +23,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class StringLengthFunctionIterator extends AtMostOneItemLocalRuntimeItera public StringLengthFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/StringToCodepointsFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/StringToCodepointsFunctionIterator.java index 5b2277d10..a7208ab91 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/StringToCodepointsFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/StringToCodepointsFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; @@ -40,10 +39,9 @@ public class StringToCodepointsFunctionIterator extends LocalFunctionCallIterato public StringToCodepointsFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/SubstringAfterFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/SubstringAfterFunctionIterator.java index 9478d9877..9507697fc 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/SubstringAfterFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/SubstringAfterFunctionIterator.java @@ -2,9 +2,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnsupportedCollationException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class SubstringAfterFunctionIterator extends AtMostOneItemLocalRuntimeIte public SubstringAfterFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/SubstringBeforeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/SubstringBeforeFunctionIterator.java index 94f126e34..12cc2472f 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/SubstringBeforeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/SubstringBeforeFunctionIterator.java @@ -2,9 +2,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnsupportedCollationException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -17,10 +16,9 @@ public class SubstringBeforeFunctionIterator extends AtMostOneItemLocalRuntimeIt public SubstringBeforeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/SubstringFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/SubstringFunctionIterator.java index dce331ff0..37e09e99d 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/SubstringFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/SubstringFunctionIterator.java @@ -22,9 +22,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class SubstringFunctionIterator extends AtMostOneItemLocalRuntimeIterator public SubstringFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/TokenizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/TokenizeFunctionIterator.java index 59f2ff6a8..94ba13f71 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/TokenizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/TokenizeFunctionIterator.java @@ -22,10 +22,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.functions.base.LocalFunctionCallIterator; @@ -42,10 +41,9 @@ public class TokenizeFunctionIterator extends LocalFunctionCallIterator { public TokenizeFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/TranslateFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/TranslateFunctionIterator.java index f0302909a..319440bb9 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/TranslateFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/TranslateFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -38,10 +37,9 @@ public class TranslateFunctionIterator extends AtMostOneItemLocalRuntimeIterator public TranslateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/functions/strings/UpperCaseFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/strings/UpperCaseFunctionIterator.java index 9c613187b..73475fbc7 100644 --- a/src/main/java/org/rumbledb/runtime/functions/strings/UpperCaseFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/strings/UpperCaseFunctionIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,10 +35,9 @@ public class UpperCaseFunctionIterator extends AtMostOneItemLocalRuntimeIterator public UpperCaseFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java index 7f54928e7..c50d9663b 100644 --- a/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/AndOperationIterator.java @@ -24,8 +24,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -41,10 +40,9 @@ public class AndOperationIterator extends AtMostOneItemLocalRuntimeIterator { public AndOperationIterator( RuntimeIterator leftIterator, RuntimeIterator rightIterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(leftIterator, rightIterator), executionMode, iteratorMetadata); + super(Arrays.asList(leftIterator, rightIterator), staticContext); this.leftIterator = leftIterator; this.rightIterator = rightIterator; } diff --git a/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java index 5792f9f68..4fff1fefc 100644 --- a/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/NotOperationIterator.java @@ -24,8 +24,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -39,10 +38,9 @@ public class NotOperationIterator extends AtMostOneItemLocalRuntimeIterator { public NotOperationIterator( RuntimeIterator child, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(child), executionMode, iteratorMetadata); + super(Collections.singletonList(child), staticContext); this.child = child; } diff --git a/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java b/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java index 5f20ae5ee..08db3868e 100644 --- a/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/logics/OrOperationIterator.java @@ -24,8 +24,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -42,10 +41,9 @@ public class OrOperationIterator extends AtMostOneItemLocalRuntimeIterator { public OrOperationIterator( RuntimeIterator leftIterator, RuntimeIterator rightIterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(leftIterator, rightIterator), executionMode, iteratorMetadata); + super(Arrays.asList(leftIterator, rightIterator), staticContext); this.leftIterator = leftIterator; this.rightIterator = rightIterator; } diff --git a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java index acd381a28..b4bfd4578 100644 --- a/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java +++ b/src/main/java/org/rumbledb/runtime/misc/ComparisonIterator.java @@ -25,13 +25,13 @@ import org.joda.time.Period; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.NonAtomicKeyException; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.comparison.ComparisonExpression; import org.rumbledb.expressions.comparison.ComparisonExpression.ComparisonOperator; import org.rumbledb.items.ItemFactory; @@ -62,10 +62,9 @@ public ComparisonIterator( RuntimeIterator leftIterator, RuntimeIterator rightIterator, ComparisonExpression.ComparisonOperator comparisonOperator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(leftIterator, rightIterator), executionMode, iteratorMetadata); + super(Arrays.asList(leftIterator, rightIterator), staticContext); this.leftIterator = leftIterator; this.rightIterator = rightIterator; this.comparisonOperator = comparisonOperator; diff --git a/src/main/java/org/rumbledb/runtime/misc/RangeOperationIterator.java b/src/main/java/org/rumbledb/runtime/misc/RangeOperationIterator.java index 698962b77..7127e0308 100644 --- a/src/main/java/org/rumbledb/runtime/misc/RangeOperationIterator.java +++ b/src/main/java/org/rumbledb/runtime/misc/RangeOperationIterator.java @@ -28,11 +28,10 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -56,10 +55,9 @@ public class RangeOperationIterator extends HybridRuntimeIterator { public RangeOperationIterator( RuntimeIterator leftIterator, RuntimeIterator rightiterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(leftIterator, rightiterator), executionMode, iteratorMetadata); + super(Arrays.asList(leftIterator, rightiterator), staticContext); this.leftIterator = leftIterator; this.rightIterator = rightiterator; } diff --git a/src/main/java/org/rumbledb/runtime/misc/StringConcatIterator.java b/src/main/java/org/rumbledb/runtime/misc/StringConcatIterator.java index 6f249b684..254dd1abb 100644 --- a/src/main/java/org/rumbledb/runtime/misc/StringConcatIterator.java +++ b/src/main/java/org/rumbledb/runtime/misc/StringConcatIterator.java @@ -24,10 +24,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -41,10 +40,9 @@ public class StringConcatIterator extends AtMostOneItemLocalRuntimeIterator { public StringConcatIterator( RuntimeIterator leftIterator, RuntimeIterator rightIterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(leftIterator, rightIterator), executionMode, iteratorMetadata); + super(Arrays.asList(leftIterator, rightIterator), staticContext); this.leftIterator = leftIterator; this.rightIterator = rightIterator; } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java index c4e0d6aa7..9e2c98581 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java @@ -28,8 +28,8 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.*; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -55,10 +55,9 @@ public class ArrayLookupIterator extends HybridRuntimeIterator { public ArrayLookupIterator( RuntimeIterator array, RuntimeIterator iterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(array, iterator), executionMode, iteratorMetadata); + super(Arrays.asList(array, iterator), staticContext); this.iterator = array; } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java index f9dc9e1c6..8e6efdc87 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java @@ -25,9 +25,8 @@ import org.apache.spark.sql.types.ArrayType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -53,10 +52,9 @@ public class ArrayUnboxingIterator extends HybridRuntimeIterator { public ArrayUnboxingIterator( RuntimeIterator arrayIterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(arrayIterator), executionMode, iteratorMetadata); + super(Arrays.asList(arrayIterator), staticContext); this.iterator = arrayIterator; } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index d15afd998..9e24e51e1 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -28,9 +28,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.errorcodes.ErrorCode; import org.rumbledb.exceptions.*; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; @@ -65,10 +65,9 @@ public class ObjectLookupIterator extends HybridRuntimeIterator { public ObjectLookupIterator( RuntimeIterator object, RuntimeIterator lookupIterator, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(object, lookupIterator), executionMode, iteratorMetadata); + super(Arrays.asList(object, lookupIterator), staticContext); this.iterator = object; } diff --git a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java index 343faaf87..bbe5e0491 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java @@ -28,10 +28,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -69,10 +68,9 @@ public class PredicateIterator extends HybridRuntimeIterator { public PredicateIterator( RuntimeIterator sequence, RuntimeIterator filterExpression, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(sequence, filterExpression), executionMode, iteratorMetadata); + super(Arrays.asList(sequence, filterExpression), staticContext); this.iterator = sequence; this.filter = filterExpression; this.filterDynamicContext = null; diff --git a/src/main/java/org/rumbledb/runtime/navigation/SequenceLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/SequenceLookupIterator.java index 8f361664e..7172eda4f 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/SequenceLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/SequenceLookupIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import java.util.ArrayList; @@ -39,10 +38,9 @@ public class SequenceLookupIterator extends AtMostOneItemLocalRuntimeIterator { public SequenceLookupIterator( RuntimeIterator sequence, int position, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Arrays.asList(sequence), executionMode, iteratorMetadata); + super(Arrays.asList(sequence), staticContext); this.iterator = sequence; this.position = position; } diff --git a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java index 130c5b5be..36b2d8b91 100644 --- a/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/ArrayRuntimeIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -37,10 +36,9 @@ public class ArrayRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { public ArrayRuntimeIterator( RuntimeIterator arrayItems, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); if (arrayItems != null) { this.children.add(arrayItems); } diff --git a/src/main/java/org/rumbledb/runtime/primary/BooleanRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/BooleanRuntimeIterator.java index 531f232ce..e60eac2b6 100644 --- a/src/main/java/org/rumbledb/runtime/primary/BooleanRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/BooleanRuntimeIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -32,8 +31,8 @@ public class BooleanRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { private static final long serialVersionUID = 1L; private Item item; - public BooleanRuntimeIterator(boolean value, ExecutionMode executionMode, ExceptionMetadata iteratorMetadata) { - super(null, executionMode, iteratorMetadata); + public BooleanRuntimeIterator(boolean value, RuntimeStaticContext staticContext) { + super(null, staticContext); this.item = ItemFactory.getInstance().createBooleanItem(value); } diff --git a/src/main/java/org/rumbledb/runtime/primary/ContextExpressionIterator.java b/src/main/java/org/rumbledb/runtime/primary/ContextExpressionIterator.java index 9422f6a88..d0214264e 100644 --- a/src/main/java/org/rumbledb/runtime/primary/ContextExpressionIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/ContextExpressionIterator.java @@ -26,8 +26,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.flwor.FlworDataFrameUtils; import org.rumbledb.runtime.flwor.NativeClauseContext; @@ -45,8 +44,8 @@ public class ContextExpressionIterator extends AtMostOneItemLocalRuntimeIterator private static final long serialVersionUID = 1L; - public ContextExpressionIterator(ExecutionMode executionMode, ExceptionMetadata iteratorMetadata) { - super(null, executionMode, iteratorMetadata); + public ContextExpressionIterator(RuntimeStaticContext staticContext) { + super(null, staticContext); } @Override diff --git a/src/main/java/org/rumbledb/runtime/primary/DecimalRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/DecimalRuntimeIterator.java index bca8ad702..5f4454bde 100644 --- a/src/main/java/org/rumbledb/runtime/primary/DecimalRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/DecimalRuntimeIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.SequenceType; @@ -36,8 +35,8 @@ public class DecimalRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { private static final long serialVersionUID = 1L; private Item item; - public DecimalRuntimeIterator(BigDecimal value, ExecutionMode executionMode, ExceptionMetadata iteratorMetadata) { - super(null, executionMode, iteratorMetadata); + public DecimalRuntimeIterator(BigDecimal value, RuntimeStaticContext staticContext) { + super(null, staticContext); this.item = ItemFactory.getInstance().createDecimalItem(value); } diff --git a/src/main/java/org/rumbledb/runtime/primary/DoubleRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/DoubleRuntimeIterator.java index 1dbbaaf84..d1600fb4c 100644 --- a/src/main/java/org/rumbledb/runtime/primary/DoubleRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/DoubleRuntimeIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.SequenceType; @@ -35,8 +34,8 @@ public class DoubleRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { private static final long serialVersionUID = 1L; private Item item; - public DoubleRuntimeIterator(Double value, ExecutionMode executionMode, ExceptionMetadata iteratorMetadata) { - super(null, executionMode, iteratorMetadata); + public DoubleRuntimeIterator(Double value, RuntimeStaticContext staticContext) { + super(null, staticContext); this.item = ItemFactory.getInstance().createDoubleItem(value); } diff --git a/src/main/java/org/rumbledb/runtime/primary/IntegerRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/IntegerRuntimeIterator.java index 7dfcaccf9..9c96c48fe 100644 --- a/src/main/java/org/rumbledb/runtime/primary/IntegerRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/IntegerRuntimeIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.flwor.NativeClauseContext; import org.rumbledb.types.SequenceType; @@ -37,10 +36,9 @@ public class IntegerRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { public IntegerRuntimeIterator( String lexicalValue, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.item = ItemFactory.getInstance().createIntegerItem(lexicalValue); } diff --git a/src/main/java/org/rumbledb/runtime/primary/NullRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/NullRuntimeIterator.java index 5b5e8dc6b..f3bc0908a 100644 --- a/src/main/java/org/rumbledb/runtime/primary/NullRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/NullRuntimeIterator.java @@ -22,8 +22,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -33,8 +32,8 @@ public class NullRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { private static final long serialVersionUID = 1L; private Item item; - public NullRuntimeIterator(ExecutionMode executionMode, ExceptionMetadata iteratorMetadata) { - super(null, executionMode, iteratorMetadata); + public NullRuntimeIterator(RuntimeStaticContext staticContext) { + super(null, staticContext); this.item = ItemFactory.getInstance().createNullItem(); } diff --git a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java index 57f142999..4c871ea86 100644 --- a/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/ObjectConstructorRuntimeIterator.java @@ -22,10 +22,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.ObjectItem; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -45,10 +44,9 @@ public class ObjectConstructorRuntimeIterator extends AtMostOneItemLocalRuntimeI public ObjectConstructorRuntimeIterator( List keys, List values, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(keys, executionMode, iteratorMetadata); + super(keys, staticContext); this.children.addAll(values); this.keys = keys; this.values = values; @@ -56,10 +54,9 @@ public ObjectConstructorRuntimeIterator( public ObjectConstructorRuntimeIterator( List childExpressions, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.children.addAll(childExpressions); this.isMergedObject = true; } diff --git a/src/main/java/org/rumbledb/runtime/primary/StringRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/primary/StringRuntimeIterator.java index 821fae8f7..60564d175 100644 --- a/src/main/java/org/rumbledb/runtime/primary/StringRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/StringRuntimeIterator.java @@ -23,8 +23,7 @@ import org.apache.commons.text.StringEscapeUtils; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.flwor.NativeClauseContext; @@ -35,8 +34,8 @@ public class StringRuntimeIterator extends AtMostOneItemLocalRuntimeIterator { private static final long serialVersionUID = 1L; private Item item; - public StringRuntimeIterator(String value, ExecutionMode executionMode, ExceptionMetadata iteratorMetadata) { - super(null, executionMode, iteratorMetadata); + public StringRuntimeIterator(String value, RuntimeStaticContext staticContext) { + super(null, staticContext); this.item = ItemFactory.getInstance().createStringItem(StringEscapeUtils.unescapeJson(value)); } diff --git a/src/main/java/org/rumbledb/runtime/primary/VariableReferenceIterator.java b/src/main/java/org/rumbledb/runtime/primary/VariableReferenceIterator.java index ceb41a17e..4abd9b856 100644 --- a/src/main/java/org/rumbledb/runtime/primary/VariableReferenceIterator.java +++ b/src/main/java/org/rumbledb/runtime/primary/VariableReferenceIterator.java @@ -27,10 +27,9 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.context.VariableValues; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.IteratorFlowException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -49,20 +48,16 @@ public class VariableReferenceIterator extends HybridRuntimeIterator { private static final long serialVersionUID = 1L; - private SequenceType sequence; private Name variableName; private List items = null; private int currentIndex = 0; public VariableReferenceIterator( Name variableName, - SequenceType seq, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.variableName = variableName; - this.sequence = seq; } @Override @@ -159,10 +154,6 @@ public void resetLocal() { this.items = null; } - public SequenceType getSequence() { - return this.sequence; - } - public Name getVariableName() { return this.variableName; } diff --git a/src/main/java/org/rumbledb/runtime/typing/AtMostOneItemTypePromotionIterator.java b/src/main/java/org/rumbledb/runtime/typing/AtMostOneItemTypePromotionIterator.java index 6e6a76c80..751eac69a 100644 --- a/src/main/java/org/rumbledb/runtime/typing/AtMostOneItemTypePromotionIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/AtMostOneItemTypePromotionIterator.java @@ -2,7 +2,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnexpectedTypeException; @@ -31,15 +31,14 @@ public AtMostOneItemTypePromotionIterator( RuntimeIterator iterator, SequenceType sequenceType, String exceptionMessage, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(iterator), executionMode, iteratorMetadata); + super(Collections.singletonList(iterator), staticContext); this.exceptionMessage = exceptionMessage; this.iterator = iterator; this.sequenceType = sequenceType; this.itemType = this.sequenceType.getItemType(); - if (!executionMode.equals(ExecutionMode.LOCAL)) { + if (!getHighestExecutionMode().equals(ExecutionMode.LOCAL)) { throw new OurBadException( "A promotion iterator should never be executed in parallel if the sequence type arity is 0, 1 or ?." ); diff --git a/src/main/java/org/rumbledb/runtime/typing/CastIterator.java b/src/main/java/org/rumbledb/runtime/typing/CastIterator.java index 88934f6ca..082b9fb49 100644 --- a/src/main/java/org/rumbledb/runtime/typing/CastIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/CastIterator.java @@ -5,8 +5,8 @@ import org.apache.commons.lang.StringUtils; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.*; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.AnnotatedItem; import org.rumbledb.items.DurationItem; import org.rumbledb.items.ItemFactory; @@ -31,10 +31,9 @@ public class CastIterator extends AtMostOneItemLocalRuntimeIterator { public CastIterator( RuntimeIterator child, SequenceType sequenceType, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(child), executionMode, iteratorMetadata); + super(Collections.singletonList(child), staticContext); this.child = child; this.sequenceType = sequenceType; } diff --git a/src/main/java/org/rumbledb/runtime/typing/CastableIterator.java b/src/main/java/org/rumbledb/runtime/typing/CastableIterator.java index 03f6f1e3a..018fb9c50 100644 --- a/src/main/java/org/rumbledb/runtime/typing/CastableIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/CastableIterator.java @@ -2,12 +2,12 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.CastableException; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.NonAtomicKeyException; import org.rumbledb.exceptions.UnknownCastTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -27,10 +27,9 @@ public class CastableIterator extends AtMostOneItemLocalRuntimeIterator { public CastableIterator( RuntimeIterator child, SequenceType sequenceType, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(child), executionMode, iteratorMetadata); + super(Collections.singletonList(child), staticContext); this.child = child; this.sequenceType = sequenceType; } diff --git a/src/main/java/org/rumbledb/runtime/typing/InstanceOfIterator.java b/src/main/java/org/rumbledb/runtime/typing/InstanceOfIterator.java index 812811ff4..0daa8f38e 100644 --- a/src/main/java/org/rumbledb/runtime/typing/InstanceOfIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/InstanceOfIterator.java @@ -23,8 +23,7 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; @@ -47,10 +46,9 @@ public class InstanceOfIterator extends AtMostOneItemLocalRuntimeIterator { public InstanceOfIterator( RuntimeIterator child, SequenceType sequenceType, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(child), executionMode, iteratorMetadata); + super(Collections.singletonList(child), staticContext); this.child = child; this.sequenceType = sequenceType; } diff --git a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java index 8033c18e0..b63ebe500 100644 --- a/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/TreatIterator.java @@ -11,8 +11,8 @@ import org.apache.spark.sql.types.StructType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.errorcodes.ErrorCode; -import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.InvalidInstanceException; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.OurBadException; @@ -52,10 +52,9 @@ public TreatIterator( RuntimeIterator iterator, SequenceType sequenceType, ErrorCode errorCode, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(iterator), executionMode, iteratorMetadata); + super(Collections.singletonList(iterator), staticContext); this.iterator = iterator; this.sequenceType = sequenceType; this.errorCode = errorCode; @@ -63,7 +62,7 @@ public TreatIterator( this.itemType = this.sequenceType.getItemType(); } if ( - !executionMode.equals(ExecutionMode.LOCAL) + !getHighestExecutionMode().equals(ExecutionMode.LOCAL) && (sequenceType.isEmptySequence() || sequenceType.getArity().equals(Arity.One) || sequenceType.getArity().equals(Arity.OneOrZero)) diff --git a/src/main/java/org/rumbledb/runtime/typing/TypePromotionIterator.java b/src/main/java/org/rumbledb/runtime/typing/TypePromotionIterator.java index 62db94864..3fedf9408 100644 --- a/src/main/java/org/rumbledb/runtime/typing/TypePromotionIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/TypePromotionIterator.java @@ -4,11 +4,10 @@ import org.apache.spark.api.java.function.Function; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnexpectedTypeException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -39,10 +38,9 @@ public TypePromotionIterator( RuntimeIterator iterator, SequenceType sequenceType, String exceptionMessage, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(iterator), executionMode, iteratorMetadata); + super(Collections.singletonList(iterator), staticContext); this.exceptionMessage = exceptionMessage; this.iterator = iterator; this.sequenceType = sequenceType; diff --git a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java index bc068ee7b..c8666e38c 100644 --- a/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java +++ b/src/main/java/org/rumbledb/runtime/typing/ValidateTypeIterator.java @@ -11,13 +11,12 @@ import org.apache.spark.sql.types.StructField; import org.apache.spark.sql.types.StructType; import org.rumbledb.api.Item; -import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.DatesWithTimezonesNotSupported; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.InvalidInstanceException; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -48,11 +47,9 @@ public ValidateTypeIterator( RuntimeIterator instance, ItemType itemType, boolean isValidate, - ExecutionMode executionMode, - RumbleRuntimeConfiguration configuration, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(Collections.singletonList(instance), executionMode, iteratorMetadata); + super(Collections.singletonList(instance), staticContext); this.itemType = itemType; this.isValidate = isValidate; } diff --git a/src/main/java/org/rumbledb/types/SequenceType.java b/src/main/java/org/rumbledb/types/SequenceType.java index bb52b6b76..d5cadfaa4 100644 --- a/src/main/java/org/rumbledb/types/SequenceType.java +++ b/src/main/java/org/rumbledb/types/SequenceType.java @@ -26,6 +26,7 @@ import org.rumbledb.context.StaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; +import org.rumbledb.types.SequenceType.Arity; import java.io.Serializable; import java.util.Arrays; @@ -43,6 +44,16 @@ public class SequenceType implements Serializable { Arity.ZeroOrMore ); + public final static SequenceType OBJECTS = new SequenceType( + BuiltinTypesCatalogue.objectItem, + Arity.ZeroOrMore + ); + + public final static SequenceType FUNCTION = new SequenceType( + BuiltinTypesCatalogue.anyFunctionItem, + Arity.One + ); + public final static SequenceType ITEM = new SequenceType( BuiltinTypesCatalogue.item, Arity.One diff --git a/src/main/java/sparksoniq/spark/ml/AnnotateFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/AnnotateFunctionIterator.java index 7841915ff..d22a1b53e 100644 --- a/src/main/java/sparksoniq/spark/ml/AnnotateFunctionIterator.java +++ b/src/main/java/sparksoniq/spark/ml/AnnotateFunctionIterator.java @@ -3,9 +3,8 @@ import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidInstanceException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -21,10 +20,9 @@ public class AnnotateFunctionIterator extends DataFrameRuntimeIterator { public AnnotateFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override diff --git a/src/main/java/sparksoniq/spark/ml/ApplyEstimatorRuntimeIterator.java b/src/main/java/sparksoniq/spark/ml/ApplyEstimatorRuntimeIterator.java index 7e4be7bc3..05dad6ca1 100644 --- a/src/main/java/sparksoniq/spark/ml/ApplyEstimatorRuntimeIterator.java +++ b/src/main/java/sparksoniq/spark/ml/ApplyEstimatorRuntimeIterator.java @@ -11,7 +11,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidRumbleMLParamException; import org.rumbledb.exceptions.MLNotADataFrameException; import org.rumbledb.exceptions.OurBadException; @@ -24,6 +24,7 @@ import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.FunctionSignature; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import java.lang.reflect.InvocationTargetException; import java.util.Arrays; @@ -48,10 +49,9 @@ public class ApplyEstimatorRuntimeIterator extends AtMostOneItemLocalRuntimeIter public ApplyEstimatorRuntimeIterator( String estimatorShortName, Estimator estimator, - ExecutionMode executionMode, - ExceptionMetadata metadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, metadata); + super(null, staticContext); this.estimatorShortName = estimatorShortName; this.estimator = estimator; } @@ -346,8 +346,12 @@ private Item generateTransformerFunctionItem(Transformer fittedModel, DynamicCon RuntimeIterator bodyIterator = new ApplyTransformerRuntimeIterator( RumbleMLCatalog.getRumbleMLShortName(fittedModel.getClass().getName()), fittedModel, - ExecutionMode.DATAFRAME, - getMetadata() + new RuntimeStaticContext( + getConfiguration(), + new SequenceType(BuiltinTypesCatalogue.anyFunctionItem, Arity.One), + ExecutionMode.DATAFRAME, + getMetadata() + ) ); List paramTypes = Collections.unmodifiableList( Arrays.asList( diff --git a/src/main/java/sparksoniq/spark/ml/ApplyTransformerRuntimeIterator.java b/src/main/java/sparksoniq/spark/ml/ApplyTransformerRuntimeIterator.java index dc6f2c203..81e288c59 100644 --- a/src/main/java/sparksoniq/spark/ml/ApplyTransformerRuntimeIterator.java +++ b/src/main/java/sparksoniq/spark/ml/ApplyTransformerRuntimeIterator.java @@ -11,12 +11,11 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.InvalidRumbleMLParamException; import org.rumbledb.exceptions.MLNotADataFrameException; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.RumbleException; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.DataFrameRuntimeIterator; import org.rumbledb.types.BuiltinTypesCatalogue; @@ -44,10 +43,9 @@ public class ApplyTransformerRuntimeIterator extends DataFrameRuntimeIterator { public ApplyTransformerRuntimeIterator( String transformerShortName, Transformer transformer, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(null, executionMode, iteratorMetadata); + super(null, staticContext); this.transformerShortName = transformerShortName; this.transformer = transformer; } diff --git a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java index cca023a44..90933724f 100644 --- a/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java +++ b/src/main/java/sparksoniq/spark/ml/BinaryClassificationMetricsFunctionIterator.java @@ -9,12 +9,14 @@ import org.apache.spark.mllib.evaluation.BinaryClassificationMetrics; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.AtMostOneItemLocalRuntimeIterator; import org.rumbledb.runtime.ConstantRDDRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; +import org.rumbledb.types.SequenceType; import scala.Tuple2; @@ -24,10 +26,9 @@ public class BinaryClassificationMetricsFunctionIterator extends AtMostOneItemLo public BinaryClassificationMetricsFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata metadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, metadata); + super(arguments, staticContext); } @Override @@ -55,19 +56,34 @@ public Item materializeFirstItemOrNull(DynamicContext context) { objectItem.putItemByKey("areaUnderPR", ItemFactory.getInstance().createDoubleItem(bcm.areaUnderPR())); objectItem.putItemByKey("areaUnderROC", ItemFactory.getInstance().createDoubleItem(bcm.areaUnderROC())); JavaRDD rdd = tupleToArrays(bcm.pr().toJavaRDD(), "recall", "precision"); - RuntimeIterator it = new ConstantRDDRuntimeIterator(rdd, getMetadata()); + RuntimeIterator it = new ConstantRDDRuntimeIterator( + rdd, + new RuntimeStaticContext(getConfiguration(), SequenceType.OBJECTS, ExecutionMode.RDD, getMetadata()) + ); objectItem.putLazyItemByKey("pr", it, context, true); rdd = tupleToArrays(bcm.fMeasureByThreshold().toJavaRDD(), "threshold", "F-Measure"); - it = new ConstantRDDRuntimeIterator(rdd, getMetadata()); + it = new ConstantRDDRuntimeIterator( + rdd, + new RuntimeStaticContext(getConfiguration(), SequenceType.OBJECTS, ExecutionMode.RDD, getMetadata()) + ); objectItem.putLazyItemByKey("fMeasureByThreshold", it, context, true); rdd = tupleToArrays(bcm.precisionByThreshold().toJavaRDD(), "threshold", "precision"); - it = new ConstantRDDRuntimeIterator(rdd, getMetadata()); + it = new ConstantRDDRuntimeIterator( + rdd, + new RuntimeStaticContext(getConfiguration(), SequenceType.OBJECTS, ExecutionMode.RDD, getMetadata()) + ); objectItem.putLazyItemByKey("precisionByThreshold", it, context, true); rdd = tupleToArrays(bcm.recallByThreshold().toJavaRDD(), "threshold", "recall"); - it = new ConstantRDDRuntimeIterator(rdd, getMetadata()); + it = new ConstantRDDRuntimeIterator( + rdd, + new RuntimeStaticContext(getConfiguration(), SequenceType.OBJECTS, ExecutionMode.RDD, getMetadata()) + ); objectItem.putLazyItemByKey("recallByThreshold", it, context, true); rdd = tupleToArrays(bcm.roc().toJavaRDD(), "false positive rate", "true positive rate"); - it = new ConstantRDDRuntimeIterator(rdd, getMetadata()); + it = new ConstantRDDRuntimeIterator( + rdd, + new RuntimeStaticContext(getConfiguration(), SequenceType.OBJECTS, ExecutionMode.RDD, getMetadata()) + ); objectItem.putLazyItemByKey("roc", it, context, true); return objectItem; diff --git a/src/main/java/sparksoniq/spark/ml/GetEstimatorFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/GetEstimatorFunctionIterator.java index 6a32ac4b3..b163effc9 100644 --- a/src/main/java/sparksoniq/spark/ml/GetEstimatorFunctionIterator.java +++ b/src/main/java/sparksoniq/spark/ml/GetEstimatorFunctionIterator.java @@ -25,7 +25,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.items.FunctionItem; @@ -55,10 +55,9 @@ public class GetEstimatorFunctionIterator extends AtMostOneItemLocalRuntimeItera public GetEstimatorFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata metadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, metadata); + super(arguments, staticContext); } @Override @@ -111,8 +110,12 @@ public Item materializeFirstItemOrNull( RuntimeIterator bodyIterator = new ApplyEstimatorRuntimeIterator( estimatorShortName, estimator, - ExecutionMode.LOCAL, - getMetadata() + new RuntimeStaticContext( + getConfiguration(), + SequenceType.FUNCTION, + ExecutionMode.LOCAL, + getMetadata() + ) ); List paramTypes = Collections.unmodifiableList( Arrays.asList( diff --git a/src/main/java/sparksoniq/spark/ml/GetTransformerFunctionIterator.java b/src/main/java/sparksoniq/spark/ml/GetTransformerFunctionIterator.java index db5a03a89..6bb0626cc 100644 --- a/src/main/java/sparksoniq/spark/ml/GetTransformerFunctionIterator.java +++ b/src/main/java/sparksoniq/spark/ml/GetTransformerFunctionIterator.java @@ -25,7 +25,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.Name; -import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.RumbleException; import org.rumbledb.expressions.ExecutionMode; @@ -57,10 +57,9 @@ public class GetTransformerFunctionIterator extends AtMostOneItemLocalRuntimeIte public GetTransformerFunctionIterator( List arguments, - ExecutionMode executionMode, - ExceptionMetadata iteratorMetadata + RuntimeStaticContext staticContext ) { - super(arguments, executionMode, iteratorMetadata); + super(arguments, staticContext); } @Override @@ -120,8 +119,12 @@ public Item materializeFirstItemOrNull( RuntimeIterator bodyIterator = new ApplyTransformerRuntimeIterator( transformerShortName, transformer, - ExecutionMode.DATAFRAME, - getMetadata() + new RuntimeStaticContext( + getConfiguration(), + SequenceType.OBJECTS, + ExecutionMode.DATAFRAME, + getMetadata() + ) ); List paramTypes = Collections.unmodifiableList( Arrays.asList( From cbbe33f959b131d0621a25a70030d6ef3e9a06ed Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 27 Apr 2023 16:09:49 +0200 Subject: [PATCH 044/136] Add new file. --- .../context/RuntimeStaticContext.java | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 src/main/java/org/rumbledb/context/RuntimeStaticContext.java diff --git a/src/main/java/org/rumbledb/context/RuntimeStaticContext.java b/src/main/java/org/rumbledb/context/RuntimeStaticContext.java new file mode 100644 index 000000000..c80a9e230 --- /dev/null +++ b/src/main/java/org/rumbledb/context/RuntimeStaticContext.java @@ -0,0 +1,61 @@ +package org.rumbledb.context; + +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.exceptions.ExceptionMetadata; +import org.rumbledb.exceptions.OurBadException; +import org.rumbledb.expressions.ExecutionMode; +import org.rumbledb.types.SequenceType; + +public class RuntimeStaticContext { + private RumbleRuntimeConfiguration configuration; + private SequenceType staticType; + private ExecutionMode executionMode; + private ExceptionMetadata metadata; + + public RuntimeStaticContext( + RumbleRuntimeConfiguration configuration, + SequenceType staticType, + ExecutionMode executionMode, + ExceptionMetadata metadata + ) { + this.configuration = configuration; + this.staticType = staticType; + this.executionMode = executionMode; + this.metadata = metadata; + } + + public RuntimeStaticContext( + RumbleRuntimeConfiguration configuration, + ExecutionMode executionMode, + ExceptionMetadata metadata + ) { + this.configuration = configuration; + this.staticType = null; + this.executionMode = executionMode; + this.metadata = metadata; + } + + public RumbleRuntimeConfiguration getConfiguration() { + return this.configuration; + } + + public SequenceType getStaticType() { + if (this.staticType == null) { + throw new OurBadException("Clauses do not have static types."); + } + return this.staticType; + } + + public ExecutionMode getExecutionMode() { + return this.executionMode; + } + + public void setExecutionMode(ExecutionMode mode) { + this.executionMode = mode; + } + + public ExceptionMetadata getMetadata() { + return this.metadata; + } + +} From 25109fc71d29621d91056dcd4fd339b8705ff236 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 27 Apr 2023 16:19:26 +0200 Subject: [PATCH 045/136] Fix reflection call. --- src/main/java/org/rumbledb/context/NamedFunctions.java | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/rumbledb/context/NamedFunctions.java b/src/main/java/org/rumbledb/context/NamedFunctions.java index d4b0fae58..8d9aaa52f 100644 --- a/src/main/java/org/rumbledb/context/NamedFunctions.java +++ b/src/main/java/org/rumbledb/context/NamedFunctions.java @@ -220,10 +220,12 @@ public static RuntimeIterator getBuiltInFunctionIterator( Constructor constructor = builtinFunction.getFunctionIteratorClass() .getConstructor( List.class, - ExecutionMode.class, - ExceptionMetadata.class + RuntimeStaticContext.class ); - functionCallIterator = constructor.newInstance(arguments, executionMode, metadata); + functionCallIterator = constructor.newInstance( + arguments, + new RuntimeStaticContext(conf, builtinFunction.getSignature().getReturnType(), executionMode, metadata) + ); } catch (ReflectiveOperationException ex) { RuntimeException e = new UnknownFunctionCallException( identifier.getName(), From ca8cdd3c622deee18c7cc17b417e06c17afb24a5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 27 Apr 2023 16:31:28 +0200 Subject: [PATCH 046/136] Make runtime static context serializable. --- .../java/org/rumbledb/context/RuntimeStaticContext.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/context/RuntimeStaticContext.java b/src/main/java/org/rumbledb/context/RuntimeStaticContext.java index c80a9e230..e5cce1f65 100644 --- a/src/main/java/org/rumbledb/context/RuntimeStaticContext.java +++ b/src/main/java/org/rumbledb/context/RuntimeStaticContext.java @@ -1,12 +1,16 @@ package org.rumbledb.context; +import java.io.Serializable; + import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.types.SequenceType; -public class RuntimeStaticContext { +public class RuntimeStaticContext implements Serializable { + private static final long serialVersionUID = 1L; + private RumbleRuntimeConfiguration configuration; private SequenceType staticType; private ExecutionMode executionMode; From e850bcbf74f48b913a67d4a0523640cf40e5039c Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 27 Apr 2023 16:47:46 +0200 Subject: [PATCH 047/136] Fixed test metadata. --- .../InlineFunctionDefinition-Error5.jq | 2 +- .../InlineFunctionDefinition-Error6.jq | 2 +- .../FunctionUserDefinedDynamic/NamedFunctionRef-Error14.jq | 2 +- .../FunctionUserDefinedDynamic/NamedFunctionRef-Error15.jq | 2 +- .../FunctionUserDefinedStatic-Error5.jq | 2 +- .../FunctionUserDefinedStatic-Error6.jq | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/InlineFunctionDefinition-Error5.jq b/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/InlineFunctionDefinition-Error5.jq index a72204378..694c52b88 100644 --- a/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/InlineFunctionDefinition-Error5.jq +++ b/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/InlineFunctionDefinition-Error5.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:2:COLUMN:0:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:2:COLUMN:64:" :) function($i as integer?, $j as decimal) as double* {$i + $j} (3,()) (: Invalid argument. Expecting one item, but the value provided is the empty sequence. :) diff --git a/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/InlineFunctionDefinition-Error6.jq b/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/InlineFunctionDefinition-Error6.jq index ac9a32c24..5ee909afb 100644 --- a/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/InlineFunctionDefinition-Error6.jq +++ b/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/InlineFunctionDefinition-Error6.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:2:COLUMN:0:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:2:COLUMN:78:" :) function($i as string?, $j as double) as string* {$i || ($j cast as string)} ({"hello": "world!"}, 2e3) (: Invalid argument. object cannot be promoted to type string?. :) diff --git a/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/NamedFunctionRef-Error14.jq b/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/NamedFunctionRef-Error14.jq index fce30c7ab..5547f9a44 100644 --- a/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/NamedFunctionRef-Error14.jq +++ b/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/NamedFunctionRef-Error14.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:0:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:8:" :) declare function fn ($i as double?, $j as decimal) as double+ {$i + $j}; fn#2(3, ()) diff --git a/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/NamedFunctionRef-Error15.jq b/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/NamedFunctionRef-Error15.jq index b120140e6..076492869 100644 --- a/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/NamedFunctionRef-Error15.jq +++ b/src/test/resources/test_files/runtime/FunctionUserDefinedDynamic/NamedFunctionRef-Error15.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:0:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:8:" :) declare function fn ($i as double?, $j as decimal) as double+ {$i + $j}; fn#2(3, "hello") diff --git a/src/test/resources/test_files/runtime/FunctionUserDefinedStatic/FunctionUserDefinedStatic-Error5.jq b/src/test/resources/test_files/runtime/FunctionUserDefinedStatic/FunctionUserDefinedStatic-Error5.jq index 01ddf7960..f7fc981c9 100644 --- a/src/test/resources/test_files/runtime/FunctionUserDefinedStatic/FunctionUserDefinedStatic-Error5.jq +++ b/src/test/resources/test_files/runtime/FunctionUserDefinedStatic/FunctionUserDefinedStatic-Error5.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:0:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:9:" :) declare function price($x as decimal?, $y as double) as double* { $x + $y }; price(1, "hello") diff --git a/src/test/resources/test_files/runtime/FunctionUserDefinedStatic/FunctionUserDefinedStatic-Error6.jq b/src/test/resources/test_files/runtime/FunctionUserDefinedStatic/FunctionUserDefinedStatic-Error6.jq index 4e819aef8..b2a8b06c8 100644 --- a/src/test/resources/test_files/runtime/FunctionUserDefinedStatic/FunctionUserDefinedStatic-Error6.jq +++ b/src/test/resources/test_files/runtime/FunctionUserDefinedStatic/FunctionUserDefinedStatic-Error6.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:0:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:9:" :) declare function price($x as decimal, $y as double) as double? { $x + $y }; price(1, ()) From 181c9b3020014470e324c3a7d33d46ad3b89409d Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:11:52 +0200 Subject: [PATCH 048/136] Fix tests. --- .../compiler/RuntimeIteratorVisitor.java | 6 ++-- .../org/rumbledb/compiler/VisitorHelpers.java | 2 +- .../config/RumbleRuntimeConfiguration.java | 31 ++++++++++++++----- .../clauses/ReturnClauseSparkIterator.java | 7 ++++- src/test/java/iq/LocalRuntimeTests.java | 4 +-- .../PartialFunctionApplication-Error2.jq | 2 +- .../NamedFunctionRefRDD-Error3.jq | 2 +- .../NamedFunctionRefRDD-Error4.jq | 2 +- 8 files changed, 39 insertions(+), 17 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 6cf674c4c..b90c6c762 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -55,6 +55,7 @@ import org.rumbledb.expressions.flowr.LetClause; import org.rumbledb.expressions.flowr.OrderByClause; import org.rumbledb.expressions.flowr.OrderByClauseSortingKey; +import org.rumbledb.expressions.flowr.ReturnClause; import org.rumbledb.expressions.flowr.WhereClause; import org.rumbledb.expressions.logic.AndExpression; import org.rumbledb.expressions.logic.NotExpression; @@ -208,13 +209,14 @@ public RuntimeIterator visitFlowrExpression(FlworExpression expression, RuntimeI expression.getReturnClause().getPreviousClause(), argument ); + ReturnClause returnClause = expression.getReturnClause(); RuntimeIterator runtimeIterator = new ReturnClauseSparkIterator( previous, this.visit( - (expression.getReturnClause()).getReturnExpr(), + returnClause.getReturnExpr(), argument ), - expression.getStaticContextForRuntime(this.config, this.visitorConfig) + returnClause.getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 7e035b869..9f9f9ae41 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -313,7 +313,7 @@ private static void populateExecutionModes(Module module, RumbleRuntimeConfigura if (conf.isPrintIteratorTree()) { printTree(module, conf); } - if (conf.localExecutionOnly()) { + if (!conf.parallelExecution()) { LocalExecutionModeVisitor visitor = new LocalExecutionModeVisitor(conf); visitor.visit(module, module.getStaticContext()); if (conf.isPrintIteratorTree()) { diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java index b338da2a8..0fc4e57be 100644 --- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java +++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java @@ -68,7 +68,8 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl private boolean dataFrameExecutionModeDetection; private boolean datesWithTimeZone; private boolean optimizeGeneralComparisonToValueComparison; - private boolean localExecutionOnly; + private boolean parallelExecution; + private boolean dataFrameExecution; private boolean nativeExecution; private boolean thirdFeature; @@ -396,10 +397,16 @@ public void init() { this.datesWithTimeZone = false; } - if (this.arguments.containsKey("local-execution-only")) { - this.localExecutionOnly = this.arguments.get("local-execution-only").equals("yes"); + if (this.arguments.containsKey("parallel-execution")) { + this.parallelExecution = this.arguments.get("parallel-execution").equals("yes"); } else { - this.localExecutionOnly = false; + this.parallelExecution = true; + } + + if (this.arguments.containsKey("data-frame-execution")) { + this.dataFrameExecution = this.arguments.get("data-frame-execution").equals("yes"); + } else { + this.dataFrameExecution = true; } if (this.arguments.containsKey("native-execution")) { @@ -598,12 +605,20 @@ public void setDateWithTimezone(boolean b) { this.datesWithTimeZone = b; } - public boolean localExecutionOnly() { - return this.localExecutionOnly; + public boolean parallelExecution() { + return this.parallelExecution; + } + + public void setParallelExecution(boolean b) { + this.parallelExecution = b; + } + + public boolean dataFrameExecution() { + return this.dataFrameExecution; } - public void setLocalExecutionOnly(boolean b) { - this.localExecutionOnly = b; + public void setDataFrameExecution(boolean b) { + this.dataFrameExecution = b; } public boolean nativeExecution() { diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java index b7f56d93c..d73957388 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java @@ -203,7 +203,12 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { } JavaRDD rdd = getRDDAux(context); - return ValidateTypeIterator.convertRDDToValidDataFrame(rdd, getStaticType().getItemType(), context, false); + return ValidateTypeIterator.convertRDDToValidDataFrame( + rdd, + expression.getStaticType().getItemType(), + context, + false + ); } @Override diff --git a/src/test/java/iq/LocalRuntimeTests.java b/src/test/java/iq/LocalRuntimeTests.java index c8d0af7ff..b0418c6d8 100644 --- a/src/test/java/iq/LocalRuntimeTests.java +++ b/src/test/java/iq/LocalRuntimeTests.java @@ -66,8 +66,8 @@ public class LocalRuntimeTests extends AnnotationsTestsBase { "yes", "--variable:externalUnparsedString", "unparsed string", - "--local-execution-only", - "yes" } + "--parallel-execution", + "no" } ).setExternalVariableValue( Name.createVariableInNoNamespace("externalStringItem"), Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) diff --git a/src/test/resources/test_files/runtime-spark/FunctionPartialApplication/PartialFunctionApplication-Error2.jq b/src/test/resources/test_files/runtime-spark/FunctionPartialApplication/PartialFunctionApplication-Error2.jq index 8dc9fdba0..6d5f760af 100644 --- a/src/test/resources/test_files/runtime-spark/FunctionPartialApplication/PartialFunctionApplication-Error2.jq +++ b/src/test/resources/test_files/runtime-spark/FunctionPartialApplication/PartialFunctionApplication-Error2.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:4:COLUMN:7:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:4:COLUMN:27:" :) declare function fn ($i as double?, $j as integer, $k as decimal) as double+ {$i + $j + $k}; for $i in parallelize((5, 10, "hello")) return fn(3, ?, ?) (5, ?) ($i) diff --git a/src/test/resources/test_files/runtime-spark/FunctionUserDefinedDynamic/NamedFunctionRefRDD-Error3.jq b/src/test/resources/test_files/runtime-spark/FunctionUserDefinedDynamic/NamedFunctionRefRDD-Error3.jq index 03611c315..b1b42bb6a 100644 --- a/src/test/resources/test_files/runtime-spark/FunctionUserDefinedDynamic/NamedFunctionRefRDD-Error3.jq +++ b/src/test/resources/test_files/runtime-spark/FunctionUserDefinedDynamic/NamedFunctionRefRDD-Error3.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:12:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:20:" :) declare function fn ($i as double?, $j as decimal) as double+ {$i + $j}; parallelize(fn#2(3, ())) diff --git a/src/test/resources/test_files/runtime-spark/FunctionUserDefinedDynamic/NamedFunctionRefRDD-Error4.jq b/src/test/resources/test_files/runtime-spark/FunctionUserDefinedDynamic/NamedFunctionRefRDD-Error4.jq index 6c7ba4ac5..eb27785d0 100644 --- a/src/test/resources/test_files/runtime-spark/FunctionUserDefinedDynamic/NamedFunctionRefRDD-Error4.jq +++ b/src/test/resources/test_files/runtime-spark/FunctionUserDefinedDynamic/NamedFunctionRefRDD-Error4.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:12:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:20:" :) declare function fn ($i as double?, $j as decimal) as double+ {$i + $j}; parallelize(fn#2(3, "hello")) From 8aa427d0b9ff2407c6bff65cac47362b88cad430 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:18:04 +0200 Subject: [PATCH 049/136] Add native execution flag. --- .../flwor/clauses/ForClauseSparkIterator.java | 23 ++++++------ .../clauses/GroupByClauseSparkIterator.java | 22 +++++++----- .../clauses/JoinClauseSparkIterator.java | 7 ++-- .../flwor/clauses/LetClauseSparkIterator.java | 35 ++++++++++++------- .../clauses/OrderByClauseSparkIterator.java | 17 +++++---- .../clauses/ReturnClauseSparkIterator.java | 15 ++++---- .../clauses/WhereClauseSparkIterator.java | 13 ++++--- .../runtime/navigation/PredicateIterator.java | 5 ++- 8 files changed, 84 insertions(+), 53 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java index 4c4011abd..c968f1be4 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java @@ -611,16 +611,19 @@ private FlworDataFrame getDataFrameInParallel( variableNamesToExclude ); - FlworDataFrame nativeQueryResult = tryNativeQuery( - df, - this.variableName, - this.positionalVariableName, - this.allowingEmpty, - this.assignmentIterator, - allColumns, - inputSchema, - context - ); + FlworDataFrame nativeQueryResult = null; + if (getConfiguration().nativeExecution()) { + nativeQueryResult = tryNativeQuery( + df, + this.variableName, + this.positionalVariableName, + this.allowingEmpty, + this.assignmentIterator, + allColumns, + inputSchema, + context + ); + } if (nativeQueryResult != null) { return nativeQueryResult; } diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java index 4537e3c34..0dcc983f3 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java @@ -288,7 +288,8 @@ public FlworDataFrame getDataFrame( context, new ArrayList(this.child.getOutputTupleVariableNames()), null, - false + false, + getConfiguration() ); @@ -310,14 +311,17 @@ public FlworDataFrame getDataFrame( String input = FlworDataFrameUtils.createTempView(df); - Dataset nativeQueryResult = tryNativeQuery( - df, - variableAccessNames, - this.outputTupleProjection, - inputSchema, - context, - input - ); + Dataset nativeQueryResult = null; + if (getConfiguration().nativeExecution()) { + nativeQueryResult = tryNativeQuery( + df, + variableAccessNames, + this.outputTupleProjection, + inputSchema, + context, + input + ); + } if (nativeQueryResult != null) { return new FlworDataFrame(nativeQueryResult); diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/JoinClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/JoinClauseSparkIterator.java index fb898ca12..b0477fad0 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/JoinClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/JoinClauseSparkIterator.java @@ -47,6 +47,7 @@ import org.rumbledb.runtime.primary.ArrayRuntimeIterator; import org.rumbledb.types.SequenceType; + import sparksoniq.jsoniq.tuple.FlworTuple; import sparksoniq.spark.SparkSessionManager; @@ -254,7 +255,8 @@ public static FlworDataFrame joinInputTupleWithSequenceOnPredicate( context, variablesInRightInputTuple, null, - true + true, + conf ); leftInputTuple = LetClauseSparkIterator.bindLetVariableInDataFrame( leftInputTuple, @@ -264,7 +266,8 @@ public static FlworDataFrame joinInputTupleWithSequenceOnPredicate( context, variablesInLeftInputTuple, null, - true + true, + conf ); } diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java index e527d48c7..8f4e9c098 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/LetClauseSparkIterator.java @@ -27,6 +27,7 @@ import org.apache.spark.sql.types.DataTypes; import org.apache.spark.sql.types.StructType; import org.rumbledb.api.Item; +import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; @@ -206,7 +207,8 @@ public FlworDataFrame getDataFrame( ? Collections.emptyList() : new ArrayList(this.child.getOutputTupleVariableNames()), this.outputTupleProjection, - false + false, + getConfiguration() ); return new FlworDataFrame(result); @@ -337,7 +339,8 @@ public FlworDataFrame getDataFrameAsJoin( context, Collections.singletonList(Name.CONTEXT_ITEM), null, - true + true, + getConfiguration() ); inputDF = LetClauseSparkIterator.bindLetVariableInDataFrame( @@ -350,7 +353,8 @@ public FlworDataFrame getDataFrameAsJoin( ? Collections.emptyList() : new ArrayList(this.child.getOutputTupleVariableNames()), null, - true + true, + getConfiguration() ); // We group the right-hand-side of the join by hash to prepare the left outer join. @@ -465,7 +469,8 @@ public FlworDataFrame getDataFrameAsJoin( context, new ArrayList(this.getOutputTupleVariableNames()), parentProjection, - false + false, + getConfiguration() ); return new FlworDataFrame(inputDF); @@ -578,7 +583,8 @@ public static Dataset bindLetVariableInDataFrame( DynamicContext context, List variablesInInputTuple, Map outputTupleVariableDependencies, - boolean hash + boolean hash, + RumbleRuntimeConfiguration conf ) { StructType inputSchema = dataFrame.schema(); // inputSchema.printTreeString(); @@ -596,14 +602,17 @@ public static Dataset bindLetVariableInDataFrame( // if we can (depending on the expression) use let natively without UDF if (!hash) { - Dataset nativeQueryResult = tryNativeQuery( - dataFrame, - newVariableName, - newVariableExpression, - allColumns, - inputSchema, - context - ); + Dataset nativeQueryResult = null; + if (conf.nativeExecution()) { + nativeQueryResult = tryNativeQuery( + dataFrame, + newVariableName, + newVariableExpression, + allColumns, + inputSchema, + context + ); + } if (nativeQueryResult != null) { return nativeQueryResult; diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index 7547a0d2c..9a9e1eba4 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -237,13 +237,16 @@ public FlworDataFrame getDataFrame( null ); - FlworDataFrame nativeQueryResult = tryNativeQuery( - df, - this.expressionsWithIterator, - allColumns, - inputSchema, - context - ); + FlworDataFrame nativeQueryResult = null; + if (getConfiguration().nativeExecution()) { + nativeQueryResult = tryNativeQuery( + df, + this.expressionsWithIterator, + allColumns, + inputSchema, + context + ); + } if (nativeQueryResult != null) { return nativeQueryResult; } diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java index d73957388..4f12c3304 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java @@ -176,12 +176,15 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { Dataset df = this.child.getDataFrame(context).getDataFrame(); StructType inputSchema = df.schema(); - Dataset nativeQueryResult = tryNativeQuery( - df, - this.expression, - inputSchema, - context - ); + Dataset nativeQueryResult = null; + if (getConfiguration().nativeExecution()) { + nativeQueryResult = tryNativeQuery( + df, + this.expression, + inputSchema, + context + ); + } if (nativeQueryResult != null) { if (getStaticType().getItemType().isObjectItemType()) { String input = FlworDataFrameUtils.createTempView(nativeQueryResult); diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/WhereClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/WhereClauseSparkIterator.java index 3980a9833..23a926857 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/WhereClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/WhereClauseSparkIterator.java @@ -174,11 +174,14 @@ public FlworDataFrame getDataFrame( FlworDataFrame df = this.child.getDataFrame(context); // StructType inputSchema = df.schema(); - FlworDataFrame nativeQueryResult = tryNativeQuery( - df, - this.expression, - context - ); + FlworDataFrame nativeQueryResult = null; + if (getConfiguration().nativeExecution()) { + nativeQueryResult = tryNativeQuery( + df, + this.expression, + context + ); + } if (nativeQueryResult != null) { return nativeQueryResult; } diff --git a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java index bbe5e0491..12e08d93b 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java @@ -245,7 +245,10 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { childDataFrame.getDataFrame().schema(), context ); - NativeClauseContext nativeQuery = filter.generateNativeQuery(nativeClauseContext); + NativeClauseContext nativeQuery = NativeClauseContext.NoNativeQuery; + if (getConfiguration().nativeExecution()) { + nativeQuery = filter.generateNativeQuery(nativeClauseContext); + } if (nativeQuery == NativeClauseContext.NoNativeQuery) { if (this.isBooleanOnlyFilter) { String left = FlworDataFrameUtils.createTempView(childDataFrame.getDataFrame()); From 5ed6ff0819728f8cce54916d65af709011f054f7 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:21:54 +0200 Subject: [PATCH 050/136] Fix test. --- .../runtime/flwor/clauses/ReturnClauseSparkIterator.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java index 4f12c3304..fce7328a6 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java @@ -186,7 +186,7 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { ); } if (nativeQueryResult != null) { - if (getStaticType().getItemType().isObjectItemType()) { + if (this.expression.getStaticType().getItemType().isObjectItemType()) { String input = FlworDataFrameUtils.createTempView(nativeQueryResult); nativeQueryResult = nativeQueryResult.sparkSession() @@ -208,7 +208,7 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { JavaRDD rdd = getRDDAux(context); return ValidateTypeIterator.convertRDDToValidDataFrame( rdd, - expression.getStaticType().getItemType(), + this.expression.getStaticType().getItemType(), context, false ); From a03b7bbc9a0619781e9049e441bfd1b0bc9091e5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:24:33 +0200 Subject: [PATCH 051/136] Fix test. --- .../runtime/flwor/clauses/ReturnClauseSparkIterator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java index fce7328a6..21419ec60 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ReturnClauseSparkIterator.java @@ -200,7 +200,7 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { } JSoundDataFrame result = new JSoundDataFrame( nativeQueryResult, - getStaticType().getItemType() + this.expression.getStaticType().getItemType() ); return result; } From ee442362c787f04d21e9dfc0dc1081646621b139 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:25:40 +0200 Subject: [PATCH 052/136] Bump jackson version. --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index cc67b9bf2..8aa8e9fee 100644 --- a/pom.xml +++ b/pom.xml @@ -285,7 +285,7 @@ com.fasterxml.jackson.dataformat jackson-dataformat-yaml - 2.12.3 + 2.13.4 From 6a1dfe2cadfa6c8d0b72c7382a12ab905a2aa4e4 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:27:05 +0200 Subject: [PATCH 053/136] Bump spark version. --- pom.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/pom.xml b/pom.xml index 8aa8e9fee..9f4e7a0cc 100644 --- a/pom.xml +++ b/pom.xml @@ -200,19 +200,19 @@ org.apache.spark spark-core_2.12 - 3.2.2 + 3.2.4 provided org.apache.spark spark-sql_2.12 - 3.2.2 + 3.2.4 provided org.apache.spark spark-mllib_2.12 - 3.2.2 + 3.2.4 provided @@ -224,7 +224,7 @@ org.apache.spark spark-avro_2.12 - 3.2.2 + 3.2.4 org.antlr From e9791482855836d600e6a49b2b9c8e8666548d22 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:35:32 +0200 Subject: [PATCH 054/136] Try executing FLWOR tests with native SQL deactivated. --- .github/workflows/maven.yml | 24 ++++++ ...iveFLWORRuntimeTestsNativeDeactivated.java | 86 +++++++++++++++++++ 2 files changed, 110 insertions(+) create mode 100644 src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index a40f105e1..67ce16388 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -74,3 +74,27 @@ jobs: run: mvn -Dtest=SparkRuntimeTests test - name: NativeFLWORRuntimeTests run: mvn -Dtest=NativeFLWORRuntimeTests test + + tests3: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + - name: Set up Java 11 + uses: actions/setup-java@v3 + with: + java-version: 11 + distribution: adopt + - name: Cache Maven packages + uses: actions/cache@v3 + with: + path: ~/.m2 + key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }} + restore-keys: ${{ runner.os }}-m2 + - name: Install with Maven + run: mvn install -DskipTests -Dgpg.skip --quiet + - name: Compile with Maven + run: mvn clean compile assembly:single + - name: NativeFLWORRuntimeTestsNativeDeactivated + run: mvn -Dtest=NativeFLWORRuntimeTestsNativeDeactivated test diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java new file mode 100644 index 000000000..cf178e23e --- /dev/null +++ b/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java @@ -0,0 +1,86 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import iq.base.AnnotationsTestsBase; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class NativeFLWORRuntimeTestsNativeDeactivated extends RuntimeTests { + + protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--native-execution", + "no" + } + ); + + public static final File nativeFlworRuntimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-native-flwor" + ); + + public NativeFLWORRuntimeTestsNativeDeactivated(File testFile) { + super(testFile); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + _testFiles.clear(); + readFileList(nativeFlworRuntimeTestsDirectory); + _testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } + + @Test(timeout = 1000000) + public void testRuntimeIterators() throws Throwable { + System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); + testAnnotations(this.testFile.getAbsolutePath(), NativeFLWORRuntimeTestsNativeDeactivated.configuration); + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput = runIterators(sequence); + Assert.assertTrue( + "Expected output: " + expectedOutput + " Actual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + } +} From c4d476160bbc75d79d31dd7fc4b7b69ac2b1a3df Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:56:34 +0200 Subject: [PATCH 055/136] Fix tests. --- .../rumbledb/compiler/RuntimeIteratorVisitor.java | 2 +- .../java/org/rumbledb/runtime/RuntimeIterator.java | 5 +++++ .../NativeFLWORRuntimeTestsNativeDeactivated.java | 14 +++++++------- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index b90c6c762..ba5246f0b 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -216,7 +216,7 @@ public RuntimeIterator visitFlowrExpression(FlworExpression expression, RuntimeI returnClause.getReturnExpr(), argument ), - returnClause.getStaticContextForRuntime(this.config, this.visitorConfig) + returnClause.getReturnExpr().getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; diff --git a/src/main/java/org/rumbledb/runtime/RuntimeIterator.java b/src/main/java/org/rumbledb/runtime/RuntimeIterator.java index 4975c079f..764433985 100644 --- a/src/main/java/org/rumbledb/runtime/RuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/RuntimeIterator.java @@ -74,6 +74,11 @@ public abstract class RuntimeIterator implements RuntimeIteratorInterface, KryoS protected RuntimeIterator(List children, RuntimeStaticContext staticContext) { this.staticContext = staticContext; + if (this.staticContext.getStaticType() == null) { + throw new OurBadException( + "Runtime iterator created without a static type! " + this.getClass().getCanonicalName() + ); + } this.isOpen = false; this.children = new ArrayList<>(); if (children != null && !children.isEmpty()) { diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java index cf178e23e..70384b0b0 100644 --- a/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java +++ b/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java @@ -38,13 +38,13 @@ public class NativeFLWORRuntimeTestsNativeDeactivated extends RuntimeTests { protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( new String[] { - "--variable:externalUnparsedString", - "unparsed string", - "--escape-backticks", - "yes", - "--native-execution", - "no" - } + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--native-execution", + "no" + } ); public static final File nativeFlworRuntimeTestsDirectory = new File( From c19bee03bc0f2f65b54b66c1e4f13f1c7d3d0ed4 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 14:57:21 +0200 Subject: [PATCH 056/136] Fix tests. --- src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index b90c6c762..ba5246f0b 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -216,7 +216,7 @@ public RuntimeIterator visitFlowrExpression(FlworExpression expression, RuntimeI returnClause.getReturnExpr(), argument ), - returnClause.getStaticContextForRuntime(this.config, this.visitorConfig) + returnClause.getReturnExpr().getStaticContextForRuntime(this.config, this.visitorConfig) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; From f3b30520dc84c3081e0b5d733cff717ca0aad6b8 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 15:16:20 +0200 Subject: [PATCH 057/136] Spotless. --- .../org/rumbledb/compiler/RuntimeIteratorVisitor.java | 8 +++++++- src/main/java/org/rumbledb/expressions/flowr/Clause.java | 3 --- 2 files changed, 7 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index ba5246f0b..4613772f4 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -25,6 +25,7 @@ import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.Name; import org.rumbledb.context.NamedFunctions; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.errorcodes.ErrorCode; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; @@ -216,7 +217,12 @@ public RuntimeIterator visitFlowrExpression(FlworExpression expression, RuntimeI returnClause.getReturnExpr(), argument ), - returnClause.getReturnExpr().getStaticContextForRuntime(this.config, this.visitorConfig) + new RuntimeStaticContext( + this.config, + expression.getStaticSequenceType(), + returnClause.getHighestExecutionMode(this.visitorConfig), + returnClause.getMetadata() + ) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; diff --git a/src/main/java/org/rumbledb/expressions/flowr/Clause.java b/src/main/java/org/rumbledb/expressions/flowr/Clause.java index 58cfec4a1..dc282c283 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/Clause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/Clause.java @@ -171,9 +171,6 @@ public void print(StringBuffer buffer, int indent) { for (Node iterator : getChildren()) { iterator.print(buffer, indent + 1); } - if (this.previousClause != null) { - this.previousClause.print(buffer, indent + 1); - } } public StaticContext getStaticContext() { From 5f26ef5cf5f8da473ae5ec75fe635d1ae6098bb5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 15:17:24 +0200 Subject: [PATCH 058/136] Spotless. --- .../org/rumbledb/compiler/RuntimeIteratorVisitor.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index ba5246f0b..4613772f4 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -25,6 +25,7 @@ import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.context.Name; import org.rumbledb.context.NamedFunctions; +import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.errorcodes.ErrorCode; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; @@ -216,7 +217,12 @@ public RuntimeIterator visitFlowrExpression(FlworExpression expression, RuntimeI returnClause.getReturnExpr(), argument ), - returnClause.getReturnExpr().getStaticContextForRuntime(this.config, this.visitorConfig) + new RuntimeStaticContext( + this.config, + expression.getStaticSequenceType(), + returnClause.getHighestExecutionMode(this.visitorConfig), + returnClause.getMetadata() + ) ); runtimeIterator.setStaticContext(expression.getStaticContext()); return runtimeIterator; From eac75b899ff6f4c74e7ea12e4be4829901c602e3 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 15:35:08 +0200 Subject: [PATCH 059/136] Fix test. --- src/main/java/org/rumbledb/compiler/CloneVisitor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java index f30c9b063..a2dfb359f 100644 --- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -286,6 +286,7 @@ public Node visitObjectConstructor(ObjectConstructorExpression expression, Node expression.getMetadata() ); result.setStaticContext(expression.getStaticContext()); + result.setStaticSequenceType(expression.getStaticSequenceType()); return result; } else { List keys = expression.getKeys() From a060f1ce171e7a5b6ad8ad17b4f9e58ef333070b Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 15:35:53 +0200 Subject: [PATCH 060/136] Remove unused import. --- src/main/java/org/rumbledb/types/SequenceType.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/rumbledb/types/SequenceType.java b/src/main/java/org/rumbledb/types/SequenceType.java index d5cadfaa4..d7def82cd 100644 --- a/src/main/java/org/rumbledb/types/SequenceType.java +++ b/src/main/java/org/rumbledb/types/SequenceType.java @@ -26,7 +26,6 @@ import org.rumbledb.context.StaticContext; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.types.SequenceType.Arity; import java.io.Serializable; import java.util.Arrays; From 0b98f29a2a8ba8a3ec0a21d056394e95e2de554d Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 28 Apr 2023 17:44:58 +0200 Subject: [PATCH 061/136] Fix tests. --- .../navigation/ArrayLookupIterator.java | 41 ++++++++++++++++ .../navigation/ArrayUnboxingIterator.java | 29 ++++++++++++ .../navigation/ObjectLookupIterator.java | 47 +++++++++++++------ .../runtime-native-flwor/for/For1Error.jq | 4 -- .../runtime-native-flwor/for/for14.jq | 4 ++ .../{GroupBy5Error.jq => GroupBy5.jq} | 2 +- .../let/{Let1Error.jq => let11.jq} | 2 +- .../let/{Let2Error.jq => let12.jq} | 2 +- .../object-lookup/{ol4error.jq => ol4.jq} | 2 +- 9 files changed, 110 insertions(+), 23 deletions(-) delete mode 100644 src/test/resources/test_files/runtime-native-flwor/for/For1Error.jq create mode 100644 src/test/resources/test_files/runtime-native-flwor/for/for14.jq rename src/test/resources/test_files/runtime-native-flwor/group-by/{GroupBy5Error.jq => GroupBy5.jq} (50%) rename src/test/resources/test_files/runtime-native-flwor/let/{Let1Error.jq => let11.jq} (66%) rename src/test/resources/test_files/runtime-native-flwor/let/{Let2Error.jq => let12.jq} (64%) rename src/test/resources/test_files/runtime-native-flwor/object-lookup/{ol4error.jq => ol4.jq} (55%) diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java index 9e2c98581..90137c404 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java @@ -20,6 +20,7 @@ package org.rumbledb.runtime.navigation; +import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; import org.apache.spark.sql.types.ArrayType; @@ -29,6 +30,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.errorcodes.ErrorCode; import org.rumbledb.exceptions.*; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -186,11 +188,37 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ItemType resultType = newContext.getResultingType().getItemType(); if (!(resultType.isArrayItemType())) { + if(getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "This is not a sequence of arrays," + + " so that the lookup will always result in the empty sequence no matter what. " + + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); + } + LogManager.getLogger("ArrayLookupIterator") + .warn( + "Array lookup on a DataFrame that does not an array type. Empty sequence returned." + ); return NativeClauseContext.NoNativeQuery; } schema = newContext.getSchema(); if (!(schema instanceof ArrayType)) { + if(getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "This is not a sequence of arrays," + + " so that the lookup will always result in the empty sequence no matter what. " + + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); + } + LogManager.getLogger("ArrayLookupIterator") + .warn( + "Array lookup on a DataFrame that does not an array type. Empty sequence returned." + ); return NativeClauseContext.NoNativeQuery; } newContext.setResultingType( @@ -239,6 +267,19 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { elementType ); } + if(getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "This is not a sequence of arrays," + + " so that the lookup will always result in the empty sequence no matter what. " + + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); + } + LogManager.getLogger("ArrayLookupIterator") + .warn( + "Array lookup on a DataFrame that does not an array type. Empty sequence returned." + ); return JSoundDataFrame.emptyDataFrame(); } } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java index 8e6efdc87..fd4217b79 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java @@ -20,13 +20,16 @@ package org.rumbledb.runtime.navigation; +import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; import org.apache.spark.sql.types.ArrayType; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.errorcodes.ErrorCode; import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.exceptions.UnexpectedStaticTypeException; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -139,6 +142,19 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ItemType newContextType = newContext.getResultingType().getItemType(); if (!newContextType.isArrayItemType()) { // let control to UDF when what we are unboxing is not an array + if(getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "This is not a sequence of arrays," + + " so that the lookup will always result in the empty sequence no matter what. " + + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); + } + LogManager.getLogger("ArrayUnboxingIterator") + .warn( + "Array unboxing on a DataFrame that does not an array type. Empty sequence returned." + ); return NativeClauseContext.NoNativeQuery; } newContext.setResultingType( @@ -190,6 +206,19 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { elementType ); } + if(getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "This is not a sequence of arrays," + + " so that the lookup will always result in the empty sequence no matter what. " + + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); + } + LogManager.getLogger("ArrayUnboxingIterator") + .warn( + "Array unboxing on a DataFrame that does not an array type. Empty sequence returned." + ); return JSoundDataFrame.emptyDataFrame(); } } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index 9e24e51e1..8609252c6 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -20,6 +20,7 @@ package org.rumbledb.runtime.navigation; +import org.apache.log4j.LogManager; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.function.FlatMapFunction; import org.apache.spark.sql.types.DataType; @@ -278,14 +279,20 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC String key = this.lookupKey.getStringValue().replace("`", FlworDataFrameUtils.backtickEscape); if (!(leftSchema instanceof StructType)) { if (this.children.get(1) instanceof StringRuntimeIterator) { - throw new UnexpectedStaticTypeException( - "You are trying to look up the value associated with the field " - + key - + ". However, the left-hand-side cannot contain any objects and it will always return the empty sequence! " - + "Fortunately Rumble was able to catch this. This is probably an overlook? " - + "Please check your query and try again.", - ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, - getMetadata() + if(getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "You are trying to look up the value associated with the field " + + key + + ". However, the left-hand-side cannot contain any objects and it will always return the empty sequence! " + + "Fortunately Rumble was able to catch this. This is probably an overlook? " + + "Please check your query and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); + } + LogManager.getLogger("ObjectLookupIterator") + .warn( + "Object lookup on a DataFrame that does not have this column. Empty sequence returned." ); } return NativeClauseContext.NoNativeQuery; @@ -305,14 +312,20 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ); } else { if (this.children.get(1) instanceof StringRuntimeIterator) { - throw new UnexpectedStaticTypeException( - "There is no field with the name " - + key - + " so that the lookup will always result in the empty sequence no matter what. " - + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", - ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, - getMetadata() + LogManager.getLogger("ObjectLookupIterator") + .warn( + "Object lookup on a DataFrame that does not have this column. Empty sequence returned." ); + if(getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "There is no field with the name " + + key + + " so that the lookup will always result in the empty sequence no matter what. " + + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); + } } return NativeClauseContext.NoNativeQuery; } @@ -357,6 +370,10 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { return result; } } + LogManager.getLogger("ObjectLookupIterator") + .warn( + "Object lookup on a DataFrame that does not have this column. Empty sequence returned." + ); JSoundDataFrame result = JSoundDataFrame.emptyDataFrame(); return result; } diff --git a/src/test/resources/test_files/runtime-native-flwor/for/For1Error.jq b/src/test/resources/test_files/runtime-native-flwor/for/For1Error.jq deleted file mode 100644 index 453ed84cd..000000000 --- a/src/test/resources/test_files/runtime-native-flwor/for/For1Error.jq +++ /dev/null @@ -1,4 +0,0 @@ -(:JIQS: ShouldCrash; ErrorCode="XPST0005"; ErrorMetadata="LINE:3:COLUMN:10:" :) -for $x in annotate({"foo":2},{"foo":"integer"}) -for $y in $x.foobar[] -return $x \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-native-flwor/for/for14.jq b/src/test/resources/test_files/runtime-native-flwor/for/for14.jq new file mode 100644 index 000000000..c2ad7879c --- /dev/null +++ b/src/test/resources/test_files/runtime-native-flwor/for/for14.jq @@ -0,0 +1,4 @@ +(:JIQS: ShouldRun; Output="" :) +for $x in annotate({"foo":2},{"foo":"integer"}) +for $y in $x.foobar[] +return $x \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy5Error.jq b/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy5.jq similarity index 50% rename from src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy5Error.jq rename to src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy5.jq index 4015cd50d..1874a3db8 100644 --- a/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy5Error.jq +++ b/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy5.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPST0005"; ErrorMetadata="LINE:3:COLUMN:15:" :) +(:JIQS: ShouldRun; Output="{ "foo" : 2 }" :) for $x in annotate({"foo":2},{"foo":"integer"}) group by $y := $x.foobar return $x \ No newline at end of file diff --git a/src/test/resources/test_files/runtime-native-flwor/let/Let1Error.jq b/src/test/resources/test_files/runtime-native-flwor/let/let11.jq similarity index 66% rename from src/test/resources/test_files/runtime-native-flwor/let/Let1Error.jq rename to src/test/resources/test_files/runtime-native-flwor/let/let11.jq index 3f253586b..b9a02e94f 100644 --- a/src/test/resources/test_files/runtime-native-flwor/let/Let1Error.jq +++ b/src/test/resources/test_files/runtime-native-flwor/let/let11.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPST0005"; ErrorMetadata="LINE:6:COLUMN:10:" :) +(:JIQS: ShouldRun; Output="" :) declare type local:mytype as {"foo":{"bar": "integer" }}; for $x in validate type local:mytype* { {"foo":{ "bar" : 2}} diff --git a/src/test/resources/test_files/runtime-native-flwor/let/Let2Error.jq b/src/test/resources/test_files/runtime-native-flwor/let/let12.jq similarity index 64% rename from src/test/resources/test_files/runtime-native-flwor/let/Let2Error.jq rename to src/test/resources/test_files/runtime-native-flwor/let/let12.jq index 59a78e736..c96d18ac4 100644 --- a/src/test/resources/test_files/runtime-native-flwor/let/Let2Error.jq +++ b/src/test/resources/test_files/runtime-native-flwor/let/let12.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPST0005"; ErrorMetadata="LINE:6:COLUMN:10:" :) +(:JIQS: ShouldRun; Output="" :) declare type local:mytype as {"foo": ["integer"]}; for $x in validate type local:mytype* { {"foo":[ 2, 3 ] } diff --git a/src/test/resources/test_files/runtime-native-flwor/object-lookup/ol4error.jq b/src/test/resources/test_files/runtime-native-flwor/object-lookup/ol4.jq similarity index 55% rename from src/test/resources/test_files/runtime-native-flwor/object-lookup/ol4error.jq rename to src/test/resources/test_files/runtime-native-flwor/object-lookup/ol4.jq index d3e426ba9..69d78c93f 100644 --- a/src/test/resources/test_files/runtime-native-flwor/object-lookup/ol4error.jq +++ b/src/test/resources/test_files/runtime-native-flwor/object-lookup/ol4.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPST0005"; ErrorMetadata="LINE:3:COLUMN:10:" :) +(:JIQS: ShouldRun; Output="" :) for $i in structured-json-file("../../../queries/denormalized.json") let $c := $i.wrongkey return $c From ed467b6bdca4bcf47c295b74e5e1a183d628fe3e Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 3 May 2023 16:03:09 +0200 Subject: [PATCH 062/136] Spotless. --- .../navigation/ArrayLookupIterator.java | 24 ++++---- .../navigation/ArrayUnboxingIterator.java | 16 +++--- .../navigation/ObjectLookupIterator.java | 56 +++++++++---------- 3 files changed, 48 insertions(+), 48 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java index 90137c404..5aec4653a 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayLookupIterator.java @@ -188,7 +188,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ItemType resultType = newContext.getResultingType().getItemType(); if (!(resultType.isArrayItemType())) { - if(getConfiguration().doStaticAnalysis()) { + if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( "This is not a sequence of arrays," + " so that the lookup will always result in the empty sequence no matter what. " @@ -198,15 +198,15 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ); } LogManager.getLogger("ArrayLookupIterator") - .warn( - "Array lookup on a DataFrame that does not an array type. Empty sequence returned." - ); + .warn( + "Array lookup on a DataFrame that does not an array type. Empty sequence returned." + ); return NativeClauseContext.NoNativeQuery; } schema = newContext.getSchema(); if (!(schema instanceof ArrayType)) { - if(getConfiguration().doStaticAnalysis()) { + if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( "This is not a sequence of arrays," + " so that the lookup will always result in the empty sequence no matter what. " @@ -216,9 +216,9 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ); } LogManager.getLogger("ArrayLookupIterator") - .warn( - "Array lookup on a DataFrame that does not an array type. Empty sequence returned." - ); + .warn( + "Array lookup on a DataFrame that does not an array type. Empty sequence returned." + ); return NativeClauseContext.NoNativeQuery; } newContext.setResultingType( @@ -267,7 +267,7 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { elementType ); } - if(getConfiguration().doStaticAnalysis()) { + if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( "This is not a sequence of arrays," + " so that the lookup will always result in the empty sequence no matter what. " @@ -277,9 +277,9 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { ); } LogManager.getLogger("ArrayLookupIterator") - .warn( - "Array lookup on a DataFrame that does not an array type. Empty sequence returned." - ); + .warn( + "Array lookup on a DataFrame that does not an array type. Empty sequence returned." + ); return JSoundDataFrame.emptyDataFrame(); } } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java index fd4217b79..ba12801d7 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ArrayUnboxingIterator.java @@ -142,7 +142,7 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ItemType newContextType = newContext.getResultingType().getItemType(); if (!newContextType.isArrayItemType()) { // let control to UDF when what we are unboxing is not an array - if(getConfiguration().doStaticAnalysis()) { + if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( "This is not a sequence of arrays," + " so that the lookup will always result in the empty sequence no matter what. " @@ -152,9 +152,9 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC ); } LogManager.getLogger("ArrayUnboxingIterator") - .warn( - "Array unboxing on a DataFrame that does not an array type. Empty sequence returned." - ); + .warn( + "Array unboxing on a DataFrame that does not an array type. Empty sequence returned." + ); return NativeClauseContext.NoNativeQuery; } newContext.setResultingType( @@ -206,7 +206,7 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { elementType ); } - if(getConfiguration().doStaticAnalysis()) { + if (getConfiguration().doStaticAnalysis()) { throw new UnexpectedStaticTypeException( "This is not a sequence of arrays," + " so that the lookup will always result in the empty sequence no matter what. " @@ -216,9 +216,9 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { ); } LogManager.getLogger("ArrayUnboxingIterator") - .warn( - "Array unboxing on a DataFrame that does not an array type. Empty sequence returned." - ); + .warn( + "Array unboxing on a DataFrame that does not an array type. Empty sequence returned." + ); return JSoundDataFrame.emptyDataFrame(); } } diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index 8609252c6..e4d221213 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -279,21 +279,21 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC String key = this.lookupKey.getStringValue().replace("`", FlworDataFrameUtils.backtickEscape); if (!(leftSchema instanceof StructType)) { if (this.children.get(1) instanceof StringRuntimeIterator) { - if(getConfiguration().doStaticAnalysis()) { - throw new UnexpectedStaticTypeException( - "You are trying to look up the value associated with the field " - + key - + ". However, the left-hand-side cannot contain any objects and it will always return the empty sequence! " - + "Fortunately Rumble was able to catch this. This is probably an overlook? " - + "Please check your query and try again.", - ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, - getMetadata() - ); + if (getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "You are trying to look up the value associated with the field " + + key + + ". However, the left-hand-side cannot contain any objects and it will always return the empty sequence! " + + "Fortunately Rumble was able to catch this. This is probably an overlook? " + + "Please check your query and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); } LogManager.getLogger("ObjectLookupIterator") - .warn( - "Object lookup on a DataFrame that does not have this column. Empty sequence returned." - ); + .warn( + "Object lookup on a DataFrame that does not have this column. Empty sequence returned." + ); } return NativeClauseContext.NoNativeQuery; } @@ -313,18 +313,18 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC } else { if (this.children.get(1) instanceof StringRuntimeIterator) { LogManager.getLogger("ObjectLookupIterator") - .warn( - "Object lookup on a DataFrame that does not have this column. Empty sequence returned." - ); - if(getConfiguration().doStaticAnalysis()) { - throw new UnexpectedStaticTypeException( - "There is no field with the name " - + key - + " so that the lookup will always result in the empty sequence no matter what. " - + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", - ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, - getMetadata() - ); + .warn( + "Object lookup on a DataFrame that does not have this column. Empty sequence returned." + ); + if (getConfiguration().doStaticAnalysis()) { + throw new UnexpectedStaticTypeException( + "There is no field with the name " + + key + + " so that the lookup will always result in the empty sequence no matter what. " + + "Fortunately Rumble was able to catch this. This is probably a typo? Please check the spelling and try again.", + ErrorCode.StaticallyInferredEmptySequenceNotFromCommaExpression, + getMetadata() + ); } } return NativeClauseContext.NoNativeQuery; @@ -371,9 +371,9 @@ public JSoundDataFrame getDataFrame(DynamicContext context) { } } LogManager.getLogger("ObjectLookupIterator") - .warn( - "Object lookup on a DataFrame that does not have this column. Empty sequence returned." - ); + .warn( + "Object lookup on a DataFrame that does not have this column. Empty sequence returned." + ); JSoundDataFrame result = JSoundDataFrame.emptyDataFrame(); return result; } From 5f4969db38114ea114e7751686b656538d42df96 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 3 May 2023 16:41:09 +0200 Subject: [PATCH 063/136] Duplicate test. --- src/test/resources/test_files/runtime-native-flwor/let/let10.jq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/test_files/runtime-native-flwor/let/let10.jq b/src/test/resources/test_files/runtime-native-flwor/let/let10.jq index feff67846..f6b436e87 100644 --- a/src/test/resources/test_files/runtime-native-flwor/let/let10.jq +++ b/src/test/resources/test_files/runtime-native-flwor/let/let10.jq @@ -7,4 +7,4 @@ let $g := $i.foo let $h := $g.bar let $j := $h[[1]] group by $j -return count($j) \ No newline at end of file +return count($i) \ No newline at end of file From 3b020a22348e8fc53011a223b7c4f697c4142733 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 3 May 2023 16:50:21 +0200 Subject: [PATCH 064/136] Fix test. --- .../clauses/GroupByClauseSparkIterator.java | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java index 0dcc983f3..e995791a3 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java @@ -538,6 +538,11 @@ private Dataset tryNativeQuery( for (Map.Entry entry : dependencies.entrySet()) { selectString.append(sep); sep = ", "; + if (groupingVariables.contains(entry.getKey())) { + // we are considering one of the grouping variables + selectString.append(entry.getKey().toString()); + continue; + } if (FlworDataFrameUtils.isVariableAvailableAsCountOnly(inputSchema, entry.getKey())) { // we are summing over a previous count selectString.append("sum(`"); @@ -547,7 +552,9 @@ private Dataset tryNativeQuery( selectString.append(entry.getKey().toString()); selectString.append(".count"); selectString.append("`"); - } else if (entry.getValue() == DynamicContext.VariableDependency.COUNT) { + continue; + } + if (entry.getValue() == DynamicContext.VariableDependency.COUNT) { if (FlworDataFrameUtils.isVariableAvailableAsNativeSequence(inputSchema, entry.getKey())) { FlworDataFrameColumn dfColumnSequence = new FlworDataFrameColumn( entry.getKey(), @@ -558,36 +565,33 @@ private Dataset tryNativeQuery( selectString.append(dfColumnSequence); selectString.append(")) as "); selectString.append(dfColumnCount); - } else { - // we need a count - selectString.append("count(`"); - selectString.append(entry.getKey().toString()); - selectString.append("`) as `"); - selectString.append(entry.getKey().toString()); - selectString.append(".count`"); + continue; } - } else if (FlworDataFrameUtils.isVariableAvailableAsNativeSequence(inputSchema, entry.getKey())) { + // we need a count + selectString.append("count(`"); + selectString.append(entry.getKey().toString()); + selectString.append("`) as `"); + selectString.append(entry.getKey().toString()); + selectString.append(".count`"); + } + if (FlworDataFrameUtils.isVariableAvailableAsNativeSequence(inputSchema, entry.getKey())) { // we cannot merge arrays natively in Spark, strangely. return null; - } else if (groupingVariables.contains(entry.getKey())) { - // we are considering one of the grouping variables - selectString.append(entry.getKey().toString()); - } else { - // we collect all the values, if it is a binary object we just switch over to udf - FlworDataFrameColumn dfColumnSequence = new FlworDataFrameColumn( - entry.getKey(), - ColumnFormat.NATIVE_SEQUENCE - ); - String columnName = entry.getKey().toString(); - StructField field = inputSchema.fields()[inputSchema.fieldIndex(columnName)]; - if (field.dataType().equals(DataTypes.BinaryType)) { - return null; - } - selectString.append("collect_list("); - selectString.append(columnName); - selectString.append(") as "); - selectString.append(dfColumnSequence); } + // we collect all the values, if it is a binary object we just switch over to udf + FlworDataFrameColumn dfColumnSequence = new FlworDataFrameColumn( + entry.getKey(), + ColumnFormat.NATIVE_SEQUENCE + ); + String columnName = entry.getKey().toString(); + StructField field = inputSchema.fields()[inputSchema.fieldIndex(columnName)]; + if (field.dataType().equals(DataTypes.BinaryType)) { + return null; + } + selectString.append("collect_list("); + selectString.append(columnName); + selectString.append(") as "); + selectString.append(dfColumnSequence); } LogManager.getLogger("GroupByClauseSparkIterator") .info("Rumble was able to optimize a group by clause to a native SQL query."); From 659d81ce5bf13273701c7bce39b6b848769f1117 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 3 May 2023 16:51:21 +0200 Subject: [PATCH 065/136] Add test. --- .../test_files/runtime-native-flwor/let/let13.jq | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 src/test/resources/test_files/runtime-native-flwor/let/let13.jq diff --git a/src/test/resources/test_files/runtime-native-flwor/let/let13.jq b/src/test/resources/test_files/runtime-native-flwor/let/let13.jq new file mode 100644 index 000000000..97c8217ff --- /dev/null +++ b/src/test/resources/test_files/runtime-native-flwor/let/let13.jq @@ -0,0 +1,10 @@ +(:JIQS: ShouldRun; Output="1" :) +declare type local:mytype as {"foo":{"bar":["integer"]}}; +for $i in validate type local:mytype* { + for $j in 1 to 10 return {"foo":{"bar":[ 1 to $j ]}} +} +let $g := $i.foo +let $h := $g.bar +let $j := $h[[1]] +group by $j +return count($j) \ No newline at end of file From 54369a06a49006426bfaea4845d923550e6c7058 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 09:30:36 +0200 Subject: [PATCH 066/136] Update GroupByClauseSparkIterator.java --- .../runtime/flwor/clauses/GroupByClauseSparkIterator.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java index e995791a3..6290c6b7b 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java @@ -573,6 +573,7 @@ private Dataset tryNativeQuery( selectString.append("`) as `"); selectString.append(entry.getKey().toString()); selectString.append(".count`"); + continue; } if (FlworDataFrameUtils.isVariableAvailableAsNativeSequence(inputSchema, entry.getKey())) { // we cannot merge arrays natively in Spark, strangely. From 9405645e1615a76177bfd2a745a56db7d97d58c6 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 10:56:51 +0200 Subject: [PATCH 067/136] Inline functions. --- .../compiler/FunctionDependenciesVisitor.java | 129 +++++++ .../compiler/FunctionInliningVisitor.java | 352 ++++++++++++++++++ .../org/rumbledb/compiler/VisitorHelpers.java | 22 +- .../module/FunctionDeclaration.java | 9 + 4 files changed, 501 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/rumbledb/compiler/FunctionDependenciesVisitor.java create mode 100644 src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java diff --git a/src/main/java/org/rumbledb/compiler/FunctionDependenciesVisitor.java b/src/main/java/org/rumbledb/compiler/FunctionDependenciesVisitor.java new file mode 100644 index 000000000..9419063ab --- /dev/null +++ b/src/main/java/org/rumbledb/compiler/FunctionDependenciesVisitor.java @@ -0,0 +1,129 @@ +package org.rumbledb.compiler; + +import org.jgrapht.Graph; +import org.jgrapht.alg.connectivity.KosarajuStrongConnectivityInspector; +import org.jgrapht.alg.interfaces.StrongConnectivityAlgorithm; +import org.jgrapht.graph.DefaultDirectedGraph; +import org.jgrapht.graph.DefaultEdge; +import org.rumbledb.context.FunctionIdentifier; +import org.rumbledb.expressions.AbstractNodeVisitor; +import org.rumbledb.expressions.flowr.*; +import org.rumbledb.expressions.module.FunctionDeclaration; +import org.rumbledb.expressions.module.LibraryModule; +import org.rumbledb.expressions.module.MainModule; +import org.rumbledb.expressions.module.Prolog; +import org.rumbledb.expressions.primary.FunctionCallExpression; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class FunctionDependenciesVisitor extends AbstractNodeVisitor { + + @Override + public FunctionIdentifier visitForClause(ForClause clause, FunctionIdentifier argument) { + return this.visit(clause.getExpression(), argument); + } + + @Override + public FunctionIdentifier visitLetClause(LetClause clause, FunctionIdentifier argument) { + return this.visit(clause.getExpression(), argument); + } + + @Override + public FunctionIdentifier visitGroupByClause(GroupByClause clause, FunctionIdentifier argument) { + for (GroupByVariableDeclaration variable : clause.getGroupVariables()) { + if (variable.getExpression() != null) { + this.visit(variable.getExpression(), argument); + } + } + return argument; + } + + public FunctionIdentifier visitOrderByClause(OrderByClause clause, FunctionIdentifier argument) { + for (OrderByClauseSortingKey orderClause : clause.getSortingKeys()) { + this.visit(orderClause.getExpression(), argument); + } + return argument; + } + + @Override + public FunctionIdentifier visitFlowrExpression(FlworExpression expression, FunctionIdentifier argument) { + Clause clause = expression.getReturnClause().getFirstClause(); + while (clause != null) { + this.visit(clause, argument); + clause = clause.getNextClause(); + } + return argument; + } + + private final Map> edges; + private final Map functionDeclarations; + + FunctionDependenciesVisitor() { + this.edges = new HashMap<>(); + this.functionDeclarations = new HashMap<>(); + } + + private void createVertex(FunctionIdentifier name) { + this.edges.put(name, new ArrayList<>()); + } + + private void createEdge(FunctionIdentifier source, FunctionIdentifier target) { + this.edges.get(source).add(target); + } + + @Override + public FunctionIdentifier visitMainModule(MainModule expression, FunctionIdentifier argument) { + visitDescendants(expression, argument); + Graph directedGraph = + new DefaultDirectedGraph<>(DefaultEdge.class); + this.edges.keySet().forEach(directedGraph::addVertex); + this.edges.keySet() + .forEach( + key -> this.edges.get(key) + .stream() + .filter(this.edges::containsKey) + .forEach(value -> directedGraph.addEdge(key, value)) + ); + StrongConnectivityAlgorithm scAlg = + new KosarajuStrongConnectivityInspector<>(directedGraph); + // every vertex in a strongly connected component corresponds to a cyclic function call + List> stronglyConnectedComponents = + scAlg.getStronglyConnectedComponents(); + stronglyConnectedComponents.stream() + .filter(subGraph -> subGraph.edgeSet().size() > 0) + .flatMap(subGraph -> subGraph.vertexSet().stream()) + .forEach(name -> this.functionDeclarations.get(name).setRecursive(true)); + return null; + } + + @Override + public FunctionIdentifier visitProlog(Prolog prolog, FunctionIdentifier argument) { + for (FunctionDeclaration declaration : prolog.getFunctionDeclarations()) { + visit(declaration, null); + } + for (LibraryModule libraryModule : prolog.getImportedModules()) { + visit(libraryModule, null); + } + return null; + } + + public FunctionIdentifier visitFunctionDeclaration(FunctionDeclaration expression, FunctionIdentifier argument) { + FunctionIdentifier name = expression.getFunctionIdentifier(); + this.functionDeclarations.put(name, expression); + createVertex(name); + visit(expression.getExpression(), name); + return argument; + } + + public FunctionIdentifier visitFunctionCall(FunctionCallExpression expression, FunctionIdentifier argument) { + if (argument == null) { + return defaultAction(expression, null); + } + createEdge(argument, expression.getFunctionIdentifier()); + visitDescendants(expression, argument); + return argument; + } +} diff --git a/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java b/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java new file mode 100644 index 000000000..738b54252 --- /dev/null +++ b/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java @@ -0,0 +1,352 @@ +package org.rumbledb.compiler; + +import org.rumbledb.context.FunctionIdentifier; +import org.rumbledb.context.Name; +import org.rumbledb.errorcodes.ErrorCode; +import org.rumbledb.expressions.Expression; +import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.control.TypeSwitchExpression; +import org.rumbledb.expressions.control.TypeswitchCase; +import org.rumbledb.expressions.flowr.Clause; +import org.rumbledb.expressions.flowr.FlworExpression; +import org.rumbledb.expressions.flowr.LetClause; +import org.rumbledb.expressions.flowr.ReturnClause; +import org.rumbledb.expressions.module.FunctionDeclaration; +import org.rumbledb.expressions.module.LibraryModule; +import org.rumbledb.expressions.module.MainModule; +import org.rumbledb.expressions.module.Prolog; +import org.rumbledb.expressions.primary.FunctionCallExpression; +import org.rumbledb.expressions.primary.InlineFunctionExpression; +import org.rumbledb.expressions.primary.VariableReferenceExpression; +import org.rumbledb.expressions.typing.CastExpression; +import org.rumbledb.expressions.typing.TreatExpression; +import org.rumbledb.types.BuiltinTypesCatalogue; +import org.rumbledb.types.SequenceType; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + + +public class FunctionInliningVisitor extends CloneVisitor { + + private final FunctionDependenciesVisitor functionDependenciesVisitor; + + public FunctionInliningVisitor() { + this.functionDependenciesVisitor = new FunctionDependenciesVisitor(); + } + + private FunctionDeclaration getFunctionDeclarationFromProlog(Prolog prolog, FunctionIdentifier functionIdentifier) { + for (FunctionDeclaration declaration : prolog.getFunctionDeclarations()) { + if (declaration.getFunctionIdentifier().equals(functionIdentifier)) { + return declaration; + } + } + for (LibraryModule module : prolog.getImportedModules()) { + FunctionDeclaration result = getFunctionDeclarationFromProlog(module.getProlog(), functionIdentifier); + if (result != null) { + return result; + } + } + return null; + } + + private boolean isVariableReferenced(Node expression, Name name) { + if (expression instanceof VariableReferenceExpression) { + return ((VariableReferenceExpression) expression).getVariableName().equals(name); + } + if (expression instanceof Clause) { + if ( + ((Clause) expression).getPreviousClause() != null + && isVariableReferenced(((Clause) expression).getPreviousClause(), name) + ) { + return true; + } + } + for (Node child : expression.getChildren()) { + if (isVariableReferenced(child, name)) { + return true; + } + } + return false; + } + + private boolean isVariableReferenced(List expressions, Name name, int index) { + for (int i = 0; i < index; i++) { + if (isVariableReferenced(expressions.get(i), name)) { + return true; + } + } + return false; + } + + private static boolean allArgumentsMatch(FunctionCallExpression expression, List paramNames) { + boolean allArgumentsMatch = true; + for (int i = 0; i < expression.getArguments().size(); i++) { + allArgumentsMatch = allArgumentsMatch + && expression.getArguments().get(i) instanceof VariableReferenceExpression + && paramNames.get(i) + .equals(((VariableReferenceExpression) expression.getArguments().get(i)).getVariableName()); + } + return allArgumentsMatch; + } + + private Expression createTypePromotion( + Expression expression, + SequenceType paramType + ) { + // integer > decimal > double + if (paramType.getItemType() == BuiltinTypesCatalogue.doubleItem) { + List cases = new ArrayList<>(); + cases.add( + new TypeswitchCase( + null, + Collections.singletonList(SequenceType.createSequenceType("integer?")), + new CastExpression( + expression, + SequenceType.createSequenceType("double?"), + expression.getMetadata() + ) + ) + ); + cases.add( + new TypeswitchCase( + null, + Collections.singletonList(SequenceType.createSequenceType("decimal?")), + new CastExpression( + expression, + SequenceType.createSequenceType("double?"), + expression.getMetadata() + ) + ) + ); + cases.add( + new TypeswitchCase( + null, + Collections.singletonList(SequenceType.createSequenceType("double?")), + expression + ) + ); + TypeSwitchExpression typeSwitchExpression = new TypeSwitchExpression( + expression, + cases, + new TypeswitchCase( + null, + new TreatExpression( + expression, + paramType, + ErrorCode.UnexpectedTypeErrorCode, + expression.getMetadata() + ) + ), + expression.getMetadata() + ); + typeSwitchExpression.setStaticSequenceType(paramType); + return typeSwitchExpression; + } + if (paramType.getItemType() == BuiltinTypesCatalogue.decimalItem) { + List cases = new ArrayList<>(); + cases.add( + new TypeswitchCase( + null, + Collections.singletonList(SequenceType.createSequenceType("integer?")), + new CastExpression( + expression, + SequenceType.createSequenceType("decimal?"), + expression.getMetadata() + ) + ) + ); + cases.add( + new TypeswitchCase( + null, + Collections.singletonList(SequenceType.createSequenceType("decimal?")), + expression + ) + ); + TypeSwitchExpression typeSwitchExpression = new TypeSwitchExpression( + expression, + cases, + new TypeswitchCase( + null, + new TreatExpression( + expression, + paramType, + ErrorCode.UnexpectedTypeErrorCode, + expression.getMetadata() + ) + ), + expression.getMetadata() + ); + typeSwitchExpression.setStaticSequenceType(paramType); + return typeSwitchExpression; + } + // anyURI > string + if (paramType.getItemType() == BuiltinTypesCatalogue.stringItem) { + List cases = new ArrayList<>(); + cases.add( + new TypeswitchCase( + null, + Collections.singletonList(SequenceType.createSequenceType("anyURI?")), + new CastExpression( + expression, + SequenceType.createSequenceType("string?"), + expression.getMetadata() + ) + ) + ); + cases.add( + new TypeswitchCase( + null, + Collections.singletonList(SequenceType.createSequenceType("string?")), + expression + ) + ); + TypeSwitchExpression typeSwitchExpression = new TypeSwitchExpression( + expression, + cases, + new TypeswitchCase( + null, + new TreatExpression( + expression, + paramType, + ErrorCode.UnexpectedTypeErrorCode, + expression.getMetadata() + ) + ), + expression.getMetadata() + ); + typeSwitchExpression.setStaticSequenceType(paramType); + return typeSwitchExpression; + } + return expression; + } + + @Override + public Node visitMainModule(MainModule mainModule, Node argument) { + this.functionDependenciesVisitor.visit(mainModule, null); + MainModule result = new MainModule( + mainModule.getProlog(), + (Expression) visit(mainModule.getExpression(), mainModule.getProlog()), + mainModule.getMetadata() + ); + result.setStaticContext(mainModule.getStaticContext()); + return result; + } + + @Override + public Node visitFunctionCall(FunctionCallExpression expression, Node argument) { + FunctionDeclaration targetFunction = getFunctionDeclarationFromProlog( + (Prolog) argument, + expression.getFunctionIdentifier() + ); + if (expression.isPartialApplication() || targetFunction == null || targetFunction.isRecursive()) { + List arguments = new ArrayList<>(); + for (Expression arg : expression.getArguments()) { + arguments.add(arg == null ? null : (Expression) visit(arg, argument)); + } + FunctionCallExpression result = new FunctionCallExpression( + expression.getFunctionName(), + arguments, + expression.getMetadata() + ); + result.setStaticSequenceType(expression.getStaticSequenceType()); + return result; + } + InlineFunctionExpression inlineFunction = (InlineFunctionExpression) targetFunction.getExpression(); + Expression body = (Expression) visit(inlineFunction.getBody(), argument); + List paramNames = new ArrayList<>(inlineFunction.getParams().keySet()); + if (expression.getArguments().size() == 0 || allArgumentsMatch(expression, paramNames)) { + if (inlineFunction.getReturnType() != null) { + return new TreatExpression( + body, + inlineFunction.getReturnType(), + ErrorCode.UnexpectedTypeErrorCode, + expression.getMetadata() + ); + } + return body; + } + body.setStaticSequenceType(inlineFunction.getReturnType()); + ReturnClause returnClause = new ReturnClause(body, expression.getMetadata()); + Clause expressionClauses = null; + Clause assignmentClauses = null; + for (int i = 0; i < expression.getArguments().size(); i++) { + Name paramName = paramNames.get(i); + SequenceType paramType = inlineFunction.getParams().get(paramName); + Expression argumentExpression = (Expression) visit(expression.getArguments().get(i), argument); + // only use assignment clause when the variables have different names + if ( + argumentExpression instanceof VariableReferenceExpression + && ((VariableReferenceExpression) argumentExpression).getVariableName().equals(paramName) + ) { + continue; + } + + // if there is a name collision, use a temporary variable + if (isVariableReferenced(expression.getArguments(), paramName, i)) { + Name columnName = new Name( + "", + "", + String.format("param%s", UUID.randomUUID().toString().replaceAll("-", "")) + ); + Clause expressionClause = new LetClause( + columnName, + null, + argumentExpression, + expression.getMetadata() + ); + Expression assignmentExpression = createTypePromotion( + new VariableReferenceExpression(columnName, expression.getMetadata()), + paramType + ); + Clause assignmentClause = new LetClause( + paramName, + null, + assignmentExpression, + expression.getMetadata() + ); + if (assignmentClauses != null) { + assignmentClause.chainWith(assignmentClauses); + } + assignmentClauses = assignmentClause; + if (expressionClauses != null) { + expressionClause.chainWith(expressionClauses); + } + expressionClauses = expressionClause; + } else { + Expression assignmentExpression = createTypePromotion( + argumentExpression, + paramType + ); + Clause expressionClause = new LetClause( + paramName, + null, + assignmentExpression, + expression.getMetadata() + ); + if (expressionClauses != null) { + expressionClause.chainWith(expressionClauses); + } + expressionClauses = expressionClause; + } + } + if (assignmentClauses != null) { + assignmentClauses.getLastClause().chainWith(returnClause); + expressionClauses.getLastClause().chainWith(assignmentClauses); + } else { + expressionClauses.getLastClause().chainWith(returnClause); + } + FlworExpression result = new FlworExpression(returnClause, expression.getMetadata()); + if (inlineFunction.getReturnType() != null) { + return new TreatExpression( + result, + inlineFunction.getReturnType(), + ErrorCode.UnexpectedTypeErrorCode, + expression.getMetadata() + ); + } + return result; + } +} diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 9f9f9ae41..82f4b1e33 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -22,7 +22,6 @@ import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.ParsingException; -import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Node; import org.rumbledb.expressions.module.LibraryModule; @@ -62,15 +61,15 @@ private static void inferTypes(Module module, RumbleRuntimeConfiguration conf) { } } - private static MainModule applyTypeDependentOptimizations(MainModule module, RumbleRuntimeConfiguration conf) { - List> optimizers = new ArrayList<>(); - if (conf.optimizeGeneralComparisonToValueComparison()) { - optimizers.add(new ComparisonVisitor()); - } + private static MainModule applyTypeIndependentOptimizations(MainModule module) { MainModule result = module; - for (AbstractNodeVisitor optimizer : optimizers) { - result = (MainModule) optimizer.visit(result, null); - } + result = (MainModule) new FunctionInliningVisitor().visit(result, null); + return result; + } + + private static MainModule applyTypeDependentOptimizations(MainModule module) { + MainModule result = module; + result = (MainModule) new ComparisonVisitor().visit(result, null); return result; } @@ -151,9 +150,10 @@ public static MainModule parseJSONiqMainModule( MainModule mainModule = (MainModule) visitor.visit(main); pruneModules(mainModule, configuration); resolveDependencies(mainModule, configuration); + mainModule = applyTypeIndependentOptimizations(mainModule); populateStaticContext(mainModule, configuration); inferTypes(mainModule, configuration); - mainModule = applyTypeDependentOptimizations(mainModule, configuration); + mainModule = applyTypeDependentOptimizations(mainModule); populateExecutionModes(mainModule, configuration); return mainModule; } catch (ParseCancellationException ex) { @@ -194,7 +194,7 @@ public static MainModule parseXQueryMainModule( resolveDependencies(mainModule, configuration); populateStaticContext(mainModule, configuration); inferTypes(mainModule, configuration); - mainModule = applyTypeDependentOptimizations(mainModule, configuration); + mainModule = applyTypeDependentOptimizations(mainModule); populateExecutionModes(mainModule, configuration); return mainModule; } catch (ParseCancellationException ex) { diff --git a/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java b/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java index 0eace7ff8..0daf55166 100644 --- a/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java +++ b/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java @@ -35,6 +35,7 @@ public class FunctionDeclaration extends Node { private final InlineFunctionExpression functionExpression; + private boolean recursive = false; public FunctionDeclaration( InlineFunctionExpression functionExpression, @@ -90,5 +91,13 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { indentIt(sb, indent); this.functionExpression.serializeToJSONiq(sb, 0); } + + public boolean isRecursive() { + return this.recursive; + } + + public void setRecursive(boolean recursive) { + this.recursive = recursive; + } } From 87961d402da7b611d3be37ac350657c10a159100 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 11:09:51 +0200 Subject: [PATCH 068/136] A few fixes. --- .../compiler/FunctionDependenciesVisitor.java | 102 ++++++++++-------- .../compiler/FunctionInliningVisitor.java | 4 - .../org/rumbledb/compiler/VisitorHelpers.java | 5 +- 3 files changed, 59 insertions(+), 52 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/FunctionDependenciesVisitor.java b/src/main/java/org/rumbledb/compiler/FunctionDependenciesVisitor.java index 9419063ab..1ef67b182 100644 --- a/src/main/java/org/rumbledb/compiler/FunctionDependenciesVisitor.java +++ b/src/main/java/org/rumbledb/compiler/FunctionDependenciesVisitor.java @@ -7,7 +7,7 @@ import org.jgrapht.graph.DefaultEdge; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.flowr.*; +// import org.rumbledb.expressions.flowr.*; import org.rumbledb.expressions.module.FunctionDeclaration; import org.rumbledb.expressions.module.LibraryModule; import org.rumbledb.expressions.module.MainModule; @@ -21,42 +21,44 @@ public class FunctionDependenciesVisitor extends AbstractNodeVisitor { - @Override - public FunctionIdentifier visitForClause(ForClause clause, FunctionIdentifier argument) { - return this.visit(clause.getExpression(), argument); - } - - @Override - public FunctionIdentifier visitLetClause(LetClause clause, FunctionIdentifier argument) { - return this.visit(clause.getExpression(), argument); - } - - @Override - public FunctionIdentifier visitGroupByClause(GroupByClause clause, FunctionIdentifier argument) { - for (GroupByVariableDeclaration variable : clause.getGroupVariables()) { - if (variable.getExpression() != null) { - this.visit(variable.getExpression(), argument); - } - } - return argument; - } - - public FunctionIdentifier visitOrderByClause(OrderByClause clause, FunctionIdentifier argument) { - for (OrderByClauseSortingKey orderClause : clause.getSortingKeys()) { - this.visit(orderClause.getExpression(), argument); - } - return argument; - } - - @Override - public FunctionIdentifier visitFlowrExpression(FlworExpression expression, FunctionIdentifier argument) { - Clause clause = expression.getReturnClause().getFirstClause(); - while (clause != null) { - this.visit(clause, argument); - clause = clause.getNextClause(); - } - return argument; - } + /* + * @Override + * public FunctionIdentifier visitForClause(ForClause clause, FunctionIdentifier argument) { + * return this.visit(clause.getExpression(), argument); + * } + * + * @Override + * public FunctionIdentifier visitLetClause(LetClause clause, FunctionIdentifier argument) { + * return this.visit(clause.getExpression(), argument); + * } + * + * @Override + * public FunctionIdentifier visitGroupByClause(GroupByClause clause, FunctionIdentifier argument) { + * for (GroupByVariableDeclaration variable : clause.getGroupVariables()) { + * if (variable.getExpression() != null) { + * this.visit(variable.getExpression(), argument); + * } + * } + * return argument; + * } + * + * public FunctionIdentifier visitOrderByClause(OrderByClause clause, FunctionIdentifier argument) { + * for (OrderByClauseSortingKey orderClause : clause.getSortingKeys()) { + * this.visit(orderClause.getExpression(), argument); + * } + * return argument; + * } + * + * @Override + * public FunctionIdentifier visitFlowrExpression(FlworExpression expression, FunctionIdentifier argument) { + * Clause clause = expression.getReturnClause().getFirstClause(); + * while (clause != null) { + * this.visit(clause, argument); + * clause = clause.getNextClause(); + * } + * return argument; + * } + */ private final Map> edges; private final Map functionDeclarations; @@ -75,8 +77,8 @@ private void createEdge(FunctionIdentifier source, FunctionIdentifier target) { } @Override - public FunctionIdentifier visitMainModule(MainModule expression, FunctionIdentifier argument) { - visitDescendants(expression, argument); + public FunctionIdentifier visitMainModule(MainModule expression, FunctionIdentifier encompassingFunction) { + visitDescendants(expression, encompassingFunction); Graph directedGraph = new DefaultDirectedGraph<>(DefaultEdge.class); this.edges.keySet().forEach(directedGraph::addVertex); @@ -100,7 +102,7 @@ public FunctionIdentifier visitMainModule(MainModule expression, FunctionIdentif } @Override - public FunctionIdentifier visitProlog(Prolog prolog, FunctionIdentifier argument) { + public FunctionIdentifier visitProlog(Prolog prolog, FunctionIdentifier encompassingFunction) { for (FunctionDeclaration declaration : prolog.getFunctionDeclarations()) { visit(declaration, null); } @@ -110,20 +112,26 @@ public FunctionIdentifier visitProlog(Prolog prolog, FunctionIdentifier argument return null; } - public FunctionIdentifier visitFunctionDeclaration(FunctionDeclaration expression, FunctionIdentifier argument) { + public FunctionIdentifier visitFunctionDeclaration( + FunctionDeclaration expression, + FunctionIdentifier encompassingFunction + ) { FunctionIdentifier name = expression.getFunctionIdentifier(); this.functionDeclarations.put(name, expression); createVertex(name); visit(expression.getExpression(), name); - return argument; + return encompassingFunction; } - public FunctionIdentifier visitFunctionCall(FunctionCallExpression expression, FunctionIdentifier argument) { - if (argument == null) { + public FunctionIdentifier visitFunctionCall( + FunctionCallExpression expression, + FunctionIdentifier encompassingFunction + ) { + if (encompassingFunction == null) { return defaultAction(expression, null); } - createEdge(argument, expression.getFunctionIdentifier()); - visitDescendants(expression, argument); - return argument; + createEdge(encompassingFunction, expression.getFunctionIdentifier()); + visitDescendants(expression, encompassingFunction); + return encompassingFunction; } } diff --git a/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java b/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java index 738b54252..618099f72 100644 --- a/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java +++ b/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java @@ -31,10 +31,7 @@ public class FunctionInliningVisitor extends CloneVisitor { - private final FunctionDependenciesVisitor functionDependenciesVisitor; - public FunctionInliningVisitor() { - this.functionDependenciesVisitor = new FunctionDependenciesVisitor(); } private FunctionDeclaration getFunctionDeclarationFromProlog(Prolog prolog, FunctionIdentifier functionIdentifier) { @@ -225,7 +222,6 @@ private Expression createTypePromotion( @Override public Node visitMainModule(MainModule mainModule, Node argument) { - this.functionDependenciesVisitor.visit(mainModule, null); MainModule result = new MainModule( mainModule.getProlog(), (Expression) visit(mainModule.getExpression(), mainModule.getProlog()), diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 82f4b1e33..9ddbd2f52 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -63,7 +63,10 @@ private static void inferTypes(Module module, RumbleRuntimeConfiguration conf) { private static MainModule applyTypeIndependentOptimizations(MainModule module) { MainModule result = module; - result = (MainModule) new FunctionInliningVisitor().visit(result, null); + // Annotate recursive functions as such + new FunctionDependenciesVisitor().visit(result, null); + // Inline non-recursive functions + result = (MainModule) new FunctionInliningVisitor().visit(result, null); return result; } From 8fffe75e39edb8d1b01b1e0a2043efa94efbe270 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 11:19:14 +0200 Subject: [PATCH 069/136] Add parameter to control function inlining. --- .../org/rumbledb/compiler/VisitorHelpers.java | 8 +++++--- .../config/RumbleRuntimeConfiguration.java | 15 +++++++++++++++ .../expressions/module/FunctionDeclaration.java | 1 + 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 9ddbd2f52..674d7deb8 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -61,12 +61,14 @@ private static void inferTypes(Module module, RumbleRuntimeConfiguration conf) { } } - private static MainModule applyTypeIndependentOptimizations(MainModule module) { + private static MainModule applyTypeIndependentOptimizations(MainModule module, RumbleRuntimeConfiguration conf) { MainModule result = module; // Annotate recursive functions as such new FunctionDependenciesVisitor().visit(result, null); // Inline non-recursive functions - result = (MainModule) new FunctionInliningVisitor().visit(result, null); + if (conf.functionInlining()) { + result = (MainModule) new FunctionInliningVisitor().visit(result, null); + } return result; } @@ -153,7 +155,7 @@ public static MainModule parseJSONiqMainModule( MainModule mainModule = (MainModule) visitor.visit(main); pruneModules(mainModule, configuration); resolveDependencies(mainModule, configuration); - mainModule = applyTypeIndependentOptimizations(mainModule); + mainModule = applyTypeIndependentOptimizations(mainModule, configuration); populateStaticContext(mainModule, configuration); inferTypes(mainModule, configuration); mainModule = applyTypeDependentOptimizations(mainModule); diff --git a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java index 0fc4e57be..c82b2df27 100644 --- a/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java +++ b/src/main/java/org/rumbledb/config/RumbleRuntimeConfiguration.java @@ -71,6 +71,7 @@ public class RumbleRuntimeConfiguration implements Serializable, KryoSerializabl private boolean parallelExecution; private boolean dataFrameExecution; private boolean nativeExecution; + private boolean functionInlining; private boolean thirdFeature; private Map shortcutMap; @@ -415,6 +416,12 @@ public void init() { this.nativeExecution = true; } + if (this.arguments.containsKey("function-inlining")) { + this.functionInlining = this.arguments.get("function-inlining").equals("yes"); + } else { + this.functionInlining = true; + } + if (this.arguments.containsKey("optimize-general-comparison-to-value-comparison")) { this.optimizeGeneralComparisonToValueComparison = this.arguments.get( "optimize-general-comparison-to-value-comparison" @@ -629,6 +636,14 @@ public void setnativeExecution(boolean b) { this.nativeExecution = b; } + public boolean functionInlining() { + return this.functionInlining; + } + + public void setFunctionInlining(boolean b) { + this.functionInlining = b; + } + public boolean optimizeGeneralComparisonToValueComparison() { return this.optimizeGeneralComparisonToValueComparison; } diff --git a/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java b/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java index 0daf55166..550467df0 100644 --- a/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java +++ b/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java @@ -79,6 +79,7 @@ public void print(StringBuffer buffer, int indent) { buffer.append(" "); } buffer.append("FunctionDeclaration " + this.getFunctionIdentifier()); + buffer.append(" | " + (this.recursive ? "recursive" : "non-recursive")); buffer.append(" | " + this.highestExecutionMode); buffer.append("\n"); for (Node iterator : getChildren()) { From 109cbcefb67b7d78fc4f41909244f8280d99c0d6 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 13:29:09 +0200 Subject: [PATCH 070/136] Fix tests. --- .../compiler/FunctionInliningVisitor.java | 164 ++++++++++++------ .../org/rumbledb/compiler/VisitorHelpers.java | 8 +- .../control/TypeswitchRuntimeIterator.java | 37 ++++ .../runtime/flwor/FlworDataFrame.java | 14 ++ .../java/org/rumbledb/types/SequenceType.java | 80 +++++++++ 5 files changed, 245 insertions(+), 58 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java b/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java index 618099f72..db74717cb 100644 --- a/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java +++ b/src/main/java/org/rumbledb/compiler/FunctionInliningVisitor.java @@ -9,6 +9,7 @@ import org.rumbledb.expressions.control.TypeswitchCase; import org.rumbledb.expressions.flowr.Clause; import org.rumbledb.expressions.flowr.FlworExpression; +import org.rumbledb.expressions.flowr.ForClause; import org.rumbledb.expressions.flowr.LetClause; import org.rumbledb.expressions.flowr.ReturnClause; import org.rumbledb.expressions.module.FunctionDeclaration; @@ -22,6 +23,7 @@ import org.rumbledb.expressions.typing.TreatExpression; import org.rumbledb.types.BuiltinTypesCatalogue; import org.rumbledb.types.SequenceType; +import org.rumbledb.types.SequenceType.Arity; import java.util.ArrayList; import java.util.Collections; @@ -89,42 +91,94 @@ private static boolean allArgumentsMatch(FunctionCallExpression expression, List return allArgumentsMatch; } - private Expression createTypePromotion( + private void addCastCase( + List cases, Expression expression, - SequenceType paramType + SequenceType testType, + SequenceType targetType ) { - // integer > decimal > double - if (paramType.getItemType() == BuiltinTypesCatalogue.doubleItem) { - List cases = new ArrayList<>(); + if (testType.equals(targetType)) { cases.add( new TypeswitchCase( null, - Collections.singletonList(SequenceType.createSequenceType("integer?")), - new CastExpression( - expression, - SequenceType.createSequenceType("double?"), - expression.getMetadata() - ) + Collections.singletonList(testType), + expression ) ); + } else if (testType.getArity().isSubtypeOf(Arity.OneOrZero)) { cases.add( new TypeswitchCase( null, - Collections.singletonList(SequenceType.createSequenceType("decimal?")), + Collections.singletonList(testType), new CastExpression( expression, - SequenceType.createSequenceType("double?"), + targetType, expression.getMetadata() ) ) ); + } else { + Name variableName = Name.createVariableInNoNamespace( + String.format("param%s", UUID.randomUUID().toString().replaceAll("-", "")) + ); + Clause forClause = new ForClause( + variableName, + false, + new SequenceType(testType.getItemType(), Arity.One), + null, + expression, + expression.getMetadata() + ); + Expression castExpression = new CastExpression( + new VariableReferenceExpression(variableName, expression.getMetadata()), + new SequenceType(targetType.getItemType(), Arity.One), + expression.getMetadata() + ); + ReturnClause returnClause = new ReturnClause( + castExpression, + expression.getMetadata() + ); + forClause.chainWith(returnClause); cases.add( new TypeswitchCase( null, - Collections.singletonList(SequenceType.createSequenceType("double?")), - expression + Collections.singletonList(testType), + new FlworExpression(returnClause, expression.getMetadata()) ) ); + } + } + + private Expression createTypePromotion( + Expression expression, + SequenceType paramType + ) { + // integer > decimal > double + if (paramType.getItemType() == BuiltinTypesCatalogue.doubleItem) { + List cases = new ArrayList<>(); + switch (paramType.getArity()) { + case One: + addCastCase(cases, expression, SequenceType.INTEGER, SequenceType.DOUBLE); + addCastCase(cases, expression, SequenceType.DECIMAL, SequenceType.DOUBLE); + addCastCase(cases, expression, SequenceType.DOUBLE, SequenceType.DOUBLE); + break; + case OneOrZero: + addCastCase(cases, expression, SequenceType.INTEGER_QM, SequenceType.DOUBLE_QM); + addCastCase(cases, expression, SequenceType.DECIMAL_QM, SequenceType.DOUBLE_QM); + addCastCase(cases, expression, SequenceType.DOUBLE_QM, SequenceType.DOUBLE_QM); + break; + case OneOrMore: + addCastCase(cases, expression, SequenceType.INTEGER_PLUS, SequenceType.DOUBLE_PLUS); + addCastCase(cases, expression, SequenceType.DECIMAL_PLUS, SequenceType.DOUBLE_PLUS); + addCastCase(cases, expression, SequenceType.DOUBLE_PLUS, SequenceType.DOUBLE_PLUS); + break; + case ZeroOrMore: + addCastCase(cases, expression, SequenceType.INTEGER_STAR, SequenceType.DOUBLE_STAR); + addCastCase(cases, expression, SequenceType.DECIMAL_STAR, SequenceType.DOUBLE_STAR); + addCastCase(cases, expression, SequenceType.DOUBLE_STAR, SequenceType.DOUBLE_STAR); + break; + case Zero: + } TypeSwitchExpression typeSwitchExpression = new TypeSwitchExpression( expression, cases, @@ -144,24 +198,25 @@ private Expression createTypePromotion( } if (paramType.getItemType() == BuiltinTypesCatalogue.decimalItem) { List cases = new ArrayList<>(); - cases.add( - new TypeswitchCase( - null, - Collections.singletonList(SequenceType.createSequenceType("integer?")), - new CastExpression( - expression, - SequenceType.createSequenceType("decimal?"), - expression.getMetadata() - ) - ) - ); - cases.add( - new TypeswitchCase( - null, - Collections.singletonList(SequenceType.createSequenceType("decimal?")), - expression - ) - ); + switch (paramType.getArity()) { + case One: + addCastCase(cases, expression, SequenceType.INTEGER, SequenceType.DECIMAL); + addCastCase(cases, expression, SequenceType.DECIMAL, SequenceType.DECIMAL); + break; + case OneOrZero: + addCastCase(cases, expression, SequenceType.INTEGER_QM, SequenceType.DECIMAL_QM); + addCastCase(cases, expression, SequenceType.DECIMAL_QM, SequenceType.DECIMAL_QM); + break; + case OneOrMore: + addCastCase(cases, expression, SequenceType.INTEGER_PLUS, SequenceType.DECIMAL_PLUS); + addCastCase(cases, expression, SequenceType.DECIMAL_PLUS, SequenceType.DECIMAL_PLUS); + break; + case ZeroOrMore: + addCastCase(cases, expression, SequenceType.INTEGER_STAR, SequenceType.DECIMAL_STAR); + addCastCase(cases, expression, SequenceType.DECIMAL_STAR, SequenceType.DECIMAL_STAR); + break; + case Zero: + } TypeSwitchExpression typeSwitchExpression = new TypeSwitchExpression( expression, cases, @@ -182,24 +237,25 @@ private Expression createTypePromotion( // anyURI > string if (paramType.getItemType() == BuiltinTypesCatalogue.stringItem) { List cases = new ArrayList<>(); - cases.add( - new TypeswitchCase( - null, - Collections.singletonList(SequenceType.createSequenceType("anyURI?")), - new CastExpression( - expression, - SequenceType.createSequenceType("string?"), - expression.getMetadata() - ) - ) - ); - cases.add( - new TypeswitchCase( - null, - Collections.singletonList(SequenceType.createSequenceType("string?")), - expression - ) - ); + switch (paramType.getArity()) { + case One: + addCastCase(cases, expression, SequenceType.ANYURI, SequenceType.STRING); + addCastCase(cases, expression, SequenceType.STRING, SequenceType.STRING); + break; + case OneOrZero: + addCastCase(cases, expression, SequenceType.ANYURI_QM, SequenceType.STRING_QM); + addCastCase(cases, expression, SequenceType.STRING_QM, SequenceType.STRING_QM); + break; + case OneOrMore: + addCastCase(cases, expression, SequenceType.ANYURI_PLUS, SequenceType.STRING_PLUS); + addCastCase(cases, expression, SequenceType.STRING_PLUS, SequenceType.STRING_PLUS); + break; + case ZeroOrMore: + addCastCase(cases, expression, SequenceType.ANYURI_STAR, SequenceType.STRING_STAR); + addCastCase(cases, expression, SequenceType.STRING_STAR, SequenceType.STRING_STAR); + break; + case Zero: + } TypeSwitchExpression typeSwitchExpression = new TypeSwitchExpression( expression, cases, @@ -282,10 +338,8 @@ public Node visitFunctionCall(FunctionCallExpression expression, Node argument) // if there is a name collision, use a temporary variable if (isVariableReferenced(expression.getArguments(), paramName, i)) { - Name columnName = new Name( - "", - "", - String.format("param%s", UUID.randomUUID().toString().replaceAll("-", "")) + Name columnName = Name.createVariableInNoNamespace( + String.format("param%s", UUID.randomUUID().toString().replaceAll("-", "")) ); Clause expressionClause = new LetClause( columnName, diff --git a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java index 674d7deb8..823b53194 100644 --- a/src/main/java/org/rumbledb/compiler/VisitorHelpers.java +++ b/src/main/java/org/rumbledb/compiler/VisitorHelpers.java @@ -348,9 +348,11 @@ private static void populateExecutionModes(Module module, RumbleRuntimeConfigura break; } - if (conf.isPrintIteratorTree()) { - printTree(module, conf); - } + /* + * if (conf.isPrintIteratorTree()) { + * printTree(module, conf); + * } + */ if (currentUnsetCount > prevUnsetCount) { throw new OurBadException( diff --git a/src/main/java/org/rumbledb/runtime/control/TypeswitchRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/control/TypeswitchRuntimeIterator.java index ce63cefe6..33bb7273e 100644 --- a/src/main/java/org/rumbledb/runtime/control/TypeswitchRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/control/TypeswitchRuntimeIterator.java @@ -5,6 +5,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.typing.InstanceOfIterator; @@ -172,4 +173,40 @@ public JavaRDD getRDDAux(DynamicContext dynamicContext) { return this.defaultCase.getReturnIterator().getRDD(dynamicContext); } + + @Override + protected boolean implementsDataFrames() { + return true; + } + + @Override + public JSoundDataFrame getDataFrame(DynamicContext context) { + this.testValue = this.testField.materializeFirstItemOrNull(context); + RuntimeIterator localMatchingIterator; + + for (TypeswitchRuntimeIteratorCase typeSwitchCase : this.cases) { + localMatchingIterator = testTypeMatchAndReturnCorrespondingIterator(typeSwitchCase); + if (localMatchingIterator != null) { + if (typeSwitchCase.getVariableName() != null) { + context.getVariableValues() + .addVariableValue( + typeSwitchCase.getVariableName(), + Collections.singletonList(this.testValue) + ); + } + + return localMatchingIterator.getDataFrame(context); + } + } + + if (this.defaultCase.getVariableName() != null) { + context.getVariableValues() + .addVariableValue( + this.defaultCase.getVariableName(), + Collections.singletonList(this.testValue) + ); + } + + return this.defaultCase.getReturnIterator().getDataFrame(context); + } } diff --git a/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrame.java b/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrame.java index 7d648676e..e908b7792 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrame.java +++ b/src/main/java/org/rumbledb/runtime/flwor/FlworDataFrame.java @@ -116,5 +116,19 @@ public String createTempView() { return FlworDataFrameUtils.createTempView(this.dataFrame); } + public void show() { + System.err.println("FLWOR DataFrame"); + System.err.println("Columns"); + for (FlworDataFrameColumn c : this.columns) { + System.err.println(c.toString()); + } + System.err.println("Column types"); + for (Name n : this.columnTypes.keySet()) { + System.err.println(n + " " + this.columnTypes.get(n)); + } + System.err.println("Data Frame"); + this.dataFrame.show(); + } + } diff --git a/src/main/java/org/rumbledb/types/SequenceType.java b/src/main/java/org/rumbledb/types/SequenceType.java index d7def82cd..41e10a619 100644 --- a/src/main/java/org/rumbledb/types/SequenceType.java +++ b/src/main/java/org/rumbledb/types/SequenceType.java @@ -88,11 +88,86 @@ public class SequenceType implements Serializable { Arity.One ); + public final static SequenceType ANYURI = new SequenceType( + BuiltinTypesCatalogue.anyURIItem, + Arity.One + ); + public final static SequenceType BOOLEAN = new SequenceType( BuiltinTypesCatalogue.booleanItem, Arity.One ); + public final static SequenceType INTEGER_STAR = new SequenceType( + BuiltinTypesCatalogue.integerItem, + Arity.ZeroOrMore + ); + + public final static SequenceType DECIMAL_STAR = new SequenceType( + BuiltinTypesCatalogue.decimalItem, + Arity.ZeroOrMore + ); + + public final static SequenceType DOUBLE_STAR = new SequenceType( + BuiltinTypesCatalogue.doubleItem, + Arity.ZeroOrMore + ); + + public final static SequenceType FLOAT_STAR = new SequenceType( + BuiltinTypesCatalogue.floatItem, + Arity.ZeroOrMore + ); + + public final static SequenceType INT_STAR = new SequenceType( + BuiltinTypesCatalogue.intItem, + Arity.ZeroOrMore + ); + + public final static SequenceType STRING_STAR = new SequenceType( + BuiltinTypesCatalogue.stringItem, + Arity.ZeroOrMore + ); + + public final static SequenceType ANYURI_STAR = new SequenceType( + BuiltinTypesCatalogue.anyURIItem, + Arity.ZeroOrMore + ); + + public final static SequenceType INTEGER_PLUS = new SequenceType( + BuiltinTypesCatalogue.integerItem, + Arity.OneOrMore + ); + + public final static SequenceType DECIMAL_PLUS = new SequenceType( + BuiltinTypesCatalogue.decimalItem, + Arity.OneOrMore + ); + + public final static SequenceType DOUBLE_PLUS = new SequenceType( + BuiltinTypesCatalogue.doubleItem, + Arity.OneOrMore + ); + + public final static SequenceType FLOAT_PLUS = new SequenceType( + BuiltinTypesCatalogue.floatItem, + Arity.OneOrMore + ); + + public final static SequenceType INT_PLUS = new SequenceType( + BuiltinTypesCatalogue.intItem, + Arity.OneOrMore + ); + + public final static SequenceType STRING_PLUS = new SequenceType( + BuiltinTypesCatalogue.stringItem, + Arity.OneOrMore + ); + + public final static SequenceType ANYURI_PLUS = new SequenceType( + BuiltinTypesCatalogue.anyURIItem, + Arity.OneOrMore + ); + public final static SequenceType INTEGER_QM = new SequenceType( BuiltinTypesCatalogue.integerItem, Arity.OneOrZero @@ -123,6 +198,11 @@ public class SequenceType implements Serializable { Arity.OneOrZero ); + public final static SequenceType ANYURI_QM = new SequenceType( + BuiltinTypesCatalogue.anyURIItem, + Arity.OneOrZero + ); + public final static SequenceType EMPTY_SEQUENCE = new SequenceType(); From 67f599153dde51115e66885dd9ff967785f938a4 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 13:38:30 +0200 Subject: [PATCH 071/136] Add tests. --- .github/workflows/maven.yml | 10 +- src/test/java/iq/RuntimeTestsNoInlining.java | 227 ++++++++++++++++++ ...ts.java => RuntimeTestsNoParallelism.java} | 14 +- 3 files changed, 240 insertions(+), 11 deletions(-) create mode 100644 src/test/java/iq/RuntimeTestsNoInlining.java rename src/test/java/iq/{LocalRuntimeTests.java => RuntimeTestsNoParallelism.java} (92%) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 67ce16388..154416fd7 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -31,12 +31,10 @@ jobs: run: mvn spotless:check - name: FrontendTests run: mvn -Dtest=FrontendTests test - - name: Bugs - run: mvn -Dtest=Bugs test - name: RuntimeTests run: mvn -Dtest=RuntimeTests test - - name: LocalRuntimeTests - run: mvn -Dtest=LocalRuntimeTests test + - name: RuntimeTestsNoParallelism + run: mvn -Dtest=RuntimeTestsNoParalelism test - name: StaticTypeTests run: mvn -Dtest=StaticTypeTests test - name: JavaAPITest @@ -96,5 +94,9 @@ jobs: run: mvn install -DskipTests -Dgpg.skip --quiet - name: Compile with Maven run: mvn clean compile assembly:single + - name: Bugs + run: mvn -Dtest=Bugs test + - name: RuntimeTestsNoInlining + run: mvn -Dtest=RuntimeTestsNoInlining test - name: NativeFLWORRuntimeTestsNativeDeactivated run: mvn -Dtest=NativeFLWORRuntimeTestsNativeDeactivated test diff --git a/src/test/java/iq/RuntimeTestsNoInlining.java b/src/test/java/iq/RuntimeTestsNoInlining.java new file mode 100644 index 000000000..e2e8ab5c9 --- /dev/null +++ b/src/test/java/iq/RuntimeTestsNoInlining.java @@ -0,0 +1,227 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import iq.base.AnnotationsTestsBase; +import scala.util.Properties; + +import org.apache.spark.SparkConf; +import org.apache.spark.api.java.JavaRDD; +import org.junit.Assert; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.Item; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; +import org.rumbledb.context.Name; +import org.rumbledb.items.ItemFactory; + +import sparksoniq.spark.SparkSessionManager; +import utils.FileManager; + +import java.io.File; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + +@RunWith(Parameterized.class) +public class RuntimeTestsNoInlining extends AnnotationsTestsBase { + + public static final File runtimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime" + ); + public static final String javaVersion = + System.getProperty("java.version"); + public static final String scalaVersion = + Properties.scalaPropOrElse("version.number", "unknown"); + protected static List _testFiles = new ArrayList<>(); + protected final File testFile; + protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--variable:externalUnparsedString", + "unparsed string", + "--function-inlining", + "no" } + ).setExternalVariableValue( + Name.createVariableInNoNamespace("externalStringItem"), + Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) + ) + .setExternalVariableValue( + Name.createVariableInNoNamespace("externalIntegerItems"), + Arrays.asList( + new Item[] { + ItemFactory.getInstance().createIntItem(1), + ItemFactory.getInstance().createIntItem(2), + ItemFactory.getInstance().createIntItem(3), + ItemFactory.getInstance().createIntItem(4), + ItemFactory.getInstance().createIntItem(5), + } + ) + ); + public RuntimeTestsNoInlining(File testFile) { + this.testFile = testFile; + } + + public static void readFileList(File dir) { + FileManager.loadJiqFiles(dir).forEach(file -> RuntimeTestsNoInlining._testFiles.add(file)); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + RuntimeTestsNoInlining.readFileList(RuntimeTestsNoInlining.runtimeTestsDirectory); + RuntimeTestsNoInlining._testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } + + @BeforeClass + public static void setupSparkSession() { + System.err.println("Java version: " + javaVersion); + System.err.println("Scala version: " + scalaVersion); + SparkConf sparkConfiguration = new SparkConf(); + sparkConfiguration.setMaster("local[*]"); + sparkConfiguration.set("spark.submit.deployMode", "client"); + sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); + sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); + sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product + + // prevents spark from failing to start on MacOS when disconnected from the internet + sparkConfiguration.set("spark.driver.host", "127.0.0.1"); + + + // sparkConfiguration.set("spark.driver.memory", "2g"); + // sparkConfiguration.set("spark.executor.memory", "2g"); + // sparkConfiguration.set("spark.speculation", "true"); + // sparkConfiguration.set("spark.speculation.quantile", "0.5"); + SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); + SparkSessionManager.COLLECT_ITEM_LIMIT = configuration.getResultSizeCap(); + System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); + } + + @Test(timeout = 1000000) + public void testRuntimeIterators() throws Throwable { + System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); + testAnnotations(this.testFile.getAbsolutePath(), AnnotationsTestsBase.configuration); + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput; + if (!sequence.availableAsRDD()) { + actualOutput = runIterators(sequence); + } else { + actualOutput = getRDDResults(sequence); + } + Assert.assertTrue( + "Expected output: " + expectedOutput + "\nActual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + } + + protected String runIterators(SequenceOfItems sequence) { + String actualOutput = getIteratorOutput(sequence); + return actualOutput; + } + + protected String getIteratorOutput(SequenceOfItems sequence) { + sequence.open(); + Item result = null; + if (sequence.hasNext()) { + result = sequence.next(); + } + if (result == null) { + return ""; + } + String singleOutput = result.serialize(); + if (!sequence.hasNext()) { + return singleOutput; + } else { + int itemCount = 1; + StringBuilder sb = new StringBuilder(); + sb.append("("); + sb.append(result.serialize()); + sb.append(", "); + while ( + sequence.hasNext() + && + ((itemCount < this.configuration.getResultSizeCap() + && this.configuration.getResultSizeCap() > 0) + || + this.configuration.getResultSizeCap() == 0) + ) { + sb.append(sequence.next().serialize()); + sb.append(", "); + itemCount++; + } + if (sequence.hasNext() && itemCount == this.configuration.getResultSizeCap()) { + System.err.println( + "Warning! The output sequence contains a large number of items but its materialization was capped at " + + SparkSessionManager.COLLECT_ITEM_LIMIT + + " items. This value can be configured with the --result-size parameter at startup" + ); + } + // remove last comma + String output = sb.toString(); + output = output.substring(0, output.length() - 2); + output += ")"; + return output; + } + } + + private String getRDDResults(SequenceOfItems sequence) { + JavaRDD rdd = sequence.getAsRDD(); + JavaRDD output = rdd.map(o -> o.serialize()); + List collectedOutput = new ArrayList(); + SparkSessionManager.collectRDDwithLimitWarningOnly(output, collectedOutput); + + if (collectedOutput.isEmpty()) { + return ""; + } + + if (collectedOutput.size() == 1) { + return collectedOutput.get(0); + } + + StringBuilder sb = new StringBuilder(); + sb.append("("); + for (String item : collectedOutput) { + sb.append(item); + sb.append(", "); + } + + String result = sb.toString(); + result = result.substring(0, result.length() - 2); + result += ")"; + return result; + } +} diff --git a/src/test/java/iq/LocalRuntimeTests.java b/src/test/java/iq/RuntimeTestsNoParallelism.java similarity index 92% rename from src/test/java/iq/LocalRuntimeTests.java rename to src/test/java/iq/RuntimeTestsNoParallelism.java index b0418c6d8..c0e41c806 100644 --- a/src/test/java/iq/LocalRuntimeTests.java +++ b/src/test/java/iq/RuntimeTestsNoParallelism.java @@ -47,7 +47,7 @@ import java.util.List; @RunWith(Parameterized.class) -public class LocalRuntimeTests extends AnnotationsTestsBase { +public class RuntimeTestsNoParallelism extends AnnotationsTestsBase { public static final File runtimeTestsDirectory = new File( System.getProperty("user.dir") @@ -85,19 +85,19 @@ public class LocalRuntimeTests extends AnnotationsTestsBase { ) ); - public LocalRuntimeTests(File testFile) { + public RuntimeTestsNoParallelism(File testFile) { this.testFile = testFile; } public static void readFileList(File dir) { - FileManager.loadJiqFiles(dir).forEach(file -> LocalRuntimeTests._testFiles.add(file)); + FileManager.loadJiqFiles(dir).forEach(file -> RuntimeTestsNoParallelism._testFiles.add(file)); } @Parameterized.Parameters(name = "{index}:{0}") public static Collection testFiles() { List result = new ArrayList<>(); - LocalRuntimeTests.readFileList(LocalRuntimeTests.runtimeTestsDirectory); - LocalRuntimeTests._testFiles.forEach(file -> result.add(new Object[] { file })); + RuntimeTestsNoParallelism.readFileList(RuntimeTestsNoParallelism.runtimeTestsDirectory); + RuntimeTestsNoParallelism._testFiles.forEach(file -> result.add(new Object[] { file })); return result; } @@ -121,14 +121,14 @@ public static void setupSparkSession() { // sparkConfiguration.set("spark.speculation", "true"); // sparkConfiguration.set("spark.speculation.quantile", "0.5"); SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); - SparkSessionManager.COLLECT_ITEM_LIMIT = LocalRuntimeTests.configuration.getResultSizeCap(); + SparkSessionManager.COLLECT_ITEM_LIMIT = RuntimeTestsNoParallelism.configuration.getResultSizeCap(); System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); } @Test(timeout = 1000000) public void testRuntimeIterators() throws Throwable { System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), LocalRuntimeTests.configuration); + testAnnotations(this.testFile.getAbsolutePath(), RuntimeTestsNoParallelism.configuration); } @Override From 314f4f304a85d038fa8f18f2c6e1587456aa27dc Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 13:38:54 +0200 Subject: [PATCH 072/136] Fix test name. --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 154416fd7..db56a36e7 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -34,7 +34,7 @@ jobs: - name: RuntimeTests run: mvn -Dtest=RuntimeTests test - name: RuntimeTestsNoParallelism - run: mvn -Dtest=RuntimeTestsNoParalelism test + run: mvn -Dtest=RuntimeTestsNoParalellism test - name: StaticTypeTests run: mvn -Dtest=StaticTypeTests test - name: JavaAPITest From 54400323ce70fe5aeeff49e3e3efcec7bb3abb3b Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 13:39:42 +0200 Subject: [PATCH 073/136] Spotless. --- src/test/java/iq/RuntimeTestsNoInlining.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/java/iq/RuntimeTestsNoInlining.java b/src/test/java/iq/RuntimeTestsNoInlining.java index e2e8ab5c9..f0c50aae8 100644 --- a/src/test/java/iq/RuntimeTestsNoInlining.java +++ b/src/test/java/iq/RuntimeTestsNoInlining.java @@ -84,6 +84,7 @@ public class RuntimeTestsNoInlining extends AnnotationsTestsBase { } ) ); + public RuntimeTestsNoInlining(File testFile) { this.testFile = testFile; } From cc66854fa3d5b69c17223fa70e42c6420378b0ae Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 13:43:14 +0200 Subject: [PATCH 074/136] Extend documentation. --- docs/CLI.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/CLI.md b/docs/CLI.md index a86386a18..8b7e72db6 100644 --- a/docs/CLI.md +++ b/docs/CLI.md @@ -38,5 +38,8 @@ Previous parameters (--shell, --query-path, --server) work in a backward compati | --context-item-input-format | N/A | context-item-input-format | text or json | sets the input format to use for parsing the standard input (as text or as a serialized json value) | | --dates-with-timezone | N/A | dates-with-timezone | yes or no | activates timezone support for the type xs:date (deactivated by default) | -| --optimize-general-comparison-to-value-comparison | N/A | optimize-general-comparison-to-valud-comparison | yes or no | activates automatic conversion of general comparisons to value comparisons when applicable | +| --optimize-general-comparison-to-value-comparison | N/A | optimize-general-comparison-to-value-comparison | yes or no | activates automatic conversion of general comparisons to value comparisons when applicable (activated by default) | +| --function-inlining | N/A | function-inlining | yes or no | activates function inlining for non-recursive functions (activated by default) | +| --parallel-execution | N/A | parallel-execution | yes or no | activates parallel execution when possible (activated by default) | +| --native-execution | N/A | native-execution | yes or no | activates native (Spark SQL) execution when possible (activated by default) | From f124bc742d9ba560d0398b5d3fd51a16a731d47e Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 4 May 2023 13:46:43 +0200 Subject: [PATCH 075/136] Fix test name. --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index db56a36e7..6fb12e584 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -34,7 +34,7 @@ jobs: - name: RuntimeTests run: mvn -Dtest=RuntimeTests test - name: RuntimeTestsNoParallelism - run: mvn -Dtest=RuntimeTestsNoParalellism test + run: mvn -Dtest=RuntimeTestsNoParallelism test - name: StaticTypeTests run: mvn -Dtest=StaticTypeTests test - name: JavaAPITest From c24f1326b5ba67e34a20bcc9e3682495fe972c63 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 10 May 2023 16:04:12 +0200 Subject: [PATCH 076/136] Deactivate DF execution of sequences on demand. --- .../compiler/ExecutionModeVisitor.java | 238 ++++++++++++++++-- .../rumbledb/expressions/CommaExpression.java | 18 -- .../java/org/rumbledb/expressions/Node.java | 18 -- .../control/ConditionalExpression.java | 32 --- .../rumbledb/expressions/flowr/Clause.java | 8 - .../rumbledb/expressions/flowr/ForClause.java | 17 +- .../expressions/flowr/GroupByClause.java | 6 - .../rumbledb/expressions/flowr/LetClause.java | 15 -- .../module/FunctionDeclaration.java | 6 - .../expressions/module/TypeDeclaration.java | 7 - .../module/VariableDeclaration.java | 11 +- .../postfix/ArrayLookupExpression.java | 6 - .../postfix/ArrayUnboxingExpression.java | 6 - .../DynamicFunctionCallExpression.java | 23 -- .../expressions/postfix/FilterExpression.java | 28 --- .../postfix/ObjectLookupExpression.java | 6 - .../primary/VariableReferenceExpression.java | 9 - .../expressions/typing/TreatExpression.java | 26 -- src/test/java/iq/RuntimeTestsNoInlining.java | 8 +- 19 files changed, 225 insertions(+), 263 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 56fb59c28..7507448d0 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -37,9 +37,11 @@ import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnknownFunctionCallException; import org.rumbledb.expressions.AbstractNodeVisitor; +import org.rumbledb.expressions.CommaExpression; import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; +import org.rumbledb.expressions.control.ConditionalExpression; import org.rumbledb.expressions.control.SwitchCase; import org.rumbledb.expressions.control.SwitchExpression; import org.rumbledb.expressions.control.TypeSwitchExpression; @@ -51,18 +53,26 @@ import org.rumbledb.expressions.flowr.ForClause; import org.rumbledb.expressions.flowr.GroupByClause; import org.rumbledb.expressions.flowr.LetClause; +import org.rumbledb.expressions.flowr.OrderByClause; import org.rumbledb.expressions.flowr.ReturnClause; import org.rumbledb.expressions.flowr.SimpleMapExpression; +import org.rumbledb.expressions.flowr.WhereClause; import org.rumbledb.expressions.miscellaneous.RangeExpression; import org.rumbledb.expressions.module.FunctionDeclaration; import org.rumbledb.expressions.module.LibraryModule; import org.rumbledb.expressions.module.MainModule; import org.rumbledb.expressions.module.Prolog; import org.rumbledb.expressions.module.VariableDeclaration; +import org.rumbledb.expressions.postfix.ArrayLookupExpression; +import org.rumbledb.expressions.postfix.ArrayUnboxingExpression; +import org.rumbledb.expressions.postfix.DynamicFunctionCallExpression; +import org.rumbledb.expressions.postfix.FilterExpression; +import org.rumbledb.expressions.postfix.ObjectLookupExpression; import org.rumbledb.expressions.primary.FunctionCallExpression; import org.rumbledb.expressions.primary.InlineFunctionExpression; import org.rumbledb.expressions.primary.IntegerLiteralExpression; import org.rumbledb.expressions.primary.VariableReferenceExpression; +import org.rumbledb.expressions.typing.TreatExpression; import org.rumbledb.expressions.typing.ValidateTypeExpression; import org.rumbledb.items.ItemFactory; import org.rumbledb.runtime.misc.RangeOperationIterator; @@ -87,28 +97,36 @@ public class ExecutionModeVisitor extends AbstractNodeVisitor { void setVisitorConfig(VisitorConfig visitorConfig) { this.visitorConfig = visitorConfig; } + + public ExecutionMode DATAFRAMEifConfigurationAllows() { + if(this.configuration.dataFrameExecution()) + { + return ExecutionMode.DATAFRAME; + } else { + return ExecutionMode.RDD; + } + } @Override protected StaticContext defaultAction(Node node, StaticContext argument) { visitDescendants(node, argument); - node.initHighestExecutionMode(this.visitorConfig); + node.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } @Override public StaticContext visitMainModule(MainModule mainModule, StaticContext argument) { visitDescendants(mainModule, mainModule.getStaticContext()); - mainModule.initHighestExecutionMode(this.visitorConfig); + mainModule.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } @Override public StaticContext visitLibraryModule(LibraryModule libraryModule, StaticContext argument) { if (libraryModule.getProlog() != null) { - libraryModule.getProlog().initHighestExecutionMode(this.visitorConfig); this.visit(libraryModule.getProlog(), libraryModule.getStaticContext()); } - libraryModule.initHighestExecutionMode(this.visitorConfig); + libraryModule.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } @@ -133,7 +151,7 @@ public StaticContext visitVariableReference(VariableReferenceExpression expressi + expression.getVariableName() + " to DataFrame based on static object* type." ); - expression.setHighestExecutionMode(ExecutionMode.DATAFRAME); + expression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); return argument; } } @@ -182,8 +200,8 @@ public StaticContext visitFunctionDeclaration(FunctionDeclaration declaration, S populateFunctionDeclarationStaticContext(expression.getStaticContext(), modes, expression); // visit the body first to make its execution mode available while adding the function to the catalog this.visit(expression.getBody(), expression.getStaticContext()); - expression.initHighestExecutionMode(this.visitorConfig); - declaration.initHighestExecutionMode(this.visitorConfig); + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + declaration.setHighestExecutionMode(expression.getBody().getHighestExecutionMode(this.visitorConfig)); expression.registerUserDefinedFunctionExecutionMode( this.visitorConfig ); @@ -204,7 +222,7 @@ public StaticContext visitInlineFunctionExpr(InlineFunctionExpression expression ); // visit the body first to make its execution mode available while adding the function to the catalog this.visit(expression.getBody(), expression.getBody().getStaticContext()); - expression.initHighestExecutionMode(this.visitorConfig); + expression.setHighestExecutionMode(ExecutionMode.LOCAL); expression.registerUserDefinedFunctionExecutionMode( this.visitorConfig ); @@ -243,8 +261,7 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static builtinFunction, expression.getArguments().size() > 0 ? expression.getArguments().get(0).getHighestExecutionMode(this.visitorConfig) - : null, - this.visitorConfig + : null ) ); } else { @@ -276,10 +293,9 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static return argument; } - private static ExecutionMode getBuiltInFunctionExecutionMode( + private ExecutionMode getBuiltInFunctionExecutionMode( BuiltinFunction builtinFunction, - ExecutionMode firstMode, - VisitorConfig visitorConfig + ExecutionMode firstMode ) { BuiltinFunctionExecutionMode functionExecutionMode = builtinFunction.getBuiltinFunctionExecutionMode(); if (functionExecutionMode == BuiltinFunctionExecutionMode.LOCAL) { @@ -289,12 +305,12 @@ private static ExecutionMode getBuiltInFunctionExecutionMode( return ExecutionMode.RDD; } if (functionExecutionMode == BuiltinFunctionExecutionMode.DATAFRAME) { - return ExecutionMode.DATAFRAME; + return DATAFRAMEifConfigurationAllows(); } if (functionExecutionMode == BuiltinFunctionExecutionMode.INHERIT_FROM_FIRST_ARGUMENT) { ExecutionMode firstArgumentExecutionMode = firstMode; if (firstArgumentExecutionMode.isDataFrame()) { - return ExecutionMode.DATAFRAME; + return DATAFRAMEifConfigurationAllows(); } if (firstArgumentExecutionMode.isRDDOrDataFrame()) { return ExecutionMode.RDD; @@ -330,7 +346,7 @@ public StaticContext visitReturnClause(ReturnClause expression, StaticContext ar .getItemType() .isCompatibleWithDataFrames(this.configuration) ) { - expression.setHighestExecutionMode(ExecutionMode.DATAFRAME); + expression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); return argument; } else { expression.setHighestExecutionMode(ExecutionMode.RDD); @@ -348,7 +364,7 @@ public StaticContext visitReturnClause(ReturnClause expression, StaticContext ar .getItemType() .isCompatibleWithDataFrames(this.configuration) ) { - expression.setHighestExecutionMode(ExecutionMode.DATAFRAME); + expression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); return argument; } else { expression.setHighestExecutionMode(ExecutionMode.RDD); @@ -393,7 +409,14 @@ public StaticContext visitFlowrExpression(FlworExpression expression, StaticCont @Override public StaticContext visitForClause(ForClause clause, StaticContext argument) { this.visit(clause.getExpression(), clause.getExpression().getStaticContext()); - clause.initHighestExecutionMode(this.visitorConfig); + clause.setHighestExecutionMode( + (clause.getExpression().getHighestExecutionMode(visitorConfig).isRDDOrDataFrame() + || (clause.getPreviousClause() != null + && clause.getPreviousClause().getHighestExecutionMode(visitorConfig).isDataFrame())) + ? ExecutionMode.DATAFRAME + : ExecutionMode.LOCAL + ); + clause.setVariableHighestStorageMode(ExecutionMode.LOCAL); argument.setVariableStorageMode( clause.getVariableName(), @@ -412,8 +435,23 @@ public StaticContext visitForClause(ForClause clause, StaticContext argument) { @Override public StaticContext visitLetClause(LetClause clause, StaticContext argument) { this.visit(clause.getExpression(), clause.getExpression().getStaticContext()); - clause.initHighestExecutionMode(this.visitorConfig); + + if(clause.getPreviousClause() == null) + { + clause.setHighestExecutionMode(ExecutionMode.LOCAL); + } else { + clause.setHighestExecutionMode( + clause.getPreviousClause().getHighestExecutionMode(visitorConfig) + ); + } + // if let clause is local, defined variables are stored according to the execution mode of the expression + if (clause.getHighestExecutionMode(this.visitorConfig) == ExecutionMode.LOCAL) { + clause.setHighestExecutionMode(clause.getExpression().getHighestExecutionMode(visitorConfig)); + } else { + clause.setHighestExecutionMode(ExecutionMode.LOCAL); + } + argument.setVariableStorageMode( clause.getVariableName(), clause.getVariableHighestStorageMode(this.visitorConfig) @@ -434,7 +472,7 @@ public StaticContext visitGroupByClause(GroupByClause clause, StaticContext argu ); } } - clause.initHighestExecutionMode(this.visitorConfig); + clause.setHighestExecutionMode(clause.getPreviousClause().getHighestExecutionMode(this.visitorConfig)); StaticContext clauseContext = clause.getStaticContext(); for (Entry entry : argument.getInScopeVariables().entrySet()) { boolean isKeyVariable = false; @@ -458,7 +496,7 @@ public StaticContext visitGroupByClause(GroupByClause clause, StaticContext argu @Override public StaticContext visitCountClause(CountClause expression, StaticContext argument) { - expression.initHighestExecutionMode(this.visitorConfig); + expression.setHighestExecutionMode(expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig)); argument.setVariableStorageMode( expression.getCountVariableName(), ExecutionMode.LOCAL @@ -564,7 +602,8 @@ public StaticContext visitVariableDeclaration(VariableDeclaration variableDeclar if (variableDeclaration.getExpression() != null) { this.visit(variableDeclaration.getExpression(), null); } - variableDeclaration.initHighestExecutionMode(this.visitorConfig); + variableDeclaration.setHighestExecutionMode(ExecutionMode.LOCAL); + variableDeclaration.setVariableHighestStorageMode(ExecutionMode.LOCAL); // first pass. argument.setVariableStorageMode( variableDeclaration.getVariableName(), @@ -576,7 +615,7 @@ public StaticContext visitVariableDeclaration(VariableDeclaration variableDeclar @Override public StaticContext visitProlog(Prolog prolog, StaticContext argument) { visitDescendants(prolog, argument); - prolog.initHighestExecutionMode(this.visitorConfig); + prolog.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } @@ -604,7 +643,7 @@ public StaticContext visitValidateTypeExpression(ValidateTypeExpression expressi + expression.getSequenceType().getItemType().getName() + " compatible with data frames." ); - expression.setHighestExecutionMode(ExecutionMode.DATAFRAME); + expression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); } else { if ( expression.getMainExpression() @@ -628,7 +667,7 @@ public StaticContext visitValidateTypeExpression(ValidateTypeExpression expressi + expression.getSequenceType().getItemType().getName() + " compatible with data frames." ); - expression.setHighestExecutionMode(ExecutionMode.DATAFRAME); + expression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); } else { if ( expression.getMainExpression() @@ -663,7 +702,7 @@ public StaticContext visitRangeExpr(RangeExpression rangeExpression, StaticConte if ( rightValue.subtract(leftValue).compareTo(BigInteger.valueOf(RangeOperationIterator.PARTITION_SIZE)) >= 0 ) { - rangeExpression.setHighestExecutionMode(ExecutionMode.DATAFRAME); + rangeExpression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); return argument; } } @@ -710,8 +749,153 @@ public StaticContext visitSimpleMapExpr(SimpleMapExpression simpleMapExpression, simpleMapExpression.setHighestExecutionMode(ExecutionMode.RDD); return argument; } - simpleMapExpression.setHighestExecutionMode(ExecutionMode.DATAFRAME); + simpleMapExpression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); + return argument; + } + + @Override + public StaticContext visitConditionalExpression(ConditionalExpression conditionalExpression, StaticContext argument) { + visitDescendants(conditionalExpression, argument); + if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isLocal()) { + conditionalExpression.setHighestExecutionMode(null); + return argument; + } + if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isLocal()) { + conditionalExpression.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isUnset()) { + conditionalExpression.setHighestExecutionMode(ExecutionMode.UNSET); + return argument; + } + if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isUnset()) { + conditionalExpression.setHighestExecutionMode(ExecutionMode.UNSET); + return argument; + } + if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isRDD()) { + conditionalExpression.setHighestExecutionMode(ExecutionMode.RDD); + return argument; + } + if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isRDD()) { + conditionalExpression.setHighestExecutionMode(ExecutionMode.RDD); + return argument; + } + conditionalExpression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); return argument; } + @Override + public StaticContext visitCommaExpression(CommaExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + if (expression.getExpressions().isEmpty()) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + + for (Expression e : expression.getExpressions()) { + if (!e.getHighestExecutionMode(visitorConfig).isRDDOrDataFrame()) { + e.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + } + + expression.setHighestExecutionMode(ExecutionMode.RDD); + return argument; + } + + @Override + public StaticContext visitOrderByClause(OrderByClause expression, StaticContext argument) { + expression.setHighestExecutionMode( + expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig) + ); + return argument; + } + + @Override + public StaticContext visitWhereClause(WhereClause expression, StaticContext argument) { + expression.setHighestExecutionMode( + expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig) + ); + return argument; + } + + @Override + public StaticContext visitArrayUnboxingExpression(ArrayUnboxingExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + return argument; + } + + @Override + public StaticContext visitArrayLookupExpression(ArrayLookupExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + return argument; + } + + @Override + public StaticContext visitObjectLookupExpression(ObjectLookupExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + return argument; + } + + @Override + public StaticContext visitFilterExpression(FilterExpression expression, StaticContext argument) { + if (expression.getPredicateExpression() instanceof IntegerLiteralExpression) { + String lexicalValue = ((IntegerLiteralExpression) expression.getPredicateExpression()).getLexicalValue(); + if (ItemFactory.getInstance().createIntegerItem(lexicalValue).isInt()) { + if ( + ItemFactory.getInstance().createIntegerItem(lexicalValue).getIntValue() <= this.configuration + .getResultSizeCap() + ) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + } + } + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + if (!expression.getStaticContext().getRumbleConfiguration().getNativeSQLPredicates()) { + if (expression.getHighestExecutionMode().equals(ExecutionMode.DATAFRAME)) { + expression.setHighestExecutionMode(ExecutionMode.RDD); + } + } + return argument; + } + + @Override + public StaticContext visitDynamicFunctionCallExpression(DynamicFunctionCallExpression expression, + StaticContext argument) { + if (expression.getArguments().size() == 0) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + if (expression.getStaticSequenceType().getArity().equals(Arity.One)) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + expression.setHighestExecutionMode(expression.getArguments().get(0).getHighestExecutionMode(visitorConfig)); + if (expression.getHighestExecutionMode().equals(ExecutionMode.RDD)) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + } + if (!this.configuration.getDataFrameExecutionModeDetection()) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + } + return argument; + } + + @Override + public StaticContext visitTreatExpression(TreatExpression expression, StaticContext argument) { + SequenceType sequenceType = expression.getsequenceType(); + if ( + !sequenceType.isEmptySequence() + && sequenceType.getArity() != SequenceType.Arity.One + && sequenceType.getArity() != SequenceType.Arity.OneOrZero + ) { + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + } + expression.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; + } + } diff --git a/src/main/java/org/rumbledb/expressions/CommaExpression.java b/src/main/java/org/rumbledb/expressions/CommaExpression.java index 8bebe5e98..01288992e 100644 --- a/src/main/java/org/rumbledb/expressions/CommaExpression.java +++ b/src/main/java/org/rumbledb/expressions/CommaExpression.java @@ -21,7 +21,6 @@ package org.rumbledb.expressions; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import java.util.ArrayList; @@ -72,23 +71,6 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { } } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - if (this.expressions.isEmpty()) { - this.highestExecutionMode = ExecutionMode.LOCAL; - return; - } - - for (Expression expression : this.expressions) { - if (!expression.getHighestExecutionMode(visitorConfig).isRDDOrDataFrame()) { - this.highestExecutionMode = ExecutionMode.LOCAL; - return; - } - } - - this.highestExecutionMode = ExecutionMode.RDD; - } - @Override public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitCommaExpression(this, argument); diff --git a/src/main/java/org/rumbledb/expressions/Node.java b/src/main/java/org/rumbledb/expressions/Node.java index e17eeeecb..be9abfc44 100644 --- a/src/main/java/org/rumbledb/expressions/Node.java +++ b/src/main/java/org/rumbledb/expressions/Node.java @@ -45,24 +45,6 @@ protected Node(ExceptionMetadata metadata) { this.metadata = metadata; } - /** - * Initializes the highest execution mode of this node, which determines - * whether evaluation will be done locally, with RDDs or with DataFrames. - * - * This method is used during the static analysis. It is meant to be - * overridden by subclasses that support higher execution modes. By - * default, the highest execution mode is assumed to be local. - * - * This method is deprecated as the logic of execution mode - * initialization is being moved to the ExecutionModeVisitor - * which invokes setHighestExecutionMode. - * - * @param visitorConfig the configuration of the visitor. - */ - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = ExecutionMode.LOCAL; - } - /** * Initializes the highest execution mode of this node, which determines * whether evaluation will be done locally, with RDDs or with DataFrames. diff --git a/src/main/java/org/rumbledb/expressions/control/ConditionalExpression.java b/src/main/java/org/rumbledb/expressions/control/ConditionalExpression.java index 81247b76a..0fda4474a 100644 --- a/src/main/java/org/rumbledb/expressions/control/ConditionalExpression.java +++ b/src/main/java/org/rumbledb/expressions/control/ConditionalExpression.java @@ -21,10 +21,8 @@ package org.rumbledb.expressions.control; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; @@ -91,36 +89,6 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { sb.append(")\n"); } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - if (this.thenExpression.getHighestExecutionMode(visitorConfig).isLocal()) { - this.highestExecutionMode = ExecutionMode.LOCAL; - return; - } - if (this.elseExpression.getHighestExecutionMode(visitorConfig).isLocal()) { - this.highestExecutionMode = ExecutionMode.LOCAL; - return; - } - if (this.thenExpression.getHighestExecutionMode(visitorConfig).isUnset()) { - this.highestExecutionMode = ExecutionMode.UNSET; - return; - } - if (this.elseExpression.getHighestExecutionMode(visitorConfig).isUnset()) { - this.highestExecutionMode = ExecutionMode.UNSET; - return; - } - if (this.thenExpression.getHighestExecutionMode(visitorConfig).isRDD()) { - this.highestExecutionMode = ExecutionMode.RDD; - return; - } - if (this.elseExpression.getHighestExecutionMode(visitorConfig).isRDD()) { - this.highestExecutionMode = ExecutionMode.RDD; - return; - } - this.highestExecutionMode = ExecutionMode.DATAFRAME; - return; - } - @Override public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitConditionalExpression(this, argument); diff --git a/src/main/java/org/rumbledb/expressions/flowr/Clause.java b/src/main/java/org/rumbledb/expressions/flowr/Clause.java index dc282c283..b7348ae1d 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/Clause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/Clause.java @@ -62,14 +62,6 @@ public Clause getNextClause() { return this.nextClause; } - /** - * This method is overridden in clauses such as for and let for special behavior - */ - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = this.previousClause.getHighestExecutionMode(visitorConfig); - } - public Clause getFirstClause() { Clause result = this; while (result.previousClause != null) { diff --git a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java index f9b014c16..26c0c5835 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java @@ -90,18 +90,6 @@ public Expression getExpression() { return this.expression; } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = - (this.expression.getHighestExecutionMode(visitorConfig).isRDDOrDataFrame() - || (this.previousClause != null - && this.previousClause.getHighestExecutionMode(visitorConfig).isDataFrame())) - ? ExecutionMode.DATAFRAME - : ExecutionMode.LOCAL; - - this.variableHighestStorageMode = ExecutionMode.LOCAL; - } - public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) { if ( !visitorConfig.suppressErrorsForAccessingUnsetExecutionModes() @@ -111,6 +99,11 @@ public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) } return this.variableHighestStorageMode; } + + public void setVariableHighestStorageMode(ExecutionMode mode) + { + this.variableHighestStorageMode = mode; + } @Override public List getChildren() { diff --git a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java index 4c5626a52..72039d9c0 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java @@ -20,7 +20,6 @@ package org.rumbledb.expressions.flowr; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.SemanticException; import org.rumbledb.expressions.AbstractNodeVisitor; @@ -46,11 +45,6 @@ public List getGroupVariables() { return this.variables; } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = this.previousClause.getHighestExecutionMode(visitorConfig); - } - @Override public List getChildren() { List result = new ArrayList<>(); diff --git a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java index ce0318f55..9a68ef2de 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java @@ -78,21 +78,6 @@ public Expression getExpression() { return this.expression; } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = - (this.previousClause == null) - ? ExecutionMode.LOCAL - : this.previousClause.getHighestExecutionMode(visitorConfig); - - // if let clause is local, defined variables are stored according to the execution mode of the expression - if (this.highestExecutionMode == ExecutionMode.LOCAL) { - this.variableHighestStorageMode = this.expression.getHighestExecutionMode(visitorConfig); - } else { - this.variableHighestStorageMode = ExecutionMode.LOCAL; - } - } - public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) { if ( !visitorConfig.suppressErrorsForAccessingUnsetExecutionModes() diff --git a/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java b/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java index 550467df0..60f89eb51 100644 --- a/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java +++ b/src/main/java/org/rumbledb/expressions/module/FunctionDeclaration.java @@ -21,7 +21,6 @@ package org.rumbledb.expressions.module; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.context.FunctionIdentifier; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; @@ -63,11 +62,6 @@ public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitFunctionDeclaration(this, argument); } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = this.functionExpression.getBody().getHighestExecutionMode(visitorConfig); - } - /** * Prints the node tree to a string buffer. * diff --git a/src/main/java/org/rumbledb/expressions/module/TypeDeclaration.java b/src/main/java/org/rumbledb/expressions/module/TypeDeclaration.java index 8f51de808..6b61bad91 100644 --- a/src/main/java/org/rumbledb/expressions/module/TypeDeclaration.java +++ b/src/main/java/org/rumbledb/expressions/module/TypeDeclaration.java @@ -21,10 +21,8 @@ package org.rumbledb.expressions.module; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Node; import org.rumbledb.types.ItemType; @@ -52,11 +50,6 @@ public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitTypeDeclaration(this, argument); } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = ExecutionMode.LOCAL; - } - /** * Prints the node tree to a string buffer. * diff --git a/src/main/java/org/rumbledb/expressions/module/VariableDeclaration.java b/src/main/java/org/rumbledb/expressions/module/VariableDeclaration.java index 0b8f67be5..5bd7b9a95 100644 --- a/src/main/java/org/rumbledb/expressions/module/VariableDeclaration.java +++ b/src/main/java/org/rumbledb/expressions/module/VariableDeclaration.java @@ -101,12 +101,6 @@ public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitVariableDeclaration(this, argument); } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = ExecutionMode.LOCAL; - this.variableHighestStorageMode = ExecutionMode.LOCAL; - } - public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) { if ( !visitorConfig.suppressErrorsForAccessingUnsetExecutionModes() @@ -116,6 +110,11 @@ public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) } return this.variableHighestStorageMode; } + + public void setVariableHighestStorageMode(ExecutionMode mode) + { + this.variableHighestStorageMode = mode; + } public void print(StringBuffer buffer, int indent) { for (int i = 0; i < indent; ++i) { diff --git a/src/main/java/org/rumbledb/expressions/postfix/ArrayLookupExpression.java b/src/main/java/org/rumbledb/expressions/postfix/ArrayLookupExpression.java index 64257cbf2..b977a2bcd 100644 --- a/src/main/java/org/rumbledb/expressions/postfix/ArrayLookupExpression.java +++ b/src/main/java/org/rumbledb/expressions/postfix/ArrayLookupExpression.java @@ -20,7 +20,6 @@ package org.rumbledb.expressions.postfix; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.AbstractNodeVisitor; @@ -70,11 +69,6 @@ public Expression getMainExpression() { return this.mainExpression; } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = this.mainExpression.getHighestExecutionMode(visitorConfig); - } - @Override public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitArrayLookupExpression(this, argument); diff --git a/src/main/java/org/rumbledb/expressions/postfix/ArrayUnboxingExpression.java b/src/main/java/org/rumbledb/expressions/postfix/ArrayUnboxingExpression.java index 1997befd7..a71cd0a4f 100644 --- a/src/main/java/org/rumbledb/expressions/postfix/ArrayUnboxingExpression.java +++ b/src/main/java/org/rumbledb/expressions/postfix/ArrayUnboxingExpression.java @@ -21,7 +21,6 @@ package org.rumbledb.expressions.postfix; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.AbstractNodeVisitor; @@ -67,9 +66,4 @@ public Expression getMainExpression() { return this.mainExpression; } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = this.mainExpression.getHighestExecutionMode(visitorConfig); - } - } diff --git a/src/main/java/org/rumbledb/expressions/postfix/DynamicFunctionCallExpression.java b/src/main/java/org/rumbledb/expressions/postfix/DynamicFunctionCallExpression.java index 9bade9093..baa178d23 100644 --- a/src/main/java/org/rumbledb/expressions/postfix/DynamicFunctionCallExpression.java +++ b/src/main/java/org/rumbledb/expressions/postfix/DynamicFunctionCallExpression.java @@ -20,15 +20,11 @@ package org.rumbledb.expressions.postfix; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; -import org.rumbledb.types.SequenceType.Arity; - import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -126,23 +122,4 @@ public void serializeToJSONiq(StringBuffer sb, int indent) { } sb.append(")\n"); } - - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - if (this.arguments.size() == 0) { - this.highestExecutionMode = ExecutionMode.LOCAL; - return; - } - if (this.getStaticSequenceType().getArity().equals(Arity.One)) { - this.highestExecutionMode = ExecutionMode.LOCAL; - return; - } - this.highestExecutionMode = this.arguments.get(0).getHighestExecutionMode(visitorConfig); - if (this.highestExecutionMode.equals(ExecutionMode.RDD)) { - this.highestExecutionMode = ExecutionMode.LOCAL; - } - if (!this.staticContext.getRumbleConfiguration().getDataFrameExecutionModeDetection()) { - this.highestExecutionMode = ExecutionMode.LOCAL; - } - } } diff --git a/src/main/java/org/rumbledb/expressions/postfix/FilterExpression.java b/src/main/java/org/rumbledb/expressions/postfix/FilterExpression.java index 3541ffffc..b5e9c9455 100644 --- a/src/main/java/org/rumbledb/expressions/postfix/FilterExpression.java +++ b/src/main/java/org/rumbledb/expressions/postfix/FilterExpression.java @@ -21,16 +21,11 @@ package org.rumbledb.expressions.postfix; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; -import org.rumbledb.expressions.primary.IntegerLiteralExpression; -import org.rumbledb.items.ItemFactory; - import java.util.ArrayList; import java.util.List; @@ -79,29 +74,6 @@ public Expression getMainExpression() { return this.mainExpression; } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - if (this.predicateExpression instanceof IntegerLiteralExpression) { - String lexicalValue = ((IntegerLiteralExpression) this.predicateExpression).getLexicalValue(); - if (ItemFactory.getInstance().createIntegerItem(lexicalValue).isInt()) { - if ( - ItemFactory.getInstance().createIntegerItem(lexicalValue).getIntValue() <= this.staticContext - .getRumbleConfiguration() - .getResultSizeCap() - ) { - this.highestExecutionMode = ExecutionMode.LOCAL; - return; - } - } - } - this.highestExecutionMode = this.mainExpression.getHighestExecutionMode(visitorConfig); - if (!this.staticContext.getRumbleConfiguration().getNativeSQLPredicates()) { - if (this.highestExecutionMode.equals(ExecutionMode.DATAFRAME)) { - this.highestExecutionMode = ExecutionMode.RDD; - } - } - } - @Override public boolean isContextDependent() { return this.mainExpression.isContextDependent(); diff --git a/src/main/java/org/rumbledb/expressions/postfix/ObjectLookupExpression.java b/src/main/java/org/rumbledb/expressions/postfix/ObjectLookupExpression.java index 6e17c5eae..d36befd30 100644 --- a/src/main/java/org/rumbledb/expressions/postfix/ObjectLookupExpression.java +++ b/src/main/java/org/rumbledb/expressions/postfix/ObjectLookupExpression.java @@ -21,7 +21,6 @@ package org.rumbledb.expressions.postfix; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.AbstractNodeVisitor; @@ -74,9 +73,4 @@ public T accept(AbstractNodeVisitor visitor, T argument) { public Expression getMainExpression() { return this.mainExpression; } - - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = this.mainExpression.getHighestExecutionMode(visitorConfig); - } } diff --git a/src/main/java/org/rumbledb/expressions/primary/VariableReferenceExpression.java b/src/main/java/org/rumbledb/expressions/primary/VariableReferenceExpression.java index 363a20489..29db7d184 100644 --- a/src/main/java/org/rumbledb/expressions/primary/VariableReferenceExpression.java +++ b/src/main/java/org/rumbledb/expressions/primary/VariableReferenceExpression.java @@ -21,10 +21,8 @@ package org.rumbledb.expressions.primary; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.context.Name; import org.rumbledb.exceptions.ExceptionMetadata; -import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.AbstractNodeVisitor; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; @@ -63,13 +61,6 @@ public void setActualType(SequenceType type) { this.type = type; } - @Override - public final void initHighestExecutionMode(VisitorConfig visitorConfig) { - // Variable reference execution mode can only be resolved in conjunction with a static context - // variable reference's execution mode gets initialized in staticContextVisitor by a setter - throw new OurBadException("Variable references do not use the highestExecutionMode initializer"); - } - @Override public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitVariableReference(this, argument); diff --git a/src/main/java/org/rumbledb/expressions/typing/TreatExpression.java b/src/main/java/org/rumbledb/expressions/typing/TreatExpression.java index c7d7c4fd3..194e3daa6 100644 --- a/src/main/java/org/rumbledb/expressions/typing/TreatExpression.java +++ b/src/main/java/org/rumbledb/expressions/typing/TreatExpression.java @@ -3,12 +3,10 @@ import java.util.Collections; import java.util.List; -import org.rumbledb.compiler.VisitorConfig; import org.rumbledb.errorcodes.ErrorCode; import org.rumbledb.exceptions.ExceptionMetadata; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.expressions.AbstractNodeVisitor; -import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.Expression; import org.rumbledb.expressions.Node; import org.rumbledb.types.SequenceType; @@ -43,30 +41,6 @@ public ErrorCode errorCodeThatShouldBeThrown() { return this.errorCode; } - @Override - public void initHighestExecutionMode(VisitorConfig visitorConfig) { - this.highestExecutionMode = calculateIsRDDFromSequenceTypeAndExpression( - this.sequenceType, - this.mainExpression, - visitorConfig - ); - } - - private static ExecutionMode calculateIsRDDFromSequenceTypeAndExpression( - SequenceType sequenceType, - Expression expression, - VisitorConfig visitorConfig - ) { - if ( - !sequenceType.isEmptySequence() - && sequenceType.getArity() != SequenceType.Arity.One - && sequenceType.getArity() != SequenceType.Arity.OneOrZero - ) { - return expression.getHighestExecutionMode(visitorConfig); - } - return ExecutionMode.LOCAL; - } - @Override public T accept(AbstractNodeVisitor visitor, T argument) { return visitor.visitTreatExpression(this, argument); diff --git a/src/test/java/iq/RuntimeTestsNoInlining.java b/src/test/java/iq/RuntimeTestsNoInlining.java index f0c50aae8..0e0491ef3 100644 --- a/src/test/java/iq/RuntimeTestsNoInlining.java +++ b/src/test/java/iq/RuntimeTestsNoInlining.java @@ -175,16 +175,16 @@ protected String getIteratorOutput(SequenceOfItems sequence) { while ( sequence.hasNext() && - ((itemCount < this.configuration.getResultSizeCap() - && this.configuration.getResultSizeCap() > 0) + ((itemCount < configuration.getResultSizeCap() + && configuration.getResultSizeCap() > 0) || - this.configuration.getResultSizeCap() == 0) + configuration.getResultSizeCap() == 0) ) { sb.append(sequence.next().serialize()); sb.append(", "); itemCount++; } - if (sequence.hasNext() && itemCount == this.configuration.getResultSizeCap()) { + if (sequence.hasNext() && itemCount == configuration.getResultSizeCap()) { System.err.println( "Warning! The output sequence contains a large number of items but its materialization was capped at " + SparkSessionManager.COLLECT_ITEM_LIMIT From bf8b09e0fff28877187d0c9f86be7c5a487363df Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 10 May 2023 16:07:24 +0200 Subject: [PATCH 077/136] Spotless. --- .../compiler/ExecutionModeVisitor.java | 209 +++++++++--------- .../rumbledb/expressions/flowr/ForClause.java | 7 +- .../module/VariableDeclaration.java | 7 +- 3 files changed, 112 insertions(+), 111 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 7507448d0..e0beea16e 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -97,14 +97,13 @@ public class ExecutionModeVisitor extends AbstractNodeVisitor { void setVisitorConfig(VisitorConfig visitorConfig) { this.visitorConfig = visitorConfig; } - + public ExecutionMode DATAFRAMEifConfigurationAllows() { - if(this.configuration.dataFrameExecution()) - { - return ExecutionMode.DATAFRAME; - } else { - return ExecutionMode.RDD; - } + if (this.configuration.dataFrameExecution()) { + return ExecutionMode.DATAFRAME; + } else { + return ExecutionMode.RDD; + } } @Override @@ -201,7 +200,7 @@ public StaticContext visitFunctionDeclaration(FunctionDeclaration declaration, S // visit the body first to make its execution mode available while adding the function to the catalog this.visit(expression.getBody(), expression.getStaticContext()); expression.setHighestExecutionMode(ExecutionMode.LOCAL); - declaration.setHighestExecutionMode(expression.getBody().getHighestExecutionMode(this.visitorConfig)); + declaration.setHighestExecutionMode(expression.getBody().getHighestExecutionMode(this.visitorConfig)); expression.registerUserDefinedFunctionExecutionMode( this.visitorConfig ); @@ -410,12 +409,12 @@ public StaticContext visitFlowrExpression(FlworExpression expression, StaticCont public StaticContext visitForClause(ForClause clause, StaticContext argument) { this.visit(clause.getExpression(), clause.getExpression().getStaticContext()); clause.setHighestExecutionMode( - (clause.getExpression().getHighestExecutionMode(visitorConfig).isRDDOrDataFrame() - || (clause.getPreviousClause() != null - && clause.getPreviousClause().getHighestExecutionMode(visitorConfig).isDataFrame())) - ? ExecutionMode.DATAFRAME - : ExecutionMode.LOCAL - ); + (clause.getExpression().getHighestExecutionMode(visitorConfig).isRDDOrDataFrame() + || (clause.getPreviousClause() != null + && clause.getPreviousClause().getHighestExecutionMode(visitorConfig).isDataFrame())) + ? ExecutionMode.DATAFRAME + : ExecutionMode.LOCAL + ); clause.setVariableHighestStorageMode(ExecutionMode.LOCAL); argument.setVariableStorageMode( @@ -435,23 +434,22 @@ public StaticContext visitForClause(ForClause clause, StaticContext argument) { @Override public StaticContext visitLetClause(LetClause clause, StaticContext argument) { this.visit(clause.getExpression(), clause.getExpression().getStaticContext()); - - if(clause.getPreviousClause() == null) - { + + if (clause.getPreviousClause() == null) { clause.setHighestExecutionMode(ExecutionMode.LOCAL); } else { - clause.setHighestExecutionMode( + clause.setHighestExecutionMode( clause.getPreviousClause().getHighestExecutionMode(visitorConfig) ); } // if let clause is local, defined variables are stored according to the execution mode of the expression if (clause.getHighestExecutionMode(this.visitorConfig) == ExecutionMode.LOCAL) { - clause.setHighestExecutionMode(clause.getExpression().getHighestExecutionMode(visitorConfig)); + clause.setHighestExecutionMode(clause.getExpression().getHighestExecutionMode(visitorConfig)); } else { - clause.setHighestExecutionMode(ExecutionMode.LOCAL); + clause.setHighestExecutionMode(ExecutionMode.LOCAL); } - + argument.setVariableStorageMode( clause.getVariableName(), clause.getVariableHighestStorageMode(this.visitorConfig) @@ -752,97 +750,100 @@ public StaticContext visitSimpleMapExpr(SimpleMapExpression simpleMapExpression, simpleMapExpression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); return argument; } - + @Override - public StaticContext visitConditionalExpression(ConditionalExpression conditionalExpression, StaticContext argument) { - visitDescendants(conditionalExpression, argument); - if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isLocal()) { - conditionalExpression.setHighestExecutionMode(null); + public StaticContext visitConditionalExpression( + ConditionalExpression conditionalExpression, + StaticContext argument + ) { + visitDescendants(conditionalExpression, argument); + if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isLocal()) { + conditionalExpression.setHighestExecutionMode(null); return argument; } if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isLocal()) { - conditionalExpression.setHighestExecutionMode(ExecutionMode.LOCAL); + conditionalExpression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isUnset()) { - conditionalExpression.setHighestExecutionMode(ExecutionMode.UNSET); + conditionalExpression.setHighestExecutionMode(ExecutionMode.UNSET); return argument; } if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isUnset()) { - conditionalExpression.setHighestExecutionMode(ExecutionMode.UNSET); + conditionalExpression.setHighestExecutionMode(ExecutionMode.UNSET); return argument; } if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isRDD()) { - conditionalExpression.setHighestExecutionMode(ExecutionMode.RDD); + conditionalExpression.setHighestExecutionMode(ExecutionMode.RDD); return argument; } if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isRDD()) { - conditionalExpression.setHighestExecutionMode(ExecutionMode.RDD); + conditionalExpression.setHighestExecutionMode(ExecutionMode.RDD); return argument; } conditionalExpression.setHighestExecutionMode(DATAFRAMEifConfigurationAllows()); return argument; } - @Override - public StaticContext visitCommaExpression(CommaExpression expression, StaticContext argument) { - visitDescendants(expression, argument); - if (expression.getExpressions().isEmpty()) { + @Override + public StaticContext visitCommaExpression(CommaExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + if (expression.getExpressions().isEmpty()) { expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } for (Expression e : expression.getExpressions()) { if (!e.getHighestExecutionMode(visitorConfig).isRDDOrDataFrame()) { - e.setHighestExecutionMode(ExecutionMode.LOCAL); - return argument; + e.setHighestExecutionMode(ExecutionMode.LOCAL); + return argument; } } expression.setHighestExecutionMode(ExecutionMode.RDD); return argument; - } - - @Override - public StaticContext visitOrderByClause(OrderByClause expression, StaticContext argument) { - expression.setHighestExecutionMode( - expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig) - ); - return argument; - } - - @Override - public StaticContext visitWhereClause(WhereClause expression, StaticContext argument) { - expression.setHighestExecutionMode( - expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig) - ); - return argument; - } - - @Override - public StaticContext visitArrayUnboxingExpression(ArrayUnboxingExpression expression, StaticContext argument) { - visitDescendants(expression, argument); - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); - return argument; - } - - @Override - public StaticContext visitArrayLookupExpression(ArrayLookupExpression expression, StaticContext argument) { - visitDescendants(expression, argument); - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); - return argument; - } - - @Override - public StaticContext visitObjectLookupExpression(ObjectLookupExpression expression, StaticContext argument) { - visitDescendants(expression, argument); - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); - return argument; - } - - @Override - public StaticContext visitFilterExpression(FilterExpression expression, StaticContext argument) { - if (expression.getPredicateExpression() instanceof IntegerLiteralExpression) { + } + + @Override + public StaticContext visitOrderByClause(OrderByClause expression, StaticContext argument) { + expression.setHighestExecutionMode( + expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig) + ); + return argument; + } + + @Override + public StaticContext visitWhereClause(WhereClause expression, StaticContext argument) { + expression.setHighestExecutionMode( + expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig) + ); + return argument; + } + + @Override + public StaticContext visitArrayUnboxingExpression(ArrayUnboxingExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + return argument; + } + + @Override + public StaticContext visitArrayLookupExpression(ArrayLookupExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + return argument; + } + + @Override + public StaticContext visitObjectLookupExpression(ObjectLookupExpression expression, StaticContext argument) { + visitDescendants(expression, argument); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + return argument; + } + + @Override + public StaticContext visitFilterExpression(FilterExpression expression, StaticContext argument) { + if (expression.getPredicateExpression() instanceof IntegerLiteralExpression) { String lexicalValue = ((IntegerLiteralExpression) expression.getPredicateExpression()).getLexicalValue(); if (ItemFactory.getInstance().createIntegerItem(lexicalValue).isInt()) { if ( @@ -854,48 +855,50 @@ public StaticContext visitFilterExpression(FilterExpression expression, StaticCo } } } - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); if (!expression.getStaticContext().getRumbleConfiguration().getNativeSQLPredicates()) { if (expression.getHighestExecutionMode().equals(ExecutionMode.DATAFRAME)) { - expression.setHighestExecutionMode(ExecutionMode.RDD); + expression.setHighestExecutionMode(ExecutionMode.RDD); } } return argument; - } + } - @Override - public StaticContext visitDynamicFunctionCallExpression(DynamicFunctionCallExpression expression, - StaticContext argument) { - if (expression.getArguments().size() == 0) { - expression.setHighestExecutionMode(ExecutionMode.LOCAL); + @Override + public StaticContext visitDynamicFunctionCallExpression( + DynamicFunctionCallExpression expression, + StaticContext argument + ) { + if (expression.getArguments().size() == 0) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } if (expression.getStaticSequenceType().getArity().equals(Arity.One)) { - expression.setHighestExecutionMode(ExecutionMode.LOCAL); + expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } expression.setHighestExecutionMode(expression.getArguments().get(0).getHighestExecutionMode(visitorConfig)); if (expression.getHighestExecutionMode().equals(ExecutionMode.RDD)) { - expression.setHighestExecutionMode(ExecutionMode.LOCAL); + expression.setHighestExecutionMode(ExecutionMode.LOCAL); } if (!this.configuration.getDataFrameExecutionModeDetection()) { - expression.setHighestExecutionMode(ExecutionMode.LOCAL); + expression.setHighestExecutionMode(ExecutionMode.LOCAL); } return argument; - } - - @Override - public StaticContext visitTreatExpression(TreatExpression expression, StaticContext argument) { - SequenceType sequenceType = expression.getsequenceType(); - if ( - !sequenceType.isEmptySequence() - && sequenceType.getArity() != SequenceType.Arity.One - && sequenceType.getArity() != SequenceType.Arity.OneOrZero - ) { - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); - } + } + + @Override + public StaticContext visitTreatExpression(TreatExpression expression, StaticContext argument) { + SequenceType sequenceType = expression.getsequenceType(); + if ( + !sequenceType.isEmptySequence() + && sequenceType.getArity() != SequenceType.Arity.One + && sequenceType.getArity() != SequenceType.Arity.OneOrZero + ) { + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + } expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; - } + } } diff --git a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java index 26c0c5835..4d73f9278 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java @@ -99,10 +99,9 @@ public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) } return this.variableHighestStorageMode; } - - public void setVariableHighestStorageMode(ExecutionMode mode) - { - this.variableHighestStorageMode = mode; + + public void setVariableHighestStorageMode(ExecutionMode mode) { + this.variableHighestStorageMode = mode; } @Override diff --git a/src/main/java/org/rumbledb/expressions/module/VariableDeclaration.java b/src/main/java/org/rumbledb/expressions/module/VariableDeclaration.java index 5bd7b9a95..273db3250 100644 --- a/src/main/java/org/rumbledb/expressions/module/VariableDeclaration.java +++ b/src/main/java/org/rumbledb/expressions/module/VariableDeclaration.java @@ -110,10 +110,9 @@ public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) } return this.variableHighestStorageMode; } - - public void setVariableHighestStorageMode(ExecutionMode mode) - { - this.variableHighestStorageMode = mode; + + public void setVariableHighestStorageMode(ExecutionMode mode) { + this.variableHighestStorageMode = mode; } public void print(StringBuffer buffer, int indent) { From a7153e96ee95e90f55499cb818322a6ae059a7e7 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Wed, 10 May 2023 17:04:08 +0200 Subject: [PATCH 078/136] Fix issues. --- .../compiler/ExecutionModeVisitor.java | 57 +++++++++++-------- .../java/org/rumbledb/expressions/Node.java | 6 +- .../expressions/flowr/CountClause.java | 3 - .../expressions/flowr/GroupByClause.java | 3 - .../rumbledb/expressions/flowr/LetClause.java | 3 - 5 files changed, 35 insertions(+), 37 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index e0beea16e..a25933e02 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -54,6 +54,7 @@ import org.rumbledb.expressions.flowr.GroupByClause; import org.rumbledb.expressions.flowr.LetClause; import org.rumbledb.expressions.flowr.OrderByClause; +import org.rumbledb.expressions.flowr.OrderByClauseSortingKey; import org.rumbledb.expressions.flowr.ReturnClause; import org.rumbledb.expressions.flowr.SimpleMapExpression; import org.rumbledb.expressions.flowr.WhereClause; @@ -409,9 +410,9 @@ public StaticContext visitFlowrExpression(FlworExpression expression, StaticCont public StaticContext visitForClause(ForClause clause, StaticContext argument) { this.visit(clause.getExpression(), clause.getExpression().getStaticContext()); clause.setHighestExecutionMode( - (clause.getExpression().getHighestExecutionMode(visitorConfig).isRDDOrDataFrame() + (clause.getExpression().getHighestExecutionMode(this.visitorConfig).isRDDOrDataFrame() || (clause.getPreviousClause() != null - && clause.getPreviousClause().getHighestExecutionMode(visitorConfig).isDataFrame())) + && clause.getPreviousClause().getHighestExecutionMode(this.visitorConfig).isDataFrame())) ? ExecutionMode.DATAFRAME : ExecutionMode.LOCAL ); @@ -439,13 +440,13 @@ public StaticContext visitLetClause(LetClause clause, StaticContext argument) { clause.setHighestExecutionMode(ExecutionMode.LOCAL); } else { clause.setHighestExecutionMode( - clause.getPreviousClause().getHighestExecutionMode(visitorConfig) + clause.getPreviousClause().getHighestExecutionMode(this.visitorConfig) ); } // if let clause is local, defined variables are stored according to the execution mode of the expression if (clause.getHighestExecutionMode(this.visitorConfig) == ExecutionMode.LOCAL) { - clause.setHighestExecutionMode(clause.getExpression().getHighestExecutionMode(visitorConfig)); + clause.setHighestExecutionMode(clause.getExpression().getHighestExecutionMode(this.visitorConfig)); } else { clause.setHighestExecutionMode(ExecutionMode.LOCAL); } @@ -757,27 +758,27 @@ public StaticContext visitConditionalExpression( StaticContext argument ) { visitDescendants(conditionalExpression, argument); - if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isLocal()) { + if (conditionalExpression.getBranch().getHighestExecutionMode(this.visitorConfig).isLocal()) { conditionalExpression.setHighestExecutionMode(null); return argument; } - if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isLocal()) { + if (conditionalExpression.getElseBranch().getHighestExecutionMode(this.visitorConfig).isLocal()) { conditionalExpression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } - if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isUnset()) { + if (conditionalExpression.getBranch().getHighestExecutionMode(this.visitorConfig).isUnset()) { conditionalExpression.setHighestExecutionMode(ExecutionMode.UNSET); return argument; } - if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isUnset()) { + if (conditionalExpression.getElseBranch().getHighestExecutionMode(this.visitorConfig).isUnset()) { conditionalExpression.setHighestExecutionMode(ExecutionMode.UNSET); return argument; } - if (conditionalExpression.getBranch().getHighestExecutionMode(visitorConfig).isRDD()) { + if (conditionalExpression.getBranch().getHighestExecutionMode(this.visitorConfig).isRDD()) { conditionalExpression.setHighestExecutionMode(ExecutionMode.RDD); return argument; } - if (conditionalExpression.getElseBranch().getHighestExecutionMode(visitorConfig).isRDD()) { + if (conditionalExpression.getElseBranch().getHighestExecutionMode(this.visitorConfig).isRDD()) { conditionalExpression.setHighestExecutionMode(ExecutionMode.RDD); return argument; } @@ -794,8 +795,8 @@ public StaticContext visitCommaExpression(CommaExpression expression, StaticCont } for (Expression e : expression.getExpressions()) { - if (!e.getHighestExecutionMode(visitorConfig).isRDDOrDataFrame()) { - e.setHighestExecutionMode(ExecutionMode.LOCAL); + if (!e.getHighestExecutionMode(this.visitorConfig).isRDDOrDataFrame()) { + expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } } @@ -805,17 +806,21 @@ public StaticContext visitCommaExpression(CommaExpression expression, StaticCont } @Override - public StaticContext visitOrderByClause(OrderByClause expression, StaticContext argument) { - expression.setHighestExecutionMode( - expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig) + public StaticContext visitOrderByClause(OrderByClause clause, StaticContext argument) { + for (OrderByClauseSortingKey s : clause.getSortingKeys()) { + visit(s.getExpression(), argument); + } + clause.setHighestExecutionMode( + clause.getPreviousClause().getHighestExecutionMode(this.visitorConfig) ); return argument; } @Override - public StaticContext visitWhereClause(WhereClause expression, StaticContext argument) { - expression.setHighestExecutionMode( - expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig) + public StaticContext visitWhereClause(WhereClause clause, StaticContext argument) { + visit(clause.getWhereExpression(), argument); + clause.setHighestExecutionMode( + clause.getPreviousClause().getHighestExecutionMode(this.visitorConfig) ); return argument; } @@ -823,21 +828,21 @@ public StaticContext visitWhereClause(WhereClause expression, StaticContext argu @Override public StaticContext visitArrayUnboxingExpression(ArrayUnboxingExpression expression, StaticContext argument) { visitDescendants(expression, argument); - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(this.visitorConfig)); return argument; } @Override public StaticContext visitArrayLookupExpression(ArrayLookupExpression expression, StaticContext argument) { visitDescendants(expression, argument); - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(this.visitorConfig)); return argument; } @Override public StaticContext visitObjectLookupExpression(ObjectLookupExpression expression, StaticContext argument) { visitDescendants(expression, argument); - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(this.visitorConfig)); return argument; } @@ -855,7 +860,7 @@ public StaticContext visitFilterExpression(FilterExpression expression, StaticCo } } } - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(this.visitorConfig)); if (!expression.getStaticContext().getRumbleConfiguration().getNativeSQLPredicates()) { if (expression.getHighestExecutionMode().equals(ExecutionMode.DATAFRAME)) { expression.setHighestExecutionMode(ExecutionMode.RDD); @@ -877,7 +882,9 @@ public StaticContext visitDynamicFunctionCallExpression( expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } - expression.setHighestExecutionMode(expression.getArguments().get(0).getHighestExecutionMode(visitorConfig)); + expression.setHighestExecutionMode( + expression.getArguments().get(0).getHighestExecutionMode(this.visitorConfig) + ); if (expression.getHighestExecutionMode().equals(ExecutionMode.RDD)) { expression.setHighestExecutionMode(ExecutionMode.LOCAL); } @@ -895,7 +902,9 @@ public StaticContext visitTreatExpression(TreatExpression expression, StaticCont && sequenceType.getArity() != SequenceType.Arity.One && sequenceType.getArity() != SequenceType.Arity.OneOrZero ) { - expression.setHighestExecutionMode(expression.getMainExpression().getHighestExecutionMode(visitorConfig)); + expression.setHighestExecutionMode( + expression.getMainExpression().getHighestExecutionMode(this.visitorConfig) + ); } expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; diff --git a/src/main/java/org/rumbledb/expressions/Node.java b/src/main/java/org/rumbledb/expressions/Node.java index be9abfc44..784a1e5d6 100644 --- a/src/main/java/org/rumbledb/expressions/Node.java +++ b/src/main/java/org/rumbledb/expressions/Node.java @@ -49,11 +49,9 @@ protected Node(ExceptionMetadata metadata) { * Initializes the highest execution mode of this node, which determines * whether evaluation will be done locally, with RDDs or with DataFrames. * - * This method is used during the static analysis. It is meant to be - * overridden by subclasses that support higher execution modes. By - * default, the highest execution mode is assumed to be local. + * This method is used during the static analysis. */ - public final void setHighestExecutionMode(ExecutionMode newMode) { + public void setHighestExecutionMode(ExecutionMode newMode) { this.highestExecutionMode = newMode; } diff --git a/src/main/java/org/rumbledb/expressions/flowr/CountClause.java b/src/main/java/org/rumbledb/expressions/flowr/CountClause.java index 9618d8476..70e710a4f 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/CountClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/CountClause.java @@ -62,9 +62,6 @@ public void print(StringBuffer buffer, int indent) { for (Node iterator : getChildren()) { iterator.print(buffer, indent + 1); } - if (this.previousClause != null) { - this.previousClause.print(buffer, indent + 1); - } } @Override diff --git a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java index 72039d9c0..33f5b2482 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java @@ -78,9 +78,6 @@ public void print(StringBuffer buffer, int indent) { for (Node iterator : getChildren()) { iterator.print(buffer, indent + 1); } - if (this.previousClause != null) { - this.previousClause.print(buffer, indent + 1); - } } @Override diff --git a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java index 9a68ef2de..e245accde 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java @@ -126,9 +126,6 @@ public void print(StringBuffer buffer, int indent) { for (Node iterator : getChildren()) { iterator.print(buffer, indent + 1); } - if (this.previousClause != null) { - this.previousClause.print(buffer, indent + 1); - } } @Override From 04eeaba341e5a48d17a4413e375e26063ecf2fb5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 13:16:06 +0200 Subject: [PATCH 079/136] Fix filter expression execution mode detection. --- src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index a25933e02..d28e7246e 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -848,6 +848,7 @@ public StaticContext visitObjectLookupExpression(ObjectLookupExpression expressi @Override public StaticContext visitFilterExpression(FilterExpression expression, StaticContext argument) { + visitDescendants(expression, argument); if (expression.getPredicateExpression() instanceof IntegerLiteralExpression) { String lexicalValue = ((IntegerLiteralExpression) expression.getPredicateExpression()).getLexicalValue(); if (ItemFactory.getInstance().createIntegerItem(lexicalValue).isInt()) { From 6039640335ca2455b044270955d464d697a4a2ef Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 13:38:04 +0200 Subject: [PATCH 080/136] Fix tests. --- .../rumbledb/compiler/ExecutionModeVisitor.java | 6 ++++-- .../java/org/rumbledb/context/StaticContext.java | 4 ++++ .../org/rumbledb/expressions/flowr/ForClause.java | 5 +++-- .../rumbledb/expressions/flowr/GroupByClause.java | 8 ++++++-- .../org/rumbledb/expressions/flowr/LetClause.java | 15 ++++++++++----- 5 files changed, 27 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index d28e7246e..36ee3c958 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -434,6 +434,7 @@ public StaticContext visitForClause(ForClause clause, StaticContext argument) { @Override public StaticContext visitLetClause(LetClause clause, StaticContext argument) { + argument.show(); this.visit(clause.getExpression(), clause.getExpression().getStaticContext()); if (clause.getPreviousClause() == null) { @@ -446,9 +447,9 @@ public StaticContext visitLetClause(LetClause clause, StaticContext argument) { // if let clause is local, defined variables are stored according to the execution mode of the expression if (clause.getHighestExecutionMode(this.visitorConfig) == ExecutionMode.LOCAL) { - clause.setHighestExecutionMode(clause.getExpression().getHighestExecutionMode(this.visitorConfig)); + clause.setVariableHighestExecutionMode(clause.getExpression().getHighestExecutionMode(this.visitorConfig)); } else { - clause.setHighestExecutionMode(ExecutionMode.LOCAL); + clause.setVariableHighestExecutionMode(ExecutionMode.LOCAL); } argument.setVariableStorageMode( @@ -456,6 +457,7 @@ public StaticContext visitLetClause(LetClause clause, StaticContext argument) { clause.getVariableHighestStorageMode(this.visitorConfig) ); + argument.show(); return argument; } diff --git a/src/main/java/org/rumbledb/context/StaticContext.java b/src/main/java/org/rumbledb/context/StaticContext.java index e5a861e23..6fb05432d 100644 --- a/src/main/java/org/rumbledb/context/StaticContext.java +++ b/src/main/java/org/rumbledb/context/StaticContext.java @@ -220,6 +220,10 @@ public Map getInScopeVariables() { return this.inScopeVariables; } + public void show() { + System.err.println(this); + } + @Override public String toString() { StringBuilder stringBuilder = new StringBuilder(); diff --git a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java index 4d73f9278..1f0aafe4b 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/ForClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/ForClause.java @@ -128,7 +128,7 @@ public void print(StringBuffer buffer, int indent) { buffer.append(getClass().getSimpleName()); buffer.append( " (" - + (this.variableName) + + ("$" + this.variableName) + ", " + this.getSequenceType().toString() + (this.getSequenceType().isResolved() ? " (resolved)" : " (unresolved)") @@ -137,7 +137,8 @@ public void print(StringBuffer buffer, int indent) { + this.positionalVariableName + ") " ); - buffer.append(" | " + this.highestExecutionMode); + buffer.append(" | mode: " + this.highestExecutionMode); + buffer.append(" | variable mode: " + this.variableHighestStorageMode); buffer.append("\n"); for (Node iterator : getChildren()) { iterator.print(buffer, indent + 1); diff --git a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java index 33f5b2482..6e2d00eae 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/GroupByClause.java @@ -68,9 +68,13 @@ public void print(StringBuffer buffer, int indent) { } buffer.append(getClass().getSimpleName()); buffer.append(" ("); + int i = 0; for (GroupByVariableDeclaration var : this.variables) { - buffer.append(var.getVariableName()); - buffer.append(", "); + buffer.append("$" + var.getVariableName()); + if (i < this.variables.size() - 1) { + buffer.append(", "); + } + ++i; } buffer.append(")"); buffer.append(" | " + this.highestExecutionMode); diff --git a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java index e245accde..8fc2fa065 100644 --- a/src/main/java/org/rumbledb/expressions/flowr/LetClause.java +++ b/src/main/java/org/rumbledb/expressions/flowr/LetClause.java @@ -88,6 +88,10 @@ public ExecutionMode getVariableHighestStorageMode(VisitorConfig visitorConfig) return this.variableHighestStorageMode; } + public void setVariableHighestExecutionMode(ExecutionMode newMode) { + this.variableHighestStorageMode = newMode; + } + @Override public List getChildren() { List result = new ArrayList<>(); @@ -112,16 +116,17 @@ public void print(StringBuffer buffer, int indent) { buffer.append(getClass().getSimpleName()); buffer.append( " (" - + (this.variableName) + + ("$" + this.variableName) + ", " - + ((this.getStaticType() != null) ? this.getStaticType().toString() : "(unset)") - + ((this.getStaticType() != null) - ? (this.getStaticType().isResolved() ? " (resolved)" : " (unresolved)") + + ((this.getSequenceType() != null) ? this.getSequenceType().toString() : "(unset)") + + ((this.getSequenceType() != null) + ? (this.getSequenceType().isResolved() ? " (resolved)" : " (unresolved)") : "") + ") " ); buffer.append(")"); - buffer.append(" | " + this.highestExecutionMode); + buffer.append(" | mode: " + this.highestExecutionMode); + buffer.append(" | variable mode: " + this.variableHighestStorageMode); buffer.append("\n"); for (Node iterator : getChildren()) { iterator.print(buffer, indent + 1); From dd12758082d78ff7df7eb21d61108df5ab22e4fa Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 15:43:25 +0200 Subject: [PATCH 081/136] Fix test. --- src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 36ee3c958..95675fbc9 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -877,6 +877,7 @@ public StaticContext visitDynamicFunctionCallExpression( DynamicFunctionCallExpression expression, StaticContext argument ) { + visitDescendants(expression, argument); if (expression.getArguments().size() == 0) { expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; From 459a25748792242c58b8eb3b40cae21c0d75fc00 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 15:50:03 +0200 Subject: [PATCH 082/136] Fix tests. --- src/main/java/org/rumbledb/compiler/CloneVisitor.java | 2 +- src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java | 3 ++- .../java/org/rumbledb/compiler/RuntimeIteratorVisitor.java | 2 +- .../java/org/rumbledb/expressions/typing/TreatExpression.java | 4 ---- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/CloneVisitor.java b/src/main/java/org/rumbledb/compiler/CloneVisitor.java index a2dfb359f..658c81f18 100644 --- a/src/main/java/org/rumbledb/compiler/CloneVisitor.java +++ b/src/main/java/org/rumbledb/compiler/CloneVisitor.java @@ -545,7 +545,7 @@ public Node visitIsStaticallyExpr(IsStaticallyExpression expression, Node argume public Node visitTreatExpression(TreatExpression expression, Node argument) { TreatExpression result = new TreatExpression( (Expression) visit(expression.getMainExpression(), argument), - expression.getsequenceType(), + expression.getSequenceType(), expression.errorCodeThatShouldBeThrown(), expression.getMetadata() ); diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 95675fbc9..86f924e65 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -900,7 +900,8 @@ public StaticContext visitDynamicFunctionCallExpression( @Override public StaticContext visitTreatExpression(TreatExpression expression, StaticContext argument) { - SequenceType sequenceType = expression.getsequenceType(); + visitDescendants(expression, argument); + SequenceType sequenceType = expression.getSequenceType(); if ( !sequenceType.isEmptySequence() && sequenceType.getArity() != SequenceType.Arity.One diff --git a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java index 4613772f4..01d577479 100644 --- a/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java +++ b/src/main/java/org/rumbledb/compiler/RuntimeIteratorVisitor.java @@ -831,7 +831,7 @@ public RuntimeIterator visitTreatExpression(TreatExpression expression, RuntimeI RuntimeIterator childExpression = this.visit(expression.getMainExpression(), argument); RuntimeIterator runtimeIterator = new TreatIterator( childExpression, - expression.getsequenceType(), + expression.getSequenceType(), expression.errorCodeThatShouldBeThrown(), expression.getStaticContextForRuntime(this.config, this.visitorConfig) ); diff --git a/src/main/java/org/rumbledb/expressions/typing/TreatExpression.java b/src/main/java/org/rumbledb/expressions/typing/TreatExpression.java index 194e3daa6..959c121b0 100644 --- a/src/main/java/org/rumbledb/expressions/typing/TreatExpression.java +++ b/src/main/java/org/rumbledb/expressions/typing/TreatExpression.java @@ -33,10 +33,6 @@ public TreatExpression( this.sequenceType = sequenceType; } - public SequenceType getsequenceType() { - return this.sequenceType; - } - public ErrorCode errorCodeThatShouldBeThrown() { return this.errorCode; } From 7926be9790d65928aa3631a76a5eca6539eb9ae5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 15:58:31 +0200 Subject: [PATCH 083/136] Fix test. --- src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 86f924e65..58715d1b5 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -910,6 +910,7 @@ public StaticContext visitTreatExpression(TreatExpression expression, StaticCont expression.setHighestExecutionMode( expression.getMainExpression().getHighestExecutionMode(this.visitorConfig) ); + return argument; } expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; From 0cdb053c3b5f6274ea2b2d4ad5e94395d4caedc4 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 16:44:10 +0200 Subject: [PATCH 084/136] Fix test. --- src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 58715d1b5..8c96e1aa7 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -338,7 +338,7 @@ private ExecutionMode getBuiltInFunctionExecutionMode( @Override public StaticContext visitReturnClause(ReturnClause expression, StaticContext argument) { - expression.getReturnExpr().accept(this, expression.getStaticContext()); + visit(expression.getReturnExpr(), expression.getReturnExpr().getStaticContext()); if (expression.getPreviousClause().getHighestExecutionMode(this.visitorConfig).isDataFrame()) { if ( expression.getReturnExpr() @@ -761,7 +761,7 @@ public StaticContext visitConditionalExpression( ) { visitDescendants(conditionalExpression, argument); if (conditionalExpression.getBranch().getHighestExecutionMode(this.visitorConfig).isLocal()) { - conditionalExpression.setHighestExecutionMode(null); + conditionalExpression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; } if (conditionalExpression.getElseBranch().getHighestExecutionMode(this.visitorConfig).isLocal()) { From 063ebfcfe088ae9723fe046ad561bf0a33c3ca96 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 17:14:28 +0200 Subject: [PATCH 085/136] Add tests with deactivated DFs. --- .github/workflows/maven.yml | 2 + ...LWORRuntimeTestsDataFramesDeactivated.java | 86 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/test/java/iq/NativeFLWORRuntimeTestsDataFramesDeactivated.java diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 6fb12e584..a877a5bd4 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -100,3 +100,5 @@ jobs: run: mvn -Dtest=RuntimeTestsNoInlining test - name: NativeFLWORRuntimeTestsNativeDeactivated run: mvn -Dtest=NativeFLWORRuntimeTestsNativeDeactivated test + - name: NativeFLWORRuntimeTestsNativeDeactivated + run: mvn -Dtest=NativeFLWORRuntimeTestsDataFramesDeactivated test diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesDeactivated.java new file mode 100644 index 000000000..b6c96499b --- /dev/null +++ b/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesDeactivated.java @@ -0,0 +1,86 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import iq.base.AnnotationsTestsBase; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class NativeFLWORRuntimeTestsDataFramesDeactivated extends RuntimeTests { + + protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--data-frame-execution", + "no" + } + ); + + public static final File nativeFlworRuntimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-native-flwor" + ); + + public NativeFLWORRuntimeTestsDataFramesDeactivated(File testFile) { + super(testFile); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + _testFiles.clear(); + readFileList(nativeFlworRuntimeTestsDirectory); + _testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } + + @Test(timeout = 1000000) + public void testRuntimeIterators() throws Throwable { + System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); + testAnnotations(this.testFile.getAbsolutePath(), NativeFLWORRuntimeTestsDataFramesDeactivated.configuration); + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput = runIterators(sequence); + Assert.assertTrue( + "Expected output: " + expectedOutput + " Actual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + } +} From 079e50b5a076ad78bccf442fc1946deda0a42a28 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 17:15:02 +0200 Subject: [PATCH 086/136] Fix test template. --- .github/workflows/maven.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index a877a5bd4..b958aede0 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -100,5 +100,5 @@ jobs: run: mvn -Dtest=RuntimeTestsNoInlining test - name: NativeFLWORRuntimeTestsNativeDeactivated run: mvn -Dtest=NativeFLWORRuntimeTestsNativeDeactivated test - - name: NativeFLWORRuntimeTestsNativeDeactivated + - name: NativeFLWORRuntimeTestsDataFramesDeactivated run: mvn -Dtest=NativeFLWORRuntimeTestsDataFramesDeactivated test From 6ec65c427ef9182ed899163d13c551c56e58e0ad Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 19:33:52 +0200 Subject: [PATCH 087/136] Update RDDRuntimeIterator.java --- src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java index 2b5fdaad3..68b32d8a2 100644 --- a/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/RDDRuntimeIterator.java @@ -48,6 +48,11 @@ protected boolean implementsLocal() { return false; } + @Override + protected boolean implementsRDD() { + return false; + } + @Override protected void openLocal() { throw new OurBadException("Local evaluation are not implemented for the iterator", getMetadata()); From 62e2faf40e97a3fa0595d9228035d39531561575 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 19:35:13 +0200 Subject: [PATCH 088/136] Update HybridRuntimeIterator.java --- src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java index 8b6869f1d..8929fe268 100644 --- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java @@ -59,6 +59,10 @@ protected boolean implementsLocal() { return true; } + protected boolean implementsRDD() { + return true; + } + protected void fallbackToRDDIfDFNotImplemented(ExecutionMode executionMode) { if (executionMode == ExecutionMode.DATAFRAME && !this.implementsDataFrames()) { this.staticContext.setExecutionMode(ExecutionMode.RDD); From 2c0508927d5810967510f68af47edc889602b9ff Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 19:38:49 +0200 Subject: [PATCH 089/136] Update HybridRuntimeIterator.java --- .../org/rumbledb/runtime/HybridRuntimeIterator.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java index 8929fe268..9374602f0 100644 --- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java @@ -146,15 +146,15 @@ public Item next() { @Override public JavaRDD getRDD(DynamicContext context) { - if (isDataFrame()) { + if ((isDataFrame() && implementsDataFrame()) || (isRDD() && implementsDataFrame() && !implementsRDD()) { JSoundDataFrame df = this.getDataFrame(context); return dataFrameToRDDOfItems(df, getMetadata()); - } else if (isRDDOrDataFrame()) { + } + if (isRDDOrDataFrame()) { return getRDDAux(context); - } else { - List contents = this.materialize(context); - return SparkSessionManager.getInstance().getJavaSparkContext().parallelize(contents); } + List contents = this.materialize(context); + return SparkSessionManager.getInstance().getJavaSparkContext().parallelize(contents); } public static JavaRDD dataFrameToRDDOfItems(JSoundDataFrame df, ExceptionMetadata metadata) { From dcf612a0eb24579df1c791d01c211c238cf3b705 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 19:40:08 +0200 Subject: [PATCH 090/136] Update HybridRuntimeIterator.java --- src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java index 9374602f0..e6adfa7d8 100644 --- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java @@ -146,7 +146,7 @@ public Item next() { @Override public JavaRDD getRDD(DynamicContext context) { - if ((isDataFrame() && implementsDataFrame()) || (isRDD() && implementsDataFrame() && !implementsRDD()) { + if ((isDataFrame() && implementsDataFrame()) || (isRDD() && implementsDataFrame() && !implementsRDD())) { JSoundDataFrame df = this.getDataFrame(context); return dataFrameToRDDOfItems(df, getMetadata()); } From 440e165872f64ac3b69e5f9a42a644efb7f59e4b Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 11 May 2023 19:41:14 +0200 Subject: [PATCH 091/136] Update HybridRuntimeIterator.java --- src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java index e6adfa7d8..131742fe5 100644 --- a/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/HybridRuntimeIterator.java @@ -146,7 +146,7 @@ public Item next() { @Override public JavaRDD getRDD(DynamicContext context) { - if ((isDataFrame() && implementsDataFrame()) || (isRDD() && implementsDataFrame() && !implementsRDD())) { + if ((isDataFrame() && implementsDataFrames()) || (isRDD() && implementsDataFrames() && !implementsRDD())) { JSoundDataFrame df = this.getDataFrame(context); return dataFrameToRDDOfItems(df, getMetadata()); } From 454c3509a63146bb9ce524a7b969a93f53a8a436 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 15:17:23 +0200 Subject: [PATCH 092/136] Remove verbose output. --- .../org/rumbledb/compiler/ExecutionModeVisitor.java | 13 ++++++------- .../org/rumbledb/compiler/InferTypeVisitor.java | 3 ++- src/main/java/org/rumbledb/types/SequenceType.java | 12 ++++++++++++ 3 files changed, 20 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java index 8c96e1aa7..88f5d8a9b 100644 --- a/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/ExecutionModeVisitor.java @@ -434,7 +434,6 @@ public StaticContext visitForClause(ForClause clause, StaticContext argument) { @Override public StaticContext visitLetClause(LetClause clause, StaticContext argument) { - argument.show(); this.visit(clause.getExpression(), clause.getExpression().getStaticContext()); if (clause.getPreviousClause() == null) { @@ -457,7 +456,6 @@ public StaticContext visitLetClause(LetClause clause, StaticContext argument) { clause.getVariableHighestStorageMode(this.visitorConfig) ); - argument.show(); return argument; } @@ -623,7 +621,8 @@ public StaticContext visitProlog(Prolog prolog, StaticContext argument) { @Override public StaticContext visitValidateTypeExpression(ValidateTypeExpression expression, StaticContext argument) { visitDescendants(expression, null); - switch (expression.getSequenceType().getArity()) { + SequenceType targetType = expression.getStaticSequenceType(); + switch (targetType.getArity()) { case Zero: expression.setHighestExecutionMode(ExecutionMode.LOCAL); return argument; @@ -635,8 +634,8 @@ public StaticContext visitValidateTypeExpression(ValidateTypeExpression expressi return argument; case OneOrMore: if ( - expression.getSequenceType().getItemType().isObjectItemType() - && expression.getSequenceType().getItemType().isCompatibleWithDataFrames(this.configuration) + targetType.getItemType().isObjectItemType() + && targetType.getItemType().isCompatibleWithDataFrames(this.configuration) ) { LogManager.getLogger("ExecutionModeVisitor") .info( @@ -659,8 +658,8 @@ public StaticContext visitValidateTypeExpression(ValidateTypeExpression expressi return argument; case ZeroOrMore: if ( - expression.getSequenceType().getItemType().isObjectItemType() - && expression.getSequenceType().getItemType().isCompatibleWithDataFrames(this.configuration) + targetType.getItemType().isObjectItemType() + && targetType.getItemType().isCompatibleWithDataFrames(this.configuration) ) { LogManager.getLogger("ExecutionModeVisitor") .info( diff --git a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java index fd7226b52..dae00d244 100644 --- a/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java +++ b/src/main/java/org/rumbledb/compiler/InferTypeVisitor.java @@ -2084,7 +2084,8 @@ public StaticContext visitProlog(Prolog prolog, StaticContext argument) { @Override public StaticContext visitValidateTypeExpression(ValidateTypeExpression expression, StaticContext argument) { visitDescendants(expression, expression.getStaticContext()); - expression.setStaticSequenceType(expression.getSequenceType()); + SequenceType sourceType = expression.getMainExpression().getStaticSequenceType(); + expression.setStaticSequenceType(expression.getSequenceType().refineArityIfSubtype(sourceType.getArity())); return argument; } diff --git a/src/main/java/org/rumbledb/types/SequenceType.java b/src/main/java/org/rumbledb/types/SequenceType.java index 41e10a619..30df1cd33 100644 --- a/src/main/java/org/rumbledb/types/SequenceType.java +++ b/src/main/java/org/rumbledb/types/SequenceType.java @@ -391,6 +391,18 @@ public SequenceType incrementArity() { return this; } + // increment arity of a sequence type from ? to * and from 1 to +, leave others arity or sequence types untouched + public SequenceType refineArityIfSubtype(Arity otherArity) { + if (!isEmptySequence()) { + if (otherArity.isSubtypeOf(this.arity)) { + return new SequenceType(this.itemType, otherArity); + } else { + return this; + } + } + return this; + } + @Override public boolean equals(Object other) { if (!(other instanceof SequenceType)) { From 7f2e62c9d47ecaebff310ade99ed309bd7bc08aa Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 15:43:54 +0200 Subject: [PATCH 093/136] Fix test. --- .../runtime/AtMostOneItemLocalRuntimeIterator.java | 14 ++++++++++++++ .../runtime/navigation/ObjectLookupIterator.java | 9 ++++----- 2 files changed, 18 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/AtMostOneItemLocalRuntimeIterator.java b/src/main/java/org/rumbledb/runtime/AtMostOneItemLocalRuntimeIterator.java index 0cb26058c..325561efa 100644 --- a/src/main/java/org/rumbledb/runtime/AtMostOneItemLocalRuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/AtMostOneItemLocalRuntimeIterator.java @@ -20,6 +20,7 @@ package org.rumbledb.runtime; +import org.apache.spark.api.java.JavaRDD; import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.RuntimeStaticContext; @@ -31,10 +32,14 @@ import org.rumbledb.expressions.ExecutionMode; import org.rumbledb.expressions.comparison.ComparisonExpression.ComparisonOperator; import org.rumbledb.types.BuiltinTypesCatalogue; + +import sparksoniq.spark.SparkSessionManager; + import org.rumbledb.runtime.misc.ComparisonIterator; import java.math.BigDecimal; import java.math.BigInteger; +import java.util.ArrayList; import java.util.List; public abstract class AtMostOneItemLocalRuntimeIterator extends RuntimeIterator { @@ -52,6 +57,15 @@ protected AtMostOneItemLocalRuntimeIterator( } } + public JavaRDD getRDD(DynamicContext context) { + Item i = materializeFirstItemOrNull(context); + List result = new ArrayList<>(); + if (i != null) { + result.add(i); + } + return SparkSessionManager.getInstance().getJavaSparkContext().parallelize(result); + } + public abstract Item materializeFirstItemOrNull( DynamicContext context ); diff --git a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java index e4d221213..1237e01e0 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/ObjectLookupIterator.java @@ -232,11 +232,10 @@ public NativeClauseContext generateNativeQuery(NativeClauseContext nativeClauseC // if the right hand side depends on the tuple stream, we cannot turn this into a native SQL query. if (outerContextSchema instanceof StructType) { StructType structSchema = (StructType) outerContextSchema; - if ( - Arrays.stream(structSchema.fieldNames()) - .anyMatch(field -> keyDependencies.containsKey(Name.createVariableInNoNamespace(field))) - ) { - return NativeClauseContext.NoNativeQuery; + for (Name n : keyDependencies.keySet()) { + if (FlworDataFrameUtils.hasColumnForVariable(structSchema, n)) { + return NativeClauseContext.NoNativeQuery; + } } } // otherwise, we can directly resolve the key statically. From c29bf480617bce486714199bc5f1feedd4375cd6 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 15:46:52 +0200 Subject: [PATCH 094/136] Add tests without parallelism. --- .github/workflows/maven.yml | 2 + ...TestsDataFramesParallelismDeactivated.java | 86 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index b958aede0..2fcfc9b9a 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -102,3 +102,5 @@ jobs: run: mvn -Dtest=NativeFLWORRuntimeTestsNativeDeactivated test - name: NativeFLWORRuntimeTestsDataFramesDeactivated run: mvn -Dtest=NativeFLWORRuntimeTestsDataFramesDeactivated test + - name: NativeFLWORRuntimeTestsParallelismDeactivated + run: mvn -Dtest=NativeFLWORRuntimeTestsParallelismDeactivated test diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java new file mode 100644 index 000000000..f9b8e50a6 --- /dev/null +++ b/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java @@ -0,0 +1,86 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import iq.base.AnnotationsTestsBase; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class NativeFLWORRuntimeTestsDataFramesParallelismDeactivated extends RuntimeTests { + + protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--parallel-execution", + "no" + } + ); + + public static final File nativeFlworRuntimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-native-flwor" + ); + + public NativeFLWORRuntimeTestsDataFramesParallelismDeactivated(File testFile) { + super(testFile); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + _testFiles.clear(); + readFileList(nativeFlworRuntimeTestsDirectory); + _testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } + + @Test(timeout = 1000000) + public void testRuntimeIterators() throws Throwable { + System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); + testAnnotations(this.testFile.getAbsolutePath(), NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.configuration); + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput = runIterators(sequence); + Assert.assertTrue( + "Expected output: " + expectedOutput + " Actual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + } +} From 3bed69a52f9caa9e6704731fd84e963bba357232 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 15:51:48 +0200 Subject: [PATCH 095/136] Spotless. --- ...iveFLWORRuntimeTestsDataFramesParallelismDeactivated.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java index f9b8e50a6..637c76d64 100644 --- a/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java +++ b/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java @@ -69,7 +69,10 @@ public static Collection testFiles() { @Test(timeout = 1000000) public void testRuntimeIterators() throws Throwable { System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.configuration); + testAnnotations( + this.testFile.getAbsolutePath(), + NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.configuration + ); } @Override From 1e59051ef383402a760d2639bc7de8f4d657c7b1 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 16:03:07 +0200 Subject: [PATCH 096/136] Fix test name. --- ...a => NativeFLWORRuntimeTestsParallelismDeactivated.java} | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) rename src/test/java/iq/{NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java => NativeFLWORRuntimeTestsParallelismDeactivated.java} (91%) diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsParallelismDeactivated.java similarity index 91% rename from src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java rename to src/test/java/iq/NativeFLWORRuntimeTestsParallelismDeactivated.java index 637c76d64..d5d3e00f8 100644 --- a/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.java +++ b/src/test/java/iq/NativeFLWORRuntimeTestsParallelismDeactivated.java @@ -34,7 +34,7 @@ import java.util.List; @RunWith(Parameterized.class) -public class NativeFLWORRuntimeTestsDataFramesParallelismDeactivated extends RuntimeTests { +public class NativeFLWORRuntimeTestsParallelismDeactivated extends RuntimeTests { protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( new String[] { @@ -53,7 +53,7 @@ public class NativeFLWORRuntimeTestsDataFramesParallelismDeactivated extends Run "/src/test/resources/test_files/runtime-native-flwor" ); - public NativeFLWORRuntimeTestsDataFramesParallelismDeactivated(File testFile) { + public NativeFLWORRuntimeTestsParallelismDeactivated(File testFile) { super(testFile); } @@ -71,7 +71,7 @@ public void testRuntimeIterators() throws Throwable { System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); testAnnotations( this.testFile.getAbsolutePath(), - NativeFLWORRuntimeTestsDataFramesParallelismDeactivated.configuration + NativeFLWORRuntimeTestsParallelismDeactivated.configuration ); } From 63931dcad5f16d8b2bcdfaeb5d4c33d10a367913 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 16:06:42 +0200 Subject: [PATCH 097/136] Fix test order. --- .../test_files/runtime-native-flwor/group-by/GroupBy3.jq | 1 + 1 file changed, 1 insertion(+) diff --git a/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy3.jq b/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy3.jq index 53fa88c98..260cc0bd5 100644 --- a/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy3.jq +++ b/src/test/resources/test_files/runtime-native-flwor/group-by/GroupBy3.jq @@ -6,4 +6,5 @@ for $i in annotate( let $l := ("foo", $i.foo.bar[[1]]) group by $k := $i.key group by $k +order by $k descending return { "k": $k, "c" : [ $l ] } From e38205aac10c611b256718ac8f0b0a7ac75f7d96 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 16:18:24 +0200 Subject: [PATCH 098/136] Add tests. --- src/test/java/iq/Bugs.java | 12 +++---- src/test/java/iq/FrontendTests.java | 8 ++--- src/test/java/iq/NativeFLWORRuntimeTests.java | 16 +++------ ...LWORRuntimeTestsDataFramesDeactivated.java | 31 +++++++---------- ...iveFLWORRuntimeTestsNativeDeactivated.java | 31 +++++++---------- ...WORRuntimeTestsParallelismDeactivated.java | 34 +++++++------------ src/test/java/iq/RuntimeTests.java | 14 ++++---- src/test/java/iq/RuntimeTestsNoInlining.java | 2 +- .../java/iq/RuntimeTestsNoParallelism.java | 8 ++--- src/test/java/iq/StaticTypeTests.java | 8 ++--- .../java/iq/base/AnnotationsTestsBase.java | 5 ++- 11 files changed, 74 insertions(+), 95 deletions(-) diff --git a/src/test/java/iq/Bugs.java b/src/test/java/iq/Bugs.java index 344e51a1e..79d18f8aa 100644 --- a/src/test/java/iq/Bugs.java +++ b/src/test/java/iq/Bugs.java @@ -91,14 +91,14 @@ public static void setupSparkSession() { // sparkConfiguration.set("spark.speculation", "true"); // sparkConfiguration.set("spark.speculation.quantile", "0.5"); SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); - SparkSessionManager.COLLECT_ITEM_LIMIT = configuration.getResultSizeCap(); + SparkSessionManager.COLLECT_ITEM_LIMIT = defaultConfiguration.getResultSizeCap(); System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); } @Test(timeout = 1000000) public void testRuntimeIterators() throws Throwable { System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), AnnotationsTestsBase.configuration); + testAnnotations(this.testFile.getAbsolutePath(), AnnotationsTestsBase.defaultConfiguration); } @Override @@ -145,16 +145,16 @@ protected String getIteratorOutput(SequenceOfItems sequence) { while ( sequence.hasNext() && - ((itemCount < AnnotationsTestsBase.configuration.getResultSizeCap() - && AnnotationsTestsBase.configuration.getResultSizeCap() > 0) + ((itemCount < AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() + && AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() > 0) || - AnnotationsTestsBase.configuration.getResultSizeCap() == 0) + AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() == 0) ) { sb.append(sequence.next().serialize()); sb.append(", "); itemCount++; } - if (sequence.hasNext() && itemCount == AnnotationsTestsBase.configuration.getResultSizeCap()) { + if (sequence.hasNext() && itemCount == AnnotationsTestsBase.defaultConfiguration.getResultSizeCap()) { System.err.println( "Warning! The output sequence contains a large number of items but its materialization was capped at " + SparkSessionManager.COLLECT_ITEM_LIMIT diff --git a/src/test/java/iq/FrontendTests.java b/src/test/java/iq/FrontendTests.java index ad5d08e5b..98526b41c 100644 --- a/src/test/java/iq/FrontendTests.java +++ b/src/test/java/iq/FrontendTests.java @@ -68,7 +68,7 @@ public void testGrammarAndParser() throws Throwable { for (File testFile : this.testFiles) { System.err.println(counter++ + " : " + testFile); // FileReader reader = getReaderForFile(testFile.getAbsolutePath()); - testAnnotations(testFile.getAbsolutePath(), AnnotationsTestsBase.configuration); + testAnnotations(testFile.getAbsolutePath(), AnnotationsTestsBase.defaultConfiguration); } } @@ -103,16 +103,16 @@ public void testSematicChecks() throws Throwable { initializeTests(semanticTestsDirectory); for (File testFile : this.testFiles) { System.err.println(counter++ + " : " + testFile); - testAnnotations(testFile.getAbsolutePath(), AnnotationsTestsBase.configuration); + testAnnotations(testFile.getAbsolutePath(), AnnotationsTestsBase.defaultConfiguration); if (Arrays.asList(manualSemanticChecksFiles).contains(testFile.getName())) { URI uri = FileSystemUtil.resolveURIAgainstWorkingDirectory( testFile.getAbsolutePath(), - AnnotationsTestsBase.configuration, + AnnotationsTestsBase.defaultConfiguration, ExceptionMetadata.EMPTY_METADATA ); MainModule mainModule = VisitorHelpers.parseMainModuleFromLocation( uri, - AnnotationsTestsBase.configuration + AnnotationsTestsBase.defaultConfiguration ); testVariableTypes(mainModule); diff --git a/src/test/java/iq/NativeFLWORRuntimeTests.java b/src/test/java/iq/NativeFLWORRuntimeTests.java index 9904df0df..41ad30a0c 100644 --- a/src/test/java/iq/NativeFLWORRuntimeTests.java +++ b/src/test/java/iq/NativeFLWORRuntimeTests.java @@ -20,9 +20,7 @@ package iq; -import iq.base.AnnotationsTestsBase; import org.junit.Assert; -import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.rumbledb.api.SequenceOfItems; @@ -36,9 +34,11 @@ @RunWith(Parameterized.class) public class NativeFLWORRuntimeTests extends RuntimeTests { - protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( - new String[] { "--variable:externalUnparsedString", "unparsed string", "--escape-backticks", "yes" } - ); + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { "--variable:externalUnparsedString", "unparsed string", "--escape-backticks", "yes" } + ); + } public static final File nativeFlworRuntimeTestsDirectory = new File( System.getProperty("user.dir") @@ -59,12 +59,6 @@ public static Collection testFiles() { return result; } - @Test(timeout = 1000000) - public void testRuntimeIterators() throws Throwable { - System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), NativeFLWORRuntimeTests.configuration); - } - @Override protected void checkExpectedOutput( String expectedOutput, diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesDeactivated.java index b6c96499b..05932b190 100644 --- a/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesDeactivated.java +++ b/src/test/java/iq/NativeFLWORRuntimeTestsDataFramesDeactivated.java @@ -20,9 +20,7 @@ package iq; -import iq.base.AnnotationsTestsBase; import org.junit.Assert; -import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.rumbledb.api.SequenceOfItems; @@ -36,16 +34,19 @@ @RunWith(Parameterized.class) public class NativeFLWORRuntimeTestsDataFramesDeactivated extends RuntimeTests { - protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( - new String[] { - "--variable:externalUnparsedString", - "unparsed string", - "--escape-backticks", - "yes", - "--data-frame-execution", - "no" - } - ); + @Override + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--data-frame-execution", + "no" + } + ); + } public static final File nativeFlworRuntimeTestsDirectory = new File( System.getProperty("user.dir") @@ -66,12 +67,6 @@ public static Collection testFiles() { return result; } - @Test(timeout = 1000000) - public void testRuntimeIterators() throws Throwable { - System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), NativeFLWORRuntimeTestsDataFramesDeactivated.configuration); - } - @Override protected void checkExpectedOutput( String expectedOutput, diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java index 70384b0b0..3b46698cf 100644 --- a/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java +++ b/src/test/java/iq/NativeFLWORRuntimeTestsNativeDeactivated.java @@ -20,9 +20,7 @@ package iq; -import iq.base.AnnotationsTestsBase; import org.junit.Assert; -import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.rumbledb.api.SequenceOfItems; @@ -36,16 +34,19 @@ @RunWith(Parameterized.class) public class NativeFLWORRuntimeTestsNativeDeactivated extends RuntimeTests { - protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( - new String[] { - "--variable:externalUnparsedString", - "unparsed string", - "--escape-backticks", - "yes", - "--native-execution", - "no" - } - ); + @Override + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--native-execution", + "no" + } + ); + } public static final File nativeFlworRuntimeTestsDirectory = new File( System.getProperty("user.dir") @@ -66,12 +67,6 @@ public static Collection testFiles() { return result; } - @Test(timeout = 1000000) - public void testRuntimeIterators() throws Throwable { - System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), NativeFLWORRuntimeTestsNativeDeactivated.configuration); - } - @Override protected void checkExpectedOutput( String expectedOutput, diff --git a/src/test/java/iq/NativeFLWORRuntimeTestsParallelismDeactivated.java b/src/test/java/iq/NativeFLWORRuntimeTestsParallelismDeactivated.java index d5d3e00f8..87aa35364 100644 --- a/src/test/java/iq/NativeFLWORRuntimeTestsParallelismDeactivated.java +++ b/src/test/java/iq/NativeFLWORRuntimeTestsParallelismDeactivated.java @@ -20,9 +20,7 @@ package iq; -import iq.base.AnnotationsTestsBase; import org.junit.Assert; -import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.rumbledb.api.SequenceOfItems; @@ -36,16 +34,19 @@ @RunWith(Parameterized.class) public class NativeFLWORRuntimeTestsParallelismDeactivated extends RuntimeTests { - protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( - new String[] { - "--variable:externalUnparsedString", - "unparsed string", - "--escape-backticks", - "yes", - "--parallel-execution", - "no" - } - ); + @Override + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--parallel-execution", + "no" + } + ); + } public static final File nativeFlworRuntimeTestsDirectory = new File( System.getProperty("user.dir") @@ -66,15 +67,6 @@ public static Collection testFiles() { return result; } - @Test(timeout = 1000000) - public void testRuntimeIterators() throws Throwable { - System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations( - this.testFile.getAbsolutePath(), - NativeFLWORRuntimeTestsParallelismDeactivated.configuration - ); - } - @Override protected void checkExpectedOutput( String expectedOutput, diff --git a/src/test/java/iq/RuntimeTests.java b/src/test/java/iq/RuntimeTests.java index e43c349d5..3fb02e10e 100644 --- a/src/test/java/iq/RuntimeTests.java +++ b/src/test/java/iq/RuntimeTests.java @@ -91,14 +91,14 @@ public static void setupSparkSession() { // sparkConfiguration.set("spark.speculation", "true"); // sparkConfiguration.set("spark.speculation.quantile", "0.5"); SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); - SparkSessionManager.COLLECT_ITEM_LIMIT = configuration.getResultSizeCap(); + SparkSessionManager.COLLECT_ITEM_LIMIT = defaultConfiguration.getResultSizeCap(); System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); } @Test(timeout = 1000000) - public void testRuntimeIterators() throws Throwable { + public final void testRuntimeIterators() throws Throwable { System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), AnnotationsTestsBase.configuration); + testAnnotations(this.testFile.getAbsolutePath(), getConfiguration()); } @Override @@ -145,16 +145,16 @@ protected String getIteratorOutput(SequenceOfItems sequence) { while ( sequence.hasNext() && - ((itemCount < AnnotationsTestsBase.configuration.getResultSizeCap() - && AnnotationsTestsBase.configuration.getResultSizeCap() > 0) + ((itemCount < AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() + && AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() > 0) || - AnnotationsTestsBase.configuration.getResultSizeCap() == 0) + AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() == 0) ) { sb.append(sequence.next().serialize()); sb.append(", "); itemCount++; } - if (sequence.hasNext() && itemCount == AnnotationsTestsBase.configuration.getResultSizeCap()) { + if (sequence.hasNext() && itemCount == AnnotationsTestsBase.defaultConfiguration.getResultSizeCap()) { System.err.println( "Warning! The output sequence contains a large number of items but its materialization was capped at " + SparkSessionManager.COLLECT_ITEM_LIMIT diff --git a/src/test/java/iq/RuntimeTestsNoInlining.java b/src/test/java/iq/RuntimeTestsNoInlining.java index 0e0491ef3..ff2f2bb3f 100644 --- a/src/test/java/iq/RuntimeTestsNoInlining.java +++ b/src/test/java/iq/RuntimeTestsNoInlining.java @@ -128,7 +128,7 @@ public static void setupSparkSession() { @Test(timeout = 1000000) public void testRuntimeIterators() throws Throwable { System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), AnnotationsTestsBase.configuration); + testAnnotations(this.testFile.getAbsolutePath(), AnnotationsTestsBase.defaultConfiguration); } @Override diff --git a/src/test/java/iq/RuntimeTestsNoParallelism.java b/src/test/java/iq/RuntimeTestsNoParallelism.java index c0e41c806..20e98ba80 100644 --- a/src/test/java/iq/RuntimeTestsNoParallelism.java +++ b/src/test/java/iq/RuntimeTestsNoParallelism.java @@ -175,16 +175,16 @@ protected String getIteratorOutput(SequenceOfItems sequence) { while ( sequence.hasNext() && - ((itemCount < AnnotationsTestsBase.configuration.getResultSizeCap() - && AnnotationsTestsBase.configuration.getResultSizeCap() > 0) + ((itemCount < AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() + && AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() > 0) || - AnnotationsTestsBase.configuration.getResultSizeCap() == 0) + AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() == 0) ) { sb.append(sequence.next().serialize()); sb.append(", "); itemCount++; } - if (sequence.hasNext() && itemCount == AnnotationsTestsBase.configuration.getResultSizeCap()) { + if (sequence.hasNext() && itemCount == AnnotationsTestsBase.defaultConfiguration.getResultSizeCap()) { System.err.println( "Warning! The output sequence contains a large number of items but its materialization was capped at " + SparkSessionManager.COLLECT_ITEM_LIMIT diff --git a/src/test/java/iq/StaticTypeTests.java b/src/test/java/iq/StaticTypeTests.java index 10342d6d7..760fe1899 100644 --- a/src/test/java/iq/StaticTypeTests.java +++ b/src/test/java/iq/StaticTypeTests.java @@ -129,16 +129,16 @@ protected String getIteratorOutput(SequenceOfItems sequence) { while ( sequence.hasNext() && - ((itemCount < AnnotationsTestsBase.configuration.getResultSizeCap() - && AnnotationsTestsBase.configuration.getResultSizeCap() > 0) + ((itemCount < AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() + && AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() > 0) || - AnnotationsTestsBase.configuration.getResultSizeCap() == 0) + AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() == 0) ) { sb.append(sequence.next().serialize()); sb.append(", "); itemCount++; } - if (sequence.hasNext() && itemCount == AnnotationsTestsBase.configuration.getResultSizeCap()) { + if (sequence.hasNext() && itemCount == AnnotationsTestsBase.defaultConfiguration.getResultSizeCap()) { System.err.println( "Warning! The output sequence contains a large number of items but its materialization was capped at " + SparkSessionManager.COLLECT_ITEM_LIMIT diff --git a/src/test/java/iq/base/AnnotationsTestsBase.java b/src/test/java/iq/base/AnnotationsTestsBase.java index a7a04c08c..30d4353d1 100644 --- a/src/test/java/iq/base/AnnotationsTestsBase.java +++ b/src/test/java/iq/base/AnnotationsTestsBase.java @@ -52,7 +52,7 @@ public class AnnotationsTestsBase { protected static int counter = 0; protected AnnotationProcessor.TestAnnotation currentAnnotation; protected List testFiles = new ArrayList<>(); - protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( + protected static final RumbleRuntimeConfiguration defaultConfiguration = new RumbleRuntimeConfiguration( new String[] { "--print-iterator-tree", "yes", @@ -75,6 +75,9 @@ public class AnnotationsTestsBase { ) ); + public RumbleRuntimeConfiguration getConfiguration() { + return defaultConfiguration; + } public void initializeTests(File dir) { FileManager.loadJiqFiles(dir).forEach(file -> this.testFiles.add(file)); From ccbef9768b6317cdf39a8e68a12c2bbc7de4e7e8 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 16:18:34 +0200 Subject: [PATCH 099/136] Add more tests. --- .../SparkRuntimeTestsNativeDeactivated.java | 81 +++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 src/test/java/iq/SparkRuntimeTestsNativeDeactivated.java diff --git a/src/test/java/iq/SparkRuntimeTestsNativeDeactivated.java b/src/test/java/iq/SparkRuntimeTestsNativeDeactivated.java new file mode 100644 index 000000000..844de7c6c --- /dev/null +++ b/src/test/java/iq/SparkRuntimeTestsNativeDeactivated.java @@ -0,0 +1,81 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import org.junit.Assert; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class SparkRuntimeTestsNativeDeactivated extends RuntimeTests { + + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--native-execution", + "no" + } + ); + } + + public static final File sparkRuntimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-spark" + ); + + public SparkRuntimeTestsNativeDeactivated(File testFile) { + super(testFile); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + _testFiles.clear(); + readFileList(sparkRuntimeTestsDirectory); + _testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput = runIterators(sequence); + Assert.assertTrue( + "Expected output: " + expectedOutput + " Actual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + } +} From de294ce25dedf2f452abf787df67bbb92d6378f5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 16:28:49 +0200 Subject: [PATCH 100/136] Restructure tests. --- .github/workflows/maven.yml | 10 +- src/test/java/iq/Bugs.java | 10 +- src/test/java/iq/FrontendTests.java | 8 +- src/test/java/iq/RuntimeTests.java | 8 +- src/test/java/iq/RuntimeTestsNoInlining.java | 213 +++-------------- .../java/iq/RuntimeTestsNoParallelism.java | 215 +++--------------- src/test/java/iq/StaticTypeTests.java | 8 +- 7 files changed, 77 insertions(+), 395 deletions(-) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 2fcfc9b9a..724183eff 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -35,6 +35,8 @@ jobs: run: mvn -Dtest=RuntimeTests test - name: RuntimeTestsNoParallelism run: mvn -Dtest=RuntimeTestsNoParallelism test + - name: RuntimeTestsNoInlining + run: mvn -Dtest=RuntimeTestsNoInlining test - name: StaticTypeTests run: mvn -Dtest=StaticTypeTests test - name: JavaAPITest @@ -70,8 +72,8 @@ jobs: run: mvn clean compile assembly:single - name: SparkRuntimeTests run: mvn -Dtest=SparkRuntimeTests test - - name: NativeFLWORRuntimeTests - run: mvn -Dtest=NativeFLWORRuntimeTests test + - name: SparkRuntimeTestsNativeDeactivated + run: mvn -Dtest=SparkRuntimeTestsNativeDeactivated test tests3: @@ -96,8 +98,8 @@ jobs: run: mvn clean compile assembly:single - name: Bugs run: mvn -Dtest=Bugs test - - name: RuntimeTestsNoInlining - run: mvn -Dtest=RuntimeTestsNoInlining test + - name: NativeFLWORRuntimeTests + run: mvn -Dtest=NativeFLWORRuntimeTests test - name: NativeFLWORRuntimeTestsNativeDeactivated run: mvn -Dtest=NativeFLWORRuntimeTestsNativeDeactivated test - name: NativeFLWORRuntimeTestsDataFramesDeactivated diff --git a/src/test/java/iq/Bugs.java b/src/test/java/iq/Bugs.java index 79d18f8aa..704916331 100644 --- a/src/test/java/iq/Bugs.java +++ b/src/test/java/iq/Bugs.java @@ -98,7 +98,7 @@ public static void setupSparkSession() { @Test(timeout = 1000000) public void testRuntimeIterators() throws Throwable { System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), AnnotationsTestsBase.defaultConfiguration); + testAnnotations(this.testFile.getAbsolutePath(), getConfiguration()); } @Override @@ -145,16 +145,16 @@ protected String getIteratorOutput(SequenceOfItems sequence) { while ( sequence.hasNext() && - ((itemCount < AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() - && AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() > 0) + ((itemCount < getConfiguration().getResultSizeCap() + && getConfiguration().getResultSizeCap() > 0) || - AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() == 0) + getConfiguration().getResultSizeCap() == 0) ) { sb.append(sequence.next().serialize()); sb.append(", "); itemCount++; } - if (sequence.hasNext() && itemCount == AnnotationsTestsBase.defaultConfiguration.getResultSizeCap()) { + if (sequence.hasNext() && itemCount == getConfiguration().getResultSizeCap()) { System.err.println( "Warning! The output sequence contains a large number of items but its materialization was capped at " + SparkSessionManager.COLLECT_ITEM_LIMIT diff --git a/src/test/java/iq/FrontendTests.java b/src/test/java/iq/FrontendTests.java index 98526b41c..00cc080b7 100644 --- a/src/test/java/iq/FrontendTests.java +++ b/src/test/java/iq/FrontendTests.java @@ -68,7 +68,7 @@ public void testGrammarAndParser() throws Throwable { for (File testFile : this.testFiles) { System.err.println(counter++ + " : " + testFile); // FileReader reader = getReaderForFile(testFile.getAbsolutePath()); - testAnnotations(testFile.getAbsolutePath(), AnnotationsTestsBase.defaultConfiguration); + testAnnotations(testFile.getAbsolutePath(), getConfiguration()); } } @@ -103,16 +103,16 @@ public void testSematicChecks() throws Throwable { initializeTests(semanticTestsDirectory); for (File testFile : this.testFiles) { System.err.println(counter++ + " : " + testFile); - testAnnotations(testFile.getAbsolutePath(), AnnotationsTestsBase.defaultConfiguration); + testAnnotations(testFile.getAbsolutePath(), getConfiguration()); if (Arrays.asList(manualSemanticChecksFiles).contains(testFile.getName())) { URI uri = FileSystemUtil.resolveURIAgainstWorkingDirectory( testFile.getAbsolutePath(), - AnnotationsTestsBase.defaultConfiguration, + getConfiguration(), ExceptionMetadata.EMPTY_METADATA ); MainModule mainModule = VisitorHelpers.parseMainModuleFromLocation( uri, - AnnotationsTestsBase.defaultConfiguration + getConfiguration() ); testVariableTypes(mainModule); diff --git a/src/test/java/iq/RuntimeTests.java b/src/test/java/iq/RuntimeTests.java index 3fb02e10e..97f95ca3b 100644 --- a/src/test/java/iq/RuntimeTests.java +++ b/src/test/java/iq/RuntimeTests.java @@ -145,16 +145,16 @@ protected String getIteratorOutput(SequenceOfItems sequence) { while ( sequence.hasNext() && - ((itemCount < AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() - && AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() > 0) + ((itemCount < getConfiguration().getResultSizeCap() + && getConfiguration().getResultSizeCap() > 0) || - AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() == 0) + getConfiguration().getResultSizeCap() == 0) ) { sb.append(sequence.next().serialize()); sb.append(", "); itemCount++; } - if (sequence.hasNext() && itemCount == AnnotationsTestsBase.defaultConfiguration.getResultSizeCap()) { + if (sequence.hasNext() && itemCount == getConfiguration().getResultSizeCap()) { System.err.println( "Warning! The output sequence contains a large number of items but its materialization was capped at " + SparkSessionManager.COLLECT_ITEM_LIMIT diff --git a/src/test/java/iq/RuntimeTestsNoInlining.java b/src/test/java/iq/RuntimeTestsNoInlining.java index ff2f2bb3f..04459353d 100644 --- a/src/test/java/iq/RuntimeTestsNoInlining.java +++ b/src/test/java/iq/RuntimeTestsNoInlining.java @@ -20,209 +20,50 @@ package iq; -import iq.base.AnnotationsTestsBase; -import scala.util.Properties; -import org.apache.spark.SparkConf; -import org.apache.spark.api.java.JavaRDD; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.rumbledb.api.Item; -import org.rumbledb.api.SequenceOfItems; import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.Name; import org.rumbledb.items.ItemFactory; -import sparksoniq.spark.SparkSessionManager; -import utils.FileManager; import java.io.File; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; -import java.util.List; @RunWith(Parameterized.class) -public class RuntimeTestsNoInlining extends AnnotationsTestsBase { - - public static final File runtimeTestsDirectory = new File( - System.getProperty("user.dir") - + - "/src/test/resources/test_files/runtime" - ); - public static final String javaVersion = - System.getProperty("java.version"); - public static final String scalaVersion = - Properties.scalaPropOrElse("version.number", "unknown"); - protected static List _testFiles = new ArrayList<>(); - protected final File testFile; - protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( - new String[] { - "--print-iterator-tree", - "yes", - "--variable:externalUnparsedString", - "unparsed string", - "--function-inlining", - "no" } - ).setExternalVariableValue( - Name.createVariableInNoNamespace("externalStringItem"), - Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) - ) - .setExternalVariableValue( - Name.createVariableInNoNamespace("externalIntegerItems"), - Arrays.asList( - new Item[] { - ItemFactory.getInstance().createIntItem(1), - ItemFactory.getInstance().createIntItem(2), - ItemFactory.getInstance().createIntItem(3), - ItemFactory.getInstance().createIntItem(4), - ItemFactory.getInstance().createIntItem(5), - } - ) - ); +public class RuntimeTestsNoInlining extends RuntimeTests { public RuntimeTestsNoInlining(File testFile) { - this.testFile = testFile; - } - - public static void readFileList(File dir) { - FileManager.loadJiqFiles(dir).forEach(file -> RuntimeTestsNoInlining._testFiles.add(file)); - } - - @Parameterized.Parameters(name = "{index}:{0}") - public static Collection testFiles() { - List result = new ArrayList<>(); - RuntimeTestsNoInlining.readFileList(RuntimeTestsNoInlining.runtimeTestsDirectory); - RuntimeTestsNoInlining._testFiles.forEach(file -> result.add(new Object[] { file })); - return result; - } - - @BeforeClass - public static void setupSparkSession() { - System.err.println("Java version: " + javaVersion); - System.err.println("Scala version: " + scalaVersion); - SparkConf sparkConfiguration = new SparkConf(); - sparkConfiguration.setMaster("local[*]"); - sparkConfiguration.set("spark.submit.deployMode", "client"); - sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); - sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); - sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product - - // prevents spark from failing to start on MacOS when disconnected from the internet - sparkConfiguration.set("spark.driver.host", "127.0.0.1"); - - - // sparkConfiguration.set("spark.driver.memory", "2g"); - // sparkConfiguration.set("spark.executor.memory", "2g"); - // sparkConfiguration.set("spark.speculation", "true"); - // sparkConfiguration.set("spark.speculation.quantile", "0.5"); - SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); - SparkSessionManager.COLLECT_ITEM_LIMIT = configuration.getResultSizeCap(); - System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); - } - - @Test(timeout = 1000000) - public void testRuntimeIterators() throws Throwable { - System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), AnnotationsTestsBase.defaultConfiguration); - } - - @Override - protected void checkExpectedOutput( - String expectedOutput, - SequenceOfItems sequence - ) { - String actualOutput; - if (!sequence.availableAsRDD()) { - actualOutput = runIterators(sequence); - } else { - actualOutput = getRDDResults(sequence); - } - Assert.assertTrue( - "Expected output: " + expectedOutput + "\nActual result: " + actualOutput, - expectedOutput.equals(actualOutput) - ); - // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + super(testFile); } - protected String runIterators(SequenceOfItems sequence) { - String actualOutput = getIteratorOutput(sequence); - return actualOutput; - } - - protected String getIteratorOutput(SequenceOfItems sequence) { - sequence.open(); - Item result = null; - if (sequence.hasNext()) { - result = sequence.next(); - } - if (result == null) { - return ""; - } - String singleOutput = result.serialize(); - if (!sequence.hasNext()) { - return singleOutput; - } else { - int itemCount = 1; - StringBuilder sb = new StringBuilder(); - sb.append("("); - sb.append(result.serialize()); - sb.append(", "); - while ( - sequence.hasNext() - && - ((itemCount < configuration.getResultSizeCap() - && configuration.getResultSizeCap() > 0) - || - configuration.getResultSizeCap() == 0) - ) { - sb.append(sequence.next().serialize()); - sb.append(", "); - itemCount++; - } - if (sequence.hasNext() && itemCount == configuration.getResultSizeCap()) { - System.err.println( - "Warning! The output sequence contains a large number of items but its materialization was capped at " - + SparkSessionManager.COLLECT_ITEM_LIMIT - + " items. This value can be configured with the --result-size parameter at startup" - ); - } - // remove last comma - String output = sb.toString(); - output = output.substring(0, output.length() - 2); - output += ")"; - return output; - } - } - - private String getRDDResults(SequenceOfItems sequence) { - JavaRDD rdd = sequence.getAsRDD(); - JavaRDD output = rdd.map(o -> o.serialize()); - List collectedOutput = new ArrayList(); - SparkSessionManager.collectRDDwithLimitWarningOnly(output, collectedOutput); - - if (collectedOutput.isEmpty()) { - return ""; - } - - if (collectedOutput.size() == 1) { - return collectedOutput.get(0); - } - - StringBuilder sb = new StringBuilder(); - sb.append("("); - for (String item : collectedOutput) { - sb.append(item); - sb.append(", "); - } - - String result = sb.toString(); - result = result.substring(0, result.length() - 2); - result += ")"; - return result; + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--variable:externalUnparsedString", + "unparsed string", + "--function-inlining", + "no" } + ).setExternalVariableValue( + Name.createVariableInNoNamespace("externalStringItem"), + Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) + ) + .setExternalVariableValue( + Name.createVariableInNoNamespace("externalIntegerItems"), + Arrays.asList( + new Item[] { + ItemFactory.getInstance().createIntItem(1), + ItemFactory.getInstance().createIntItem(2), + ItemFactory.getInstance().createIntItem(3), + ItemFactory.getInstance().createIntItem(4), + ItemFactory.getInstance().createIntItem(5), + } + ) + ); } } diff --git a/src/test/java/iq/RuntimeTestsNoParallelism.java b/src/test/java/iq/RuntimeTestsNoParallelism.java index 20e98ba80..253481a98 100644 --- a/src/test/java/iq/RuntimeTestsNoParallelism.java +++ b/src/test/java/iq/RuntimeTestsNoParallelism.java @@ -20,209 +20,48 @@ package iq; -import iq.base.AnnotationsTestsBase; -import scala.util.Properties; - -import org.apache.spark.SparkConf; -import org.apache.spark.api.java.JavaRDD; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.rumbledb.api.Item; -import org.rumbledb.api.SequenceOfItems; import org.rumbledb.config.RumbleRuntimeConfiguration; import org.rumbledb.context.Name; import org.rumbledb.items.ItemFactory; -import sparksoniq.spark.SparkSessionManager; -import utils.FileManager; - import java.io.File; -import java.util.ArrayList; import java.util.Arrays; -import java.util.Collection; import java.util.Collections; -import java.util.List; @RunWith(Parameterized.class) -public class RuntimeTestsNoParallelism extends AnnotationsTestsBase { - - public static final File runtimeTestsDirectory = new File( - System.getProperty("user.dir") - + - "/src/test/resources/test_files/runtime" - ); - public static final String javaVersion = - System.getProperty("java.version"); - public static final String scalaVersion = - Properties.scalaPropOrElse("version.number", "unknown"); - protected static List _testFiles = new ArrayList<>(); - protected final File testFile; - protected static final RumbleRuntimeConfiguration configuration = new RumbleRuntimeConfiguration( - new String[] { - "--print-iterator-tree", - "yes", - "--variable:externalUnparsedString", - "unparsed string", - "--parallel-execution", - "no" } - ).setExternalVariableValue( - Name.createVariableInNoNamespace("externalStringItem"), - Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) - ) - .setExternalVariableValue( - Name.createVariableInNoNamespace("externalIntegerItems"), - Arrays.asList( - new Item[] { - ItemFactory.getInstance().createIntItem(1), - ItemFactory.getInstance().createIntItem(2), - ItemFactory.getInstance().createIntItem(3), - ItemFactory.getInstance().createIntItem(4), - ItemFactory.getInstance().createIntItem(5), - } - ) - ); +public class RuntimeTestsNoParallelism extends RuntimeTests { public RuntimeTestsNoParallelism(File testFile) { - this.testFile = testFile; - } - - public static void readFileList(File dir) { - FileManager.loadJiqFiles(dir).forEach(file -> RuntimeTestsNoParallelism._testFiles.add(file)); - } - - @Parameterized.Parameters(name = "{index}:{0}") - public static Collection testFiles() { - List result = new ArrayList<>(); - RuntimeTestsNoParallelism.readFileList(RuntimeTestsNoParallelism.runtimeTestsDirectory); - RuntimeTestsNoParallelism._testFiles.forEach(file -> result.add(new Object[] { file })); - return result; - } - - @BeforeClass - public static void setupSparkSession() { - System.err.println("Java version: " + javaVersion); - System.err.println("Scala version: " + scalaVersion); - SparkConf sparkConfiguration = new SparkConf(); - sparkConfiguration.setMaster("local[*]"); - sparkConfiguration.set("spark.submit.deployMode", "client"); - sparkConfiguration.set("spark.executor.extraClassPath", "lib/"); - sparkConfiguration.set("spark.driver.extraClassPath", "lib/"); - sparkConfiguration.set("spark.sql.crossJoin.enabled", "true"); // enables cartesian product - - // prevents spark from failing to start on MacOS when disconnected from the internet - sparkConfiguration.set("spark.driver.host", "127.0.0.1"); - - - // sparkConfiguration.set("spark.driver.memory", "2g"); - // sparkConfiguration.set("spark.executor.memory", "2g"); - // sparkConfiguration.set("spark.speculation", "true"); - // sparkConfiguration.set("spark.speculation.quantile", "0.5"); - SparkSessionManager.getInstance().initializeConfigurationAndSession(sparkConfiguration, true); - SparkSessionManager.COLLECT_ITEM_LIMIT = RuntimeTestsNoParallelism.configuration.getResultSizeCap(); - System.err.println("Spark version: " + SparkSessionManager.getInstance().getJavaSparkContext().version()); + super(testFile); } - @Test(timeout = 1000000) - public void testRuntimeIterators() throws Throwable { - System.err.println(AnnotationsTestsBase.counter++ + " : " + this.testFile); - testAnnotations(this.testFile.getAbsolutePath(), RuntimeTestsNoParallelism.configuration); - } - - @Override - protected void checkExpectedOutput( - String expectedOutput, - SequenceOfItems sequence - ) { - String actualOutput; - if (!sequence.availableAsRDD()) { - actualOutput = runIterators(sequence); - } else { - actualOutput = getRDDResults(sequence); - } - Assert.assertTrue( - "Expected output: " + expectedOutput + "\nActual result: " + actualOutput, - expectedOutput.equals(actualOutput) - ); - // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); - } - - protected String runIterators(SequenceOfItems sequence) { - String actualOutput = getIteratorOutput(sequence); - return actualOutput; - } - - protected String getIteratorOutput(SequenceOfItems sequence) { - sequence.open(); - Item result = null; - if (sequence.hasNext()) { - result = sequence.next(); - } - if (result == null) { - return ""; - } - String singleOutput = result.serialize(); - if (!sequence.hasNext()) { - return singleOutput; - } else { - int itemCount = 1; - StringBuilder sb = new StringBuilder(); - sb.append("("); - sb.append(result.serialize()); - sb.append(", "); - while ( - sequence.hasNext() - && - ((itemCount < AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() - && AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() > 0) - || - AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() == 0) - ) { - sb.append(sequence.next().serialize()); - sb.append(", "); - itemCount++; - } - if (sequence.hasNext() && itemCount == AnnotationsTestsBase.defaultConfiguration.getResultSizeCap()) { - System.err.println( - "Warning! The output sequence contains a large number of items but its materialization was capped at " - + SparkSessionManager.COLLECT_ITEM_LIMIT - + " items. This value can be configured with the --result-size parameter at startup" - ); - } - // remove last comma - String output = sb.toString(); - output = output.substring(0, output.length() - 2); - output += ")"; - return output; - } - } - - private String getRDDResults(SequenceOfItems sequence) { - JavaRDD rdd = sequence.getAsRDD(); - JavaRDD output = rdd.map(o -> o.serialize()); - List collectedOutput = new ArrayList(); - SparkSessionManager.collectRDDwithLimitWarningOnly(output, collectedOutput); - - if (collectedOutput.isEmpty()) { - return ""; - } - - if (collectedOutput.size() == 1) { - return collectedOutput.get(0); - } - - StringBuilder sb = new StringBuilder(); - sb.append("("); - for (String item : collectedOutput) { - sb.append(item); - sb.append(", "); - } - - String result = sb.toString(); - result = result.substring(0, result.length() - 2); - result += ")"; - return result; + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--print-iterator-tree", + "yes", + "--variable:externalUnparsedString", + "unparsed string", + "--parallel-execution", + "no" } + ).setExternalVariableValue( + Name.createVariableInNoNamespace("externalStringItem"), + Collections.singletonList(ItemFactory.getInstance().createStringItem("this is a string")) + ) + .setExternalVariableValue( + Name.createVariableInNoNamespace("externalIntegerItems"), + Arrays.asList( + new Item[] { + ItemFactory.getInstance().createIntItem(1), + ItemFactory.getInstance().createIntItem(2), + ItemFactory.getInstance().createIntItem(3), + ItemFactory.getInstance().createIntItem(4), + ItemFactory.getInstance().createIntItem(5), + } + ) + ); } } diff --git a/src/test/java/iq/StaticTypeTests.java b/src/test/java/iq/StaticTypeTests.java index 760fe1899..edec1671c 100644 --- a/src/test/java/iq/StaticTypeTests.java +++ b/src/test/java/iq/StaticTypeTests.java @@ -129,16 +129,16 @@ protected String getIteratorOutput(SequenceOfItems sequence) { while ( sequence.hasNext() && - ((itemCount < AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() - && AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() > 0) + ((itemCount < getConfiguration().getResultSizeCap() + && getConfiguration().getResultSizeCap() > 0) || - AnnotationsTestsBase.defaultConfiguration.getResultSizeCap() == 0) + getConfiguration().getResultSizeCap() == 0) ) { sb.append(sequence.next().serialize()); sb.append(", "); itemCount++; } - if (sequence.hasNext() && itemCount == AnnotationsTestsBase.defaultConfiguration.getResultSizeCap()) { + if (sequence.hasNext() && itemCount == getConfiguration().getResultSizeCap()) { System.err.println( "Warning! The output sequence contains a large number of items but its materialization was capped at " + SparkSessionManager.COLLECT_ITEM_LIMIT From 936b35e0b11feb9f1314b8995d276ab14dc951ee Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 16:43:04 +0200 Subject: [PATCH 101/136] Add tests. --- .github/workflows/maven.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 724183eff..37a2806cf 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -74,6 +74,10 @@ jobs: run: mvn -Dtest=SparkRuntimeTests test - name: SparkRuntimeTestsNativeDeactivated run: mvn -Dtest=SparkRuntimeTestsNativeDeactivated test + - name: SparkRuntimeTestsDataFramesDeactivated + run: mvn -Dtest=SparkRuntimeTestsDataFramesDeactivated test + - name: SparkRuntimeTestsParallelismDeactivated + run: mvn -Dtest=SparkRuntimeTestsParallelismDeactivated test tests3: From 1cd876c9f47fb36108d3335ab364dacb3e34c9ce Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 16:48:09 +0200 Subject: [PATCH 102/136] Run ML tests separately. --- .github/workflows/maven.yml | 5 +++++ .../RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateDF1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq | 0 .../AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq | 0 .../AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq | 0 .../AnnotateFunction/MLAnnotateLocal-SchemaError1.jq | 0 .../AnnotateFunction/MLAnnotateLocal-SchemaError2.jq | 0 .../AnnotateFunction/MLAnnotateLocal-SchemaError3.jq | 0 .../AnnotateFunction/MLAnnotateLocal-SchemaError4.jq | 0 .../AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq | 0 .../AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal2.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal4.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal5.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal6.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal7.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal8.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateLocal9.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD1.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD2.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD4.jq | 0 .../RumbleML/AnnotateFunction/MLAnnotateRDD5.jq | 0 .../RumbleML/EstimatorTests/EstimatorTODO | 0 .../EstimatorTests/MLEstimator-AFTSurvivalRegression.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq | 0 .../MLEstimator-BucketedRandomProjectionLSH.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq | 0 .../EstimatorTests/MLEstimator-CrossValidator.jq.disabled | 0 .../EstimatorTests/MLEstimator-DecisionTreeClassifier.jq | 0 .../EstimatorTests/MLEstimator-DecisionTreeRegressor.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq | 0 .../MLEstimator-GeneralizedLinearRegression.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-IDF.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled | 0 .../EstimatorTests/MLEstimator-IsotonicRegression.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-KMeans1.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-LDA.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq | 0 .../EstimatorTests/MLEstimator-LogisticRegression1.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq | 0 .../MLEstimator-MultilayerPerceptronClassifier1.jq | 0 .../MLEstimator-MultilayerPerceptronClassifier2.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq | 0 .../EstimatorTests/MLEstimator-OneVsRest.jq.disabled | 0 .../RumbleML/EstimatorTests/MLEstimator-PCA.jq | 0 .../EstimatorTests/MLEstimator-QuantileDiscretizer1.jq | 0 .../EstimatorTests/MLEstimator-QuantileDiscretizer2.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-RFormula.jq | 0 .../EstimatorTests/MLEstimator-RandomForestClassifier.jq | 0 .../EstimatorTests/MLEstimator-RandomForestRegressor.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq | 0 .../MLEstimator-TrainValidationSplit.jq.disabled | 0 .../RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq | 0 .../RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq | 0 .../FeatureVectorization/MLFeatureVectorization-Error1.jq | 0 .../FeatureVectorization/MLFeatureVectorization-Error2.jq | 0 .../FeatureVectorization/MLFeatureVectorization-Error3.jq | 0 .../RumbleML/FeatureVectorization/MLFeatureVectorization1.jq | 0 .../RumbleML/FeatureVectorization/MLFeatureVectorization2.jq | 0 .../{runtime-spark => }/RumbleML/MLDecimalTypeError1.jq | 0 .../{runtime-spark => }/RumbleML/MLNonDF-Error1.jq | 0 .../{runtime-spark => }/RumbleML/MLNonDF-Error2.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLParamError1.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLParamError2.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLParamError3.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLParamError4.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLPipeline1.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLPipeline2.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLPipeline3.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLPipeline4.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLPipeline5.jq | 0 .../test_files/{runtime-spark => }/RumbleML/MLPipeline6.jq | 0 .../RumbleML/TransformerTests/MLTransformer-Binarizer1.jq | 0 .../RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq | 0 .../MLTransformer-DiscreteCosineTransform(DCT)1.jq | 0 .../MLTransformer-ElementwiseProduct1.jq.disabled | 0 .../TransformerTests/MLTransformer-FeatureHasher1.jq | 0 .../RumbleML/TransformerTests/MLTransformer-HashingTF1.jq | 0 .../MLTransformer-IndexToString1.jq.disabled | 0 .../RumbleML/TransformerTests/MLTransformer-Interaction1.jq | 0 .../TransformerTests/MLTransformer-Interaction2.jq.disabled | 0 .../RumbleML/TransformerTests/MLTransformer-NGram1.jq | 0 .../RumbleML/TransformerTests/MLTransformer-Normalizer1.jq | 0 .../TransformerTests/MLTransformer-PolynomialExpansion1.jq | 0 .../TransformerTests/MLTransformer-RegexTokenizer1.jq | 0 .../TransformerTests/MLTransformer-SQLTransformer1.jq | 0 .../TransformerTests/MLTransformer-StopWordsRemover1.jq | 0 .../RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq | 0 .../RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq | 0 .../TransformerTests/MLTransformer-VectorAssembler1.jq | 0 .../TransformerTests/MLTransformer-VectorSizeHint1.jq | 0 .../RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq | 0 .../RumbleML/TransformerTests/TransformerTODO | 0 121 files changed, 5 insertions(+) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateDF1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/EstimatorTODO (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-IDF.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-LDA.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-PCA.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-RFormula.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLDecimalTypeError1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLNonDF-Error1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLNonDF-Error2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLParamError1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLParamError2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLParamError3.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLParamError4.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLPipeline1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLPipeline2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLPipeline3.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLPipeline4.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLPipeline5.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/MLPipeline6.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-Interaction1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-NGram1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq (100%) rename src/test/resources/test_files/{runtime-spark => }/RumbleML/TransformerTests/TransformerTODO (100%) diff --git a/.github/workflows/maven.yml b/.github/workflows/maven.yml index 37a2806cf..7f1bc9e58 100644 --- a/.github/workflows/maven.yml +++ b/.github/workflows/maven.yml @@ -110,3 +110,8 @@ jobs: run: mvn -Dtest=NativeFLWORRuntimeTestsDataFramesDeactivated test - name: NativeFLWORRuntimeTestsParallelismDeactivated run: mvn -Dtest=NativeFLWORRuntimeTestsParallelismDeactivated test + - name: MLTests + run: mvn -Dtest=MLTests test + - name: MLTestsNativeDeactivated + run: mvn -Dtest=MLTestsNativeDeactivated test + diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateDF1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq b/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq rename to src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/EstimatorTODO b/src/test/resources/test_files/RumbleML/EstimatorTests/EstimatorTODO similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/EstimatorTODO rename to src/test/resources/test_files/RumbleML/EstimatorTests/EstimatorTODO diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-IDF.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-IDF.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-IDF.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-IDF.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-LDA.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LDA.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-LDA.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LDA.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-PCA.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-PCA.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-PCA.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-PCA.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-RFormula.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RFormula.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-RFormula.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RFormula.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq b/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq rename to src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq b/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq rename to src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq b/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq rename to src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq b/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq rename to src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq b/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq rename to src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq b/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq rename to src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLDecimalTypeError1.jq b/src/test/resources/test_files/RumbleML/MLDecimalTypeError1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLDecimalTypeError1.jq rename to src/test/resources/test_files/RumbleML/MLDecimalTypeError1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLNonDF-Error1.jq b/src/test/resources/test_files/RumbleML/MLNonDF-Error1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLNonDF-Error1.jq rename to src/test/resources/test_files/RumbleML/MLNonDF-Error1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLNonDF-Error2.jq b/src/test/resources/test_files/RumbleML/MLNonDF-Error2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLNonDF-Error2.jq rename to src/test/resources/test_files/RumbleML/MLNonDF-Error2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLParamError1.jq b/src/test/resources/test_files/RumbleML/MLParamError1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLParamError1.jq rename to src/test/resources/test_files/RumbleML/MLParamError1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLParamError2.jq b/src/test/resources/test_files/RumbleML/MLParamError2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLParamError2.jq rename to src/test/resources/test_files/RumbleML/MLParamError2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLParamError3.jq b/src/test/resources/test_files/RumbleML/MLParamError3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLParamError3.jq rename to src/test/resources/test_files/RumbleML/MLParamError3.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLParamError4.jq b/src/test/resources/test_files/RumbleML/MLParamError4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLParamError4.jq rename to src/test/resources/test_files/RumbleML/MLParamError4.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline1.jq b/src/test/resources/test_files/RumbleML/MLPipeline1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline1.jq rename to src/test/resources/test_files/RumbleML/MLPipeline1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline2.jq b/src/test/resources/test_files/RumbleML/MLPipeline2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline2.jq rename to src/test/resources/test_files/RumbleML/MLPipeline2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline3.jq b/src/test/resources/test_files/RumbleML/MLPipeline3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline3.jq rename to src/test/resources/test_files/RumbleML/MLPipeline3.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline4.jq b/src/test/resources/test_files/RumbleML/MLPipeline4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline4.jq rename to src/test/resources/test_files/RumbleML/MLPipeline4.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline5.jq b/src/test/resources/test_files/RumbleML/MLPipeline5.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline5.jq rename to src/test/resources/test_files/RumbleML/MLPipeline5.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline6.jq b/src/test/resources/test_files/RumbleML/MLPipeline6.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/MLPipeline6.jq rename to src/test/resources/test_files/RumbleML/MLPipeline6.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Interaction1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Interaction1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Interaction1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Interaction1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-NGram1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-NGram1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-NGram1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-NGram1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq b/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq rename to src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq diff --git a/src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/TransformerTODO b/src/test/resources/test_files/RumbleML/TransformerTests/TransformerTODO similarity index 100% rename from src/test/resources/test_files/runtime-spark/RumbleML/TransformerTests/TransformerTODO rename to src/test/resources/test_files/RumbleML/TransformerTests/TransformerTODO From 6b0c66243e0c82078fc8669865472df2b4bb37f7 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 16:53:41 +0200 Subject: [PATCH 103/136] Add files. --- src/test/java/iq/MLTests.java | 66 +++++++++++++++ .../java/iq/MLTestsNativeDeactivated.java | 64 +++++++++++++++ ...parkRuntimeTestsDataFramesDeactivated.java | 81 +++++++++++++++++++ ...arkRuntimeTestsParallelismDeactivated.java | 81 +++++++++++++++++++ 4 files changed, 292 insertions(+) create mode 100644 src/test/java/iq/MLTests.java create mode 100644 src/test/java/iq/MLTestsNativeDeactivated.java create mode 100644 src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java create mode 100644 src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java diff --git a/src/test/java/iq/MLTests.java b/src/test/java/iq/MLTests.java new file mode 100644 index 000000000..e0d311879 --- /dev/null +++ b/src/test/java/iq/MLTests.java @@ -0,0 +1,66 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.config.RumbleRuntimeConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class MLTests extends RuntimeTests { + + public static final File sparkRuntimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/RumbleML" + ); + + public MLTests(File testFile) { + super(testFile); + } + + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--native-execution", + "no" + } + ); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + _testFiles.clear(); + readFileList(sparkRuntimeTestsDirectory); + _testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } +} diff --git a/src/test/java/iq/MLTestsNativeDeactivated.java b/src/test/java/iq/MLTestsNativeDeactivated.java new file mode 100644 index 000000000..4d6b5c513 --- /dev/null +++ b/src/test/java/iq/MLTestsNativeDeactivated.java @@ -0,0 +1,64 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.config.RumbleRuntimeConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class MLTestsNativeDeactivated extends RuntimeTests { + + public static final File sparkRuntimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/RumbleML" + ); + + public MLTestsNativeDeactivated(File testFile) { + super(testFile); + } + + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes" + } + ); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + _testFiles.clear(); + readFileList(sparkRuntimeTestsDirectory); + _testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } +} diff --git a/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java b/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java new file mode 100644 index 000000000..70f7e5b3e --- /dev/null +++ b/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java @@ -0,0 +1,81 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import org.junit.Assert; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class SparkRuntimeTestsDataFramesDeactivated extends RuntimeTests { + + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--data-frame-execution", + "no" + } + ); + } + + public static final File sparkRuntimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-spark" + ); + + public SparkRuntimeTestsDataFramesDeactivated(File testFile) { + super(testFile); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + _testFiles.clear(); + readFileList(sparkRuntimeTestsDirectory); + _testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput = runIterators(sequence); + Assert.assertTrue( + "Expected output: " + expectedOutput + " Actual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + } +} diff --git a/src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java b/src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java new file mode 100644 index 000000000..428f5296f --- /dev/null +++ b/src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java @@ -0,0 +1,81 @@ +/* + * 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. + * + * Authors: Stefan Irimescu, Can Berker Cikis + * + */ + +package iq; + +import org.junit.Assert; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; + +import java.io.File; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +@RunWith(Parameterized.class) +public class SparkRuntimeTestsParallelismDeactivated extends RuntimeTests { + + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--parallel-execution", + "no" + } + ); + } + + public static final File sparkRuntimeTestsDirectory = new File( + System.getProperty("user.dir") + + + "/src/test/resources/test_files/runtime-spark" + ); + + public SparkRuntimeTestsParallelismDeactivated(File testFile) { + super(testFile); + } + + @Parameterized.Parameters(name = "{index}:{0}") + public static Collection testFiles() { + List result = new ArrayList<>(); + _testFiles.clear(); + readFileList(sparkRuntimeTestsDirectory); + _testFiles.forEach(file -> result.add(new Object[] { file })); + return result; + } + + @Override + protected void checkExpectedOutput( + String expectedOutput, + SequenceOfItems sequence + ) { + String actualOutput = runIterators(sequence); + Assert.assertTrue( + "Expected output: " + expectedOutput + " Actual result: " + actualOutput, + expectedOutput.equals(actualOutput) + ); + // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); + } +} From e570bba3ec27e41a078cf824a532d26a0894a5d1 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Fri, 12 May 2023 17:01:12 +0200 Subject: [PATCH 104/136] Put ML tests at same level as before to preserve paths. --- .../{ => RumbleML}/AnnotateFunction/MLAnnotateDF-SchemaError1.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateDF-SchemaError2.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateDF-SchemaError3.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateDF-SchemaError4.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateDF1.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateForChaining1.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateForChaining2.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateForChaining3.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateForChaining4.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateForEstimator1.jq | 0 .../AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq | 0 .../AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateForTransformer1.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateForTransformer2.jq | 0 .../AnnotateFunction/MLAnnotateLocal-SchemaError1.jq | 0 .../AnnotateFunction/MLAnnotateLocal-SchemaError2.jq | 0 .../AnnotateFunction/MLAnnotateLocal-SchemaError3.jq | 0 .../AnnotateFunction/MLAnnotateLocal-SchemaError4.jq | 0 .../AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq | 0 .../AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal1.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal2.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateLocal3.jq.disabled | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal4.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal5.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal6.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal7.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal8.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal9.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD1.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD2.jq | 0 .../{ => RumbleML}/AnnotateFunction/MLAnnotateRDD3.jq.disabled | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD4.jq | 0 .../RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD5.jq | 0 .../RumbleML/{ => RumbleML}/EstimatorTests/EstimatorTODO | 0 .../EstimatorTests/MLEstimator-AFTSurvivalRegression.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-BisectingKMeans.jq | 0 .../EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-ChiSqSelector.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-CountVectorizer.jq | 0 .../EstimatorTests/MLEstimator-CrossValidator.jq.disabled | 0 .../EstimatorTests/MLEstimator-DecisionTreeClassifier.jq | 0 .../EstimatorTests/MLEstimator-DecisionTreeRegressor.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-FPGrowth.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-GBTClassifier.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-GBTRegressor.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-GaussianMixture.jq | 0 .../EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq | 0 .../RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-IDF.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-Imputer.jq.disabled | 0 .../EstimatorTests/MLEstimator-IsotonicRegression.jq | 0 .../RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-KMeans1.jq | 0 .../RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-LDA.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-LinearRegression.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-LinearSVC.jq | 0 .../EstimatorTests/MLEstimator-LogisticRegression1.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-MaxAbsScaler.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-MinHashLSH.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-MinMaxScaler.jq | 0 .../EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq | 0 .../EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-NaiveBayes.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-OneHotEncoder.jq | 0 .../EstimatorTests/MLEstimator-OneVsRest.jq.disabled | 0 .../RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-PCA.jq | 0 .../EstimatorTests/MLEstimator-QuantileDiscretizer1.jq | 0 .../EstimatorTests/MLEstimator-QuantileDiscretizer2.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-RFormula.jq | 0 .../EstimatorTests/MLEstimator-RandomForestClassifier.jq | 0 .../EstimatorTests/MLEstimator-RandomForestRegressor.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-StandardScaler.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-StringIndexer.jq | 0 .../EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-VectorIndexer.jq | 0 .../{ => RumbleML}/EstimatorTests/MLEstimator-Word2Vec.jq | 0 .../FeatureVectorization/MLFeatureVectorization-Error1.jq | 0 .../FeatureVectorization/MLFeatureVectorization-Error2.jq | 0 .../FeatureVectorization/MLFeatureVectorization-Error3.jq | 0 .../FeatureVectorization/MLFeatureVectorization1.jq | 0 .../FeatureVectorization/MLFeatureVectorization2.jq | 0 .../test_files/RumbleML/{ => RumbleML}/MLDecimalTypeError1.jq | 0 .../test_files/RumbleML/{ => RumbleML}/MLNonDF-Error1.jq | 0 .../test_files/RumbleML/{ => RumbleML}/MLNonDF-Error2.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLParamError1.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLParamError2.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLParamError3.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLParamError4.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLPipeline1.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLPipeline2.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLPipeline3.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLPipeline4.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLPipeline5.jq | 0 .../resources/test_files/RumbleML/{ => RumbleML}/MLPipeline6.jq | 0 .../{ => RumbleML}/TransformerTests/MLTransformer-Binarizer1.jq | 0 .../{ => RumbleML}/TransformerTests/MLTransformer-Bucketizer1.jq | 0 .../MLTransformer-DiscreteCosineTransform(DCT)1.jq | 0 .../MLTransformer-ElementwiseProduct1.jq.disabled | 0 .../TransformerTests/MLTransformer-FeatureHasher1.jq | 0 .../{ => RumbleML}/TransformerTests/MLTransformer-HashingTF1.jq | 0 .../TransformerTests/MLTransformer-IndexToString1.jq.disabled | 0 .../{ => RumbleML}/TransformerTests/MLTransformer-Interaction1.jq | 0 .../TransformerTests/MLTransformer-Interaction2.jq.disabled | 0 .../{ => RumbleML}/TransformerTests/MLTransformer-NGram1.jq | 0 .../{ => RumbleML}/TransformerTests/MLTransformer-Normalizer1.jq | 0 .../TransformerTests/MLTransformer-PolynomialExpansion1.jq | 0 .../TransformerTests/MLTransformer-RegexTokenizer1.jq | 0 .../TransformerTests/MLTransformer-SQLTransformer1.jq | 0 .../TransformerTests/MLTransformer-StopWordsRemover1.jq | 0 .../{ => RumbleML}/TransformerTests/MLTransformer-Tokenizer1.jq | 0 .../{ => RumbleML}/TransformerTests/MLTransformer-Tokenizer2.jq | 0 .../TransformerTests/MLTransformer-VectorAssembler1.jq | 0 .../TransformerTests/MLTransformer-VectorSizeHint1.jq | 0 .../TransformerTests/MLTransformer-VectorSlicer1.jq | 0 .../RumbleML/{ => RumbleML}/TransformerTests/TransformerTODO | 0 120 files changed, 0 insertions(+), 0 deletions(-) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateDF-SchemaError1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateDF-SchemaError2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateDF-SchemaError3.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateDF-SchemaError4.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateDF1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForChaining1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForChaining2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForChaining3.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForChaining4.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForEstimator1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForTransformer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateForTransformer2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal3.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal4.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal5.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal6.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal7.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal8.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateLocal9.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD3.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD4.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/AnnotateFunction/MLAnnotateRDD5.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/EstimatorTODO (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-BisectingKMeans.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-ChiSqSelector.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-CountVectorizer.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-CrossValidator.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-FPGrowth.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-GBTClassifier.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-GBTRegressor.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-GaussianMixture.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-IDF.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-Imputer.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-IsotonicRegression.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-KMeans1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-LDA.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-LinearRegression.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-LinearSVC.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-LogisticRegression1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-MaxAbsScaler.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-MinHashLSH.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-MinMaxScaler.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-NaiveBayes.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-OneHotEncoder.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-OneVsRest.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-PCA.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-RFormula.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-RandomForestClassifier.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-RandomForestRegressor.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-StandardScaler.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-StringIndexer.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-VectorIndexer.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/EstimatorTests/MLEstimator-Word2Vec.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/FeatureVectorization/MLFeatureVectorization-Error1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/FeatureVectorization/MLFeatureVectorization-Error2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/FeatureVectorization/MLFeatureVectorization-Error3.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/FeatureVectorization/MLFeatureVectorization1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/FeatureVectorization/MLFeatureVectorization2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLDecimalTypeError1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLNonDF-Error1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLNonDF-Error2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLParamError1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLParamError2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLParamError3.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLParamError4.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLPipeline1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLPipeline2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLPipeline3.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLPipeline4.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLPipeline5.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/MLPipeline6.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-Binarizer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-Bucketizer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-FeatureHasher1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-HashingTF1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-IndexToString1.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-Interaction1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-Interaction2.jq.disabled (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-NGram1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-Normalizer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-PolynomialExpansion1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-RegexTokenizer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-SQLTransformer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-StopWordsRemover1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-Tokenizer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-Tokenizer2.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-VectorAssembler1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-VectorSizeHint1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/MLTransformer-VectorSlicer1.jq (100%) rename src/test/resources/test_files/RumbleML/{ => RumbleML}/TransformerTests/TransformerTODO (100%) diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError3.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF-SchemaError4.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateDF1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateDF1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForChaining1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForChaining2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForChaining3.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForChaining4.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForEstimator1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingLocalData1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForPreprocessingRDDData1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForTransformer1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateForTransformer2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError3.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-SchemaError4.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal-TypeCasting2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal3.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal4.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal5.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal6.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal7.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal8.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateLocal9.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError3.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-SchemaError4.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD-TypeCasting2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD1.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD2.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD3.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD4.jq diff --git a/src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq b/src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq rename to src/test/resources/test_files/RumbleML/RumbleML/AnnotateFunction/MLAnnotateRDD5.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/EstimatorTODO b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/EstimatorTODO similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/EstimatorTODO rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/EstimatorTODO diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-AFTSurvivalRegression.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-BisectingKMeans.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-BucketedRandomProjectionLSH.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-ChiSqSelector.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-CountVectorizer.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-CrossValidator.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-DecisionTreeClassifier.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-DecisionTreeRegressor.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-FPGrowth.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-GBTClassifier.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-GBTRegressor.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-GaussianMixture.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-GeneralizedLinearRegression.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-IDF.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-IDF.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-IDF.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-IDF.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-Imputer.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-IsotonicRegression.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-KMeans1.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LDA.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-LDA.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LDA.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-LDA.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-LinearRegression.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-LinearSVC.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-LogisticRegression1.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MaxAbsScaler.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MinHashLSH.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MinMaxScaler.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier1.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-MultilayerPerceptronClassifier2.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-NaiveBayes.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-OneHotEncoder.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-OneVsRest.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-PCA.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-PCA.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-PCA.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-PCA.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer1.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-QuantileDiscretizer2.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RFormula.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-RFormula.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RFormula.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-RFormula.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-RandomForestClassifier.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-RandomForestRegressor.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-StandardScaler.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-StringIndexer.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-TrainValidationSplit.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-VectorIndexer.jq diff --git a/src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq b/src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq rename to src/test/resources/test_files/RumbleML/RumbleML/EstimatorTests/MLEstimator-Word2Vec.jq diff --git a/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq b/src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization-Error1.jq diff --git a/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq b/src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization-Error2.jq diff --git a/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq b/src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq rename to src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization-Error3.jq diff --git a/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq b/src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization1.jq diff --git a/src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq b/src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/FeatureVectorization/MLFeatureVectorization2.jq diff --git a/src/test/resources/test_files/RumbleML/MLDecimalTypeError1.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLDecimalTypeError1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLDecimalTypeError1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLDecimalTypeError1.jq diff --git a/src/test/resources/test_files/RumbleML/MLNonDF-Error1.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLNonDF-Error1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLNonDF-Error1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLNonDF-Error1.jq diff --git a/src/test/resources/test_files/RumbleML/MLNonDF-Error2.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLNonDF-Error2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLNonDF-Error2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLNonDF-Error2.jq diff --git a/src/test/resources/test_files/RumbleML/MLParamError1.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLParamError1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLParamError1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLParamError1.jq diff --git a/src/test/resources/test_files/RumbleML/MLParamError2.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLParamError2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLParamError2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLParamError2.jq diff --git a/src/test/resources/test_files/RumbleML/MLParamError3.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLParamError3.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLParamError3.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLParamError3.jq diff --git a/src/test/resources/test_files/RumbleML/MLParamError4.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLParamError4.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLParamError4.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLParamError4.jq diff --git a/src/test/resources/test_files/RumbleML/MLPipeline1.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLPipeline1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLPipeline1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLPipeline1.jq diff --git a/src/test/resources/test_files/RumbleML/MLPipeline2.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLPipeline2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLPipeline2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLPipeline2.jq diff --git a/src/test/resources/test_files/RumbleML/MLPipeline3.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLPipeline3.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLPipeline3.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLPipeline3.jq diff --git a/src/test/resources/test_files/RumbleML/MLPipeline4.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLPipeline4.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLPipeline4.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLPipeline4.jq diff --git a/src/test/resources/test_files/RumbleML/MLPipeline5.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLPipeline5.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLPipeline5.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLPipeline5.jq diff --git a/src/test/resources/test_files/RumbleML/MLPipeline6.jq b/src/test/resources/test_files/RumbleML/RumbleML/MLPipeline6.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/MLPipeline6.jq rename to src/test/resources/test_files/RumbleML/RumbleML/MLPipeline6.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Binarizer1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Bucketizer1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-DiscreteCosineTransform(DCT)1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-ElementwiseProduct1.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-FeatureHasher1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-HashingTF1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-IndexToString1.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Interaction1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Interaction1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Interaction1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Interaction1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Interaction2.jq.disabled diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-NGram1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-NGram1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-NGram1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-NGram1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Normalizer1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-PolynomialExpansion1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-RegexTokenizer1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-SQLTransformer1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-StopWordsRemover1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Tokenizer1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-Tokenizer2.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-VectorAssembler1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-VectorSizeHint1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/MLTransformer-VectorSlicer1.jq diff --git a/src/test/resources/test_files/RumbleML/TransformerTests/TransformerTODO b/src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/TransformerTODO similarity index 100% rename from src/test/resources/test_files/RumbleML/TransformerTests/TransformerTODO rename to src/test/resources/test_files/RumbleML/RumbleML/TransformerTests/TransformerTODO From 8431e0debdac9523f5d606a173a7e1c9f145ed43 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 11:29:43 +0200 Subject: [PATCH 105/136] Fix tests. --- .../iq/SparkRuntimeTestsDataFramesDeactivated.java | 13 ------------- .../test_files/runtime-spark/Pushdown/KeysDF1.jq | 4 +++- 2 files changed, 3 insertions(+), 14 deletions(-) diff --git a/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java b/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java index 70f7e5b3e..8a964acd2 100644 --- a/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java +++ b/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java @@ -65,17 +65,4 @@ public static Collection testFiles() { _testFiles.forEach(file -> result.add(new Object[] { file })); return result; } - - @Override - protected void checkExpectedOutput( - String expectedOutput, - SequenceOfItems sequence - ) { - String actualOutput = runIterators(sequence); - Assert.assertTrue( - "Expected output: " + expectedOutput + " Actual result: " + actualOutput, - expectedOutput.equals(actualOutput) - ); - // unorderedItemSequenceStringsAreEqual(expectedOutput, actualOutput)); - } } diff --git a/src/test/resources/test_files/runtime-spark/Pushdown/KeysDF1.jq b/src/test/resources/test_files/runtime-spark/Pushdown/KeysDF1.jq index f08898c81..600a59d75 100644 --- a/src/test/resources/test_files/runtime-spark/Pushdown/KeysDF1.jq +++ b/src/test/resources/test_files/runtime-spark/Pushdown/KeysDF1.jq @@ -1,2 +1,4 @@ (:JIQS: ShouldRun; Output="(choices, country, date, guess, sample, target)" :) -keys(structured-json-file("../../../queries/conf-ex.json")) +for $k in keys(structured-json-file("../../../queries/conf-ex.json")) +order by $k +return $k From 4b47c3e217225431401d3566b3f0d083828a57f8 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 11:30:32 +0200 Subject: [PATCH 106/136] Spotless. --- src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java b/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java index 8a964acd2..9b7a372c6 100644 --- a/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java +++ b/src/test/java/iq/SparkRuntimeTestsDataFramesDeactivated.java @@ -20,10 +20,8 @@ package iq; -import org.junit.Assert; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; -import org.rumbledb.api.SequenceOfItems; import org.rumbledb.config.RumbleRuntimeConfiguration; import java.io.File; From 12e35b2e3ecb7ebd44542549511c86cc2641a4cb Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 11:46:31 +0200 Subject: [PATCH 107/136] Fix tests. --- src/test/java/iq/SparkRuntimeTests.java | 15 +++++++++++++++ .../iq/SparkRuntimeTestsNativeDeactivated.java | 4 +++- .../DataFrames/GroupbyClauseDateError1.jq | 2 +- .../DataFrames/OrderbyClauseDateError1.jq | 2 +- 4 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/test/java/iq/SparkRuntimeTests.java b/src/test/java/iq/SparkRuntimeTests.java index acea67f56..d4df9a243 100644 --- a/src/test/java/iq/SparkRuntimeTests.java +++ b/src/test/java/iq/SparkRuntimeTests.java @@ -24,6 +24,8 @@ import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import org.rumbledb.api.SequenceOfItems; +import org.rumbledb.config.RumbleRuntimeConfiguration; + import java.io.File; import java.util.ArrayList; import java.util.Collection; @@ -38,6 +40,19 @@ public class SparkRuntimeTests extends RuntimeTests { "/src/test/resources/test_files/runtime-spark" ); + public RumbleRuntimeConfiguration getConfiguration() { + return new RumbleRuntimeConfiguration( + new String[] { + "--variable:externalUnparsedString", + "unparsed string", + "--escape-backticks", + "yes", + "--dates-with-timezone", + "yes" + } + ); + } + public SparkRuntimeTests(File testFile) { super(testFile); } diff --git a/src/test/java/iq/SparkRuntimeTestsNativeDeactivated.java b/src/test/java/iq/SparkRuntimeTestsNativeDeactivated.java index 844de7c6c..83101de97 100644 --- a/src/test/java/iq/SparkRuntimeTestsNativeDeactivated.java +++ b/src/test/java/iq/SparkRuntimeTestsNativeDeactivated.java @@ -42,7 +42,9 @@ public RumbleRuntimeConfiguration getConfiguration() { "--escape-backticks", "yes", "--native-execution", - "no" + "no", + "--dates-with-timezone", + "yes" } ); } diff --git a/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClauseDateError1.jq b/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClauseDateError1.jq index f277fdfbe..44f8e575d 100644 --- a/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClauseDateError1.jq +++ b/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClauseDateError1.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="RBDY0006"; ErrorMetadata="LINE:1:COLUMN:0:" :) +(:JIQS: ShouldRun; Output="(-0045-01-01, 2004-04-12+14:00, 2004-04-12, 2004-04-12-05:00, 12004-04-12Z)" :) for $j as date in parallelize((date("2004-04-12"), date("2004-04-12-05:00"), date("2004-04-12Z"), date("2004-04-12+14:00"), date("-0045-01-01"), date("12004-04-12Z"), date(()))) group by $j order by $j diff --git a/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseDateError1.jq b/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseDateError1.jq index 8ceb9fe9d..c1cd1f6b0 100644 --- a/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseDateError1.jq +++ b/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseDateError1.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="RBDY0006"; ErrorMetadata="LINE:1:COLUMN:0:" :) +(:JIQS: ShouldRun; Output="(-0045-01-01, 2004-04-12+14:00, 2004-04-12, 2004-04-12Z, 2004-04-12-05:00, 12004-04-12)" :) for $j as date in parallelize((date("2004-04-12"), date("2004-04-12-05:00"), date("2004-04-12Z"), date("2004-04-12+14:00"), date("-0045-01-01"), date("12004-04-12"), date(()))) order by $j return $j From abbb4f4048c4d02d089a941b118acf72d9269418 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 14:19:55 +0200 Subject: [PATCH 108/136] Fix tests. --- .../org/rumbledb/context/NamedFunctions.java | 34 ++++----- .../primary/FunctionCallExpression.java | 2 +- .../primary/InlineFunctionExpression.java | 2 +- .../org/rumbledb/runtime/RuntimeIterator.java | 2 + .../flwor/clauses/ForClauseSparkIterator.java | 6 +- .../input/ParallelizeFunctionIterator.java | 72 ++++++++++--------- 6 files changed, 57 insertions(+), 61 deletions(-) diff --git a/src/main/java/org/rumbledb/context/NamedFunctions.java b/src/main/java/org/rumbledb/context/NamedFunctions.java index 8d9aaa52f..2b47fc38c 100644 --- a/src/main/java/org/rumbledb/context/NamedFunctions.java +++ b/src/main/java/org/rumbledb/context/NamedFunctions.java @@ -49,7 +49,8 @@ public class NamedFunctions implements Serializable, KryoSerializable { private static final long serialVersionUID = 1L; - // two maps for User defined function are needed as execution mode is known at static analysis phase + // two maps for User defined function are needed as execution mode is known at + // static analysis phase // but functions items are fully known at runtimeIterator generation private HashMap userDefinedFunctions; private RumbleRuntimeConfiguration conf; @@ -78,11 +79,7 @@ public RuntimeIterator getUserDefinedFunctionCallIterator( arguments ); } - throw new UnknownFunctionCallException( - identifier.getName(), - identifier.getArity(), - metadata - ); + throw new UnknownFunctionCallException(identifier.getName(), identifier.getArity(), metadata); } @@ -176,12 +173,7 @@ public static RuntimeIterator getBuiltInFunctionIterator( throw new UnknownFunctionCallException(identifier.getName(), identifier.getArity(), metadata); } for (int i = 0; i < arguments.size(); i++) { - if ( - !builtinFunction.getSignature() - .getParameterTypes() - .get(i) - .equals(SequenceType.ITEM_STAR) - ) { + if (!builtinFunction.getSignature().getParameterTypes().get(i).equals(SequenceType.ITEM_STAR)) { SequenceType sequenceType = builtinFunction.getSignature().getParameterTypes().get(i); RuntimeStaticContext runtimeStaticContext = new RuntimeStaticContext( conf, @@ -218,20 +210,18 @@ public static RuntimeIterator getBuiltInFunctionIterator( RuntimeIterator functionCallIterator; try { Constructor constructor = builtinFunction.getFunctionIteratorClass() - .getConstructor( - List.class, - RuntimeStaticContext.class - ); + .getConstructor(List.class, RuntimeStaticContext.class); functionCallIterator = constructor.newInstance( arguments, - new RuntimeStaticContext(conf, builtinFunction.getSignature().getReturnType(), executionMode, metadata) + new RuntimeStaticContext( + conf, + builtinFunction.getSignature().getReturnType(), + executionMode, + metadata + ) ); } catch (ReflectiveOperationException ex) { - RuntimeException e = new UnknownFunctionCallException( - identifier.getName(), - arguments.size(), - metadata - ); + RuntimeException e = new UnknownFunctionCallException(identifier.getName(), arguments.size(), metadata); e.initCause(ex); throw e; } diff --git a/src/main/java/org/rumbledb/expressions/primary/FunctionCallExpression.java b/src/main/java/org/rumbledb/expressions/primary/FunctionCallExpression.java index f2d00b684..5b4dd9e98 100644 --- a/src/main/java/org/rumbledb/expressions/primary/FunctionCallExpression.java +++ b/src/main/java/org/rumbledb/expressions/primary/FunctionCallExpression.java @@ -82,7 +82,7 @@ public void print(StringBuffer buffer, int indent) { for (int i = 0; i < indent; ++i) { buffer.append(" "); } - buffer.append(getClass().getSimpleName()); + buffer.append(getClass().getSimpleName() + " (" + this.identifier + ")"); buffer.append(" | " + this.highestExecutionMode); buffer.append( " | " diff --git a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java index 31964210c..b78f414f1 100644 --- a/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java +++ b/src/main/java/org/rumbledb/expressions/primary/InlineFunctionExpression.java @@ -140,7 +140,7 @@ public void print(StringBuffer buffer, int indent) { buffer.append(" "); } buffer.append("Body:\n"); - this.body.print(buffer, indent + 2); + this.body.print(buffer, indent + 4); } @Override diff --git a/src/main/java/org/rumbledb/runtime/RuntimeIterator.java b/src/main/java/org/rumbledb/runtime/RuntimeIterator.java index 764433985..429b88cc6 100644 --- a/src/main/java/org/rumbledb/runtime/RuntimeIterator.java +++ b/src/main/java/org/rumbledb/runtime/RuntimeIterator.java @@ -405,6 +405,8 @@ public void print(StringBuffer buffer, int indent) { buffer.append(" | "); buffer.append(this.staticContext.getExecutionMode()); buffer.append(" | "); + buffer.append(getStaticType()); + buffer.append(" | "); buffer.append("Variable dependencies: "); Map dependencies = getVariableDependencies(); diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java index c968f1be4..734ec6ad9 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/ForClauseSparkIterator.java @@ -933,10 +933,10 @@ public void print(StringBuffer buffer, int indent) { buffer.append(" "); } buffer.append("Variable ").append(this.variableName.toString()).append("\n"); - for (int i = 0; i < indent + 1; ++i) { - buffer.append(" "); - } if (this.positionalVariableName != null) { + for (int i = 0; i < indent + 1; ++i) { + buffer.append(" "); + } buffer.append("Positional variable ").append(this.positionalVariableName.toString()).append("\n"); } this.assignmentIterator.print(buffer, indent + 1); diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java index a149ee98e..0f9a7e88c 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java @@ -24,6 +24,7 @@ import org.rumbledb.api.Item; import org.rumbledb.context.DynamicContext; import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.runtime.HybridRuntimeIterator; import org.rumbledb.runtime.RuntimeIterator; @@ -36,62 +37,65 @@ public class ParallelizeFunctionIterator extends HybridRuntimeIterator { private static final long serialVersionUID = 1L; + private RuntimeIterator sequenceIterator; + private RuntimeIterator partitionsIterator; public ParallelizeFunctionIterator( List parameters, RuntimeStaticContext staticContext ) { super(parameters, staticContext); + this.sequenceIterator = this.children.get(0); + this.partitionsIterator = this.children.get(0); } @Override public JavaRDD getRDDAux(DynamicContext context) { JavaRDD rdd = null; List contents = new ArrayList<>(); - RuntimeIterator sequenceIterator = this.children.get(0); - sequenceIterator.open(context); - while (sequenceIterator.hasNext()) { - contents.add(sequenceIterator.next()); - } - sequenceIterator.close(); + this.sequenceIterator.materialize(context, contents); if (this.children.size() == 1) { rdd = SparkSessionManager.getInstance().getJavaSparkContext().parallelize(contents); } else { - RuntimeIterator partitionsIterator = this.children.get(1); - partitionsIterator.open(context); - if (!partitionsIterator.hasNext()) { - throw new UnexpectedTypeException( - "The second parameter of parallelize must be an integer, but an empty sequence is supplied.", - getMetadata() - ); - } - Item partitions = partitionsIterator.next(); - if (!partitions.isInteger()) { - throw new UnexpectedTypeException( - "The second parameter of parallelize must be an integer, but a non-integer is supplied.", - getMetadata() - ); - } - try { - rdd = SparkSessionManager.getInstance() - .getJavaSparkContext() - .parallelize(contents, partitions.getIntValue()); - } catch (Exception e) { - if (!partitionsIterator.hasNext()) { - throw new UnexpectedTypeException( - "The second parameter of parallelize must be an integer.", - getMetadata() - ); - } - } - partitionsIterator.close(); + Item partitions = getNumberOfPartitions(context); + rdd = SparkSessionManager.getInstance() + .getJavaSparkContext() + .parallelize(contents, partitions.getIntValue()); } return rdd; } + protected Item getNumberOfPartitions(DynamicContext context) { + Item partitions = null; + try { + partitions = this.partitionsIterator.materializeAtMostOneItemOrNull(context); + } catch (MoreThanOneItemException e) { + throw new UnexpectedTypeException( + "The second parameter of parallelize must be an integer, but a sequence with more than one item is supplied.", + getMetadata() + ); + } + if (partitions == null) { + throw new UnexpectedTypeException( + "The second parameter of parallelize must be an integer, but an empty sequence is supplied.", + getMetadata() + ); + } + if (!partitions.isInteger()) { + throw new UnexpectedTypeException( + "The second parameter of parallelize must be an integer, but a non-integer is supplied.", + getMetadata() + ); + } + return partitions; + } + @Override protected void openLocal() { this.children.get(0).open(this.currentDynamicContextForLocalExecution); + if (this.children.size() > 1) { + getNumberOfPartitions(this.currentDynamicContextForLocalExecution); + } } @Override From 036cb2271043aa9f921f21caf2db9fb19744796c Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 14:21:50 +0200 Subject: [PATCH 109/136] Move over long test to parallel only. --- .../resources/test_files/{runtime-spark => RumbleML}/UnusedLet.jq | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/resources/test_files/{runtime-spark => RumbleML}/UnusedLet.jq (100%) diff --git a/src/test/resources/test_files/runtime-spark/UnusedLet.jq b/src/test/resources/test_files/RumbleML/UnusedLet.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/UnusedLet.jq rename to src/test/resources/test_files/RumbleML/UnusedLet.jq From 7abf613e1def2f3b18eb49382845065507b818b6 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 14:23:54 +0200 Subject: [PATCH 110/136] Move parallel specific tests. --- .../{runtime-spark => RumbleML}/NestedFLWORSparkError1.jq | 0 .../{runtime-spark => RumbleML}/NestedFLWORSparkError2.jq | 0 .../{runtime-spark => RumbleML}/NestedFLWORSparkError3.jq | 0 .../{runtime-spark => RumbleML}/NestedFLWORSparkError4.jq | 0 .../{runtime-spark => RumbleML}/NestedFLWORSparkError5.jq | 0 .../{runtime-spark => RumbleML}/NestedFLWORSparkError6.jq | 0 .../{runtime-spark => RumbleML}/NestedFLWORSparkError7.jq | 0 .../{runtime-spark => RumbleML}/NestedFLWORSparkError8.jq | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename src/test/resources/test_files/{runtime-spark => RumbleML}/NestedFLWORSparkError1.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/NestedFLWORSparkError2.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/NestedFLWORSparkError3.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/NestedFLWORSparkError4.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/NestedFLWORSparkError5.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/NestedFLWORSparkError6.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/NestedFLWORSparkError7.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/NestedFLWORSparkError8.jq (100%) diff --git a/src/test/resources/test_files/runtime-spark/NestedFLWORSparkError1.jq b/src/test/resources/test_files/RumbleML/NestedFLWORSparkError1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/NestedFLWORSparkError1.jq rename to src/test/resources/test_files/RumbleML/NestedFLWORSparkError1.jq diff --git a/src/test/resources/test_files/runtime-spark/NestedFLWORSparkError2.jq b/src/test/resources/test_files/RumbleML/NestedFLWORSparkError2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/NestedFLWORSparkError2.jq rename to src/test/resources/test_files/RumbleML/NestedFLWORSparkError2.jq diff --git a/src/test/resources/test_files/runtime-spark/NestedFLWORSparkError3.jq b/src/test/resources/test_files/RumbleML/NestedFLWORSparkError3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/NestedFLWORSparkError3.jq rename to src/test/resources/test_files/RumbleML/NestedFLWORSparkError3.jq diff --git a/src/test/resources/test_files/runtime-spark/NestedFLWORSparkError4.jq b/src/test/resources/test_files/RumbleML/NestedFLWORSparkError4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/NestedFLWORSparkError4.jq rename to src/test/resources/test_files/RumbleML/NestedFLWORSparkError4.jq diff --git a/src/test/resources/test_files/runtime-spark/NestedFLWORSparkError5.jq b/src/test/resources/test_files/RumbleML/NestedFLWORSparkError5.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/NestedFLWORSparkError5.jq rename to src/test/resources/test_files/RumbleML/NestedFLWORSparkError5.jq diff --git a/src/test/resources/test_files/runtime-spark/NestedFLWORSparkError6.jq b/src/test/resources/test_files/RumbleML/NestedFLWORSparkError6.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/NestedFLWORSparkError6.jq rename to src/test/resources/test_files/RumbleML/NestedFLWORSparkError6.jq diff --git a/src/test/resources/test_files/runtime-spark/NestedFLWORSparkError7.jq b/src/test/resources/test_files/RumbleML/NestedFLWORSparkError7.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/NestedFLWORSparkError7.jq rename to src/test/resources/test_files/RumbleML/NestedFLWORSparkError7.jq diff --git a/src/test/resources/test_files/runtime-spark/NestedFLWORSparkError8.jq b/src/test/resources/test_files/RumbleML/NestedFLWORSparkError8.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/NestedFLWORSparkError8.jq rename to src/test/resources/test_files/RumbleML/NestedFLWORSparkError8.jq From 29233cc4d568310f71fc3fa64e3164f7b99186a5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 14:26:46 +0200 Subject: [PATCH 111/136] Raise cap. --- src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java b/src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java index 428f5296f..5cf82a04e 100644 --- a/src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java +++ b/src/test/java/iq/SparkRuntimeTestsParallelismDeactivated.java @@ -42,7 +42,9 @@ public RumbleRuntimeConfiguration getConfiguration() { "--escape-backticks", "yes", "--parallel-execution", - "no" + "no", + "--materialization-cap", + "1000000" } ); } From 12375b16cefb4418376ae891ff5b3ee5caa86001 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 14:32:32 +0200 Subject: [PATCH 112/136] Fix test. --- .../runtime/functions/input/ParallelizeFunctionIterator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java index 0f9a7e88c..0edeb0a04 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java @@ -46,7 +46,7 @@ public ParallelizeFunctionIterator( ) { super(parameters, staticContext); this.sequenceIterator = this.children.get(0); - this.partitionsIterator = this.children.get(0); + this.partitionsIterator = this.children.get(1); } @Override From 3514953a3d0471e372d4974fca3d776366083f75 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 14:37:22 +0200 Subject: [PATCH 113/136] Fix tests. --- .../runtime/functions/input/ParallelizeFunctionIterator.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java index 0edeb0a04..8d8162c07 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java @@ -46,7 +46,10 @@ public ParallelizeFunctionIterator( ) { super(parameters, staticContext); this.sequenceIterator = this.children.get(0); - this.partitionsIterator = this.children.get(1); + this.partitionsIterator = null; + if (this.children.size() > 1) { + this.partitionsIterator = this.children.get(1); + } } @Override From 1a6b390a62900f2a42dea514c4fef88141f9d527 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Mon, 15 May 2023 15:04:58 +0200 Subject: [PATCH 114/136] Fix test. --- .../flwor/clauses/GroupByClauseSparkIterator.java | 4 ++-- .../functions/input/ParallelizeFunctionIterator.java | 10 +++++----- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java index 6290c6b7b..4e5442005 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java @@ -34,8 +34,8 @@ import org.rumbledb.exceptions.InvalidGroupVariableException; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; -import org.rumbledb.exceptions.NonAtomicKeyException; import org.rumbledb.exceptions.OurBadException; +import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.runtime.RuntimeIterator; import org.rumbledb.runtime.RuntimeTupleIterator; @@ -182,7 +182,7 @@ private HashMap> mapTuplesToPairs() { while (groupVariableExpression.hasNext()) { Item resultItem = groupVariableExpression.next(); if (!resultItem.isAtomic()) { - throw new NonAtomicKeyException( + throw new UnexpectedTypeException( "Group by keys must be atomics", getMetadata() ); diff --git a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java index 8d8162c07..3e17a4f3d 100644 --- a/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java +++ b/src/main/java/org/rumbledb/runtime/functions/input/ParallelizeFunctionIterator.java @@ -40,10 +40,7 @@ public class ParallelizeFunctionIterator extends HybridRuntimeIterator { private RuntimeIterator sequenceIterator; private RuntimeIterator partitionsIterator; - public ParallelizeFunctionIterator( - List parameters, - RuntimeStaticContext staticContext - ) { + public ParallelizeFunctionIterator(List parameters, RuntimeStaticContext staticContext) { super(parameters, staticContext); this.sequenceIterator = this.children.get(0); this.partitionsIterator = null; @@ -63,7 +60,10 @@ public JavaRDD getRDDAux(DynamicContext context) { Item partitions = getNumberOfPartitions(context); rdd = SparkSessionManager.getInstance() .getJavaSparkContext() - .parallelize(contents, partitions.getIntValue()); + .parallelize( + contents, + partitions.getIntValue() + ); } return rdd; } From f7ca84926b0e89afae0e20cc5d031a698b9de193 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 11:01:50 +0200 Subject: [PATCH 115/136] Allow parallel order by on binary values. --- .../flwor/clauses/OrderByClauseSparkIterator.java | 4 ++++ .../flwor/udfs/OrderClauseCreateColumnsUDF.java | 4 ++++ .../flwor/udfs/OrderClauseDetermineTypeUDF.java | 11 ----------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index 9a9e1eba4..5c37e69c4 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -378,6 +378,10 @@ public FlworDataFrame getDataFrame( columnType = DataTypes.DoubleType; } else if (columnTypeString.equals(BuiltinTypesCatalogue.floatItem.getName())) { columnType = DataTypes.FloatType; + } else if (columnTypeString.equals(BuiltinTypesCatalogue.base64BinaryItem.getName())) { + columnType = DataTypes.BinaryType; + } else if (columnTypeString.equals(BuiltinTypesCatalogue.hexBinaryItem.getName())) { + columnType = DataTypes.BinaryType; } else if (columnTypeString.equals(BuiltinTypesCatalogue.decimalItem.getName())) { columnType = TypeMappings.decimalType; } else if ( diff --git a/src/main/java/org/rumbledb/runtime/flwor/udfs/OrderClauseCreateColumnsUDF.java b/src/main/java/org/rumbledb/runtime/flwor/udfs/OrderClauseCreateColumnsUDF.java index fa1a1469c..af343a672 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/udfs/OrderClauseCreateColumnsUDF.java +++ b/src/main/java/org/rumbledb/runtime/flwor/udfs/OrderClauseCreateColumnsUDF.java @@ -132,6 +132,10 @@ private void createColumnsForItem(Item nextItem, int expressionIndex) { this.results.add(nextItem.castToFloatValue()); } else if (typeName.equals(BuiltinTypesCatalogue.decimalItem.getName())) { this.results.add(nextItem.castToDecimalValue()); + } else if (typeName.equals(BuiltinTypesCatalogue.base64BinaryItem.getName())) { + this.results.add(nextItem.getBinaryValue()); + } else if (typeName.equals(BuiltinTypesCatalogue.hexBinaryItem.getName())) { + this.results.add(nextItem.getBinaryValue()); } else if ( typeName.equals(BuiltinTypesCatalogue.durationItem.getName()) || typeName.equals(BuiltinTypesCatalogue.yearMonthDurationItem.getName()) diff --git a/src/main/java/org/rumbledb/runtime/flwor/udfs/OrderClauseDetermineTypeUDF.java b/src/main/java/org/rumbledb/runtime/flwor/udfs/OrderClauseDetermineTypeUDF.java index 2c0391017..efb522e0e 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/udfs/OrderClauseDetermineTypeUDF.java +++ b/src/main/java/org/rumbledb/runtime/flwor/udfs/OrderClauseDetermineTypeUDF.java @@ -85,17 +85,6 @@ private void populateFromExpression(OrderByClauseAnnotatedChildIterator expressi expressionWithIterator.getIterator().getMetadata() ); } - if (this.nextItem.isBinary()) { - String itemType = this.nextItem.getDynamicType().toString(); - throw new UnexpectedTypeException( - "\"" - + itemType - + "\": invalid type: can not compare for equality to type \"" - + itemType - + "\"", - expressionWithIterator.getIterator().getMetadata() - ); - } this.result.add(this.nextItem.getDynamicType().getName().getLocalName()); } } From ec4a5973bd1aea9cf6711892ba4ca0cc4b3af0f1 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 11:03:47 +0200 Subject: [PATCH 116/136] Fix tests. --- .../runtime-spark/DataFrames/OrderbyClauseBase64Binary.jq | 2 +- .../runtime-spark/DataFrames/OrderbyClauseHexBinary.jq | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseBase64Binary.jq b/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseBase64Binary.jq index b29bda7ea..832bb4001 100644 --- a/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseBase64Binary.jq +++ b/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseBase64Binary.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:9:" :) +(:JIQS: ShouldRun; Output="(AaBb, aAbB, 0FB80F+9, 0FB80F+9, 0F+40A==, 0123456789abcdef)" :) for $j as base64Binary in parallelize((base64Binary("0123456789abcdef"), base64Binary("AaBb"), base64Binary("aAbB"), base64Binary("0FB80F+9"), base64Binary("0 FB8 0F+9"), base64Binary("0F+40A=="), base64Binary(()))) order by $j return $j diff --git a/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseHexBinary.jq b/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseHexBinary.jq index 7f2e1ad10..c3645d5ef 100644 --- a/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseHexBinary.jq +++ b/src/test/resources/test_files/runtime-spark/DataFrames/OrderbyClauseHexBinary.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:3:COLUMN:9:" :) +(:JIQS: ShouldRun; Output="(0123456789ABCDEF, AABB, AABB)" :) for $j as hexBinary in parallelize((hexBinary("0123456789abcdef"), hexBinary("AaBb"), hexBinary("aAbB"), hexBinary(()))) order by $j return $j From fe5f3d29c659dc16f3c0f9780383bf7288162cfb Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 11:15:04 +0200 Subject: [PATCH 117/136] Fix tests. --- .../test_files/runtime-spark/DataFrames/GroupbyClause1.jq | 3 ++- .../test_files/runtime-spark/DataFrames/GroupbyClause2.jq | 4 ++-- .../test_files/runtime-spark/DataFrames/GroupbyClause7.jq | 3 ++- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause1.jq b/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause1.jq index dba8516df..de61e37f8 100644 --- a/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause1.jq +++ b/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause1.jq @@ -1,7 +1,8 @@ -(:JIQS: ShouldRun; Output="([ 1, { "guess" : "Czech", "target" : "Czech", "country" : "SE", "choices" : [ "Maori", "Czech", "Korean", "Turkish" ], "sample" : "1787b5c79a00b3513ce76847bc1f5b75", "date" : "2013-08-20" } ], [ 2, { "guess" : "Greek", "target" : "Serbian", "country" : "SE", "choices" : [ "German", "Greek", "Kannada", "Serbian" ], "sample" : "0d5b697ebb326b5043ce7fa60a7b968d", "date" : "2013-08-20" }, { "guess" : "Serbian", "target" : "Serbian", "country" : "AU", "choices" : [ "Dari", "Serbian", "Sinhalese", "Vietnamese" ], "sample" : "0d5b697ebb326b5043ce7fa60a7b968d", "date" : "2013-08-20" } ], [ 3, { "guess" : "Latvian", "target" : "Russian", "country" : "AU", "choices" : [ "Lao", "Latvian", "Russian", "Swahili" ], "sample" : "b7df3f9d67cef259fbcaa5abcad9d774", "date" : "2013-08-20" }, { "guess" : "Russian", "target" : "Russian", "country" : "AU", "choices" : [ "Croatian", "Nepali", "Russian", "Slovenian" ], "sample" : "8a59d48e99e8a1df7e366c4648095e27", "date" : "2013-08-20" } ])" :) +(:JIQS: ShouldRun; Output="([ 1, { "guess" : "Czech", "target" : "Czech", "country" : "SE", "choices" : [ "Maori", "Czech", "Korean", "Turkish" ], "sample" : "1787b5c79a00b3513ce76847bc1f5b75", "date" : "2013-08-20" } ], [ 2, { "guess" : "Latvian", "target" : "Russian", "country" : "AU", "choices" : [ "Lao", "Latvian", "Russian", "Swahili" ], "sample" : "b7df3f9d67cef259fbcaa5abcad9d774", "date" : "2013-08-20" }, { "guess" : "Russian", "target" : "Russian", "country" : "AU", "choices" : [ "Croatian", "Nepali", "Russian", "Slovenian" ], "sample" : "8a59d48e99e8a1df7e366c4648095e27", "date" : "2013-08-20" } ], [ 3, { "guess" : "Greek", "target" : "Serbian", "country" : "SE", "choices" : [ "German", "Greek", "Kannada", "Serbian" ], "sample" : "0d5b697ebb326b5043ce7fa60a7b968d", "date" : "2013-08-20" }, { "guess" : "Serbian", "target" : "Serbian", "country" : "AU", "choices" : [ "Dari", "Serbian", "Sinhalese", "Vietnamese" ], "sample" : "0d5b697ebb326b5043ce7fa60a7b968d", "date" : "2013-08-20" } ])" :) for $i in json-file("../../../queries/conf-ex.json", 10) let $j := $i.target group by $j +order by $j count $k return [$k, $i] diff --git a/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause2.jq b/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause2.jq index 3122de4ba..ff805ef62 100644 --- a/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause2.jq +++ b/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause2.jq @@ -1,8 +1,8 @@ -(:JIQS: ShouldRun; Output="({ "Author" : "pregnanthollywood", "TotalScore" : -1 }, { "Author" : "uncannylizard", "TotalScore" : 0 }, { "Author" : "Mace55555", "TotalScore" : 1 }, { "Author" : "PeglegGecko", "TotalScore" : 1 }, { "Author" : "vhisic", "TotalScore" : 1 }, { "Author" : "asdjfweaiv", "TotalScore" : 1 }, { "Author" : "TimDisaster", "TotalScore" : 1 }, { "Author" : "kylionsfan", "TotalScore" : 1 }, { "Author" : "deephaven", "TotalScore" : 1 }, { "Author" : "politevelociraptor", "TotalScore" : 1 }, { "Author" : "billj457", "TotalScore" : 1 }, { "Author" : "MadagascarDifficulty", "TotalScore" : 1 }, { "Author" : "slicked9778", "TotalScore" : 1 }, { "Author" : "Crodface", "TotalScore" : 1 }, { "Author" : "MrRangerLP", "TotalScore" : 1 }, { "Author" : "Clomez", "TotalScore" : 1 }, { "Author" : "CarpeAeonem", "TotalScore" : 1 }, { "Author" : "Movepeck", "TotalScore" : 2 }, { "Author" : "Vamking12", "TotalScore" : 2 }, { "Author" : "gingerguitarx92x", "TotalScore" : 2 }, { "Author" : "Mastersimpson", "TotalScore" : 2 }, { "Author" : "marklar7", "TotalScore" : 2 }, { "Author" : "thebasedyeezus", "TotalScore" : 2 }, { "Author" : "highvoltorb", "TotalScore" : 2 }, { "Author" : "noitnemid", "TotalScore" : 2 }, { "Author" : "jaggazz", "TotalScore" : 2 }, { "Author" : "-purple-is-a-fruit-", "TotalScore" : 2 }, { "Author" : "FreeSoul789", "TotalScore" : 3 }, { "Author" : "RedCoatsForever", "TotalScore" : 3 }, { "Author" : "BigGupp1", "TotalScore" : 6 }, { "Author" : "[deleted]", "TotalScore" : 7 }, { "Author" : "submaRED", "TotalScore" : 7 }, { "Author" : "Meltingteeth", "TotalScore" : 10 }, { "Author" : "YoungModern", "TotalScore" : 14 }, { "Author" : "dewprisms", "TotalScore" : 17 })" :) +(:JIQS: ShouldRun; Output="({ "Author" : "pregnanthollywood", "TotalScore" : -1 }, { "Author" : "uncannylizard", "TotalScore" : 0 }, { "Author" : "CarpeAeonem", "TotalScore" : 1 }, { "Author" : "Clomez", "TotalScore" : 1 }, { "Author" : "Crodface", "TotalScore" : 1 }, { "Author" : "Mace55555", "TotalScore" : 1 }, { "Author" : "MadagascarDifficulty", "TotalScore" : 1 }, { "Author" : "MrRangerLP", "TotalScore" : 1 }, { "Author" : "PeglegGecko", "TotalScore" : 1 }, { "Author" : "TimDisaster", "TotalScore" : 1 }, { "Author" : "asdjfweaiv", "TotalScore" : 1 }, { "Author" : "billj457", "TotalScore" : 1 }, { "Author" : "deephaven", "TotalScore" : 1 }, { "Author" : "kylionsfan", "TotalScore" : 1 }, { "Author" : "politevelociraptor", "TotalScore" : 1 }, { "Author" : "slicked9778", "TotalScore" : 1 }, { "Author" : "vhisic", "TotalScore" : 1 }, { "Author" : "-purple-is-a-fruit-", "TotalScore" : 2 }, { "Author" : "Mastersimpson", "TotalScore" : 2 }, { "Author" : "Movepeck", "TotalScore" : 2 }, { "Author" : "Vamking12", "TotalScore" : 2 }, { "Author" : "gingerguitarx92x", "TotalScore" : 2 }, { "Author" : "highvoltorb", "TotalScore" : 2 }, { "Author" : "jaggazz", "TotalScore" : 2 }, { "Author" : "marklar7", "TotalScore" : 2 }, { "Author" : "noitnemid", "TotalScore" : 2 }, { "Author" : "thebasedyeezus", "TotalScore" : 2 }, { "Author" : "FreeSoul789", "TotalScore" : 3 }, { "Author" : "RedCoatsForever", "TotalScore" : 3 }, { "Author" : "BigGupp1", "TotalScore" : 6 }, { "Author" : "[deleted]", "TotalScore" : 7 }, { "Author" : "submaRED", "TotalScore" : 7 }, { "Author" : "Meltingteeth", "TotalScore" : 10 }, { "Author" : "YoungModern", "TotalScore" : 14 }, { "Author" : "dewprisms", "TotalScore" : 17 })" :) for $i in json-file("../../../queries/Reddit.json", 10) let $author := $i.author, $score := $i.score group by $author let $totalScore := sum($score) -order by $totalScore +order by $totalScore, $author return {"Author": $author, "TotalScore": $totalScore} diff --git a/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause7.jq b/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause7.jq index 32467aa98..49d55abac 100644 --- a/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause7.jq +++ b/src/test/resources/test_files/runtime-spark/DataFrames/GroupbyClause7.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="([ 1, { "guess" : "Arabic", "choices" : [ "Arabic", "Cantonese", "Maltese", "Samoan" ] }, { "guess" : "Arabic", "choices" : [ "Albanian", "Arabic", "Czech", "Dutch" ] } ], [ 2, { "guess" : "Bulgarian", "target" : "Albanian", "country" : "AU", "choices" : [ "Albanian", "Bulgarian", "Russian", "Ukrainian" ] }, { "guess" : "Bulgarian", "target" : "Albanian", "country" : "AU", "choices" : [ "Arabic", "Bulgarian", "Hebrew", "Spanish" ] } ], [ 3, { "guess" : "Arabic", "country" : null, "choices" : [ "Arabic", "Greek", "Hebrew", "Spanish" ] } ], [ 4, { "guess" : "Arabic", "country" : "IN", "choices" : [ "Arabic", "Greek", "Hebrew", "Spanish" ] } ], [ 5, { "guess" : "Slovenian", "target" : "Norwegian", "country" : "AU", "choices" : [ "Dinka", "Nepali", "Norwegian", "Slovenian" ] } ], [ 6, { "guess" : "Bulgarian", "target" : null, "country" : "AU", "choices" : [ "Albanian", "Bulgarian", "Russian", "Ukrainian" ] }, { "guess" : "Bulgarian", "target" : null, "country" : "AU", "choices" : [ "Arabic", "Bulgarian", "Hebrew", "Spanish" ] } ])" :) +(:JIQS: ShouldRun; Output="([ 1, { "guess" : "Arabic", "choices" : [ "Arabic", "Cantonese", "Maltese", "Samoan" ] }, { "guess" : "Arabic", "choices" : [ "Albanian", "Arabic", "Czech", "Dutch" ] } ], [ 2, { "guess" : "Arabic", "country" : null, "choices" : [ "Arabic", "Greek", "Hebrew", "Spanish" ] } ], [ 3, { "guess" : "Arabic", "country" : "IN", "choices" : [ "Arabic", "Greek", "Hebrew", "Spanish" ] } ], [ 4, { "guess" : "Bulgarian", "target" : null, "country" : "AU", "choices" : [ "Albanian", "Bulgarian", "Russian", "Ukrainian" ] }, { "guess" : "Bulgarian", "target" : null, "country" : "AU", "choices" : [ "Arabic", "Bulgarian", "Hebrew", "Spanish" ] } ], [ 5, { "guess" : "Bulgarian", "target" : "Albanian", "country" : "AU", "choices" : [ "Albanian", "Bulgarian", "Russian", "Ukrainian" ] }, { "guess" : "Bulgarian", "target" : "Albanian", "country" : "AU", "choices" : [ "Arabic", "Bulgarian", "Hebrew", "Spanish" ] } ], [ 6, { "guess" : "Slovenian", "target" : "Norwegian", "country" : "AU", "choices" : [ "Dinka", "Nepali", "Norwegian", "Slovenian" ] } ])" :) for $i in parallelize(( {"guess": "Slovenian", "target": "Norwegian", "country": "AU", "choices": ["Dinka", "Nepali", "Norwegian", "Slovenian"]}, {"guess": "Arabic", "choices": ["Arabic", "Cantonese", "Maltese", "Samoan"]}, @@ -10,6 +10,7 @@ for $i in parallelize(( {"guess": "Bulgarian", "target": null, "country": "AU", "choices": ["Albanian", "Bulgarian", "Russian", "Ukrainian"]}, {"guess": "Bulgarian", "target": null, "country": "AU", "choices": ["Arabic", "Bulgarian", "Hebrew", "Spanish"]})) group by $guess := $i.guess, $target := $i.target, $country := $i.country +order by $guess, $target, $country count $group_index return [$group_index, $i] From 6c5ec35f92cdf30fd112320dc7c5aad1ce9a46d8 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 11:16:03 +0200 Subject: [PATCH 118/136] Move test over. --- .../{runtime-spark => RumbleML}/MaterializationError.jq | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/test/resources/test_files/{runtime-spark => RumbleML}/MaterializationError.jq (100%) diff --git a/src/test/resources/test_files/runtime-spark/MaterializationError.jq b/src/test/resources/test_files/RumbleML/MaterializationError.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/MaterializationError.jq rename to src/test/resources/test_files/RumbleML/MaterializationError.jq From 5ab4727f0e0a55d98ab83a67def298e7712e5f5b Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 11:23:54 +0200 Subject: [PATCH 119/136] Fix test. --- .../runtime/navigation/PredicateIterator.java | 13 +++++++++---- .../{runtime-spark => RumbleML}/ForLetJoinError4.jq | 0 2 files changed, 9 insertions(+), 4 deletions(-) rename src/test/resources/test_files/{runtime-spark => RumbleML}/ForLetJoinError4.jq (100%) diff --git a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java index 12e08d93b..ae7e28034 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java @@ -30,7 +30,9 @@ import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; import org.rumbledb.exceptions.IteratorFlowException; +import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.OurBadException; +import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; @@ -174,12 +176,15 @@ private void setNextResult() { this.filterDynamicContext.getVariableValues().setPosition(++this.position); } - this.filter.open(this.filterDynamicContext); Item fil = null; - if (this.filter.hasNext()) { - fil = this.filter.next(); + try { + fil = this.filter.materializeAtMostOneItemOrNull(this.filterDynamicContext); + } catch (MoreThanOneItemException e) { + throw new UnexpectedTypeException( + "Effective boolean value not defined for sequences of more than one atomic item. Sequence must be singleton.", + this.filter.getMetadata() + ); } - this.filter.close(); // if filter is an integer, it is used to return the element(s) with the index equal to the given integer if (fil != null && fil.isInt()) { int index = fil.getIntValue(); diff --git a/src/test/resources/test_files/runtime-spark/ForLetJoinError4.jq b/src/test/resources/test_files/RumbleML/ForLetJoinError4.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/ForLetJoinError4.jq rename to src/test/resources/test_files/RumbleML/ForLetJoinError4.jq From 257fc822d26aebecd2cabf76198fb38f50c6ceb3 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 11:27:24 +0200 Subject: [PATCH 120/136] Fix tests. --- .../org/rumbledb/runtime/navigation/PredicateIterator.java | 3 ++- .../test_files/{runtime-spark => RumbleML}/ForLetJoinError1.jq | 0 .../test_files/{runtime-spark => RumbleML}/ForLetJoinError5.jq | 0 .../resources/test_files/{runtime-spark => RumbleML}/Join5.jq | 0 4 files changed, 2 insertions(+), 1 deletion(-) rename src/test/resources/test_files/{runtime-spark => RumbleML}/ForLetJoinError1.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/ForLetJoinError5.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/Join5.jq (100%) diff --git a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java index ae7e28034..9612b1661 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java @@ -29,6 +29,7 @@ import org.rumbledb.context.DynamicContext; import org.rumbledb.context.Name; import org.rumbledb.context.RuntimeStaticContext; +import org.rumbledb.exceptions.InvalidArgumentTypeException; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.OurBadException; @@ -180,7 +181,7 @@ private void setNextResult() { try { fil = this.filter.materializeAtMostOneItemOrNull(this.filterDynamicContext); } catch (MoreThanOneItemException e) { - throw new UnexpectedTypeException( + throw new InvalidArgumentTypeException( "Effective boolean value not defined for sequences of more than one atomic item. Sequence must be singleton.", this.filter.getMetadata() ); diff --git a/src/test/resources/test_files/runtime-spark/ForLetJoinError1.jq b/src/test/resources/test_files/RumbleML/ForLetJoinError1.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/ForLetJoinError1.jq rename to src/test/resources/test_files/RumbleML/ForLetJoinError1.jq diff --git a/src/test/resources/test_files/runtime-spark/ForLetJoinError5.jq b/src/test/resources/test_files/RumbleML/ForLetJoinError5.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/ForLetJoinError5.jq rename to src/test/resources/test_files/RumbleML/ForLetJoinError5.jq diff --git a/src/test/resources/test_files/runtime-spark/Join5.jq b/src/test/resources/test_files/RumbleML/Join5.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/Join5.jq rename to src/test/resources/test_files/RumbleML/Join5.jq From 69139428f0a44dbaa61a2416f21e643f1153e8c9 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 11:29:48 +0200 Subject: [PATCH 121/136] Fix tests. --- .../test_files/{runtime-spark => RumbleML}/ForLetJoinError2.jq | 0 .../resources/test_files/{runtime-spark => RumbleML}/Join7.jq | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename src/test/resources/test_files/{runtime-spark => RumbleML}/ForLetJoinError2.jq (100%) rename src/test/resources/test_files/{runtime-spark => RumbleML}/Join7.jq (100%) diff --git a/src/test/resources/test_files/runtime-spark/ForLetJoinError2.jq b/src/test/resources/test_files/RumbleML/ForLetJoinError2.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/ForLetJoinError2.jq rename to src/test/resources/test_files/RumbleML/ForLetJoinError2.jq diff --git a/src/test/resources/test_files/runtime-spark/Join7.jq b/src/test/resources/test_files/RumbleML/Join7.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/Join7.jq rename to src/test/resources/test_files/RumbleML/Join7.jq From f2c05f64957855c7c429acbdbefc0483a96e27de Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:05:18 +0200 Subject: [PATCH 122/136] Spotless. --- .../java/org/rumbledb/runtime/navigation/PredicateIterator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java index 9612b1661..96d4d5a4f 100644 --- a/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java +++ b/src/main/java/org/rumbledb/runtime/navigation/PredicateIterator.java @@ -33,7 +33,6 @@ import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.OurBadException; -import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; import org.rumbledb.items.structured.JSoundDataFrame; import org.rumbledb.runtime.HybridRuntimeIterator; From e211e82a3a07a16c60ef48b5ebee5c88c4e63889 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:11:20 +0200 Subject: [PATCH 123/136] Fix test. --- .../clauses/OrderByClauseSparkIterator.java | 2 +- .../sparksoniq/jsoniq/tuple/FlworKey.java | 19 ++++++++++++------- .../jsoniq/tuple/FlworKeyComparator.java | 10 ++++++++-- .../ForLetJoinError3.jq | 0 4 files changed, 21 insertions(+), 10 deletions(-) rename src/test/resources/test_files/{runtime-spark => RumbleML}/ForLetJoinError3.jq (100%) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index 5c37e69c4..676b76472 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -163,7 +163,7 @@ private TreeMap> mapExpressionsToOrderedPairs() { // OrderByClauseSortClosure implements a comparator and provides the exact desired behavior for local execution // as well TreeMap> keyValuePairs = new TreeMap<>( - new FlworKeyComparator(this.expressionsWithIterator) + new FlworKeyComparator(this.expressionsWithIterator, getMetadata()) ); // assign current context as parent. re-use the same context object for efficiency diff --git a/src/main/java/sparksoniq/jsoniq/tuple/FlworKey.java b/src/main/java/sparksoniq/jsoniq/tuple/FlworKey.java index 57d7e9734..e8665eb65 100644 --- a/src/main/java/sparksoniq/jsoniq/tuple/FlworKey.java +++ b/src/main/java/sparksoniq/jsoniq/tuple/FlworKey.java @@ -114,11 +114,16 @@ public boolean equalFlworKey(FlworKey flworKey) { * Invariant - two Flworkeys have the same length * * @param flworKey "other" FlworKey to be compared against + * @param metadata * @return comparison value (-1=smaller, 0=equal, 1=larger) * index (of the expression that determines ordering) */ - public int compareWithFlworKey(FlworKey flworKey, List expressions) { + public int compareWithFlworKey( + FlworKey flworKey, + List expressions, + ExceptionMetadata metadata + ) { if (this.keyItems.size() != flworKey.keyItems.size()) { - throw new OurBadException("Invalid sort key: Key sizes can't be different."); + throw new OurBadException("Invalid sort key: Key sizes can't be different.", metadata); } int result = 0; @@ -136,7 +141,7 @@ public int compareWithFlworKey(FlworKey flworKey, List, Serializable { private static final long serialVersionUID = 1L; private final List expressions; + private ExceptionMetadata metadata; - public FlworKeyComparator(List expressions) { + public FlworKeyComparator( + List expressions, + ExceptionMetadata exceptionMetadata + ) { this.expressions = expressions; + this.metadata = exceptionMetadata; } @Override public int compare(FlworKey key1, FlworKey key2) { - int result = key1.compareWithFlworKey(key2, this.expressions); + int result = key1.compareWithFlworKey(key2, this.expressions, this.metadata); if (result == 0) { return 0; diff --git a/src/test/resources/test_files/runtime-spark/ForLetJoinError3.jq b/src/test/resources/test_files/RumbleML/ForLetJoinError3.jq similarity index 100% rename from src/test/resources/test_files/runtime-spark/ForLetJoinError3.jq rename to src/test/resources/test_files/RumbleML/ForLetJoinError3.jq From cdd7037004736063d4e6bcdba034a5536d7a669f Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:17:10 +0200 Subject: [PATCH 124/136] Fix test. --- .../runtime/flwor/clauses/OrderByClauseSparkIterator.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index 676b76472..37a6bf321 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -182,8 +182,8 @@ private TreeMap> mapExpressionsToOrderedPairs() { try { Item resultItem = iterator.materializeAtMostOneItemOrNull(tupleContext); if (resultItem != null && !resultItem.isAtomic()) { - throw new NoTypedValueException( - "Order by keys must be atomics", + throw new UnexpectedTypeException( + "Keys in an order-by clause must be atomics.", expressionWithIterator.getIterator().getMetadata() ); } @@ -191,7 +191,7 @@ private TreeMap> mapExpressionsToOrderedPairs() { results.add(resultItem); } catch (MoreThanOneItemException e) { throw new UnexpectedTypeException( - "Order by keys must be at most one item", + "Keys in an order-by clause must be at most one item.", expressionWithIterator.getIterator().getMetadata() ); } From 1d948e632fc8650d0e65d40f4ab59d4f04c0f7ff Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:17:23 +0200 Subject: [PATCH 125/136] Fix test. --- .../runtime/flwor/clauses/OrderByClauseSparkIterator.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java index 37a6bf321..1d17221bf 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/OrderByClauseSparkIterator.java @@ -34,7 +34,6 @@ import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; import org.rumbledb.exceptions.MoreThanOneItemException; -import org.rumbledb.exceptions.NoTypedValueException; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; From 5506d7b986fb805fe321417ead9b467763b8110b Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:24:26 +0200 Subject: [PATCH 126/136] Fix test. --- .../clauses/GroupByClauseSparkIterator.java | 23 +++++++++++++------ 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java index 4e5442005..445db1c50 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java @@ -34,6 +34,7 @@ import org.rumbledb.exceptions.InvalidGroupVariableException; import org.rumbledb.exceptions.IteratorFlowException; import org.rumbledb.exceptions.JobWithinAJobException; +import org.rumbledb.exceptions.MoreThanOneItemException; import org.rumbledb.exceptions.OurBadException; import org.rumbledb.exceptions.UnexpectedTypeException; import org.rumbledb.expressions.flowr.FLWOR_CLAUSES; @@ -51,6 +52,7 @@ import sparksoniq.jsoniq.tuple.FlworTuple; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; @@ -177,19 +179,26 @@ private HashMap> mapTuplesToPairs() { ); } - List newVariableResults = new ArrayList<>(); - groupVariableExpression.open(tupleContext); - while (groupVariableExpression.hasNext()) { - Item resultItem = groupVariableExpression.next(); + List newVariableResults = null; + Item resultItem = null; + try { + resultItem = groupVariableExpression.materializeAtMostOneItemOrNull(tupleContext); + } catch (MoreThanOneItemException e) + { + throw new UnexpectedTypeException("Keys in a group-by clause must be at most one item.", getMetadata()); + } + if(resultItem != null) + { if (!resultItem.isAtomic()) { throw new UnexpectedTypeException( - "Group by keys must be atomics", + "Keys in a group-by clause must be atomics.", getMetadata() ); } - newVariableResults.add(resultItem); + newVariableResults = Collections.singletonList(resultItem); + } else { + newVariableResults = Collections.emptyList(); } - groupVariableExpression.close(); // if a new variable is declared inside the group by clause, insert value in tuple inputTuple.putValue(expression.getVariableName(), newVariableResults); From 12b383ec9608b064fc4bf14bea00b9c0764617e1 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:29:50 +0200 Subject: [PATCH 127/136] Fix test. --- .../java/org/rumbledb/items/Base64BinaryItem.java | 2 +- .../flwor/clauses/GroupByClauseSparkIterator.java | 15 ++++++++------- .../LocalClauses/OrderbyClauseBase64Binary.jq | 2 +- 3 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main/java/org/rumbledb/items/Base64BinaryItem.java b/src/main/java/org/rumbledb/items/Base64BinaryItem.java index 52d55bac6..0ccbd5013 100644 --- a/src/main/java/org/rumbledb/items/Base64BinaryItem.java +++ b/src/main/java/org/rumbledb/items/Base64BinaryItem.java @@ -40,8 +40,8 @@ public Base64BinaryItem() { } public Base64BinaryItem(String stringValue) { - this.stringValue = stringValue; this.value = parseBase64BinaryString(stringValue); + this.stringValue = StringUtils.chomp(Base64.encodeBase64String(this.value)); } @Override diff --git a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java index 445db1c50..6627a4add 100644 --- a/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java +++ b/src/main/java/org/rumbledb/runtime/flwor/clauses/GroupByClauseSparkIterator.java @@ -182,13 +182,14 @@ private HashMap> mapTuplesToPairs() { List newVariableResults = null; Item resultItem = null; try { - resultItem = groupVariableExpression.materializeAtMostOneItemOrNull(tupleContext); - } catch (MoreThanOneItemException e) - { - throw new UnexpectedTypeException("Keys in a group-by clause must be at most one item.", getMetadata()); + resultItem = groupVariableExpression.materializeAtMostOneItemOrNull(tupleContext); + } catch (MoreThanOneItemException e) { + throw new UnexpectedTypeException( + "Keys in a group-by clause must be at most one item.", + getMetadata() + ); } - if(resultItem != null) - { + if (resultItem != null) { if (!resultItem.isAtomic()) { throw new UnexpectedTypeException( "Keys in a group-by clause must be atomics.", @@ -197,7 +198,7 @@ private HashMap> mapTuplesToPairs() { } newVariableResults = Collections.singletonList(resultItem); } else { - newVariableResults = Collections.emptyList(); + newVariableResults = Collections.emptyList(); } // if a new variable is declared inside the group by clause, insert value in tuple diff --git a/src/test/resources/test_files/runtime-spark/LocalClauses/OrderbyClauseBase64Binary.jq b/src/test/resources/test_files/runtime-spark/LocalClauses/OrderbyClauseBase64Binary.jq index d32433217..4e9d2c721 100644 --- a/src/test/resources/test_files/runtime-spark/LocalClauses/OrderbyClauseBase64Binary.jq +++ b/src/test/resources/test_files/runtime-spark/LocalClauses/OrderbyClauseBase64Binary.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="(AaBb, aAbB, 0FB80F+9, 0 FB8 0F+9, 0F+40A==, 0123456789abcdef)" :) +(:JIQS: ShouldRun; Output="(AaBb, aAbB, 0FB80F+9, 0FB80F+9, 0F+40A==, 0123456789abcdef)" :) for $j as base64Binary in (base64Binary("0123456789abcdef"), base64Binary("AaBb"), base64Binary("aAbB"), base64Binary("0FB80F+9"), base64Binary("0 FB8 0F+9"), base64Binary("0F+40A=="), base64Binary(())) order by $j return $j From c3811c085da47e000064984d5a041689dd9bf474 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:32:07 +0200 Subject: [PATCH 128/136] Use ANTLR 4.8. --- .../rumbledb/parser/JsoniqBaseVisitor.java | 2 +- .../java/org/rumbledb/parser/JsoniqLexer.java | 125 ++++++++-------- .../org/rumbledb/parser/JsoniqParser.java | 138 ++++++++++-------- .../org/rumbledb/parser/JsoniqVisitor.java | 2 +- 4 files changed, 147 insertions(+), 120 deletions(-) diff --git a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java index 9651ffda1..294470559 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java +++ b/src/main/java/org/rumbledb/parser/JsoniqBaseVisitor.java @@ -1,4 +1,4 @@ -// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.7 +// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.8 // Java header package org.rumbledb.parser; diff --git a/src/main/java/org/rumbledb/parser/JsoniqLexer.java b/src/main/java/org/rumbledb/parser/JsoniqLexer.java index 01503d070..888f964a1 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqLexer.java +++ b/src/main/java/org/rumbledb/parser/JsoniqLexer.java @@ -1,4 +1,4 @@ -// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.7 +// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.8 // Java header package org.rumbledb.parser; @@ -16,7 +16,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class JsoniqLexer extends Lexer { - static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -49,63 +49,72 @@ public class JsoniqLexer extends Lexer { "DEFAULT_MODE" }; - public static final String[] ruleNames = { - "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", - "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16", - "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", - "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", - "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", - "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", - "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56", - "T__57", "T__58", "T__59", "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", - "Korder", "Kreturn", "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", - "Kcount", "Kstable", "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", - "Kcollation", "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", - "Kdefault", "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", - "Kinstance", "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", - "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", - "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", "STRING", "ESC", - "UNICODE", "HEX", "ArgumentPlaceholder", "NullLiteral", "Literal", "NumericLiteral", - "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", "Digits", "WS", "NCName", - "NameStartChar", "NameChar", "XQComment", "ContentChar" - }; + private static String[] makeRuleNames() { + return new String[] { + "T__0", "T__1", "T__2", "T__3", "T__4", "T__5", "T__6", "T__7", "T__8", + "T__9", "T__10", "T__11", "T__12", "T__13", "T__14", "T__15", "T__16", + "T__17", "T__18", "T__19", "T__20", "T__21", "T__22", "T__23", "T__24", + "T__25", "T__26", "T__27", "T__28", "T__29", "T__30", "T__31", "T__32", + "T__33", "T__34", "T__35", "T__36", "T__37", "T__38", "T__39", "T__40", + "T__41", "T__42", "T__43", "T__44", "T__45", "T__46", "T__47", "T__48", + "T__49", "T__50", "T__51", "T__52", "T__53", "T__54", "T__55", "T__56", + "T__57", "T__58", "T__59", "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", + "Korder", "Kreturn", "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", + "Kcount", "Kstable", "Kascending", "Kdescending", "Ksome", "Kevery", + "Ksatisfies", "Kcollation", "Kgreatest", "Kleast", "Kswitch", "Kcase", + "Ktry", "Kcatch", "Kdefault", "Kthen", "Kelse", "Ktypeswitch", "Kor", + "Kand", "Knot", "Kto", "Kinstance", "Kof", "Kstatically", "Kis", "Ktreat", + "Kcast", "Kcastable", "Kversion", "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", + "Ktype", "Kvalidate", "Kannotate", "Kdeclare", "Kcontext", "Kitem", "Kvariable", + "STRING", "ESC", "UNICODE", "HEX", "ArgumentPlaceholder", "NullLiteral", + "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", "DoubleLiteral", + "Digits", "WS", "NCName", "NameStartChar", "NameChar", "XQComment", "ContentChar" + }; + } + public static final String[] ruleNames = makeRuleNames(); - private static final String[] _LITERAL_NAMES = { - null, "';'", "'module'", "'namespace'", "'='", "'ordering'", "'ordered'", - "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", - "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", - "'digit'", "'pattern-separator'", "'import'", "','", "':='", "'external'", - "'function'", "'('", "')'", "'{'", "'}'", "'jsound'", "'compact'", "'verbose'", - "'json'", "'schema'", "'$'", "'|'", "'*'", "'eq'", "'ne'", "'lt'", "'le'", - "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", "'+'", "'-'", - "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'", "'$$'", "'#'", - "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", "'by'", "'order'", - "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", "'empty'", "'count'", - "'stable'", "'ascending'", "'descending'", "'some'", "'every'", "'satisfies'", - "'collation'", "'greatest'", "'least'", "'switch'", "'case'", "'try'", - "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", "'or'", "'and'", - "'not'", "'to'", "'instance'", "'of'", "'statically'", "'is'", "'treat'", - "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", "'true'", - "'false'", "'type'", "'validate'", "'annotate'", "'declare'", "'context'", - "'item'", "'variable'", null, "'?'", "'null'" - }; - private static final String[] _SYMBOLIC_NAMES = { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", - "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", - "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", - "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", - "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", - "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", - "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", - "Kdeclare", "Kcontext", "Kitem", "Kvariable", "STRING", "ArgumentPlaceholder", - "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", - "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" - }; + private static String[] makeLiteralNames() { + return new String[] { + null, "';'", "'module'", "'namespace'", "'='", "'ordering'", "'ordered'", + "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", + "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", + "'digit'", "'pattern-separator'", "'import'", "','", "':='", "'external'", + "'function'", "'('", "')'", "'{'", "'}'", "'jsound'", "'compact'", "'verbose'", + "'json'", "'schema'", "'$'", "'|'", "'*'", "'eq'", "'ne'", "'lt'", "'le'", + "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", "'+'", + "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'", "'$$'", + "'#'", "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", "'by'", + "'order'", "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", + "'empty'", "'count'", "'stable'", "'ascending'", "'descending'", "'some'", + "'every'", "'satisfies'", "'collation'", "'greatest'", "'least'", "'switch'", + "'case'", "'try'", "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", + "'or'", "'and'", "'not'", "'to'", "'instance'", "'of'", "'statically'", + "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", + "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'", + "'context'", "'item'", "'variable'", null, "'?'", "'null'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", + "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", + "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", + "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", + "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", + "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", + "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", + "Kdeclare", "Kcontext", "Kitem", "Kvariable", "STRING", "ArgumentPlaceholder", + "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", + "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); /** diff --git a/src/main/java/org/rumbledb/parser/JsoniqParser.java b/src/main/java/org/rumbledb/parser/JsoniqParser.java index c0ca5cfc6..299fcb8a3 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqParser.java +++ b/src/main/java/org/rumbledb/parser/JsoniqParser.java @@ -1,4 +1,4 @@ -// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.7 +// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.8 // Java header package org.rumbledb.parser; @@ -25,7 +25,7 @@ @SuppressWarnings({"all", "warnings", "unchecked", "unused", "cast"}) public class JsoniqParser extends Parser { - static { RuntimeMetaData.checkVersion("4.7", RuntimeMetaData.VERSION); } + static { RuntimeMetaData.checkVersion("4.8", RuntimeMetaData.VERSION); } protected static final DFA[] _decisionToDFA; protected static final PredictionContextCache _sharedContextCache = @@ -79,64 +79,73 @@ public class JsoniqParser extends Parser { RULE_anyFunctionTest = 85, RULE_typedFunctionTest = 86, RULE_singleType = 87, RULE_pairConstructor = 88, RULE_arrayConstructor = 89, RULE_uriLiteral = 90, RULE_stringLiteral = 91, RULE_keyWords = 92; - public static final String[] ruleNames = { - "moduleAndThisIsIt", "module", "mainModule", "libraryModule", "prolog", - "setter", "namespaceDecl", "annotatedDecl", "defaultCollationDecl", "orderingModeDecl", - "emptyOrderDecl", "decimalFormatDecl", "qname", "dfPropertyName", "moduleImport", - "varDecl", "contextItemDecl", "functionDecl", "typeDecl", "schemaLanguage", - "paramList", "param", "expr", "exprSingle", "flowrExpr", "forClause", - "forVar", "letClause", "letVar", "whereClause", "groupByClause", "groupByVar", - "orderByClause", "orderByExpr", "countClause", "quantifiedExpr", "quantifiedExprVar", - "switchExpr", "switchCaseClause", "typeSwitchExpr", "caseClause", "ifExpr", - "tryCatchExpr", "catchClause", "orExpr", "andExpr", "notExpr", "comparisonExpr", - "stringConcatExpr", "rangeExpr", "additiveExpr", "multiplicativeExpr", - "instanceOfExpr", "isStaticallyExpr", "treatExpr", "castableExpr", "castExpr", - "arrowExpr", "arrowFunctionSpecifier", "unaryExpr", "valueExpr", "validateExpr", - "annotateExpr", "simpleMapExpr", "postFixExpr", "arrayLookup", "arrayUnboxing", - "predicate", "objectLookup", "primaryExpr", "varRef", "parenthesizedExpr", - "contextItemExpr", "orderedExpr", "unorderedExpr", "functionCall", "argumentList", - "argument", "functionItemExpr", "namedFunctionRef", "inlineFunctionExpr", - "sequenceType", "objectConstructor", "itemType", "functionTest", "anyFunctionTest", - "typedFunctionTest", "singleType", "pairConstructor", "arrayConstructor", - "uriLiteral", "stringLiteral", "keyWords" - }; - - private static final String[] _LITERAL_NAMES = { - null, "';'", "'module'", "'namespace'", "'='", "'ordering'", "'ordered'", - "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", - "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", - "'digit'", "'pattern-separator'", "'import'", "','", "':='", "'external'", - "'function'", "'('", "')'", "'{'", "'}'", "'jsound'", "'compact'", "'verbose'", - "'json'", "'schema'", "'$'", "'|'", "'*'", "'eq'", "'ne'", "'lt'", "'le'", - "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", "'+'", "'-'", - "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'", "'$$'", "'#'", - "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", "'by'", "'order'", - "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", "'empty'", "'count'", - "'stable'", "'ascending'", "'descending'", "'some'", "'every'", "'satisfies'", - "'collation'", "'greatest'", "'least'", "'switch'", "'case'", "'try'", - "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", "'or'", "'and'", - "'not'", "'to'", "'instance'", "'of'", "'statically'", "'is'", "'treat'", - "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", "'true'", - "'false'", "'type'", "'validate'", "'annotate'", "'declare'", "'context'", - "'item'", "'variable'", null, "'?'", "'null'" - }; - private static final String[] _SYMBOLIC_NAMES = { - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, null, null, null, null, null, null, null, null, null, null, null, - null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", - "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", - "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", - "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", - "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", - "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", - "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", - "Kdeclare", "Kcontext", "Kitem", "Kvariable", "STRING", "ArgumentPlaceholder", - "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", - "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" - }; + private static String[] makeRuleNames() { + return new String[] { + "moduleAndThisIsIt", "module", "mainModule", "libraryModule", "prolog", + "setter", "namespaceDecl", "annotatedDecl", "defaultCollationDecl", "orderingModeDecl", + "emptyOrderDecl", "decimalFormatDecl", "qname", "dfPropertyName", "moduleImport", + "varDecl", "contextItemDecl", "functionDecl", "typeDecl", "schemaLanguage", + "paramList", "param", "expr", "exprSingle", "flowrExpr", "forClause", + "forVar", "letClause", "letVar", "whereClause", "groupByClause", "groupByVar", + "orderByClause", "orderByExpr", "countClause", "quantifiedExpr", "quantifiedExprVar", + "switchExpr", "switchCaseClause", "typeSwitchExpr", "caseClause", "ifExpr", + "tryCatchExpr", "catchClause", "orExpr", "andExpr", "notExpr", "comparisonExpr", + "stringConcatExpr", "rangeExpr", "additiveExpr", "multiplicativeExpr", + "instanceOfExpr", "isStaticallyExpr", "treatExpr", "castableExpr", "castExpr", + "arrowExpr", "arrowFunctionSpecifier", "unaryExpr", "valueExpr", "validateExpr", + "annotateExpr", "simpleMapExpr", "postFixExpr", "arrayLookup", "arrayUnboxing", + "predicate", "objectLookup", "primaryExpr", "varRef", "parenthesizedExpr", + "contextItemExpr", "orderedExpr", "unorderedExpr", "functionCall", "argumentList", + "argument", "functionItemExpr", "namedFunctionRef", "inlineFunctionExpr", + "sequenceType", "objectConstructor", "itemType", "functionTest", "anyFunctionTest", + "typedFunctionTest", "singleType", "pairConstructor", "arrayConstructor", + "uriLiteral", "stringLiteral", "keyWords" + }; + } + public static final String[] ruleNames = makeRuleNames(); + + private static String[] makeLiteralNames() { + return new String[] { + null, "';'", "'module'", "'namespace'", "'='", "'ordering'", "'ordered'", + "'decimal-format'", "':'", "'decimal-separator'", "'grouping-separator'", + "'infinity'", "'minus-sign'", "'NaN'", "'percent'", "'per-mille'", "'zero-digit'", + "'digit'", "'pattern-separator'", "'import'", "','", "':='", "'external'", + "'function'", "'('", "')'", "'{'", "'}'", "'jsound'", "'compact'", "'verbose'", + "'json'", "'schema'", "'$'", "'|'", "'*'", "'eq'", "'ne'", "'lt'", "'le'", + "'gt'", "'ge'", "'!='", "'<'", "'<='", "'>'", "'>='", "'||'", "'+'", + "'-'", "'div'", "'idiv'", "'mod'", "'!'", "'['", "']'", "'.'", "'$$'", + "'#'", "'{|'", "'|}'", "'for'", "'let'", "'where'", "'group'", "'by'", + "'order'", "'return'", "'if'", "'in'", "'as'", "'at'", "'allowing'", + "'empty'", "'count'", "'stable'", "'ascending'", "'descending'", "'some'", + "'every'", "'satisfies'", "'collation'", "'greatest'", "'least'", "'switch'", + "'case'", "'try'", "'catch'", "'default'", "'then'", "'else'", "'typeswitch'", + "'or'", "'and'", "'not'", "'to'", "'instance'", "'of'", "'statically'", + "'is'", "'treat'", "'cast'", "'castable'", "'version'", "'jsoniq'", "'unordered'", + "'true'", "'false'", "'type'", "'validate'", "'annotate'", "'declare'", + "'context'", "'item'", "'variable'", null, "'?'", "'null'" + }; + } + private static final String[] _LITERAL_NAMES = makeLiteralNames(); + private static String[] makeSymbolicNames() { + return new String[] { + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, null, null, null, null, null, null, null, null, null, null, null, + null, "Kfor", "Klet", "Kwhere", "Kgroup", "Kby", "Korder", "Kreturn", + "Kif", "Kin", "Kas", "Kat", "Kallowing", "Kempty", "Kcount", "Kstable", + "Kascending", "Kdescending", "Ksome", "Kevery", "Ksatisfies", "Kcollation", + "Kgreatest", "Kleast", "Kswitch", "Kcase", "Ktry", "Kcatch", "Kdefault", + "Kthen", "Kelse", "Ktypeswitch", "Kor", "Kand", "Knot", "Kto", "Kinstance", + "Kof", "Kstatically", "Kis", "Ktreat", "Kcast", "Kcastable", "Kversion", + "Kjsoniq", "Kunordered", "Ktrue", "Kfalse", "Ktype", "Kvalidate", "Kannotate", + "Kdeclare", "Kcontext", "Kitem", "Kvariable", "STRING", "ArgumentPlaceholder", + "NullLiteral", "Literal", "NumericLiteral", "IntegerLiteral", "DecimalLiteral", + "DoubleLiteral", "WS", "NCName", "XQComment", "ContentChar" + }; + } + private static final String[] _SYMBOLIC_NAMES = makeSymbolicNames(); public static final Vocabulary VOCABULARY = new VocabularyImpl(_LITERAL_NAMES, _SYMBOLIC_NAMES); /** @@ -186,6 +195,7 @@ public JsoniqParser(TokenStream input) { super(input); _interp = new ParserATNSimulator(this,_ATN,_decisionToDFA,_sharedContextCache); } + public static class ModuleAndThisIsItContext extends ParserRuleContext { public ModuleContext module() { return getRuleContext(ModuleContext.class,0); @@ -813,6 +823,7 @@ public final DefaultCollationDeclContext defaultCollationDecl() throws Recogniti public static class OrderingModeDeclContext extends ParserRuleContext { public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } + public TerminalNode Kunordered() { return getToken(JsoniqParser.Kunordered, 0); } public OrderingModeDeclContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -862,6 +873,7 @@ public static class EmptyOrderDeclContext extends ParserRuleContext { public Token emptySequenceOrder; public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } public TerminalNode Kdefault() { return getToken(JsoniqParser.Kdefault, 0); } + public TerminalNode Korder() { return getToken(JsoniqParser.Korder, 0); } public TerminalNode Kempty() { return getToken(JsoniqParser.Kempty, 0); } public TerminalNode Kgreatest() { return getToken(JsoniqParser.Kgreatest, 0); } public TerminalNode Kleast() { return getToken(JsoniqParser.Kleast, 0); } @@ -1656,6 +1668,7 @@ public static class TypeDeclContext extends ParserRuleContext { public ExprSingleContext type_definition; public TerminalNode Kdeclare() { return getToken(JsoniqParser.Kdeclare, 0); } public TerminalNode Ktype() { return getToken(JsoniqParser.Ktype, 0); } + public TerminalNode Kas() { return getToken(JsoniqParser.Kas, 0); } public QnameContext qname() { return getRuleContext(QnameContext.class,0); } @@ -5778,6 +5791,7 @@ public final OrderedExprContext orderedExpr() throws RecognitionException { } public static class UnorderedExprContext extends ParserRuleContext { + public TerminalNode Kunordered() { return getToken(JsoniqParser.Kunordered, 0); } public ExprContext expr() { return getRuleContext(ExprContext.class,0); } @@ -6300,6 +6314,7 @@ public static class SequenceTypeContext extends ParserRuleContext { public ItemTypeContext itemType() { return getRuleContext(ItemTypeContext.class,0); } + public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } public SequenceTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -6679,6 +6694,7 @@ public static class TypedFunctionTestContext extends ParserRuleContext { public SequenceTypeContext sequenceType; public List st = new ArrayList(); public SequenceTypeContext rt; + public TerminalNode Kas() { return getToken(JsoniqParser.Kas, 0); } public List sequenceType() { return getRuleContexts(SequenceTypeContext.class); } @@ -6761,6 +6777,7 @@ public static class SingleTypeContext extends ParserRuleContext { public ItemTypeContext itemType() { return getRuleContext(ItemTypeContext.class,0); } + public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } public SingleTypeContext(ParserRuleContext parent, int invokingState) { super(parent, invokingState); } @@ -6808,6 +6825,7 @@ public static class PairConstructorContext extends ParserRuleContext { public ExprSingleContext lhs; public Token name; public ExprSingleContext rhs; + public TerminalNode ArgumentPlaceholder() { return getToken(JsoniqParser.ArgumentPlaceholder, 0); } public List exprSingle() { return getRuleContexts(ExprSingleContext.class); } diff --git a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java index b519eb374..e4a5acf0d 100644 --- a/src/main/java/org/rumbledb/parser/JsoniqVisitor.java +++ b/src/main/java/org/rumbledb/parser/JsoniqVisitor.java @@ -1,4 +1,4 @@ -// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.7 +// Generated from ./src/main/java/org/rumbledb/parser/Jsoniq.g4 by ANTLR 4.8 // Java header package org.rumbledb.parser; From 4e8c280b46a33470822dfa1ac181211d6bb5f1c5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:35:40 +0200 Subject: [PATCH 129/136] Fix tests. --- src/test/resources/test_files/runtime/CastBinaries.jq | 2 +- .../test_files/runtime/FunctionBinaries/FunctionBase64Binary.jq | 2 +- src/test/resources/test_files/runtime/OrderByError1.jq | 2 +- src/test/resources/test_files/runtime/Treat.jq | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/test/resources/test_files/runtime/CastBinaries.jq b/src/test/resources/test_files/runtime/CastBinaries.jq index 650ad2f9a..e21158949 100644 --- a/src/test/resources/test_files/runtime/CastBinaries.jq +++ b/src/test/resources/test_files/runtime/CastBinaries.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="(AABBCC, 0 FB8 0F+9, Q Q = =, D05FB8D0, r44=)" :) +(:JIQS: ShouldRun; Output="(AABBCC, 0FB80F+9, QQ==, D05FB8D0, r44=)" :) "aabbCC" cast as hexBinary, " 0 FB8 0F+9" cast as base64Binary, "Q Q = =" cast as base64Binary, diff --git a/src/test/resources/test_files/runtime/FunctionBinaries/FunctionBase64Binary.jq b/src/test/resources/test_files/runtime/FunctionBinaries/FunctionBase64Binary.jq index cf4638679..ce2af3a9e 100644 --- a/src/test/resources/test_files/runtime/FunctionBinaries/FunctionBase64Binary.jq +++ b/src/test/resources/test_files/runtime/FunctionBinaries/FunctionBase64Binary.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="(0123456789abcdef, AaBb, 0 FB8 0F+9, 0F+40A==, Q Q = =)" :) +(:JIQS: ShouldRun; Output="(0123456789abcdef, AaBb, 0FB80F+9, 0F+40A==, QQ==)" :) base64Binary("0123456789abcdef"), base64Binary("AaBb"), base64Binary("0 FB8 0F+9"), diff --git a/src/test/resources/test_files/runtime/OrderByError1.jq b/src/test/resources/test_files/runtime/OrderByError1.jq index 80d938c08..85cc12ab2 100644 --- a/src/test/resources/test_files/runtime/OrderByError1.jq +++ b/src/test/resources/test_files/runtime/OrderByError1.jq @@ -1,2 +1,2 @@ -(:JIQS: ShouldCrash; ErrorCode="FOTY0012"; ErrorMetadata="LINE:2:COLUMN:30:" :) +(:JIQS: ShouldCrash; ErrorCode="XPTY0004"; ErrorMetadata="LINE:2:COLUMN:30:" :) let $i := [1] stable order by $i return $i \ No newline at end of file diff --git a/src/test/resources/test_files/runtime/Treat.jq b/src/test/resources/test_files/runtime/Treat.jq index 3e72a5c90..ab07ce904 100644 --- a/src/test/resources/test_files/runtime/Treat.jq +++ b/src/test/resources/test_files/runtime/Treat.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="(1, 2.14, 1, aa, 1, { "a" : "b" }, 1, 2, 3, false, null, [ 1, 2, 3 ], { "aa" : "bb" }, { "cc" : "dd" }, P3Y5M, P2Y4M, P10Y3M, P3DT5H6.001S, P21D, 2001-12-12T23:00:00, 2001-12-12-10:00, 13:20:30.555, AABBCC, 0 FB8 0F+9, Q Q = =, mailto:rumble)" :) +(:JIQS: ShouldRun; Output="(1, 2.14, 1, aa, 1, { "a" : "b" }, 1, 2, 3, false, null, [ 1, 2, 3 ], { "aa" : "bb" }, { "cc" : "dd" }, P3Y5M, P2Y4M, P10Y3M, P3DT5H6.001S, P21D, 2001-12-12T23:00:00, 2001-12-12-10:00, 13:20:30.555, AABBCC, 0 FB80F+9, QQ==, mailto:rumble)" :) 1 treat as integer, 2.14 treat as decimal, 1 treat as decimal, From c4fcf87eaca38369bd6baa289378c2f3641bb8e3 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:42:56 +0200 Subject: [PATCH 130/136] Increase version. --- pom.xml | 2 +- src/main/resources/assets/banner.txt | 2 +- src/main/resources/assets/defaultscreen.txt | 24 +++++++++---------- .../resources/assets/jsound-validator.html | 2 +- src/main/resources/assets/public.html | 2 +- 5 files changed, 16 insertions(+), 16 deletions(-) diff --git a/pom.xml b/pom.xml index 9f4e7a0cc..423a700af 100644 --- a/pom.xml +++ b/pom.xml @@ -26,7 +26,7 @@ com.github.rumbledb rumbledb - 1.20.0 + 1.21.0 jar RumbleDB A JSONiq engine to query large-scale JSON datasets stored on HDFS. Spark under the hood. diff --git a/src/main/resources/assets/banner.txt b/src/main/resources/assets/banner.txt index 545593744..d9c1077c5 100644 --- a/src/main/resources/assets/banner.txt +++ b/src/main/resources/assets/banner.txt @@ -1,6 +1,6 @@ ____ __ __ ____ ____ / __ \__ ______ ___ / /_ / /__ / __ \/ __ ) / /_/ / / / / __ `__ \/ __ \/ / _ \/ / / / __ | The distributed JSONiq engine - / _, _/ /_/ / / / / / / /_/ / / __/ /_/ / /_/ / 1.20.0 "Honeylocust" beta + / _, _/ /_/ / / / / / / /_/ / / __/ /_/ / /_/ / 1.21.0 "Hawthorn blossom" beta /_/ |_|\__,_/_/ /_/ /_/_.___/_/\___/_____/_____/ diff --git a/src/main/resources/assets/defaultscreen.txt b/src/main/resources/assets/defaultscreen.txt index bd68de94d..5737cb5cc 100644 --- a/src/main/resources/assets/defaultscreen.txt +++ b/src/main/resources/assets/defaultscreen.txt @@ -17,16 +17,16 @@ for directly running a query from an input file or (with -q) provided directly o It is the default mode. -spark-submit rumbledb-1.20.0.jar run my-query.jq -spark-submit rumbledb-1.20.0.jar run -q '1+1' +spark-submit rumbledb-1.21.0.jar run my-query.jq +spark-submit rumbledb-1.21.0.jar run -q '1+1' You can specify an output path with -o like so: -spark-submit rumbledb-1.20.0.jar run -q '1+1' -o my-output.txt +spark-submit rumbledb-1.21.0.jar run -q '1+1' -o my-output.txt **** serve **** for running as an HTTP server listening on the specified port (-p) and host (-h). -spark-submit rumbledb-1.20.0.jar serve -p 9090 +spark-submit rumbledb-1.21.0.jar serve -p 9090 RumbleDB also supports Apache Livy for use in Jupyter notebooks, which may be even more convenient if you are using a cluster. @@ -34,29 +34,29 @@ even more convenient if you are using a cluster. **** repl **** for shell mode. -spark-submit rumbledb-1.20.0.jar repl +spark-submit rumbledb-1.21.0.jar repl **** resource use configuration **** For a local use, you can control the number of cores, as well as allocated memory, with: -spark-submit --master local[*] rumbledb-1.20.0.jar repl -spark-submit --master local[*] rumbledb-1.20.0.jar repl -spark-submit --master local[2] rumbledb-1.20.0.jar repl -spark-submit --master local[*] --driver-memory 10G rumbledb-1.20.0.jar repl +spark-submit --master local[*] rumbledb-1.21.0.jar repl +spark-submit --master local[*] rumbledb-1.21.0.jar repl +spark-submit --master local[2] rumbledb-1.21.0.jar repl +spark-submit --master local[*] --driver-memory 10G rumbledb-1.21.0.jar repl You can use RumbleDB remotely with: -spark-submit --master yarn rumbledb-1.20.0.jar repl +spark-submit --master yarn rumbledb-1.21.0.jar repl (Although for clusters provided as a service, --master yarn is often implicit and unnecessary). For remote use (e.g., logged in on the Spark cluster with ssh), you can set the number of executors, cores and memory, you can use: -spark-submit --executor-cores 3 --executor-memory 5G rumbledb-1.20.0.jar repl +spark-submit --executor-cores 3 --executor-memory 5G rumbledb-1.21.0.jar repl For remote use, you can also use other file system paths such as S3, HDFS, etc: -spark-submit rumbledb-1.20.0.jar run hdfs://server:port/my-query.jq -o hdfs://server:port/my-output.json +spark-submit rumbledb-1.21.0.jar run hdfs://server:port/my-query.jq -o hdfs://server:port/my-output.json More documentation on available CLI parameters is available on https://www.rumbledb.org/ diff --git a/src/main/resources/assets/jsound-validator.html b/src/main/resources/assets/jsound-validator.html index 106eb639d..c244ad20a 100644 --- a/src/main/resources/assets/jsound-validator.html +++ b/src/main/resources/assets/jsound-validator.html @@ -78,7 +78,7 @@

Validate with RumbleDB 1.20.0 +

Results

diff --git a/src/main/resources/assets/public.html b/src/main/resources/assets/public.html index d96d565b3..866300746 100644 --- a/src/main/resources/assets/public.html +++ b/src/main/resources/assets/public.html @@ -46,7 +46,7 @@

Evaluate with RumbleDB 1.20.0 + From d5473833dcd403e6199884e0b4b0751393111733 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:44:52 +0200 Subject: [PATCH 131/136] Update documentation. --- docs/Docker.md | 4 ++-- docs/FAQ.md | 6 +++--- docs/Getting started.md | 12 ++++++------ docs/HTTPServer.md | 8 ++++---- docs/install.md | 4 ++-- 5 files changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/Docker.md b/docs/Docker.md index 37df44d98..a2fe49ab5 100644 --- a/docs/Docker.md +++ b/docs/Docker.md @@ -2,7 +2,7 @@ ## Known issue -On occasion, the docker version of RumbleDB used to throw a Kryo NoSuchMethodError on some systems. This should be fixed with version 1.20.0, let us know if this is not the case. +On occasion, the docker version of RumbleDB used to throw a Kryo NoSuchMethodError on some systems. This should be fixed with version 1.21.0, let us know if this is not the case. You can upgrade to the newest version with @@ -29,7 +29,7 @@ The RumbleDB shell appears: ____ __ __ ____ ____ / __ \__ ______ ___ / /_ / /__ / __ \/ __ ) / /_/ / / / / __ `__ \/ __ \/ / _ \/ / / / __ | The distributed JSONiq engine - / _, _/ /_/ / / / / / / /_/ / / __/ /_/ / /_/ / 1.20.0 "Honeylocust" beta + / _, _/ /_/ / / / / / / /_/ / / __/ /_/ / /_/ / 1.21.0 "Hawthorn blossom" beta /_/ |_|\__,_/_/ /_/ /_/_.___/_/\___/_____/_____/ diff --git a/docs/FAQ.md b/docs/FAQ.md index 024b650f0..8bbcb6e98 100644 --- a/docs/FAQ.md +++ b/docs/FAQ.md @@ -10,15 +10,15 @@ If you run RumbleDB with a standalone jar, then your laptop will allocate by def In order to increase the memory, you can use `-Xmx10g` (for 10 GB, but you can use any other value): - java -jar -Xmx10g rumbledb-1.20.0-standalone.jar ... + java -jar -Xmx10g rumbledb-1.21.0-standalone.jar ... If you run RumbleDB on your laptop (or a single machine) with the thin jar, then by default this is limited to around 2 GB, and you can change this with `--driver-memory`: - spark-submit --driver-memory 10G rumbledb-1.20.0-for-spark-3.1.jar ... + spark-submit --driver-memory 10G rumbledb-1.21.0-for-spark-3.1.jar ... If you run RumbleDB on a cluster, then the memory needs to be allocated to the executors, not the driver: - spark-submit --executor-memory 10G rumbledb-1.20.0-for-spark-3.1.jar ... + spark-submit --executor-memory 10G rumbledb-1.21.0-for-spark-3.1.jar ... Setting things up on a cluster requires more thinking because setting the executor memory should be done in conjunction with setting the total number of executors and the number of cores per executor. This highly depends on your cluster hardware. diff --git a/docs/Getting started.md b/docs/Getting started.md index 5e78cfe12..5e4cfc6d3 100644 --- a/docs/Getting started.md +++ b/docs/Getting started.md @@ -35,17 +35,17 @@ Do make sure it is not Java 17, which will not work. RumbleDB is just a download and no installation is required. -In order to run RumbleDB, you simply need to download rumbledb-1.20.0-standalone.jar from the [download page](https://github.com/RumbleDB/rumble/releases) and put it in a directory of your choice, for example, right besides your data. +In order to run RumbleDB, you simply need to download rumbledb-1.21.0-standalone.jar from the [download page](https://github.com/RumbleDB/rumble/releases) and put it in a directory of your choice, for example, right besides your data. Make sure to use the corresponding jar name accordingly in all our instructions in lieu of rumbledb.jar. You can test that it works with: - java -jar rumbledb-1.20.0-standalone.jar run -q '1+1' + java -jar rumbledb-1.21.0-standalone.jar run -q '1+1' or launch a JSONiq shell with: - java -jar rumbledb-1.20.0-standalone.jar repl + java -jar rumbledb-1.21.0-standalone.jar repl If you run out of memory, you can set allocate more memory to Java with an additional Java parameter, e.g., -Xmx10g @@ -111,9 +111,9 @@ Like Spark, RumbleDB is just a download and no installation is required. In order to run RumbleDB, you simply need to download one of the small .jar files from the [download page](https://github.com/RumbleDB/rumble/releases) and put it in a directory of your choice, for example, right besides your data. -If you use Spark 3.2+, use rumbledb-1.20.0-for-spark-3.2.jar. +If you use Spark 3.2+, use rumbledb-1.21.0-for-spark-3.2.jar. -If you use Spark 3.3+, use rumbledb-1.20.0-for-spark-3.3.jar. +If you use Spark 3.3+, use rumbledb-1.21.0-for-spark-3.3.jar. These jars do not embed Spark, since you chose to set it up separately. They will work with your Spark installation with the spark-submit command. @@ -158,7 +158,7 @@ The RumbleDB shell appears: ____ __ __ ____ ____ / __ \__ ______ ___ / /_ / /__ / __ \/ __ ) / /_/ / / / / __ `__ \/ __ \/ / _ \/ / / / __ | The distributed JSONiq engine - / _, _/ /_/ / / / / / / /_/ / / __/ /_/ / /_/ / 1.20.0 "Honeylocust" beta + / _, _/ /_/ / / / / / / /_/ / / __/ /_/ / /_/ / 1.21.0 "Hawthorn blossom" beta /_/ |_|\__,_/_/ /_/ /_/_.___/_/\___/_____/_____/ diff --git a/docs/HTTPServer.md b/docs/HTTPServer.md index f9a93df28..badb01845 100644 --- a/docs/HTTPServer.md +++ b/docs/HTTPServer.md @@ -4,7 +4,7 @@ RumbleDB can be run as an HTTP server that listens for queries. In order to do so, you can use the --server and --port parameters: - spark-submit rumbledb-1.20.0.jar serve -p 8001 + spark-submit rumbledb-1.21.0.jar serve -p 8001 This command will not return until you force it to (Ctrl+C on Linux and Mac). This is because the server has to run permanently to listen to incoming requests. @@ -69,11 +69,11 @@ Then there are two options - Connect to the master with SSH with an extra parameter for securely tunneling the HTTP connection (for example `-L 8001:localhost:8001` or any port of your choosing) - Download the RumbleDB jar to the master node - wget https://github.com/RumbleDB/rumble/releases/download/v1.20.0/rumbledb-1.20.0.jar + wget https://github.com/RumbleDB/rumble/releases/download/v1.21.0/rumbledb-1.21.0.jar - Launch the HTTP server on the master node (it will be accessible under `http://localhost:8001/jsoniq`). - spark-submit rumbledb-1.20.0.jar serve -p 8001 + spark-submit rumbledb-1.21.0.jar serve -p 8001 - And then use Jupyter notebooks in the same way you would do it locally (it magically works because of the tunneling) @@ -81,7 +81,7 @@ Then there are two options There is also another way that does not need any tunnelling: you can specify the hostname of your EC2 machine (copied over from the EC2 dashboard) with the --host parameter. For example, with the placeholder : - spark-submit rumbledb-1.20.0.jar serve -p 8001 -h + spark-submit rumbledb-1.21.0.jar serve -p 8001 -h You also need to make sure in your EMR security group that the chosen port (e.g., 8001) is accessible from the machine in which you run your Jupyter notebook. Then, you can point your Jupyter notebook on this machine to `http://:8001/jsoniq`. diff --git a/docs/install.md b/docs/install.md index 55a102ca9..ac5cb9631 100644 --- a/docs/install.md +++ b/docs/install.md @@ -64,7 +64,7 @@ After successful completion, you can check the `target` directory, which should The most straightforward to test if the above steps were successful is to run the RumbleDB shell locally, like so: - $ spark-submit target/rumbledb-1.20.0.jar repl + $ spark-submit target/rumbledb-1.21.0.jar repl The RumbleDB shell should start: @@ -73,7 +73,7 @@ The RumbleDB shell should start: ____ __ __ ____ ____ / __ \__ ______ ___ / /_ / /__ / __ \/ __ ) / /_/ / / / / __ `__ \/ __ \/ / _ \/ / / / __ | The distributed JSONiq engine - / _, _/ /_/ / / / / / / /_/ / / __/ /_/ / /_/ / 1.20.0 "Honeylocust" beta + / _, _/ /_/ / / / / / / /_/ / / __/ /_/ / /_/ / 1.21.0 "Hawthorn blossom" beta /_/ |_|\__,_/_/ /_/ /_/_.___/_/\___/_____/_____/ Master: local[2] From a4017ea3635a7f5ba4ed679ad0ca76deba26c6f5 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:45:37 +0200 Subject: [PATCH 132/136] Update table of contents. --- mkdocs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mkdocs.yml b/mkdocs.yml index 01601ae61..764028796 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -1,4 +1,4 @@ -site_name: RumbleDB 1.20 "Honeylocust" beta +site_name: RumbleDB 1.21 "Hawthorn blossom" beta nav: - '1. Documentation home': 'index.md' - '2. Getting started': 'Getting started.md' From 03d8dcbd7dbe34066d9e2e7ea323488d5cde9599 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 13:46:41 +0200 Subject: [PATCH 133/136] Fix test. --- src/test/resources/test_files/runtime/Treat.jq | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/test/resources/test_files/runtime/Treat.jq b/src/test/resources/test_files/runtime/Treat.jq index ab07ce904..06e9a8d4a 100644 --- a/src/test/resources/test_files/runtime/Treat.jq +++ b/src/test/resources/test_files/runtime/Treat.jq @@ -1,4 +1,4 @@ -(:JIQS: ShouldRun; Output="(1, 2.14, 1, aa, 1, { "a" : "b" }, 1, 2, 3, false, null, [ 1, 2, 3 ], { "aa" : "bb" }, { "cc" : "dd" }, P3Y5M, P2Y4M, P10Y3M, P3DT5H6.001S, P21D, 2001-12-12T23:00:00, 2001-12-12-10:00, 13:20:30.555, AABBCC, 0 FB80F+9, QQ==, mailto:rumble)" :) +(:JIQS: ShouldRun; Output="(1, 2.14, 1, aa, 1, { "a" : "b" }, 1, 2, 3, false, null, [ 1, 2, 3 ], { "aa" : "bb" }, { "cc" : "dd" }, P3Y5M, P2Y4M, P10Y3M, P3DT5H6.001S, P21D, 2001-12-12T23:00:00, 2001-12-12-10:00, 13:20:30.555, AABBCC, 0FB80F+9, QQ==, mailto:rumble)" :) 1 treat as integer, 2.14 treat as decimal, 1 treat as decimal, From 6d67ca811e07022c79086f9e5d8a674aff46ad32 Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Tue, 16 May 2023 19:05:28 +0200 Subject: [PATCH 134/136] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 5d3991f5d..e1fee9832 100644 --- a/README.md +++ b/README.md @@ -16,3 +16,4 @@ The documentation also contains an introduction specific to RumbleDB and how you [The documentation of the current master (for the adventurous and curious) is available here.](http://sparksoniq.readthedocs.io/en/latest/) +RumbleDB is an effort involving many researchers and ETH Zurich students: code and support by Stefan Irimescu, Ghislain Fourny, Gustavo Alonso, Renato Marroquin, Rodrigo Bruno, Falko Noé, Ioana Stefan, Andrea Rinaldi, Stevan Mihajlovic, Mario Arduini, Can Berker Çıkış, Elwin Stephan, David Dao, Zirun Wang, Ingo Müller, Dan-Ovidiu Graur, Thomas Zhou, Olivier Goerens, Alexandru Meterez, Remo Röthlisberger, Dominik Bruggisser, David Loughlin. From af5f1f43eb6758af92279e93ced2646fbf4ff37c Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 25 May 2023 16:03:14 +0200 Subject: [PATCH 135/136] Add Jupyter notebook. --- FLWOR.ipynb | 3307 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 3307 insertions(+) create mode 100644 FLWOR.ipynb diff --git a/FLWOR.ipynb b/FLWOR.ipynb new file mode 100644 index 000000000..a0f856d1d --- /dev/null +++ b/FLWOR.ipynb @@ -0,0 +1,3307 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#
RumbleDB sandbox
\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This is a RumbleDB sandbox that allows you to play with simple JSONiq queries.\n", + "\n", + "It is a jupyter notebook that you can also download and execute on your own machine, but if you arrived here from the RumbleDB website, it is likely to be shown within Google's Colab environment.\n", + "\n", + "To get started, you first need to execute the cell below to activate the RumbleDB magic (you do not need to understand what it does, this is just initialization Python code)." + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: rumbledb in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (1.17.3)\n", + "Requirement already satisfied: requests in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from rumbledb) (2.27.1)\n", + "Requirement already satisfied: jupyter in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from rumbledb) (1.0.0)\n", + "Requirement already satisfied: qtconsole in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (5.3.2)\n", + "Requirement already satisfied: ipywidgets in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (8.0.2)\n", + "Requirement already satisfied: ipykernel in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (6.16.0)\n", + "Requirement already satisfied: notebook in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (6.5.1)\n", + "Requirement already satisfied: nbconvert in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (7.2.1)\n", + "Requirement already satisfied: jupyter-console in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (6.4.4)\n", + "Requirement already satisfied: pyzmq>=17 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (24.0.1)\n", + "Requirement already satisfied: tornado>=6.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (6.2)\n", + "Requirement already satisfied: appnope in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (0.1.3)\n", + "Requirement already satisfied: traitlets>=5.1.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (5.4.0)\n", + "Requirement already satisfied: matplotlib-inline>=0.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (0.1.6)\n", + "Requirement already satisfied: psutil in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (5.9.2)\n", + "Requirement already satisfied: jupyter-client>=6.1.12 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (7.4.2)\n", + "Requirement already satisfied: ipython>=7.23.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (8.5.0)\n", + "Requirement already satisfied: nest-asyncio in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (1.5.6)\n", + "Requirement already satisfied: packaging in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (21.3)\n", + "Requirement already satisfied: debugpy>=1.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (1.6.3)\n", + "Requirement already satisfied: jedi>=0.16 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.18.1)\n", + "Requirement already satisfied: prompt-toolkit<3.1.0,>3.0.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (3.0.31)\n", + "Requirement already satisfied: pickleshare in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.7.5)\n", + "Requirement already satisfied: pygments>=2.4.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (2.13.0)\n", + "Requirement already satisfied: pexpect>4.3 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (4.8.0)\n", + "Requirement already satisfied: stack-data in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.5.1)\n", + "Requirement already satisfied: backcall in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.2.0)\n", + "Requirement already satisfied: decorator in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (5.1.1)\n", + "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.8.3)\n", + "Requirement already satisfied: entrypoints in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter->rumbledb) (0.4)\n", + "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter->rumbledb) (2.8.2)\n", + "Requirement already satisfied: jupyter-core>=4.9.2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter->rumbledb) (4.11.1)\n", + "Requirement already satisfied: ptyprocess>=0.5 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from pexpect>4.3->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.7.0)\n", + "Requirement already satisfied: wcwidth in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from prompt-toolkit<3.1.0,>3.0.1->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.2.5)\n", + "Requirement already satisfied: six>=1.5 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel->jupyter->rumbledb) (1.16.0)\n", + "Requirement already satisfied: jupyterlab-widgets~=3.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipywidgets->jupyter->rumbledb) (3.0.3)\n", + "Requirement already satisfied: widgetsnbextension~=4.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipywidgets->jupyter->rumbledb) (4.0.3)\n", + "Requirement already satisfied: nbformat>=5.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (5.7.0)\n", + "Requirement already satisfied: pandocfilters>=1.4.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (1.5.0)\n", + "Requirement already satisfied: tinycss2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (1.1.1)\n", + "Requirement already satisfied: defusedxml in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (0.7.1)\n", + "Requirement already satisfied: importlib-metadata>=3.6 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (5.0.0)\n", + "Requirement already satisfied: mistune<3,>=2.0.3 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (2.0.4)\n", + "Requirement already satisfied: nbclient>=0.5.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (0.7.0)\n", + "Requirement already satisfied: bleach in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (5.0.1)\n", + "Requirement already satisfied: jinja2>=3.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (3.1.2)\n", + "Requirement already satisfied: jupyterlab-pygments in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (0.2.2)\n", + "Requirement already satisfied: markupsafe>=2.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (2.1.1)\n", + "Requirement already satisfied: beautifulsoup4 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (4.11.1)\n", + "Requirement already satisfied: zipp>=0.5 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from importlib-metadata>=3.6->nbconvert->jupyter->rumbledb) (3.9.0)\n", + "Requirement already satisfied: jsonschema>=2.6 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbformat>=5.1->nbconvert->jupyter->rumbledb) (4.16.0)\n", + "Requirement already satisfied: fastjsonschema in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbformat>=5.1->nbconvert->jupyter->rumbledb) (2.16.2)\n", + "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat>=5.1->nbconvert->jupyter->rumbledb) (0.18.1)\n", + "Requirement already satisfied: attrs>=17.4.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat>=5.1->nbconvert->jupyter->rumbledb) (22.1.0)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Requirement already satisfied: soupsieve>1.2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from beautifulsoup4->nbconvert->jupyter->rumbledb) (2.3.2.post1)\n", + "Requirement already satisfied: webencodings in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from bleach->nbconvert->jupyter->rumbledb) (0.5.1)\n", + "Requirement already satisfied: prometheus-client in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (0.15.0)\n", + "Requirement already satisfied: nbclassic==0.4.5 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (0.4.5)\n", + "Requirement already satisfied: argon2-cffi in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (21.3.0)\n", + "Requirement already satisfied: Send2Trash>=1.8.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (1.8.0)\n", + "Requirement already satisfied: ipython-genutils in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (0.2.0)\n", + "Requirement already satisfied: terminado>=0.8.3 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (0.16.0)\n", + "Requirement already satisfied: jupyter-server>=1.8 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbclassic==0.4.5->notebook->jupyter->rumbledb) (1.21.0)\n", + "Requirement already satisfied: notebook-shim>=0.1.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbclassic==0.4.5->notebook->jupyter->rumbledb) (0.1.0)\n", + "Requirement already satisfied: anyio<4,>=3.1.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-server>=1.8->nbclassic==0.4.5->notebook->jupyter->rumbledb) (3.6.1)\n", + "Requirement already satisfied: websocket-client in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-server>=1.8->nbclassic==0.4.5->notebook->jupyter->rumbledb) (1.4.1)\n", + "Requirement already satisfied: sniffio>=1.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic==0.4.5->notebook->jupyter->rumbledb) (1.3.0)\n", + "Requirement already satisfied: idna>=2.8 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic==0.4.5->notebook->jupyter->rumbledb) (3.3)\n", + "Requirement already satisfied: argon2-cffi-bindings in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from argon2-cffi->notebook->jupyter->rumbledb) (21.2.0)\n", + "Requirement already satisfied: cffi>=1.0.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook->jupyter->rumbledb) (1.15.0)\n", + "Requirement already satisfied: pycparser in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook->jupyter->rumbledb) (2.21)\n", + "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from packaging->ipykernel->jupyter->rumbledb) (3.0.9)\n", + "Requirement already satisfied: qtpy>=2.0.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from qtconsole->jupyter->rumbledb) (2.2.1)\n", + "Requirement already satisfied: certifi>=2017.4.17 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from requests->rumbledb) (2022.6.15)\n", + "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from requests->rumbledb) (1.26.8)\n", + "Requirement already satisfied: charset-normalizer~=2.0.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from requests->rumbledb) (2.0.4)\n", + "Requirement already satisfied: executing in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (1.1.1)\n", + "Requirement already satisfied: asttokens in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (2.0.8)\n", + "Requirement already satisfied: pure-eval in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.2.2)\n", + "The rumbledb extension is already loaded. To reload it, use:\n", + " %reload_ext rumbledb\n", + "env: RUMBLEDB_SERVER=http://public.rumbledb.org:9090/jsoniq\n" + ] + } + ], + "source": [ + "!pip install rumbledb\n", + "%load_ext rumbledb\n", + "%env RUMBLEDB_SERVER=http://public.rumbledb.org:9090/jsoniq" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "By default, this notebook uses a small public backend provided by us. Each query runs on just one machine that is very limited in CPU: one core and memory: 1GB, and with only the http scheme activated. This is sufficient to discover RumbleDB and play a bit, but of course is not intended for any production use. If you need to use RumbleDB in production, you can use it with an installation of Spark either on your machine or on a cluster.\n", + "\n", + "This sandbox backend may occasionally break, especially if too many users use it at the same time, so please bear with us! The system is automatically restarted every day so, if it stops working, you can either try again in 24 hours or notify us.\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is straightforward to execute your own RumbleDB server on your own Spark cluster (and then you can make full use of all the input file systems and file formats). In this case, just replace the above server with your own hostname and port. Note that if you run RumbleDB as a server locally, you will also need to download and use this notebook locally rather than in this Google Colab environment as, obviously, your personal computer cannot be accessed from the Web.\n", + "\n", + "Now we are all set! You can now start reading and executing the JSONiq queries as you go, and you can even edit them!" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## The dataset\n", + "\n", + "The dataset contains products:" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 1.8291950225830078 ms\n", + "{\"product\": \"blender\", \"store-number\": 20, \"quantity\": 920}\n", + "{\"product\": \"shirt\", \"store-number\": 39, \"quantity\": 839}\n", + "{\"product\": \"tv\", \"store-number\": 58, \"quantity\": 758}\n", + "{\"product\": \"toaster\", \"store-number\": 77, \"quantity\": 677}\n", + "{\"product\": \"socks\", \"store-number\": 96, \"quantity\": 596}\n", + "{\"product\": \"phone\", \"store-number\": 15, \"quantity\": 515}\n", + "{\"product\": \"broiler\", \"store-number\": 34, \"quantity\": 434}\n", + "{\"product\": \"blender\", \"store-number\": 53, \"quantity\": 353}\n", + "{\"product\": \"shirt\", \"store-number\": 72, \"quantity\": 272}\n", + "{\"product\": \"tv\", \"store-number\": 91, \"quantity\": 191}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "\n", + "json-file(\"https://www.rumbledb.org/samples/products-small.json\")[position() le 10]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As well as contries:" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.6905701160430908 ms\n", + "{\"sid\": 1, \"country\": \"Afghanistan\"}\n", + "{\"sid\": 2, \"country\": \"land Islands\"}\n", + "{\"sid\": 3, \"country\": \"Albania\"}\n", + "{\"sid\": 4, \"country\": \"Algeria\"}\n", + "{\"sid\": 5, \"country\": \"American Samoa\"}\n", + "{\"sid\": 6, \"country\": \"AndorrA\"}\n", + "{\"sid\": 7, \"country\": \"Angola\"}\n", + "{\"sid\": 8, \"country\": \"Anguilla\"}\n", + "{\"sid\": 9, \"country\": \"Antarctica\"}\n", + "{\"sid\": 10, \"country\": \"Antigua and Barbuda\"}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "\n", + "json-file(\"https://www.rumbledb.org/samples/countries.json\")[position() le 10]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## For clauses" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "For clauses bind their variable in turn to each item of the provided expression. Here is an example:" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.05975675582885742 ms\n", + "{\"number\": 1, \"square\": 1}\n", + "{\"number\": 2, \"square\": 4}\n", + "{\"number\": 3, \"square\": 9}\n", + "{\"number\": 4, \"square\": 16}\n", + "{\"number\": 5, \"square\": 25}\n", + "{\"number\": 6, \"square\": 36}\n", + "{\"number\": 7, \"square\": 49}\n", + "{\"number\": 8, \"square\": 64}\n", + "{\"number\": 9, \"square\": 81}\n", + "{\"number\": 10, \"square\": 100}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for$x in 1 to 10\n", + "return\n", + " {\n", + " \"number\": $x,\n", + " \"square\": $x * $x\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the above query, the variable $x is bound with 1, then with 2, then with 3, etc, and finally with 10. It is always bound with a sequence of exactly one item. It is, however, possible to bind it with an empty sequence if the expression returns no items. This is done with “allowing empty”." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.01749706268310547 ms\n", + "0\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x allowing empty in () return count($x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Note that, without “allowing empty”, if the expression in the for clause evaluates to an empty sequence, the variable would not bind to anything at all and the FLWOR expression would simply return an empty sequence." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.01473093032836914 ms\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in () return count($x)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Each variable binding is also more generally called a tuple. In this above examples, there is only one variable binding in each tuple (x), but it is possible to build larger tuples with more clauses. For example, this FLWOR expression involves two for clauses. The tuples after the first for clause and before the second one only bind variable x (to 1, then to 2, then to 3), but the tuple after the second for clause and before the return clause bind variables x and y. There are six tuples in total, because the second for clause expands each incoming tuple to zero, one or more tuples (think of a flatMap transformation in Spark for an analogy)." + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.017578125 ms\n", + "[1, 1]\n", + "[2, 1]\n", + "[2, 2]\n", + "[3, 1]\n", + "[3, 2]\n", + "[3, 3]\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for$x in 1 to 3\n", + "for $y in 1 to $x\n", + "return [ $x, $y ]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now if we use our small example dataset, we can iterate on all objects, say, products:" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 2.0165750980377197 ms\n", + "\"Warning! The output sequence contains 100000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "return $product.product" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It can thus be seen that the for clause is akin to the FROM clause in SQL, and the return is akin to the SELECT clause.\n", + "Projection in JSONiq can be made with a project() function call, with the keys to keep:" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 1.7290990352630615 ms\n", + "\"Warning! The output sequence contains 100000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "{\"product\": \"blender\", \"store-number\": 20}\n", + "{\"product\": \"shirt\", \"store-number\": 39}\n", + "{\"product\": \"tv\", \"store-number\": 58}\n", + "{\"product\": \"toaster\", \"store-number\": 77}\n", + "{\"product\": \"socks\", \"store-number\": 96}\n", + "{\"product\": \"phone\", \"store-number\": 15}\n", + "{\"product\": \"broiler\", \"store-number\": 34}\n", + "{\"product\": \"blender\", \"store-number\": 53}\n", + "{\"product\": \"shirt\", \"store-number\": 72}\n", + "{\"product\": \"tv\", \"store-number\": 91}\n", + "{\"product\": \"toaster\", \"store-number\": 10}\n", + "{\"product\": \"socks\", \"store-number\": 29}\n", + "{\"product\": \"phone\", \"store-number\": 48}\n", + "{\"product\": \"broiler\", \"store-number\": 67}\n", + "{\"product\": \"blender\", \"store-number\": 86}\n", + "{\"product\": \"shirt\", \"store-number\": 5}\n", + "{\"product\": \"tv\", \"store-number\": 24}\n", + "{\"product\": \"toaster\", \"store-number\": 43}\n", + "{\"product\": \"socks\", \"store-number\": 62}\n", + "{\"product\": \"phone\", \"store-number\": 81}\n", + "{\"product\": \"broiler\", \"store-number\": 100}\n", + "{\"product\": \"blender\", \"store-number\": 19}\n", + "{\"product\": \"shirt\", \"store-number\": 38}\n", + "{\"product\": \"tv\", \"store-number\": 57}\n", + "{\"product\": \"toaster\", \"store-number\": 76}\n", + "{\"product\": \"socks\", \"store-number\": 95}\n", + "{\"product\": \"phone\", \"store-number\": 14}\n", + "{\"product\": \"broiler\", \"store-number\": 33}\n", + "{\"product\": \"blender\", \"store-number\": 52}\n", + "{\"product\": \"shirt\", \"store-number\": 71}\n", + "{\"product\": \"tv\", \"store-number\": 90}\n", + "{\"product\": \"toaster\", \"store-number\": 9}\n", + "{\"product\": \"socks\", \"store-number\": 28}\n", + "{\"product\": \"phone\", \"store-number\": 47}\n", + "{\"product\": \"broiler\", \"store-number\": 66}\n", + "{\"product\": \"blender\", \"store-number\": 85}\n", + "{\"product\": \"shirt\", \"store-number\": 4}\n", + "{\"product\": \"tv\", \"store-number\": 23}\n", + "{\"product\": \"toaster\", \"store-number\": 42}\n", + "{\"product\": \"socks\", \"store-number\": 61}\n", + "{\"product\": \"phone\", \"store-number\": 80}\n", + "{\"product\": \"broiler\", \"store-number\": 99}\n", + "{\"product\": \"blender\", \"store-number\": 18}\n", + "{\"product\": \"shirt\", \"store-number\": 37}\n", + "{\"product\": \"tv\", \"store-number\": 56}\n", + "{\"product\": \"toaster\", \"store-number\": 75}\n", + "{\"product\": \"socks\", \"store-number\": 94}\n", + "{\"product\": \"phone\", \"store-number\": 13}\n", + "{\"product\": \"broiler\", \"store-number\": 32}\n", + "{\"product\": \"blender\", \"store-number\": 51}\n", + "{\"product\": \"shirt\", \"store-number\": 70}\n", + "{\"product\": \"tv\", \"store-number\": 89}\n", + "{\"product\": \"toaster\", \"store-number\": 8}\n", + "{\"product\": \"socks\", \"store-number\": 27}\n", + "{\"product\": \"phone\", \"store-number\": 46}\n", + "{\"product\": \"broiler\", \"store-number\": 65}\n", + "{\"product\": \"blender\", \"store-number\": 84}\n", + "{\"product\": \"shirt\", \"store-number\": 3}\n", + "{\"product\": \"tv\", \"store-number\": 22}\n", + "{\"product\": \"toaster\", \"store-number\": 41}\n", + "{\"product\": \"socks\", \"store-number\": 60}\n", + "{\"product\": \"phone\", \"store-number\": 79}\n", + "{\"product\": \"broiler\", \"store-number\": 98}\n", + "{\"product\": \"blender\", \"store-number\": 17}\n", + "{\"product\": \"shirt\", \"store-number\": 36}\n", + "{\"product\": \"tv\", \"store-number\": 55}\n", + "{\"product\": \"toaster\", \"store-number\": 74}\n", + "{\"product\": \"socks\", \"store-number\": 93}\n", + "{\"product\": \"phone\", \"store-number\": 12}\n", + "{\"product\": \"broiler\", \"store-number\": 31}\n", + "{\"product\": \"blender\", \"store-number\": 50}\n", + "{\"product\": \"shirt\", \"store-number\": 69}\n", + "{\"product\": \"tv\", \"store-number\": 88}\n", + "{\"product\": \"toaster\", \"store-number\": 7}\n", + "{\"product\": \"socks\", \"store-number\": 26}\n", + "{\"product\": \"phone\", \"store-number\": 45}\n", + "{\"product\": \"broiler\", \"store-number\": 64}\n", + "{\"product\": \"blender\", \"store-number\": 83}\n", + "{\"product\": \"shirt\", \"store-number\": 2}\n", + "{\"product\": \"tv\", \"store-number\": 21}\n", + "{\"product\": \"toaster\", \"store-number\": 40}\n", + "{\"product\": \"socks\", \"store-number\": 59}\n", + "{\"product\": \"phone\", \"store-number\": 78}\n", + "{\"product\": \"broiler\", \"store-number\": 97}\n", + "{\"product\": \"blender\", \"store-number\": 16}\n", + "{\"product\": \"shirt\", \"store-number\": 35}\n", + "{\"product\": \"tv\", \"store-number\": 54}\n", + "{\"product\": \"toaster\", \"store-number\": 73}\n", + "{\"product\": \"socks\", \"store-number\": 92}\n", + "{\"product\": \"phone\", \"store-number\": 11}\n", + "{\"product\": \"broiler\", \"store-number\": 30}\n", + "{\"product\": \"blender\", \"store-number\": 49}\n", + "{\"product\": \"shirt\", \"store-number\": 68}\n", + "{\"product\": \"tv\", \"store-number\": 87}\n", + "{\"product\": \"toaster\", \"store-number\": 6}\n", + "{\"product\": \"socks\", \"store-number\": 25}\n", + "{\"product\": \"phone\", \"store-number\": 44}\n", + "{\"product\": \"broiler\", \"store-number\": 63}\n", + "{\"product\": \"blender\", \"store-number\": 82}\n", + "{\"product\": \"shirt\", \"store-number\": 1}\n", + "{\"product\": \"tv\", \"store-number\": 20}\n", + "{\"product\": \"toaster\", \"store-number\": 39}\n", + "{\"product\": \"socks\", \"store-number\": 58}\n", + "{\"product\": \"phone\", \"store-number\": 77}\n", + "{\"product\": \"broiler\", \"store-number\": 96}\n", + "{\"product\": \"blender\", \"store-number\": 15}\n", + "{\"product\": \"shirt\", \"store-number\": 34}\n", + "{\"product\": \"tv\", \"store-number\": 53}\n", + "{\"product\": \"toaster\", \"store-number\": 72}\n", + "{\"product\": \"socks\", \"store-number\": 91}\n", + "{\"product\": \"phone\", \"store-number\": 10}\n", + "{\"product\": \"broiler\", \"store-number\": 29}\n", + "{\"product\": \"blender\", \"store-number\": 48}\n", + "{\"product\": \"shirt\", \"store-number\": 67}\n", + "{\"product\": \"tv\", \"store-number\": 86}\n", + "{\"product\": \"toaster\", \"store-number\": 5}\n", + "{\"product\": \"socks\", \"store-number\": 24}\n", + "{\"product\": \"phone\", \"store-number\": 43}\n", + "{\"product\": \"broiler\", \"store-number\": 62}\n", + "{\"product\": \"blender\", \"store-number\": 81}\n", + "{\"product\": \"shirt\", \"store-number\": 100}\n", + "{\"product\": \"tv\", \"store-number\": 19}\n", + "{\"product\": \"toaster\", \"store-number\": 38}\n", + "{\"product\": \"socks\", \"store-number\": 57}\n", + "{\"product\": \"phone\", \"store-number\": 76}\n", + "{\"product\": \"broiler\", \"store-number\": 95}\n", + "{\"product\": \"blender\", \"store-number\": 14}\n", + "{\"product\": \"shirt\", \"store-number\": 33}\n", + "{\"product\": \"tv\", \"store-number\": 52}\n", + "{\"product\": \"toaster\", \"store-number\": 71}\n", + "{\"product\": \"socks\", \"store-number\": 90}\n", + "{\"product\": \"phone\", \"store-number\": 9}\n", + "{\"product\": \"broiler\", \"store-number\": 28}\n", + "{\"product\": \"blender\", \"store-number\": 47}\n", + "{\"product\": \"shirt\", \"store-number\": 66}\n", + "{\"product\": \"tv\", \"store-number\": 85}\n", + "{\"product\": \"toaster\", \"store-number\": 4}\n", + "{\"product\": \"socks\", \"store-number\": 23}\n", + "{\"product\": \"phone\", \"store-number\": 42}\n", + "{\"product\": \"broiler\", \"store-number\": 61}\n", + "{\"product\": \"blender\", \"store-number\": 80}\n", + "{\"product\": \"shirt\", \"store-number\": 99}\n", + "{\"product\": \"tv\", \"store-number\": 18}\n", + "{\"product\": \"toaster\", \"store-number\": 37}\n", + "{\"product\": \"socks\", \"store-number\": 56}\n", + "{\"product\": \"phone\", \"store-number\": 75}\n", + "{\"product\": \"broiler\", \"store-number\": 94}\n", + "{\"product\": \"blender\", \"store-number\": 13}\n", + "{\"product\": \"shirt\", \"store-number\": 32}\n", + "{\"product\": \"tv\", \"store-number\": 51}\n", + "{\"product\": \"toaster\", \"store-number\": 70}\n", + "{\"product\": \"socks\", \"store-number\": 89}\n", + "{\"product\": \"phone\", \"store-number\": 8}\n", + "{\"product\": \"broiler\", \"store-number\": 27}\n", + "{\"product\": \"blender\", \"store-number\": 46}\n", + "{\"product\": \"shirt\", \"store-number\": 65}\n", + "{\"product\": \"tv\", \"store-number\": 84}\n", + "{\"product\": \"toaster\", \"store-number\": 3}\n", + "{\"product\": \"socks\", \"store-number\": 22}\n", + "{\"product\": \"phone\", \"store-number\": 41}\n", + "{\"product\": \"broiler\", \"store-number\": 60}\n", + "{\"product\": \"blender\", \"store-number\": 79}\n", + "{\"product\": \"shirt\", \"store-number\": 98}\n", + "{\"product\": \"tv\", \"store-number\": 17}\n", + "{\"product\": \"toaster\", \"store-number\": 36}\n", + "{\"product\": \"socks\", \"store-number\": 55}\n", + "{\"product\": \"phone\", \"store-number\": 74}\n", + "{\"product\": \"broiler\", \"store-number\": 93}\n", + "{\"product\": \"blender\", \"store-number\": 12}\n", + "{\"product\": \"shirt\", \"store-number\": 31}\n", + "{\"product\": \"tv\", \"store-number\": 50}\n", + "{\"product\": \"toaster\", \"store-number\": 69}\n", + "{\"product\": \"socks\", \"store-number\": 88}\n", + "{\"product\": \"phone\", \"store-number\": 7}\n", + "{\"product\": \"broiler\", \"store-number\": 26}\n", + "{\"product\": \"blender\", \"store-number\": 45}\n", + "{\"product\": \"shirt\", \"store-number\": 64}\n", + "{\"product\": \"tv\", \"store-number\": 83}\n", + "{\"product\": \"toaster\", \"store-number\": 2}\n", + "{\"product\": \"socks\", \"store-number\": 21}\n", + "{\"product\": \"phone\", \"store-number\": 40}\n", + "{\"product\": \"broiler\", \"store-number\": 59}\n", + "{\"product\": \"blender\", \"store-number\": 78}\n", + "{\"product\": \"shirt\", \"store-number\": 97}\n", + "{\"product\": \"tv\", \"store-number\": 16}\n", + "{\"product\": \"toaster\", \"store-number\": 35}\n", + "{\"product\": \"socks\", \"store-number\": 54}\n", + "{\"product\": \"phone\", \"store-number\": 73}\n", + "{\"product\": \"broiler\", \"store-number\": 92}\n", + "{\"product\": \"blender\", \"store-number\": 11}\n", + "{\"product\": \"shirt\", \"store-number\": 30}\n", + "{\"product\": \"tv\", \"store-number\": 49}\n", + "{\"product\": \"toaster\", \"store-number\": 68}\n", + "{\"product\": \"socks\", \"store-number\": 87}\n", + "{\"product\": \"phone\", \"store-number\": 6}\n", + "{\"product\": \"broiler\", \"store-number\": 25}\n", + "{\"product\": \"blender\", \"store-number\": 44}\n", + "{\"product\": \"shirt\", \"store-number\": 63}\n", + "{\"product\": \"tv\", \"store-number\": 82}\n", + "{\"product\": \"toaster\", \"store-number\": 1}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "return project($product, (\"product\", \"store-number\"))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let us look closer at the key called \"type\". What values does it take? We can use dot-based navigation to navigate down to these values. This will work nicely on the entire dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 1.7029812335968018 ms\n", + "\"Warning! The output sequence contains 100000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "{\"store-number\": 20}\n", + "{\"store-number\": 39}\n", + "{\"store-number\": 58}\n", + "{\"store-number\": 77}\n", + "{\"store-number\": 96}\n", + "{\"store-number\": 15}\n", + "{\"store-number\": 34}\n", + "{\"store-number\": 53}\n", + "{\"store-number\": 72}\n", + "{\"store-number\": 91}\n", + "{\"store-number\": 10}\n", + "{\"store-number\": 29}\n", + "{\"store-number\": 48}\n", + "{\"store-number\": 67}\n", + "{\"store-number\": 86}\n", + "{\"store-number\": 5}\n", + "{\"store-number\": 24}\n", + "{\"store-number\": 43}\n", + "{\"store-number\": 62}\n", + "{\"store-number\": 81}\n", + "{\"store-number\": 100}\n", + "{\"store-number\": 19}\n", + "{\"store-number\": 38}\n", + "{\"store-number\": 57}\n", + "{\"store-number\": 76}\n", + "{\"store-number\": 95}\n", + "{\"store-number\": 14}\n", + "{\"store-number\": 33}\n", + "{\"store-number\": 52}\n", + "{\"store-number\": 71}\n", + "{\"store-number\": 90}\n", + "{\"store-number\": 9}\n", + "{\"store-number\": 28}\n", + "{\"store-number\": 47}\n", + "{\"store-number\": 66}\n", + "{\"store-number\": 85}\n", + "{\"store-number\": 4}\n", + "{\"store-number\": 23}\n", + "{\"store-number\": 42}\n", + "{\"store-number\": 61}\n", + "{\"store-number\": 80}\n", + "{\"store-number\": 99}\n", + "{\"store-number\": 18}\n", + "{\"store-number\": 37}\n", + "{\"store-number\": 56}\n", + "{\"store-number\": 75}\n", + "{\"store-number\": 94}\n", + "{\"store-number\": 13}\n", + "{\"store-number\": 32}\n", + "{\"store-number\": 51}\n", + "{\"store-number\": 70}\n", + "{\"store-number\": 89}\n", + "{\"store-number\": 8}\n", + "{\"store-number\": 27}\n", + "{\"store-number\": 46}\n", + "{\"store-number\": 65}\n", + "{\"store-number\": 84}\n", + "{\"store-number\": 3}\n", + "{\"store-number\": 22}\n", + "{\"store-number\": 41}\n", + "{\"store-number\": 60}\n", + "{\"store-number\": 79}\n", + "{\"store-number\": 98}\n", + "{\"store-number\": 17}\n", + "{\"store-number\": 36}\n", + "{\"store-number\": 55}\n", + "{\"store-number\": 74}\n", + "{\"store-number\": 93}\n", + "{\"store-number\": 12}\n", + "{\"store-number\": 31}\n", + "{\"store-number\": 50}\n", + "{\"store-number\": 69}\n", + "{\"store-number\": 88}\n", + "{\"store-number\": 7}\n", + "{\"store-number\": 26}\n", + "{\"store-number\": 45}\n", + "{\"store-number\": 64}\n", + "{\"store-number\": 83}\n", + "{\"store-number\": 2}\n", + "{\"store-number\": 21}\n", + "{\"store-number\": 40}\n", + "{\"store-number\": 59}\n", + "{\"store-number\": 78}\n", + "{\"store-number\": 97}\n", + "{\"store-number\": 16}\n", + "{\"store-number\": 35}\n", + "{\"store-number\": 54}\n", + "{\"store-number\": 73}\n", + "{\"store-number\": 92}\n", + "{\"store-number\": 11}\n", + "{\"store-number\": 30}\n", + "{\"store-number\": 49}\n", + "{\"store-number\": 68}\n", + "{\"store-number\": 87}\n", + "{\"store-number\": 6}\n", + "{\"store-number\": 25}\n", + "{\"store-number\": 44}\n", + "{\"store-number\": 63}\n", + "{\"store-number\": 82}\n", + "{\"store-number\": 1}\n", + "{\"store-number\": 20}\n", + "{\"store-number\": 39}\n", + "{\"store-number\": 58}\n", + "{\"store-number\": 77}\n", + "{\"store-number\": 96}\n", + "{\"store-number\": 15}\n", + "{\"store-number\": 34}\n", + "{\"store-number\": 53}\n", + "{\"store-number\": 72}\n", + "{\"store-number\": 91}\n", + "{\"store-number\": 10}\n", + "{\"store-number\": 29}\n", + "{\"store-number\": 48}\n", + "{\"store-number\": 67}\n", + "{\"store-number\": 86}\n", + "{\"store-number\": 5}\n", + "{\"store-number\": 24}\n", + "{\"store-number\": 43}\n", + "{\"store-number\": 62}\n", + "{\"store-number\": 81}\n", + "{\"store-number\": 100}\n", + "{\"store-number\": 19}\n", + "{\"store-number\": 38}\n", + "{\"store-number\": 57}\n", + "{\"store-number\": 76}\n", + "{\"store-number\": 95}\n", + "{\"store-number\": 14}\n", + "{\"store-number\": 33}\n", + "{\"store-number\": 52}\n", + "{\"store-number\": 71}\n", + "{\"store-number\": 90}\n", + "{\"store-number\": 9}\n", + "{\"store-number\": 28}\n", + "{\"store-number\": 47}\n", + "{\"store-number\": 66}\n", + "{\"store-number\": 85}\n", + "{\"store-number\": 4}\n", + "{\"store-number\": 23}\n", + "{\"store-number\": 42}\n", + "{\"store-number\": 61}\n", + "{\"store-number\": 80}\n", + "{\"store-number\": 99}\n", + "{\"store-number\": 18}\n", + "{\"store-number\": 37}\n", + "{\"store-number\": 56}\n", + "{\"store-number\": 75}\n", + "{\"store-number\": 94}\n", + "{\"store-number\": 13}\n", + "{\"store-number\": 32}\n", + "{\"store-number\": 51}\n", + "{\"store-number\": 70}\n", + "{\"store-number\": 89}\n", + "{\"store-number\": 8}\n", + "{\"store-number\": 27}\n", + "{\"store-number\": 46}\n", + "{\"store-number\": 65}\n", + "{\"store-number\": 84}\n", + "{\"store-number\": 3}\n", + "{\"store-number\": 22}\n", + "{\"store-number\": 41}\n", + "{\"store-number\": 60}\n", + "{\"store-number\": 79}\n", + "{\"store-number\": 98}\n", + "{\"store-number\": 17}\n", + "{\"store-number\": 36}\n", + "{\"store-number\": 55}\n", + "{\"store-number\": 74}\n", + "{\"store-number\": 93}\n", + "{\"store-number\": 12}\n", + "{\"store-number\": 31}\n", + "{\"store-number\": 50}\n", + "{\"store-number\": 69}\n", + "{\"store-number\": 88}\n", + "{\"store-number\": 7}\n", + "{\"store-number\": 26}\n", + "{\"store-number\": 45}\n", + "{\"store-number\": 64}\n", + "{\"store-number\": 83}\n", + "{\"store-number\": 2}\n", + "{\"store-number\": 21}\n", + "{\"store-number\": 40}\n", + "{\"store-number\": 59}\n", + "{\"store-number\": 78}\n", + "{\"store-number\": 97}\n", + "{\"store-number\": 16}\n", + "{\"store-number\": 35}\n", + "{\"store-number\": 54}\n", + "{\"store-number\": 73}\n", + "{\"store-number\": 92}\n", + "{\"store-number\": 11}\n", + "{\"store-number\": 30}\n", + "{\"store-number\": 49}\n", + "{\"store-number\": 68}\n", + "{\"store-number\": 87}\n", + "{\"store-number\": 6}\n", + "{\"store-number\": 25}\n", + "{\"store-number\": 44}\n", + "{\"store-number\": 63}\n", + "{\"store-number\": 82}\n", + "{\"store-number\": 1}\n" + ] + } + ], + "source": [] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is possible to implement a join with a sequence of two for clauses and a predicate (note that newlines in JSONiq are irrelevant, so we spread the for clause on two lines in order to fit the query on this page):" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 11.249583959579468 ms\n", + "\"Warning! The output sequence contains 100000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"tv\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"tv\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"tv\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"tv\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"tv\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"tv\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"tv\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"tv\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"socks\", \"country\": \"Botswana\"}\n", + "{\"product\": \"socks\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"broiler\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"shirt\", \"country\": \"Botswana\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"toaster\", \"country\": \"Botswana\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"phone\", \"country\": \"Botswana\"}\n", + "{\"product\": \"phone\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"blender\", \"country\": \"Botswana\"}\n", + "{\"product\": \"blender\", \"country\": \"Bhutan\"}\n", + "{\"product\": \"tv\", \"country\": \"Botswana\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"socks\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"socks\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"socks\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"socks\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"socks\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"socks\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"socks\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"socks\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"broiler\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"shirt\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"toaster\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"phone\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"tv\", \"country\": \"El Salvador\"}\n", + "{\"product\": \"blender\", \"country\": \"Bangladesh\"}\n", + "{\"product\": \"tv\", \"country\": \"Cote D\\\"Ivoire\"}\n", + "{\"product\": \"tv\", \"country\": \"Bangladesh\"}\n", + "{\"product\": \"socks\", \"country\": \"Cote D\\\"Ivoire\"}\n", + "{\"product\": \"socks\", \"country\": \"Bangladesh\"}\n", + "{\"product\": \"broiler\", \"country\": \"Cote D\\\"Ivoire\"}\n", + "{\"product\": \"broiler\", \"country\": \"Bangladesh\"}\n", + "{\"product\": \"shirt\", \"country\": \"Cote D\\\"Ivoire\"}\n", + "{\"product\": \"shirt\", \"country\": \"Bangladesh\"}\n", + "{\"product\": \"toaster\", \"country\": \"Cote D\\\"Ivoire\"}\n", + "{\"product\": \"toaster\", \"country\": \"Bangladesh\"}\n", + "{\"product\": \"phone\", \"country\": \"Cote D\\\"Ivoire\"}\n", + "{\"product\": \"phone\", \"country\": \"Bangladesh\"}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "for $store in json-file(\"http://www.rumbledb.org/samples/countries.json\")\n", + " [$$.sid eq $product.store-number]\n", + "return {\n", + " \"product\" : $product.product,\n", + " \"country\" : $store.country\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is possible to implement a join with a sequence of two for clauses and a predicate (note that newlines in JSONiq are irrelevant, so we spread the for clause on two lines in order to fit the query on this page):" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 12.377734184265137 ms\n", + "\"Warning! The output sequence contains 100000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "{\"product\": \"blender\", \"country\": [\"Barbados\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Canada\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Czech Republic\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"French Southern Territories\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Holy See (Vatican City State)\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Austria\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bulgaria\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Costa Rica\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Fiji\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guinea\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Antigua and Barbuda\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Botswana\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Colombia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Eritrea\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Grenada\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"American Samoa\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Benin\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Chad\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Dominican Republic\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Germany\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Iceland\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Bangladesh\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Cameroon\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Cyprus\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"French Polynesia\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Heard Island and Mcdonald Islands\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Australia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Brunei Darussalam\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Cook Islands\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Faroe Islands\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guernsey\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Antarctica\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Bosnia and Herzegovina\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Cocos (Keeling) Islands\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Equatorial Guinea\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Greenland\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Algeria\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Belize\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Central African Republic\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Dominica\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Georgia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Hungary\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Bahrain\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Cambodia\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Cuba\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"French Guiana\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Haiti\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Aruba\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"British Indian Ocean Territory\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Congo, The Democratic Republic of the\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Falkland Islands (Malvinas)\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guatemala\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Anguilla\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Bolivia\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Christmas Island\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"El Salvador\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Greece\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Albania\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Belgium\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Cayman Islands\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Djibouti\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Gambia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Hong Kong\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Bahamas\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Burundi\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Croatia\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"France\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guyana\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Armenia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Brazil\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Congo\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Ethiopia\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guam\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Angola\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Bhutan\"]}\n", + "{\"product\": \"phone\", \"country\": [\"China\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Egypt\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Gibraltar\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"land Islands\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Belarus\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Cape Verde\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Denmark\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Gabon\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Honduras\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Azerbaijan\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Burkina Faso\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Cote D\\\"Ivoire\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Finland\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guinea-Bissau\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Argentina\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bouvet Island\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Comoros\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Estonia\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guadeloupe\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"AndorrA\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Bermuda\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Chile\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Ecuador\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Ghana\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Afghanistan\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Barbados\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Canada\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Czech Republic\"]}\n", + "{\"product\": \"phone\", \"country\": [\"French Southern Territories\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Holy See (Vatican City State)\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Austria\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Bulgaria\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Costa Rica\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Fiji\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guinea\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Antigua and Barbuda\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Botswana\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Colombia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Eritrea\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Grenada\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"American Samoa\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Benin\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Chad\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Dominican Republic\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Germany\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Iceland\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Bangladesh\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Cameroon\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Cyprus\"]}\n", + "{\"product\": \"phone\", \"country\": [\"French Polynesia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Heard Island and Mcdonald Islands\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Australia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Brunei Darussalam\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Cook Islands\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Faroe Islands\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guernsey\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Antarctica\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bosnia and Herzegovina\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Cocos (Keeling) Islands\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Equatorial Guinea\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Greenland\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Algeria\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Belize\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Central African Republic\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Dominica\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Georgia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Hungary\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Bahrain\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Cambodia\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Cuba\"]}\n", + "{\"product\": \"phone\", \"country\": [\"French Guiana\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Haiti\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Aruba\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"British Indian Ocean Territory\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Congo, The Democratic Republic of the\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Falkland Islands (Malvinas)\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guatemala\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Anguilla\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bolivia\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Christmas Island\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"El Salvador\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Greece\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Albania\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Belgium\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Cayman Islands\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Djibouti\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Gambia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Hong Kong\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Bahamas\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Burundi\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Croatia\"]}\n", + "{\"product\": \"phone\", \"country\": [\"France\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Guyana\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Armenia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Brazil\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Congo\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Ethiopia\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guam\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Angola\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bhutan\"]}\n", + "{\"product\": \"blender\", \"country\": [\"China\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Egypt\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Gibraltar\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"land Islands\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Belarus\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Cape Verde\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Denmark\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Gabon\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Honduras\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Azerbaijan\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Burkina Faso\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Cote D\\\"Ivoire\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Finland\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Guinea-Bissau\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Argentina\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Bouvet Island\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Comoros\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Estonia\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guadeloupe\"]}\n", + "{\"product\": \"phone\", \"country\": [\"AndorrA\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bermuda\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Chile\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Ecuador\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Ghana\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Afghanistan\"]}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "for $store allowing empty in json-file(\"http://www.rumbledb.org/samples/countries.json\")\n", + " [$$.sid eq $product.store-number]\n", + "return {\n", + " \"product\" : $product.product,\n", + " \"country\" : [ $store.country ]\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the case of the last product, no matching record in stores.json is found and store is bound to the empty sequence for that tuple. When constructing the object in the return clause’s expression, the empty sequence obtained from store.country is automatically replaced with a null value (because an object value cannot be empty). But if we add an array constructor around the country, we will notice the empty sequence:" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 5.071000099182129 ms\n", + "\"Warning! The output sequence contains 100000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "{\"product\": \"blender\", \"country\": [\"Barbados\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Canada\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Czech Republic\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"French Southern Territories\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Holy See (Vatican City State)\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Austria\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bulgaria\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Costa Rica\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Fiji\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guinea\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Antigua and Barbuda\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Botswana\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Colombia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Eritrea\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Grenada\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"American Samoa\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Benin\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Chad\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Dominican Republic\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Germany\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Iceland\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Bangladesh\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Cameroon\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Cyprus\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"French Polynesia\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Heard Island and Mcdonald Islands\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Australia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Brunei Darussalam\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Cook Islands\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Faroe Islands\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guernsey\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Antarctica\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Bosnia and Herzegovina\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Cocos (Keeling) Islands\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Equatorial Guinea\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Greenland\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Algeria\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Belize\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Central African Republic\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Dominica\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Georgia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Hungary\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Bahrain\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Cambodia\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Cuba\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"French Guiana\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Haiti\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Aruba\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"British Indian Ocean Territory\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Congo, The Democratic Republic of the\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Falkland Islands (Malvinas)\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guatemala\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Anguilla\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Bolivia\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Christmas Island\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"El Salvador\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Greece\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Albania\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Belgium\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Cayman Islands\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Djibouti\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Gambia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Hong Kong\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Bahamas\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Burundi\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Croatia\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"France\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guyana\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Armenia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Brazil\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Congo\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Ethiopia\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guam\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Angola\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Bhutan\"]}\n", + "{\"product\": \"phone\", \"country\": [\"China\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Egypt\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Gibraltar\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"land Islands\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Belarus\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Cape Verde\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Denmark\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Gabon\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Honduras\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Azerbaijan\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Burkina Faso\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Cote D\\\"Ivoire\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Finland\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guinea-Bissau\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Argentina\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bouvet Island\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Comoros\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Estonia\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Guadeloupe\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"AndorrA\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Bermuda\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Chile\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Ecuador\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Ghana\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Afghanistan\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Barbados\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Canada\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Czech Republic\"]}\n", + "{\"product\": \"phone\", \"country\": [\"French Southern Territories\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Holy See (Vatican City State)\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Austria\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Bulgaria\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Costa Rica\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Fiji\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guinea\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Antigua and Barbuda\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Botswana\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Colombia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Eritrea\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Grenada\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"American Samoa\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Benin\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Chad\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Dominican Republic\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Germany\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Iceland\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Bangladesh\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Cameroon\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Cyprus\"]}\n", + "{\"product\": \"phone\", \"country\": [\"French Polynesia\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Heard Island and Mcdonald Islands\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Australia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Brunei Darussalam\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Cook Islands\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Faroe Islands\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guernsey\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Antarctica\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bosnia and Herzegovina\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Cocos (Keeling) Islands\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Equatorial Guinea\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Greenland\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Algeria\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Belize\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Central African Republic\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Dominica\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Georgia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Hungary\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Bahrain\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Cambodia\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Cuba\"]}\n", + "{\"product\": \"phone\", \"country\": [\"French Guiana\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Haiti\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Aruba\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"British Indian Ocean Territory\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Congo, The Democratic Republic of the\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Falkland Islands (Malvinas)\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guatemala\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Anguilla\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bolivia\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Christmas Island\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"El Salvador\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Greece\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Albania\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Belgium\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Cayman Islands\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Djibouti\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Gambia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Hong Kong\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Bahamas\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Burundi\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Croatia\"]}\n", + "{\"product\": \"phone\", \"country\": [\"France\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Guyana\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Armenia\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Brazil\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Congo\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Ethiopia\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guam\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Angola\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bhutan\"]}\n", + "{\"product\": \"blender\", \"country\": [\"China\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Egypt\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Gibraltar\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"land Islands\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Belarus\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Cape Verde\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Denmark\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Gabon\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Honduras\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Azerbaijan\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Burkina Faso\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Cote D\\\"Ivoire\"]}\n", + "{\"product\": \"phone\", \"country\": [\"Finland\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Guinea-Bissau\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Argentina\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Bouvet Island\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Comoros\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Estonia\"]}\n", + "{\"product\": \"socks\", \"country\": [\"Guadeloupe\"]}\n", + "{\"product\": \"phone\", \"country\": [\"AndorrA\"]}\n", + "{\"product\": \"broiler\", \"country\": [\"Bermuda\"]}\n", + "{\"product\": \"blender\", \"country\": [\"Chile\"]}\n", + "{\"product\": \"shirt\", \"country\": [\"Ecuador\"]}\n", + "{\"product\": \"tv\", \"country\": [\"Ghana\"]}\n", + "{\"product\": \"toaster\", \"country\": [\"Afghanistan\"]}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "for $store allowing empty in json-file(\"http://www.rumbledb.org/samples/countries.json\")\n", + " [$$.sid eq $product.store-number]\n", + "return {\n", + " \"product\" : $product.product,\n", + " \"country\" : [ $store.country ]\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Let clauses\n", + "\n", + "As seen before, the let clause can be used to bind a variable with any sequence of items, also more than one. FLWOR expressions with just a cascade of let clauses are quite popular." + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.016152143478393555 ms\n", + "4\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "let $x:=2\n", + "return $x * $x" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, let clauses can also appear after other clauses, for example, after a for clause. Then, they will bind a sequence of items for each previous binding (tuple), like so:" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.015926837921142578 ms\n", + "{\"number\": 1, \"square\": 1}\n", + "{\"number\": 2, \"square\": 4}\n", + "{\"number\": 3, \"square\": 9}\n", + "{\"number\": 4, \"square\": 16}\n", + "{\"number\": 5, \"square\": 25}\n", + "{\"number\": 6, \"square\": 36}\n", + "{\"number\": 7, \"square\": 49}\n", + "{\"number\": 8, \"square\": 64}\n", + "{\"number\": 9, \"square\": 81}\n", + "{\"number\": 10, \"square\": 100}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 10\n", + "let $square := $x * $x\n", + "return {\n", + " \"number\": $x,\n", + " \"square\": $square\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In the above example, $square is only bound with one item. Here is another example where it is bound with more than one:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.020356178283691406 ms\n", + "{\"number\": 1, \"square\": 1, \"cube\": 1}\n", + "{\"number\": 2, \"square\": 4, \"cube\": 8}\n", + "{\"number\": 3, \"square\": 9, \"cube\": 27}\n", + "{\"number\": 4, \"square\": 16, \"cube\": 64}\n", + "{\"number\": 5, \"square\": 25, \"cube\": 125}\n", + "{\"number\": 6, \"square\": 36, \"cube\": 216}\n", + "{\"number\": 7, \"square\": 49, \"cube\": 343}\n", + "{\"number\": 8, \"square\": 64, \"cube\": 512}\n", + "{\"number\": 9, \"square\": 81, \"cube\": 729}\n", + "{\"number\": 10, \"square\": 100, \"cube\": 1000}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 10\n", + "let $square-and-cube := ($x * $x, $x * $x * $x)\n", + "return\n", + " {\n", + " \"number\": $x,\n", + " \"square\": $square-and-cube[1],\n", + " \"cube\": $square-and-cube[2]\n", + " }" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.019574880599975586 ms\n", + "{\"number\": 1, \"square or cube\": 1}\n", + "{\"number\": 1, \"square or cube\": 1}\n", + "{\"number\": 2, \"square or cube\": 4}\n", + "{\"number\": 2, \"square or cube\": 8}\n", + "{\"number\": 3, \"square or cube\": 9}\n", + "{\"number\": 3, \"square or cube\": 27}\n", + "{\"number\": 4, \"square or cube\": 16}\n", + "{\"number\": 4, \"square or cube\": 64}\n", + "{\"number\": 5, \"square or cube\": 25}\n", + "{\"number\": 5, \"square or cube\": 125}\n", + "{\"number\": 6, \"square or cube\": 36}\n", + "{\"number\": 6, \"square or cube\": 216}\n", + "{\"number\": 7, \"square or cube\": 49}\n", + "{\"number\": 7, \"square or cube\": 343}\n", + "{\"number\": 8, \"square or cube\": 64}\n", + "{\"number\": 8, \"square or cube\": 512}\n", + "{\"number\": 9, \"square or cube\": 81}\n", + "{\"number\": 9, \"square or cube\": 729}\n", + "{\"number\": 10, \"square or cube\": 100}\n", + "{\"number\": 10, \"square or cube\": 1000}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 10\n", + "for $square-or-cube in ($x * $x, $x * $x * $x)\n", + "return\n", + " {\n", + " \"number\": $x,\n", + " \"square or cube\": $square-or-cube\n", + " }" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A let clause outputs exactly one outgoing tuple for each incoming tuple (think of a map transformation in Spark). Unlike the for clause, it does not modify the number of tuples.\n", + "Let us now showcase the use of a let clause with our dataset.\n", + "Now if we use our small example dataset, we can iterate on all objects, say, products:" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.6827859878540039 ms\n", + "\"Warning! The output sequence contains 100000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n", + "\"socks\"\n", + "\"phone\"\n", + "\"broiler\"\n", + "\"blender\"\n", + "\"shirt\"\n", + "\"tv\"\n", + "\"toaster\"\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "let $type := $product.product\n", + "return $type" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Let clauses also allow for joining the two datasets and denormalizing them by nesting the stores into the products. This would be consider- ably more difficult to do with (Spark) SQL, even with extensions. The results are pretty-printed for ease of read." + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 1.1218500137329102 ms\n", + "{\"store\": \"Angola\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"AndorrA\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Antarctica\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"American Samoa\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Afghanistan\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Antigua and Barbuda\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Albania\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Armenia\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Anguilla\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Argentina\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"land Islands\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Algeria\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Bangladesh\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Belgium\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Bermuda\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Bahamas\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Aruba\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Bahrain\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Australia\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Belarus\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Austria\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Belize\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Barbados\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Azerbaijan\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Benin\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Bhutan\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Botswana\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Bulgaria\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"British Indian Ocean Territory\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Brazil\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Bolivia\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Bosnia and Herzegovina\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Brunei Darussalam\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Cambodia\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Burkina Faso\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Burundi\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Bouvet Island\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Congo\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Chad\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Canada\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Cayman Islands\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Colombia\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Chile\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Comoros\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Cameroon\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Central African Republic\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Christmas Island\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Cape Verde\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"China\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Cocos (Keeling) Islands\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Cote D\\\"Ivoire\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Cyprus\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Czech Republic\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Congo, The Democratic Republic of the\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Cuba\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Cook Islands\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Dominica\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Croatia\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Dominican Republic\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Denmark\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Djibouti\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Costa Rica\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"El Salvador\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Faroe Islands\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Estonia\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Fiji\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Ecuador\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Eritrea\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"France\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Equatorial Guinea\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"French Guiana\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Ethiopia\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Finland\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Falkland Islands (Malvinas)\", \"available products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"store\": \"Egypt\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"French Southern Territories\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Greece\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Guadeloupe\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Gambia\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Greenland\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Gibraltar\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Georgia\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"French Polynesia\", \"available products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"store\": \"Gabon\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Germany\", \"available products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"store\": \"Ghana\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Grenada\", \"available products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"store\": \"Haiti\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Hong Kong\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Heard Island and Mcdonald Islands\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Guam\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Holy See (Vatican City State)\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Guatemala\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Iceland\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Guinea-Bissau\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Honduras\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Guernsey\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Hungary\", \"available products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"store\": \"Guyana\", \"available products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"store\": \"Guinea\", \"available products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"store\": \"Jordan\", \"available products\": []}\n", + "{\"store\": \"Japan\", \"available products\": []}\n", + "{\"store\": \"Israel\", \"available products\": []}\n", + "{\"store\": \"Iran, Islamic Republic Of\", \"available products\": []}\n", + "{\"store\": \"Iraq\", \"available products\": []}\n", + "{\"store\": \"Isle of Man\", \"available products\": []}\n", + "{\"store\": \"Jersey\", \"available products\": []}\n", + "{\"store\": \"Ireland\", \"available products\": []}\n", + "{\"store\": \"Italy\", \"available products\": []}\n", + "{\"store\": \"India\", \"available products\": []}\n", + "{\"store\": \"Indonesia\", \"available products\": []}\n", + "{\"store\": \"Jamaica\", \"available products\": []}\n", + "{\"store\": \"Kazakhstan\", \"available products\": []}\n", + "{\"store\": \"Kyrgyzstan\", \"available products\": []}\n", + "{\"store\": \"Korea, Democratic People\\\"S Republic of\", \"available products\": []}\n", + "{\"store\": \"Liberia\", \"available products\": []}\n", + "{\"store\": \"Kenya\", \"available products\": []}\n", + "{\"store\": \"Kiribati\", \"available products\": []}\n", + "{\"store\": \"Lao People\\\"S Democratic Republic\", \"available products\": []}\n", + "{\"store\": \"Lesotho\", \"available products\": []}\n", + "{\"store\": \"Kuwait\", \"available products\": []}\n", + "{\"store\": \"Libyan Arab Jamahiriya\", \"available products\": []}\n", + "{\"store\": \"Lebanon\", \"available products\": []}\n", + "{\"store\": \"Korea, Republic of\", \"available products\": []}\n", + "{\"store\": \"Latvia\", \"available products\": []}\n", + "{\"store\": \"Macedonia, The Former Yugoslav Republic of\", \"available products\": []}\n", + "{\"store\": \"Liechtenstein\", \"available products\": []}\n", + "{\"store\": \"Malta\", \"available products\": []}\n", + "{\"store\": \"Luxembourg\", \"available products\": []}\n", + "{\"store\": \"Madagascar\", \"available products\": []}\n", + "{\"store\": \"Malawi\", \"available products\": []}\n", + "{\"store\": \"Lithuania\", \"available products\": []}\n", + "{\"store\": \"Maldives\", \"available products\": []}\n", + "{\"store\": \"Marshall Islands\", \"available products\": []}\n", + "{\"store\": \"Mali\", \"available products\": []}\n", + "{\"store\": \"Macao\", \"available products\": []}\n", + "{\"store\": \"Malaysia\", \"available products\": []}\n", + "{\"store\": \"Morocco\", \"available products\": []}\n", + "{\"store\": \"Moldova, Republic of\", \"available products\": []}\n", + "{\"store\": \"Monaco\", \"available products\": []}\n", + "{\"store\": \"Micronesia, Federated States of\", \"available products\": []}\n", + "{\"store\": \"Mozambique\", \"available products\": []}\n", + "{\"store\": \"Mongolia\", \"available products\": []}\n", + "{\"store\": \"Mauritania\", \"available products\": []}\n", + "{\"store\": \"Martinique\", \"available products\": []}\n", + "{\"store\": \"Mexico\", \"available products\": []}\n", + "{\"store\": \"Mayotte\", \"available products\": []}\n", + "{\"store\": \"Mauritius\", \"available products\": []}\n", + "{\"store\": \"Montenegro\", \"available products\": []}\n", + "{\"store\": \"Montserrat\", \"available products\": []}\n", + "{\"store\": \"Netherlands\", \"available products\": []}\n", + "{\"store\": \"New Caledonia\", \"available products\": []}\n", + "{\"store\": \"Nigeria\", \"available products\": []}\n", + "{\"store\": \"New Zealand\", \"available products\": []}\n", + "{\"store\": \"Nauru\", \"available products\": []}\n", + "{\"store\": \"Netherlands Antilles\", \"available products\": []}\n", + "{\"store\": \"Niger\", \"available products\": []}\n", + "{\"store\": \"Nepal\", \"available products\": []}\n", + "{\"store\": \"Niue\", \"available products\": []}\n", + "{\"store\": \"Myanmar\", \"available products\": []}\n", + "{\"store\": \"Nicaragua\", \"available products\": []}\n", + "{\"store\": \"Namibia\", \"available products\": []}\n", + "{\"store\": \"Pakistan\", \"available products\": []}\n", + "{\"store\": \"Philippines\", \"available products\": []}\n", + "{\"store\": \"Panama\", \"available products\": []}\n", + "{\"store\": \"Palau\", \"available products\": []}\n", + "{\"store\": \"Papua New Guinea\", \"available products\": []}\n", + "{\"store\": \"Oman\", \"available products\": []}\n", + "{\"store\": \"Northern Mariana Islands\", \"available products\": []}\n", + "{\"store\": \"Pitcairn\", \"available products\": []}\n", + "{\"store\": \"Norfolk Island\", \"available products\": []}\n", + "{\"store\": \"Paraguay\", \"available products\": []}\n", + "{\"store\": \"Peru\", \"available products\": []}\n", + "{\"store\": \"Norway\", \"available products\": []}\n", + "{\"store\": \"Palestinian Territory, Occupied\", \"available products\": []}\n", + "{\"store\": \"Saint Helena\", \"available products\": []}\n", + "{\"store\": \"Saint Pierre and Miquelon\", \"available products\": []}\n", + "{\"store\": \"Romania\", \"available products\": []}\n", + "{\"store\": \"Puerto Rico\", \"available products\": []}\n", + "{\"store\": \"Saint Kitts and Nevis\", \"available products\": []}\n", + "{\"store\": \"Portugal\", \"available products\": []}\n", + "{\"store\": \"Qatar\", \"available products\": []}\n", + "{\"store\": \"Russian Federation\", \"available products\": []}\n", + "{\"store\": \"Saint Lucia\", \"available products\": []}\n", + "{\"store\": \"Poland\", \"available products\": []}\n", + "{\"store\": \"Reunion\", \"available products\": []}\n", + "{\"store\": \"RWANDA\", \"available products\": []}\n", + "{\"store\": \"Sao Tome and Principe\", \"available products\": []}\n", + "{\"store\": \"Slovakia\", \"available products\": []}\n", + "{\"store\": \"Sierra Leone\", \"available products\": []}\n", + "{\"store\": \"Saint Vincent and the Grenadines\", \"available products\": []}\n", + "{\"store\": \"San Marino\", \"available products\": []}\n", + "{\"store\": \"Senegal\", \"available products\": []}\n", + "{\"store\": \"Singapore\", \"available products\": []}\n", + "{\"store\": \"Saudi Arabia\", \"available products\": []}\n", + "{\"store\": \"Solomon Islands\", \"available products\": []}\n", + "{\"store\": \"Slovenia\", \"available products\": []}\n", + "{\"store\": \"Serbia\", \"available products\": []}\n", + "{\"store\": \"Seychelles\", \"available products\": []}\n", + "{\"store\": \"Samoa\", \"available products\": []}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $store in json-file(\"http://www.rumbledb.org/samples/countries.json\")\n", + "let $product := json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + " [$store.sid eq $$.store-number]\n", + "return {\n", + " \"store\" : $store.country,\n", + " \"available products\" : [\n", + " distinct-values($product.product)\n", + " ]\n", + "}\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Where clauses\n", + "\n", + "\n", + "Where clauses are used to filter variable bindings (tuples) based on a predicate on these variables. They are the equivalent to a WHERE clause in SQL.\n", + "This is a simple example of its use in conjunction with a for clause:" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.014545917510986328 ms\n", + "{\"number\": 8, \"square\": 64}\n", + "{\"number\": 9, \"square\": 81}\n", + "{\"number\": 10, \"square\": 100}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 10\n", + "where $x gt 7\n", + "return {\n", + " \"number\": $x,\n", + " \"square\": $x * $x\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A where clause can appear anywhere in a FLWOR expression, ex- cept that it cannot be the first clause (always for or let) or the last clause (always return)." + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.021066904067993164 ms\n", + "{\"number\": 8, \"y\": 64}\n", + "{\"number\": 8, \"y\": 65}\n", + "{\"number\": 9, \"y\": 81}\n", + "{\"number\": 9, \"y\": 82}\n", + "{\"number\": 10, \"y\": 100}\n", + "{\"number\": 10, \"y\": 101}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 10\n", + "let $square := $x * $x\n", + "where $square > 60\n", + "for $y in $square to $square + 1\n", + "return {\n", + " \"number\": $x,\n", + " \"y\": $y\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "A where clause always outputs a subset (or all) of its incoming tuples, without any alteration. In the case that the predicate always evaluates to true, it forwards all tuples, as if there had been no where clause at all. In the case that the predicate always evaluates to false, it outputs no tuple and the FLWOR expression will then return the empty sequence, with no need to further evaluate any of the remaining clauses.\n", + "Here is another example of use of the where clause with our datasets:" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 1.835021734237671 ms\n", + "\"Warning! The output sequence contains 1000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n", + "\"broiler\"\n", + "\"shirt\"\n", + "\"toaster\"\n", + "\"phone\"\n", + "\"blender\"\n", + "\"tv\"\n", + "\"socks\"\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "let $store := json-file(\"http://www.rumbledb.org/samples/countries.json\")\n", + " [$$.sid eq $product.store-number]\n", + "where $store.country = \"Germany\"\n", + "return $product.product" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Order by clauses\n", + "\n", + "Order by clauses are used to reorganize the order of the tuples, but without altering them. They are the same as ORDER BY clauses in SQL." + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.01975703239440918 ms\n", + "{\"number\": 0, \"square\": 0}\n", + "{\"number\": -1, \"square\": 1}\n", + "{\"number\": 1, \"square\": 1}\n", + "{\"number\": -2, \"square\": 4}\n", + "{\"number\": 2, \"square\": 4}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in -2 to 2\n", + "let $square := $x * $x\n", + "order by $square\n", + "return {\n", + " \"number\": $x,\n", + " \"square\": $square\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is also possible, like in SQL, to specify an ascending or a descend- ing order. By default, the order is ascending.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.013797283172607422 ms\n", + "{\"number\": 0, \"square\": 0}\n", + "{\"number\": -1, \"square\": 1}\n", + "{\"number\": 1, \"square\": 1}\n", + "{\"number\": -2, \"square\": 4}\n", + "{\"number\": 2, \"square\": 4}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in -2 to 2\n", + "let $square := $x * $x\n", + "order by $square ascending\n", + "return {\n", + " \"number\": $x,\n", + " \"square\": $square\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.01792001724243164 ms\n", + "{\"number\": -2, \"square\": 4}\n", + "{\"number\": 2, \"square\": 4}\n", + "{\"number\": -1, \"square\": 1}\n", + "{\"number\": 1, \"square\": 1}\n", + "{\"number\": 0, \"square\": 0}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in -2 to 2\n", + "let $square := $x * $x\n", + "order by $square descending\n", + "return {\n", + " \"number\": $x,\n", + " \"square\": $square\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "In case of ties between tuples, the order is arbitrary. But it is possible to sort on another variable in case there is a tie with the first one (compound sorting keys):" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.014029979705810547 ms\n", + "{\"number\": -2, \"square\": 4}\n", + "{\"number\": 2, \"square\": 4}\n", + "{\"number\": -1, \"square\": 1}\n", + "{\"number\": 1, \"square\": 1}\n", + "{\"number\": 0, \"square\": 0}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in -2 to 2\n", + "let $square := $x * $x\n", + "order by $square descending, $x ascending return {\n", + " \"number\": $x,\n", + " \"square\": $square\n", + " }\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "It is possible to control what to do with empty sequences: they can be considered smallest or greatest." + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.014728307723999023 ms\n", + "[1]\n", + "[3]\n", + "[5]\n", + "[]\n", + "[]\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 5\n", + "let $y := $x[$$ mod 2 = 1]\n", + "order by $y ascending empty greatest\n", + "return [ $y ]\n" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.013755083084106445 ms\n", + "[]\n", + "[]\n", + "[1]\n", + "[3]\n", + "[5]\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 5\n", + "let $y := $x[$$ mod 2 = 1]\n", + "order by $y ascending empty least\n", + "return [ $y ]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Here is another example of use of the order by clause with our datasets:" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 4.2881550788879395 ms\n", + "\"Warning! The output sequence contains 100000 items but its materialization was capped at 200 items. This value can be configured with the result-size parameter in the query string of the HTTP request.\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n", + "\"tv\"\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "let $store := json-file(\"http://www.rumbledb.org/samples/countries.json\")\n", + " [$$.sid eq $product.store-number]\n", + "order by count($store) descending,\n", + " string-length($product.product) ascending\n", + "return $product.product" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Group by clauses\n", + "\n", + "Group by clauses organize tuples in groups based on matching keys, and then output only one tuple for each group, aggregating other variables (count, sum, max, min...). This is similar to GROUP BY clauses in SQL." + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.01671290397644043 ms\n", + "{\"grouping key\": 0, \"count of x\": 2}\n", + "{\"grouping key\": 1, \"count of x\": 3}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 5\n", + "let $y := $x mod 2\n", + "group by $y\n", + "return {\n", + " \"grouping key\" : $y,\n", + " \"count of x\" : count($x)\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "However, JSONiq’s group by clauses are more powerful and expres- sive than SQL GROUP BY clauses: indeed, it is also possible to opt out of aggregating other (non-grouping-key) variables. Then, for a non- aggregated variable, the sequence of all its values of within a group will be rebound to this same variable as a single binding in the outcoming tuple. It is thus possible to write many more queries than SQL would allow, which is one of the reasons why a language like JSONiq should be preferred for nested datasets.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 0.01664900779724121 ms\n", + "{\"grouping key\": 0, \"grouped x values\": [2, 4]}\n", + "{\"grouping key\": 1, \"grouped x values\": [1, 3, 5]}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $x in 1 to 5\n", + "let $y := $x mod 2\n", + "group by $y\n", + "return {\n", + " \"grouping key\" : $y,\n", + " \"grouped x values\" : [ $x ]\n", + "}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Finally, here is an example of use of a group by clause with our example dataset." + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Took: 3.1400740146636963 ms\n", + "{\"sid\": 64, \"country\": \"Egypt\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 68, \"country\": \"Estonia\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 42, \"country\": \"Central African Republic\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 83, \"country\": \"Gibraltar\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 54, \"country\": \"Cote D\\\"Ivoire\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 96, \"country\": \"Holy See (Vatican City State)\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 82, \"country\": \"Ghana\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 78, \"country\": \"Gabon\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 41, \"country\": \"Cayman Islands\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 89, \"country\": \"Guatemala\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 62, \"country\": \"Dominican Republic\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 86, \"country\": \"Grenada\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 58, \"country\": \"Czech Republic\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 66, \"country\": \"Equatorial Guinea\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 70, \"country\": \"Falkland Islands (Malvinas)\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 91, \"country\": \"Guinea\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 100, \"country\": \"Iceland\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 49, \"country\": \"Comoros\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 14, \"country\": \"Australia\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 88, \"country\": \"Guam\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 97, \"country\": \"Honduras\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 67, \"country\": \"Eritrea\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 15, \"country\": \"Austria\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 12, \"country\": \"Armenia\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 11, \"country\": \"Argentina\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 4, \"country\": \"Algeria\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 74, \"country\": \"France\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 92, \"country\": \"Guinea-Bissau\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 63, \"country\": \"Ecuador\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 5, \"country\": \"American Samoa\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 19, \"country\": \"Bangladesh\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 10, \"country\": \"Antigua and Barbuda\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 2, \"country\": \"land Islands\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 37, \"country\": \"Cambodia\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 59, \"country\": \"Denmark\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 73, \"country\": \"Finland\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 7, \"country\": \"Angola\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 61, \"country\": \"Dominica\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 94, \"country\": \"Haiti\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 56, \"country\": \"Cuba\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 1, \"country\": \"Afghanistan\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 79, \"country\": \"Gambia\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 9, \"country\": \"Antarctica\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 17, \"country\": \"Bahamas\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 23, \"country\": \"Belize\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 40, \"country\": \"Cape Verde\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 50, \"country\": \"Congo\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 16, \"country\": \"Azerbaijan\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 48, \"country\": \"Colombia\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 75, \"country\": \"French Guiana\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 32, \"country\": \"British Indian Ocean Territory\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 39, \"country\": \"Canada\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 76, \"country\": \"French Polynesia\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 93, \"country\": \"Guyana\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 80, \"country\": \"Georgia\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 36, \"country\": \"Burundi\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 53, \"country\": \"Costa Rica\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 31, \"country\": \"Brazil\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 98, \"country\": \"Hong Kong\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 45, \"country\": \"China\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 38, \"country\": \"Cameroon\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 33, \"country\": \"Brunei Darussalam\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 60, \"country\": \"Djibouti\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 29, \"country\": \"Botswana\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 95, \"country\": \"Heard Island and Mcdonald Islands\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 47, \"country\": \"Cocos (Keeling) Islands\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 69, \"country\": \"Ethiopia\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 25, \"country\": \"Bermuda\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 13, \"country\": \"Aruba\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 18, \"country\": \"Bahrain\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 84, \"country\": \"Greece\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 34, \"country\": \"Bulgaria\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 51, \"country\": \"Congo, The Democratic Republic of the\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 46, \"country\": \"Christmas Island\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 71, \"country\": \"Faroe Islands\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 99, \"country\": \"Hungary\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 52, \"country\": \"Cook Islands\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 90, \"country\": \"Guernsey\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 24, \"country\": \"Benin\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 8, \"country\": \"Anguilla\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 77, \"country\": \"French Southern Territories\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 28, \"country\": \"Bosnia and Herzegovina\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 85, \"country\": \"Greenland\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 6, \"country\": \"AndorrA\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 3, \"country\": \"Albania\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 44, \"country\": \"Chile\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 55, \"country\": \"Croatia\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 81, \"country\": \"Germany\", \"products\": [\"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\"]}\n", + "{\"sid\": 72, \"country\": \"Fiji\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 21, \"country\": \"Belarus\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 22, \"country\": \"Belgium\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 57, \"country\": \"Cyprus\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 87, \"country\": \"Guadeloupe\", \"products\": [\"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\"]}\n", + "{\"sid\": 43, \"country\": \"Chad\", \"products\": [\"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\"]}\n", + "{\"sid\": 20, \"country\": \"Barbados\", \"products\": [\"blender\", \"tv\", \"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\"]}\n", + "{\"sid\": 65, \"country\": \"El Salvador\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n", + "{\"sid\": 27, \"country\": \"Bolivia\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 26, \"country\": \"Bhutan\", \"products\": [\"socks\", \"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\"]}\n", + "{\"sid\": 35, \"country\": \"Burkina Faso\", \"products\": [\"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\", \"broiler\"]}\n", + "{\"sid\": 30, \"country\": \"Bouvet Island\", \"products\": [\"broiler\", \"shirt\", \"toaster\", \"phone\", \"blender\", \"tv\", \"socks\"]}\n" + ] + } + ], + "source": [ + "%%jsoniq\n", + "for $product in json-file(\"http://www.rumbledb.org/samples/products-small.json\")\n", + "group by $sid := $product.store-number\n", + "order by $sid\n", + "let $store := json-file(\"http://www.rumbledb.org/samples/countries.json\")\n", + " [$$.sid eq $sid]\n", + "return {|\n", + " $store,\n", + " { \"products\" : [ distinct-values($product.product) ] }\n", + "|}" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "anaconda-cloud": {}, + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.9.12" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} From 1ad3f323b0d32f0846f43e77096304893476814e Mon Sep 17 00:00:00 2001 From: Ghislain Fourny Date: Thu, 25 May 2023 16:16:31 +0200 Subject: [PATCH 136/136] Remove verbose output. --- FLWOR.ipynb | 99 ++--------------------------------------------------- 1 file changed, 2 insertions(+), 97 deletions(-) diff --git a/FLWOR.ipynb b/FLWOR.ipynb index a0f856d1d..4759c65e9 100644 --- a/FLWOR.ipynb +++ b/FLWOR.ipynb @@ -20,104 +20,9 @@ }, { "cell_type": "code", - "execution_count": 88, + "execution_count": null, "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: rumbledb in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (1.17.3)\n", - "Requirement already satisfied: requests in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from rumbledb) (2.27.1)\n", - "Requirement already satisfied: jupyter in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from rumbledb) (1.0.0)\n", - "Requirement already satisfied: qtconsole in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (5.3.2)\n", - "Requirement already satisfied: ipywidgets in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (8.0.2)\n", - "Requirement already satisfied: ipykernel in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (6.16.0)\n", - "Requirement already satisfied: notebook in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (6.5.1)\n", - "Requirement already satisfied: nbconvert in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (7.2.1)\n", - "Requirement already satisfied: jupyter-console in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter->rumbledb) (6.4.4)\n", - "Requirement already satisfied: pyzmq>=17 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (24.0.1)\n", - "Requirement already satisfied: tornado>=6.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (6.2)\n", - "Requirement already satisfied: appnope in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (0.1.3)\n", - "Requirement already satisfied: traitlets>=5.1.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (5.4.0)\n", - "Requirement already satisfied: matplotlib-inline>=0.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (0.1.6)\n", - "Requirement already satisfied: psutil in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (5.9.2)\n", - "Requirement already satisfied: jupyter-client>=6.1.12 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (7.4.2)\n", - "Requirement already satisfied: ipython>=7.23.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (8.5.0)\n", - "Requirement already satisfied: nest-asyncio in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (1.5.6)\n", - "Requirement already satisfied: packaging in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (21.3)\n", - "Requirement already satisfied: debugpy>=1.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipykernel->jupyter->rumbledb) (1.6.3)\n", - "Requirement already satisfied: jedi>=0.16 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.18.1)\n", - "Requirement already satisfied: prompt-toolkit<3.1.0,>3.0.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (3.0.31)\n", - "Requirement already satisfied: pickleshare in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.7.5)\n", - "Requirement already satisfied: pygments>=2.4.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (2.13.0)\n", - "Requirement already satisfied: pexpect>4.3 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (4.8.0)\n", - "Requirement already satisfied: stack-data in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.5.1)\n", - "Requirement already satisfied: backcall in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.2.0)\n", - "Requirement already satisfied: decorator in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipython>=7.23.1->ipykernel->jupyter->rumbledb) (5.1.1)\n", - "Requirement already satisfied: parso<0.9.0,>=0.8.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jedi>=0.16->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.8.3)\n", - "Requirement already satisfied: entrypoints in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter->rumbledb) (0.4)\n", - "Requirement already satisfied: python-dateutil>=2.8.2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter->rumbledb) (2.8.2)\n", - "Requirement already satisfied: jupyter-core>=4.9.2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-client>=6.1.12->ipykernel->jupyter->rumbledb) (4.11.1)\n", - "Requirement already satisfied: ptyprocess>=0.5 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from pexpect>4.3->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.7.0)\n", - "Requirement already satisfied: wcwidth in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from prompt-toolkit<3.1.0,>3.0.1->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.2.5)\n", - "Requirement already satisfied: six>=1.5 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from python-dateutil>=2.8.2->jupyter-client>=6.1.12->ipykernel->jupyter->rumbledb) (1.16.0)\n", - "Requirement already satisfied: jupyterlab-widgets~=3.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipywidgets->jupyter->rumbledb) (3.0.3)\n", - "Requirement already satisfied: widgetsnbextension~=4.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from ipywidgets->jupyter->rumbledb) (4.0.3)\n", - "Requirement already satisfied: nbformat>=5.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (5.7.0)\n", - "Requirement already satisfied: pandocfilters>=1.4.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (1.5.0)\n", - "Requirement already satisfied: tinycss2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (1.1.1)\n", - "Requirement already satisfied: defusedxml in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (0.7.1)\n", - "Requirement already satisfied: importlib-metadata>=3.6 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (5.0.0)\n", - "Requirement already satisfied: mistune<3,>=2.0.3 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (2.0.4)\n", - "Requirement already satisfied: nbclient>=0.5.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (0.7.0)\n", - "Requirement already satisfied: bleach in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (5.0.1)\n", - "Requirement already satisfied: jinja2>=3.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (3.1.2)\n", - "Requirement already satisfied: jupyterlab-pygments in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (0.2.2)\n", - "Requirement already satisfied: markupsafe>=2.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (2.1.1)\n", - "Requirement already satisfied: beautifulsoup4 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbconvert->jupyter->rumbledb) (4.11.1)\n", - "Requirement already satisfied: zipp>=0.5 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from importlib-metadata>=3.6->nbconvert->jupyter->rumbledb) (3.9.0)\n", - "Requirement already satisfied: jsonschema>=2.6 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbformat>=5.1->nbconvert->jupyter->rumbledb) (4.16.0)\n", - "Requirement already satisfied: fastjsonschema in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbformat>=5.1->nbconvert->jupyter->rumbledb) (2.16.2)\n", - "Requirement already satisfied: pyrsistent!=0.17.0,!=0.17.1,!=0.17.2,>=0.14.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat>=5.1->nbconvert->jupyter->rumbledb) (0.18.1)\n", - "Requirement already satisfied: attrs>=17.4.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jsonschema>=2.6->nbformat>=5.1->nbconvert->jupyter->rumbledb) (22.1.0)\n" - ] - }, - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: soupsieve>1.2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from beautifulsoup4->nbconvert->jupyter->rumbledb) (2.3.2.post1)\n", - "Requirement already satisfied: webencodings in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from bleach->nbconvert->jupyter->rumbledb) (0.5.1)\n", - "Requirement already satisfied: prometheus-client in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (0.15.0)\n", - "Requirement already satisfied: nbclassic==0.4.5 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (0.4.5)\n", - "Requirement already satisfied: argon2-cffi in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (21.3.0)\n", - "Requirement already satisfied: Send2Trash>=1.8.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (1.8.0)\n", - "Requirement already satisfied: ipython-genutils in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (0.2.0)\n", - "Requirement already satisfied: terminado>=0.8.3 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from notebook->jupyter->rumbledb) (0.16.0)\n", - "Requirement already satisfied: jupyter-server>=1.8 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbclassic==0.4.5->notebook->jupyter->rumbledb) (1.21.0)\n", - "Requirement already satisfied: notebook-shim>=0.1.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from nbclassic==0.4.5->notebook->jupyter->rumbledb) (0.1.0)\n", - "Requirement already satisfied: anyio<4,>=3.1.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-server>=1.8->nbclassic==0.4.5->notebook->jupyter->rumbledb) (3.6.1)\n", - "Requirement already satisfied: websocket-client in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from jupyter-server>=1.8->nbclassic==0.4.5->notebook->jupyter->rumbledb) (1.4.1)\n", - "Requirement already satisfied: sniffio>=1.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic==0.4.5->notebook->jupyter->rumbledb) (1.3.0)\n", - "Requirement already satisfied: idna>=2.8 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from anyio<4,>=3.1.0->jupyter-server>=1.8->nbclassic==0.4.5->notebook->jupyter->rumbledb) (3.3)\n", - "Requirement already satisfied: argon2-cffi-bindings in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from argon2-cffi->notebook->jupyter->rumbledb) (21.2.0)\n", - "Requirement already satisfied: cffi>=1.0.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from argon2-cffi-bindings->argon2-cffi->notebook->jupyter->rumbledb) (1.15.0)\n", - "Requirement already satisfied: pycparser in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from cffi>=1.0.1->argon2-cffi-bindings->argon2-cffi->notebook->jupyter->rumbledb) (2.21)\n", - "Requirement already satisfied: pyparsing!=3.0.5,>=2.0.2 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from packaging->ipykernel->jupyter->rumbledb) (3.0.9)\n", - "Requirement already satisfied: qtpy>=2.0.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from qtconsole->jupyter->rumbledb) (2.2.1)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from requests->rumbledb) (2022.6.15)\n", - "Requirement already satisfied: urllib3<1.27,>=1.21.1 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from requests->rumbledb) (1.26.8)\n", - "Requirement already satisfied: charset-normalizer~=2.0.0 in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from requests->rumbledb) (2.0.4)\n", - "Requirement already satisfied: executing in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (1.1.1)\n", - "Requirement already satisfied: asttokens in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (2.0.8)\n", - "Requirement already satisfied: pure-eval in /Users/ghislain/opt/miniconda3/lib/python3.9/site-packages (from stack-data->ipython>=7.23.1->ipykernel->jupyter->rumbledb) (0.2.2)\n", - "The rumbledb extension is already loaded. To reload it, use:\n", - " %reload_ext rumbledb\n", - "env: RUMBLEDB_SERVER=http://public.rumbledb.org:9090/jsoniq\n" - ] - } - ], + "outputs": [], "source": [ "!pip install rumbledb\n", "%load_ext rumbledb\n",