Skip to content
Draft

Test #1678

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
80 commits
Select commit Hold shift + click to select a range
7357eb7
Update moduleImport rule to support multiple location URIs in JSONiq …
CaiJimmy Jul 16, 2026
e3ff834
Add ResolvedResource and ResourceResolver classes for URI resolution …
CaiJimmy Jul 16, 2026
5b1a4ff
Add CompilationConfiguration class for managing compilation settings …
CaiJimmy Jul 16, 2026
b8b42bb
Add ModuleImportLoader class for shared module import semantics in JS…
CaiJimmy Jul 16, 2026
ee51d4d
Refactor Rumble and VisitorHelpers to integrate CompilationConfigurat…
CaiJimmy Jul 16, 2026
cea5ece
Merge branch 'master' into jimmy/resource-resolver
CaiJimmy Jul 16, 2026
cfc202c
Use Java URI to resolve URI instead of Hadoop Path
CaiJimmy Jul 16, 2026
5ec29f7
Test CI
CaiJimmy Jul 16, 2026
3415e6f
Add InvalidURILiteralErrorCode and InvalidURILiteralException class
CaiJimmy Jul 16, 2026
b1d6589
Fix URI resolution errors
CaiJimmy Jul 16, 2026
5dfdb4f
Trigger Build
CaiJimmy Jul 16, 2026
8dfa4aa
Trigger Build
CaiJimmy Jul 16, 2026
fc12c9e
Trigger Build
CaiJimmy Jul 16, 2026
b8daf2e
Throw UnsupportedFeatureException for XML Schema validate expressions
CaiJimmy Jul 16, 2026
1c442a4
Align XQuery validateExpr with standard
CaiJimmy Jul 16, 2026
df0b016
Add XML Schema validation test cases for various scenarios
CaiJimmy Jul 16, 2026
89a33f8
Implement ValidateExpression support in various visitors and add new …
CaiJimmy Jul 16, 2026
0ef9be6
Add SchemaImport support to XQueryTranslationVisitor and related classes
CaiJimmy Jul 16, 2026
93d82b8
Add XML Schema import test cases for various scenarios
CaiJimmy Jul 16, 2026
11f9ff6
Add Java SE module limit argument and include Xerces dependency in po…
CaiJimmy Jul 16, 2026
5728710
Remove Java SE module limit arguments from compiler configuration
CaiJimmy Jul 16, 2026
0ee5a40
Add XML schema and XQuery test file for schema import compilation
CaiJimmy Jul 16, 2026
a077960
Add SchemaImportException class for handling schema import errors
CaiJimmy Jul 16, 2026
5d0a190
Implement SchemaCatalogLoader and SchemaCatalog for XML Schema manage…
CaiJimmy Jul 16, 2026
2b45e9a
Add UnknownSchemaTypeException for handling missing schema types
CaiJimmy Jul 16, 2026
bd86abf
Add getTypeDefinition method to SchemaCatalog for retrieving type def…
CaiJimmy Jul 16, 2026
931220c
Add schema type validation in visitValidateExpression
CaiJimmy Jul 16, 2026
f95ced8
Add test cases
CaiJimmy Jul 16, 2026
1f0962d
Add validation error codes and create ValidateException class for XQu…
CaiJimmy Jul 16, 2026
71ec2cd
Support for builtin type definition
CaiJimmy Jul 16, 2026
7aca10d
Refactor SchemaCatalog to encapsulate built-in schema creation and pr…
CaiJimmy Jul 16, 2026
34b956e
Improve schema loading by handling empty imports and setting built-in…
CaiJimmy Jul 16, 2026
fa448cb
Refactor InferTypeVisitor to simplify schema type validation logic
CaiJimmy Jul 16, 2026
280ef04
Add XmlItemSaxEmitter and XmlSchemaValidator for XML Schema validation
CaiJimmy Jul 16, 2026
09ce4c0
Implement DocumentNodeConstructor and ValidateRuntimeIterator for XML…
CaiJimmy Jul 16, 2026
819fad2
Add XQuery validation test cases and update schema with pattern restr…
CaiJimmy Jul 16, 2026
7e022c8
Add createXmlSchemaAtomicType method to ItemTypeFactory for XML Schem…
CaiJimmy Jul 16, 2026
7528d12
Remove outdated comments regarding schema validation for attribute an…
CaiJimmy Jul 16, 2026
faddd64
Add XmlSchemaNodeProperties to manage schema-derived properties for X…
CaiJimmy Jul 16, 2026
3ce966d
Implement XML Schema validation enhancements, including PSVI support,…
CaiJimmy Jul 16, 2026
dc2524b
Enhance XML Schema support by introducing XmlSchemaTypeAnnotation and…
CaiJimmy Jul 16, 2026
16d542e
Add XML Schema support for NOTATION and QName types; introduce new si…
CaiJimmy Jul 17, 2026
88fa1a5
Add NotationItem because xs:Notation should not be the same as xs:QName
CaiJimmy Jul 17, 2026
2d875bd
Implement lax XML Schema validation support; refactor validation meth…
CaiJimmy Jul 17, 2026
c7f1458
Refactor BuiltinFunctionCatalogue to update return types from 'item*'…
CaiJimmy Jul 17, 2026
54321fa
Add new error codes for IdentifierFunctionDocument and InvalidXmlId
CaiJimmy Jul 17, 2026
59ec35c
Refactor id-related function iterators to extend NodeIdentifierFuncti…
CaiJimmy Jul 17, 2026
d5b44a2
Enhance AttributeItem and ElementItem to support XML Schema ID and ID…
CaiJimmy Jul 17, 2026
82f605c
Add support for element() types in SequenceType with appropriate arity
CaiJimmy Jul 17, 2026
49f9597
Enhance XML validation by adding document validation support and ensu…
CaiJimmy Jul 17, 2026
643d86f
Add XML schema definitions and validation tests for identity entries …
CaiJimmy Jul 17, 2026
7bf0ce3
Enhance XML Schema support by adding generalized atomic types and uni…
CaiJimmy Jul 17, 2026
9315aca
Add element and attribute test support
CaiJimmy Jul 17, 2026
565fbb0
Add validation tests for various XML schema types and structures
CaiJimmy Jul 17, 2026
1671b9d
Enhance XML Schema support by implementing schema element and attribu…
CaiJimmy Jul 17, 2026
a08b17e
Add XML schema definitions and validation tests for new elements and …
CaiJimmy Jul 17, 2026
2a99d95
Update workflow to use 'schema' version for QT3 JSONiq and XQuery tests
CaiJimmy Jul 17, 2026
9cd1c30
Implement XML Schema constructor function support and validation
CaiJimmy Jul 17, 2026
8303b6b
Add test cases for imported atomic type constructors and their facets
CaiJimmy Jul 17, 2026
dda057c
Implement XML Schema list constructor support and enhance validation …
CaiJimmy Jul 17, 2026
a3f5675
Add XQuery test files and schema definitions for list type constructo…
CaiJimmy Jul 17, 2026
d4df918
Refactor XML Schema constructors: replace list constructor with simpl…
CaiJimmy Jul 17, 2026
2ba2601
Fix Spark error
CaiJimmy Jul 17, 2026
bd4a079
Enhance XML Schema handling: refactor constructors, improve union typ…
CaiJimmy Jul 17, 2026
932d29f
Fix NPE
CaiJimmy Jul 17, 2026
d440d2f
Merge branch 'master' of https://github.com/RumbleDB/rumble into jimm…
CaiJimmy Jul 17, 2026
8900f2a
Fix test
CaiJimmy Jul 17, 2026
d218c7f
Code cleanup
CaiJimmy Jul 17, 2026
c316e4d
Enhance XML Schema casting support: implement XmlSchemaCastIterator a…
CaiJimmy Jul 17, 2026
084c70f
Add error codes and exception for MoreThanOneConstructionDeclaration
CaiJimmy Jul 17, 2026
2770604
Implement construction mode handling in XML Schema constructors: add …
CaiJimmy Jul 17, 2026
0299515
Add XQuery test files and update schema: introduce various constructi…
CaiJimmy Jul 17, 2026
2bfd1e3
Merge branch 'master' of https://github.com/RumbleDB/rumble into jimm…
CaiJimmy Jul 17, 2026
b3fedf6
Trigger Build
CaiJimmy Jul 17, 2026
298923f
Avoid repeated function copy
CaiJimmy Jul 17, 2026
a59ccc9
Refactor function body iterator handling: introduce Supplier for lazy…
CaiJimmy Jul 19, 2026
bfe4446
Cache runtime static contexts
CaiJimmy Jul 19, 2026
8c946cf
Compile static function argument conversions once
CaiJimmy Jul 19, 2026
4dab815
Reuse compiled function body iterators
CaiJimmy Jul 19, 2026
18bce16
Reuse static function call frames
CaiJimmy Jul 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions .github/workflows/run-qt3.yml
Original file line number Diff line number Diff line change
Expand Up @@ -104,15 +104,15 @@ jobs:

