All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog and this project adheres to Semantic Versioning.
- The CLI exits with 1 on invalid options and on every failure, also when Flink threads linger (see HANDBOOK: Command line).
--versionprintsMappingWeaver <version>, from the jar's manifest.- The CLI validates its options before running: exactly one of
-mand-l, and-ofortoFile; an invalid option prints the message and the usage. - An IRI term map uses a value as it is when it is an absolute IRI of any scheme, fragments included, and otherwise prepends the base IRI; a percent-encoded path such as
http://example.com/http%3A%2F%2Fexample.comis kept (RMLTC0020a). - A join on equality whose condition holds no attributes is refused instead of joining every combination. A mapping plan that cannot express its condition, one joining on a constant for instance, arrives with an empty condition; the loop over the attributes then found nothing to reject on and answered that every record matched, so a cross join was silently produced where an equality was asked for (RML-Core test cases RMLTC0030c to RMLTC0030f).
- An equality join no longer logs both solution mappings and both attribute names at WARN level for every pair of records it compares.
lookupWithDelimitercalls using different input files no longer reuse each other's results- Tests that change the FnO function descriptions restore the defaults afterwards, so the test classes that run after them in the same JVM find the built-in functions again
- An IRI or blank node object map fed by a function producing several values yields a term per value, instead of keeping only the first
- A function producing several values is applied to every one of them, wherever it is used
- FnO return datatypes now follow the selected resource in the function's ordered
fno:returnslist, with warnings and first-return fallback for invalidrml:returnvalues - A value from a multi-valued function no longer carries the datatype of the collection the function returns
- A source field is read once per name, so a logical view read by several triples maps no longer exhausts the heap
- A function returning its values as an array, as the GREL functions do, no longer ends up as the array itself
- A reference to something the record does not have yields NULL instead of aborting the mapping, as the RML-IO registry requires of JSONPath
- An empty value is a value, and no longer reported as an absent attribute
- Git ignore
pom.xml.versionsBackup - Remove reference to non-existing branch in GitLab CI script
- Updated dependency on Function Agent to 2.0.0, which includes the fix for calculating the parameter arity of functions (1.5.1); an unknown function id still fails the mapping.
- Merged
--function-descriptionsand-fparameters.
- Release tooling:
RELEASE.mddocuments the steps;bump-version.shchecks the version format and moves to the next patch-SNAPSHOTafter a release. - Reorganized test resources and Java runners by RML language and provenance, using authoritative spec fixtures where applicable
- Updated dependency on Algebraic Mapping Operators to 5.1.0
- Updated dependency on dataio to 2.4.2
- Updated dependency on MappingLoom to 0.8.0
- Updated dependency on idlab-functions-java to 1.5.2
- Updated dependency on grel-functions-java to v0.11.1
- The GREL function descriptions (
functions_grel.ttl) come from the grel-functions-java jar, like the IDLab ones from idlab-functions-java, instead of a copy in MappingWeaver. Ten GREL functions (math_ceil,floor,round,min,max,ln,log,exp,powandstring_toNumber) now returnxsd:decimalinstead ofxsd:integer. - Updated dependencies on other libraries to latest stable release versions
- dataio is a direct dependency, since MappingWeaver uses its classes.
- The versions of algebraic-mapping-operators, dataio, MappingLoom, function-agent-java, idlab-functions-java and grel-functions-java are Maven properties, so a local build can use their development versions (see HANDBOOK: Dependency versions)
- Declared
slf4j-simpleas a runtime dependency, so the CLI has a concrete logging backend on its runtime classpath - Built-in FnO descriptions use a
classpath://prefix; custom descriptions can override them by filename (see README: Custom FnO function descriptions) - HANDBOOK: a regression case's expected output is derived from the specification rule it names, and one that upstream lacks is proposed there (see HANDBOOK: Test resource organization)
- GitLab CI: the test jobs extend a shared
.unittestsjob, list only test classes that run at least one test (addingReferenceFunctionTestandCliExitCodeTest), and run without a Docker service (see HANDBOOK: Continuous integration) - HANDBOOK: the agent request contract follows the software-handbook contract of 2026-10-19
- A function producing several values hands them over as one
CollectionNodeinstead of one node per value. The values stay together while they are passed around, so a function taking the result as an argument sees all of them, and the terms are generated where the collection is serialized: aTemplateSerializerstates the template once per member. A collection that a term map asks to be serialized as anrdf:Listorrdf:Seqis RML-CC and not implemented, so every collection is serialized a term at a time for now.
- The
--json-ldoption, which had no effect - Unused classes
CSVSourceOperator,FlinkDataIOReader(deprecated) andMain.CommonSink CliOutputTest, whose tests were all disabled, and the dependencies only it used: the Eclipse Paho MQTT client (with its repository) and Testcontainers HiveMQ- Leftover copies of the
moveupandmultiple-function-executionsmappings from before the test resources were reorganized - The copies of the RML-KGC test suites and the test classes that ran them (
RMLCoreTest,RMLIOTest,RMLRegistryTest,RMLFNMLTest,RMLLVTest,RMLCCTest,RMLSTARTest,TestRunner, with the unusedjunit-platform-launcher), and the RML-KGC part ofscripts/update_spec_tests.shandscripts/tests_compare.sh: the conformance run reads the suites at pinned commits, andModuleTestdoes the everyday checks. Also the local cases no test ran: the variantsRMLTC0008b-multidata*and an old copy ofRMLFNMLTC0001-CSV.CliExitCodeTestreads its two cases fromtest-cases/engines/cli, andRMLLVFNMLTestis in therml_kgc.fnopackage. CSVWSourceTest, which ranRMLIOREGTC0012bon a stored plan;ModuleTest'sio/csvwgroup translates that case.TestCorecompares the output's graphs as MappingWeaver writes them.
- Conformance run:
conformance/run.shruns the seven kg-construct test suites and the runner'sproposedcorpus on the jar with mapping-test-runner 0.1.4, and fails on any difference fromconformance/expected-results.csv, which lists the 232 cases MappingWeaver fails, each with its cause (154 of the 389 cases pass, and 3 are skipped). The engine runs each case with Flink at parallelism 1. The manualConformanceCI job runs it on Docker-in-Docker (docker:29-dind), and a release runs it first (see HANDBOOK: Conformance). ModuleTest: the everyday tests of RML-Core, RML-IO, RML-FNML and RML-LV, thirteen mappings that each merge the kg-construct test cases of one feature that MappingWeaver passes, compared by dataset isomorphism.- Shell scripts keep LF line endings (
.gitattributes). - Test cases
RMLFNOTC1005-JSONandRMLFNOTC1006-JSON, covering a multi-valued function in an IRI and in a blank node object map - Test cases
RMLFNOTC1001-JSONtoRMLFNOTC1004-JSON, covering a multi-valued function in a logical view: a split in an object map, with nulls turned into empty strings, with empty strings filtered out afterwards byidlab-fn:trueCondition, and the same split as a field of the view - GitLab CI: added Javadoc check in linting phase
- Debug logging now reports the discovered/loaded FnO function IRIs when the FnO agent is initialized
- A parameter
--custom-functions-onlyto disable loading of built-in FnO descriptions, so only the custom ones are used - A parameter
--best-effortto continue mapping even when encountering data errors. - A test for loading and executing a RML mapping with a custom external function.
- A source that is a CSV on the Web table is read in the dialect it says it is written in. The plan's source configuration carries what the table and its dialect said — the delimiter, the quote character, the encoding, whether the data has a header row, and the values standing for no value — and those become the
CSVWConfigurationthe CSV source operator reads through. A source saying none of it is a plain CSV and is read as before. Test case RMLIOREGTC0012b covers a semicolon-separated table naming "NULL" as its null value. - A file source may say where its data is with
urlinstead ofpath, which is what a CSV on the Web table says. - GitLab CI: create JAR artifact for each build.
0.3.0 - 2026-07-30
- Classified the RML-CC, RML-FNML and RML-STAR conformance test cases as passing or known-failing, each with an explanatory reason.
- RMLLVFNMLTest, covering a logical-view field whose value is computed by an FnO function (
toUpperCase), and enabled it in the GitLab CI pipeline.
- Updated Algebraic Mapping Operators to 4.0.0, MappingLoom to 0.7.1 and idlab-functions-java to 1.5.0.
- A source field's value is now read from MappingLoom's single
expressioninstead of the separatereferenceandconstantkeys, which were fused as of MappingLoom 0.7.0. The expression is handed to an AMOExpressionFieldas it is, whether it is a reference, a constant or a function computing the value; a function producing several values makes the field produce a record per value. This replaces the earlier mapping of a reference or constant onto AMO's now removed reference and constant fields. ReferenceFunctionreports itself as a bare reference (ExtendFunction.asReference()), so a field carrying it reads the attribute straight from the record and a path matching several values (a JSON array, an XML node list) still yields all of them.- RML-LV test case RMLLVTC0001c (a template-valued expression field) passes and is no longer listed as known-failing.
- Synced the RML-IO, RML-STAR and RML-FNML test resources with their upstream RML test-case repositories and re-triaged the affected tests.
- Enabled the passing spec test classes (RML-FNML, RML-STAR, RMLRegistry, WebSocket, FnO) in the GitLab CI pipeline.
- Updated the README conformance table with the current test-case pass percentages.
- A function that fails at runtime (e.g. a
substringindex out of range) now yields an empty result instead of aborting the whole mapping, so no triple is generated for that value; a function that cannot be resolved still raises an error (fixes RML-FNML test case RMLFNMLTC0008-CSV). - Updated Algebraic Mapping Operators to 2.0.3
- Updated MappingLoom to 0.6.8
- Added GenerateBlankNode extend function, fixes RML-Core test case RMLTC0012e.
0.2.0 - 2026-05-27
- Upgraded Flink to v2.2.0
- Implemented stdout sink using Flink 2.2's Sink API
- Added a FlinkTargetOperator to handle the creation of sinks using a Factory pattern
- Added an extra Flink operator step to extract the serialized RDF output from solution mappings before written the records into the sinks
- Added CLI option
-l --loom-fileto take an AlgeMapLoom plan as input. - Added websocket support
- Updated RML test cases
- Put dependency to FnOio in small case. See #1
- Update dependency on MappingLoom to 0.6.6
- Use base IRI given as program argument when generating relative IRIs
- Updated Algemaploom-rs version to 0.6.5
- (Re-)use Flink 2.2's mini-cluster for testing and reduce test start-up time
- Moved all CLI related parameters parsing and specification to a separate module
- Updated pom.xml to directly pull dataio instead of pulling this through algebraic mapping operators
- Old TargetSinkFunction which implements the deprecated legacy Flink's SinkFunction API
- OperatorTests.java which doesn't test anything meaningful is removed
- All existing implementations of a generic DataIO-based sink operators using legacy Flink's Source API
0.1.0 - 2025-10-08
- Initial source code