qt3-jsoniq:
needs: [resolve-baseline, build]
uses: RumbleDB/rumble-test-suite/.github/workflows/qt3-suite.yml@master
uses: RumbleDB/rumble-test-suite/.github/workflows/qt3-suite.yml@jimmy/schema
with:
tested_parser: jsoniq
rumble_artifact_name: rumble-build
baseline_run_id: ${{ needs.resolve-baseline.outputs.baseline_run_id }}

qt3-xquery:
needs: [resolve-baseline, build]
uses: RumbleDB/rumble-test-suite/.github/workflows/qt3-suite.yml@master
uses: RumbleDB/rumble-test-suite/.github/workflows/qt3-suite.yml@jimmy/schema
with:
tested_parser: xquery
rumble_artifact_name: rumble-build
Expand Down
11 changes: 11 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,17 @@
<artifactId>antlr4-runtime</artifactId>
<version>${antlr4.version}</version>
</dependency>
<dependency>
<groupId>xerces</groupId>
<artifactId>xercesImpl</artifactId>
<version>2.12.2</version>
<exclusions>
<exclusion>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.jline</groupId>
<artifactId>jline</artifactId>
Expand Down
32 changes: 32 additions & 0 deletions src/main/java/org/rumbledb/api/Item.java
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
import org.rumbledb.exceptions.OurBadException;
import org.rumbledb.items.structured.JSoundDataFrame;
import org.rumbledb.items.xml.XMLDocumentPosition;
import org.rumbledb.items.xml.XmlSchemaNodeProperties;
import org.rumbledb.runtime.flwor.NativeClauseContext;
import org.rumbledb.runtime.RuntimeIterator;
import org.rumbledb.runtime.update.primitives.Collection;
Expand Down Expand Up @@ -393,6 +394,29 @@ default Name getQNameValue() {

// endregion qnames

// region notations

/**
* Tests whether the item is an atomic item of type xs:NOTATION.
*
* @return true if it is an xs:NOTATION item, false otherwise.
*/
default boolean isNotation() {
return false;
}

/**
* Returns the expanded name of this item when it is an xs:NOTATION.
*
* @return the expanded name.
* @throws UnsupportedOperationException if the item is not an xs:NOTATION.
*/
default Name getNotationValue() {
throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
}

// endregion notations

/**
* Tests whether the item is an atomic item of type base64Binary or hexBinary.
*
Expand Down Expand Up @@ -1704,6 +1728,14 @@ default ItemType getSchemaType() {
return null;
}

default void setXmlSchemaProperties(XmlSchemaNodeProperties properties) {
throw new UnsupportedOperationException("Operation not defined for type " + this.getDynamicType());
}

default XmlSchemaNodeProperties getXmlSchemaProperties() {
return XmlSchemaNodeProperties.none();
}


/**
* Get the position of the Node inside the XML document (and path incase of multiple docs) for sorting /
Expand Down
32 changes: 28 additions & 4 deletions src/main/java/org/rumbledb/api/Rumble.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@

import org.apache.spark.sql.SparkSession;
import org.rumbledb.compiler.VisitorHelpers;
import org.rumbledb.config.CompilationConfiguration;
import org.rumbledb.config.RumbleRuntimeConfiguration;
import org.rumbledb.context.DynamicContext;
import org.rumbledb.expressions.module.MainModule;
import org.rumbledb.resources.ResourceResolver;
import org.rumbledb.runtime.RuntimeIterator;

import sparksoniq.spark.SparkSessionManager;
Expand All @@ -25,14 +27,35 @@
public class Rumble {

private RumbleRuntimeConfiguration configuration;
private CompilationConfiguration compilationConfiguration;

/**
* Creates a new Rumble instance. This initializes a brand new Spark session.
*
* @param configuration a RumbleRuntimeConfiguration object containing the configuration.
*/
public Rumble(RumbleRuntimeConfiguration configuration) {
this.configuration = configuration;
this(new CompilationConfiguration(configuration));
}

/**
* Creates a new Rumble instance with a custom resolver for imported resources.
*
* @param configuration a RumbleRuntimeConfiguration object containing the configuration.
* @param resourceResolver the resolver used for imported modules and schemas.
*/
public Rumble(RumbleRuntimeConfiguration configuration, ResourceResolver resourceResolver) {
this(new CompilationConfiguration(configuration, resourceResolver));
}

/**
* Creates a new Rumble instance with explicit compilation configuration.
*
* @param compilationConfiguration the configuration used to compile queries.
*/
public Rumble(CompilationConfiguration compilationConfiguration) {
this.compilationConfiguration = compilationConfiguration;
this.configuration = compilationConfiguration.runtimeConfiguration();
SparkSessionManager.getInstance().getOrCreateSession();
}

Expand All @@ -42,6 +65,7 @@ public Rumble(RumbleRuntimeConfiguration configuration) {
*/
public Rumble(SparkSession session) {
this.configuration = new RumbleRuntimeConfiguration();
this.compilationConfiguration = new CompilationConfiguration(this.configuration);
SparkSessionManager.getInstance(session);
}

Expand All @@ -63,7 +87,7 @@ public RumbleRuntimeConfiguration getConfiguration() {
public SequenceOfItems runQuery(String query) {
MainModule mainModule = VisitorHelpers.parseMainModuleFromQuery(
query,
this.configuration
this.compilationConfiguration
);
DynamicContext dynamicContext = VisitorHelpers.createDynamicContext(mainModule, this.configuration);
RuntimeIterator iterator = VisitorHelpers.generateRuntimeIterator(
Expand Down Expand Up @@ -95,7 +119,7 @@ public String runQueryToString(String query) {
public SequenceOfItems runQuery(URI location) throws IOException {
MainModule mainModule = VisitorHelpers.parseMainModuleFromLocation(
location,
this.configuration
this.compilationConfiguration
);
DynamicContext dynamicContext = VisitorHelpers.createDynamicContext(mainModule, this.configuration);
RuntimeIterator iterator = VisitorHelpers.generateRuntimeIterator(
Expand Down Expand Up @@ -127,7 +151,7 @@ public String runQueryToString(URI location) throws IOException {
public String serializeToJSONiq(String query) {
MainModule mainModule = VisitorHelpers.parseMainModuleFromQuery(
query,
this.configuration
this.compilationConfiguration
);
StringBuilder sb = new StringBuilder();
mainModule.serializeToJSONiq(sb, 0);
Expand Down
15 changes: 15 additions & 0 deletions src/main/java/org/rumbledb/compiler/CloneVisitor.java
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
import org.rumbledb.expressions.typing.IsStaticallyExpression;
import org.rumbledb.expressions.typing.TreatExpression;
import org.rumbledb.expressions.typing.ValidateTypeExpression;
import org.rumbledb.expressions.typing.ValidateExpression;
import org.rumbledb.expressions.xml.AttributeNodeContentExpression;
import org.rumbledb.expressions.xml.AttributeNodeExpression;
import org.rumbledb.expressions.xml.CommentNodeConstructorExpression;
Expand Down Expand Up @@ -1261,6 +1262,20 @@ public Node visitValidateTypeExpression(ValidateTypeExpression expression, Node
return result;
}

@Override
public Node visitValidateExpression(ValidateExpression expression, Node argument) {
Expression result = new ValidateExpression(
(Expression) visit(expression.getMainExpression(), argument),
expression.getValidationMode(),
expression.getTypeName(),
expression.getMetadata()
);
result.setStaticContext(expression.getStaticContext());
result.setStaticSequenceType(expression.getStaticSequenceType());
result.setSequential(expression.isSequential());
return result;
}

// region scripting
@Override
public Node visitApplyStatement(ApplyStatement statement, Node argument) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@
import org.rumbledb.types.ItemType;
import org.rumbledb.types.SequenceType;
import org.rumbledb.types.SequenceType.Arity;
import org.rumbledb.xml.schema.XmlSchemaConstructorFunction;

import java.math.BigInteger;
import java.util.ArrayList;
Expand Down Expand Up @@ -250,7 +251,11 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static
visitDescendants(expression, expression.getStaticContext());
FunctionIdentifier identifier = expression.getFunctionIdentifier();
String queryLanguage = expression.getStaticContext().getQueryLanguage();
if (!BuiltinFunctionCatalogue.exists(identifier, queryLanguage)) {
boolean isSchemaConstructor = XmlSchemaConstructorFunction.resolve(
identifier,
expression.getStaticContext()
) != null;
if (!BuiltinFunctionCatalogue.exists(identifier, queryLanguage) && !isSchemaConstructor) {
List<ExecutionMode> modes = new ArrayList<>();
for (Expression parameter : expression.getArguments()) {
if (parameter == null) {
Expand Down Expand Up @@ -283,6 +288,8 @@ public StaticContext visitFunctionCall(FunctionCallExpression expression, Static
this.configuration
)
);
} else if (isSchemaConstructor) {
expression.setHighestExecutionMode(ExecutionMode.LOCAL);
} else {
if (
expression.getStaticContext()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@
import org.rumbledb.expressions.update.TransformExpression;
import org.rumbledb.expressions.update.TruncateCollectionExpression;
import org.rumbledb.types.FunctionSignature;
import org.rumbledb.xml.schema.XmlSchemaConstructorFunction;

public class ExpressionClassificationVisitor extends AbstractNodeVisitor<ExpressionClassification> {

Expand Down Expand Up @@ -366,7 +367,10 @@ private FunctionSignature getSignature(FunctionIdentifier identifier, StaticCont
if (function != null) {
signature = function.getSignature();
} else {
signature = staticContext.getFunctionSignature(identifier);
XmlSchemaConstructorFunction constructor = XmlSchemaConstructorFunction.resolve(identifier, staticContext);
signature = constructor == null
? staticContext.getFunctionSignature(identifier)
: constructor.signature();
}
return signature;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -420,7 +420,7 @@ && usesQNameCoercionErrorSemantics(expression)
typeSwitchExpression.setStaticSequenceType(paramType);
return typeSwitchExpression;
}
if (paramType.getItemType().equals(BuiltinTypesCatalogue.errorItem)) {
if (BuiltinTypesCatalogue.errorItem.getName().equals(paramType.getItemType().getName())) {
TreatExpression result = new TreatExpression(
expression,
paramType,
Expand All @@ -434,8 +434,9 @@ && usesQNameCoercionErrorSemantics(expression)
}

private boolean isNamespaceSensitiveFunctionParameter(SequenceType paramType) {
return paramType.getItemType().equals(BuiltinTypesCatalogue.QNameItem)
|| paramType.getItemType().equals(BuiltinTypesCatalogue.NOTATIONItem);
Name parameterTypeName = paramType.getItemType().getName();
return BuiltinTypesCatalogue.QNameItem.getName().equals(parameterTypeName)
|| BuiltinTypesCatalogue.NOTATIONItem.getName().equals(parameterTypeName);
}

private boolean usesQNameCoercionErrorSemantics(Expression expression) {
Expand Down
Loading
Loading