From 6239559c81b425e1309920ca4370eacd79cb96cc Mon Sep 17 00:00:00 2001 From: Sitt Min Oo Date: Fri, 14 Jun 2024 12:35:44 +0000 Subject: [PATCH] Add ShExML execution capabilities to weaver (mostly bug fixing) --- .cmt | 34 +++ .prettierrc | 5 + src/operator/extendOperator.js | 186 +++++++++----- src/operator/operatormanager.js | 6 +- src/operator/renameOperator.js | 16 +- src/operator/serializerOperator.js | 98 ++++---- src/operator/sourceOperator.js | 193 ++++++++------ src/types.js | 84 ++++--- .../GTFS-case/mapping.json | 175 +------------ .../GTFS-case/mapping_pretty.dot | 4 +- .../RMLTC0000-CSV/mapping.json | 2 +- .../RMLTC0000-CSV/mapping_pretty.dot | 4 +- .../RMLTC0001a-CSV/mapping.json | 2 +- .../RMLTC0001a-CSV/mapping_pretty.dot | 4 +- .../RMLTC0001b-CSV/mapping.json | 2 +- .../RMLTC0001b-CSV/mapping_pretty.dot | 4 +- .../RMLTC0002a-CSV/mapping.json | 2 +- .../RMLTC0002a-CSV/mapping_pretty.dot | 4 +- .../RMLTC0002b-CSV/mapping.dot | 2 +- .../RMLTC0002b-CSV/mapping.json | 2 +- .../RMLTC0002b-CSV/mapping_pretty.dot | 6 +- .../RMLTC0002c-CSV/mapping.dot | 2 +- .../RMLTC0002c-CSV/mapping.json | 2 +- .../RMLTC0002c-CSV/mapping_pretty.dot | 4 +- .../RMLTC0002e-CSV/mapping.dot | 2 +- .../RMLTC0002e-CSV/mapping.json | 2 +- .../RMLTC0002e-CSV/mapping_pretty.dot | 4 +- .../RMLTC0003c-CSV/mapping.dot | 2 +- .../RMLTC0003c-CSV/mapping.json | 2 +- .../RMLTC0003c-CSV/mapping_pretty.dot | 6 +- .../RMLTC0004a-CSV/mapping.dot | 12 +- .../RMLTC0004a-CSV/mapping.json | 2 +- .../RMLTC0004a-CSV/mapping_pretty.dot | 16 +- .../RMLTC0005a-CSV/mapping_pretty.dot | 2 +- .../RMLTC0006a-CSV/mapping.json | 2 +- .../RMLTC0006a-CSV/mapping_pretty.dot | 4 +- .../RMLTC0007a-CSV/mapping.json | 2 +- .../RMLTC0007a-CSV/mapping_pretty.dot | 4 +- .../RMLTC0007b-CSV/mapping.json | 2 +- .../RMLTC0007b-CSV/mapping_pretty.dot | 4 +- .../RMLTC0007c-CSV/mapping.dot | 2 +- .../RMLTC0007c-CSV/mapping.json | 2 +- .../RMLTC0007c-CSV/mapping_pretty.dot | 6 +- .../RMLTC0007d-CSV/mapping.dot | 2 +- .../RMLTC0007d-CSV/mapping.json | 2 +- .../RMLTC0007d-CSV/mapping_pretty.dot | 6 +- .../RMLTC0007e-CSV/mapping.json | 2 +- .../RMLTC0007e-CSV/mapping_pretty.dot | 4 +- .../RMLTC0007f-CSV/mapping.json | 2 +- .../RMLTC0007f-CSV/mapping_pretty.dot | 4 +- .../RMLTC0007g-CSV/mapping.dot | 2 +- .../RMLTC0007g-CSV/mapping.json | 2 +- .../RMLTC0007g-CSV/mapping_pretty.dot | 6 +- .../RMLTC0008a-CSV/mapping.dot | 2 +- .../RMLTC0008a-CSV/mapping.json | 2 +- .../RMLTC0008a-CSV/mapping_pretty.dot | 6 +- .../RMLTC0008b-CSV/mapping.dot | 30 +-- .../RMLTC0008b-CSV/mapping.json | 2 +- .../RMLTC0008b-CSV/mapping_pretty.dot | 34 +-- .../RMLTC0008c-CSV/mapping.dot | 2 +- .../RMLTC0008c-CSV/mapping.json | 2 +- .../RMLTC0008c-CSV/mapping_pretty.dot | 6 +- .../RMLTC0009a-CSV/mapping.dot | 34 +-- .../RMLTC0009a-CSV/mapping.json | 2 +- .../RMLTC0009a-CSV/mapping_pretty.dot | 34 +-- .../RMLTC0009b-CSV/mapping.dot | 34 +-- .../RMLTC0009b-CSV/mapping.json | 2 +- .../RMLTC0009b-CSV/mapping_pretty.dot | 34 +-- .../RMLTC0010a-CSV/mapping.dot | 2 +- .../RMLTC0010a-CSV/mapping.json | 2 +- .../RMLTC0010a-CSV/mapping_pretty.dot | 6 +- .../RMLTC0010b-CSV/mapping.dot | 2 +- .../RMLTC0010b-CSV/mapping.json | 2 +- .../RMLTC0010b-CSV/mapping_pretty.dot | 4 +- .../RMLTC0010c-CSV/mapping.dot | 2 +- .../RMLTC0010c-CSV/mapping.json | 2 +- .../RMLTC0010c-CSV/mapping_pretty.dot | 6 +- .../RMLTC0011b-CSV/mapping.dot | 18 +- .../RMLTC0011b-CSV/mapping.json | 2 +- .../RMLTC0011b-CSV/mapping_pretty.dot | 22 +- .../RMLTC0012a-CSV/mapping.dot | 2 +- .../RMLTC0012a-CSV/mapping.json | 2 +- .../RMLTC0012a-CSV/mapping_pretty.dot | 6 +- .../RMLTC0012b-CSV/mapping.dot | 2 +- .../RMLTC0012b-CSV/mapping.json | 2 +- .../RMLTC0012b-CSV/mapping_pretty.dot | 10 +- .../RMLTC0015a-CSV/mapping.dot | 10 +- .../RMLTC0015a-CSV/mapping.json | 235 +----------------- .../RMLTC0015a-CSV/mapping_pretty.dot | 14 +- .../RMLTC0015b-CSV/mapping.dot | 8 +- .../RMLTC0015b-CSV/mapping.json | 2 +- .../RMLTC0015b-CSV/mapping_pretty.dot | 12 +- .../RMLTC0019a-CSV/mapping_pretty.dot | 2 +- .../RMLTC0019b-CSV/mapping.json | 2 +- .../RMLTC0019b-CSV/mapping_pretty.dot | 4 +- .../RMLTC0020a-CSV/mapping.json | 2 +- .../RMLTC0020a-CSV/mapping_pretty.dot | 4 +- .../RMLTC0020b-CSV/mapping.json | 2 +- .../RMLTC0020b-CSV/mapping_pretty.dot | 4 +- test/rml_tests.js | 102 ++++---- test/shexml/blankprefix/events.csv | 3 + test/shexml/blankprefix/expected.nq | 6 + test/shexml/blankprefix/input.dot | 13 + test/shexml/blankprefix/input.json | 1 + test/shexml/blankprefix/input.shexml | 18 ++ test/shexml/blankprefix/input_pretty.dot | 13 + test/shexml/bnode/events.csv | 3 + test/shexml/bnode/expected.nq | 6 + test/shexml/bnode/input.dot | 13 + test/shexml/bnode/input.json | 1 + test/shexml/bnode/input.shexml | 18 ++ test/shexml/bnode/input_pretty.dot | 13 + test/shexml/bnode/pretty.png | Bin 0 -> 294398 bytes test/shexml/constant/events.csv | 3 + test/shexml/constant/expected.nq | 8 + test/shexml/constant/input.dot | 13 + test/shexml/constant/input.json | 1 + test/shexml/constant/input.shexml | 19 ++ test/shexml/constant/input_pretty.dot | 13 + test/shexml/graph/expected.nq | 10 + test/shexml/graph/film2.csv | 3 + test/shexml/graph/films.csv | 3 + test/shexml/graph/input.dot | 20 ++ test/shexml/graph/input.json | 1 + test/shexml/graph/input.shexml | 30 +++ test/shexml/graph/input_pretty.dot | 20 ++ test/shexml/linking/events.csv | 3 + test/shexml/linking/expected.nq | 10 + test/shexml/linking/input.dot | 13 + test/shexml/linking/input.json | 1 + test/shexml/linking/input.shexml | 23 ++ test/shexml/linking/input_pretty.dot | 13 + test/shexml/literal/events.csv | 3 + test/shexml/literal/expected.nq | 6 + test/shexml/literal/input.dot | 13 + test/shexml/literal/input.json | 1 + test/shexml/literal/input.shexml | 18 ++ test/shexml/literal/input_pretty.dot | 13 + test/shexml/multiple_iterator/expected.nq | 12 + test/shexml/multiple_iterator/film2.csv | 3 + test/shexml/multiple_iterator/films.csv | 3 + test/shexml/multiple_iterator/input.dot | 20 ++ test/shexml/multiple_iterator/input.json | 1 + test/shexml/multiple_iterator/input.shexml | 29 +++ .../shexml/multiple_iterator/input_pretty.dot | 20 ++ .../only_iterator_expression/events.csv | 3 + .../only_iterator_expression/expected.nq | 6 + .../shexml/only_iterator_expression/input.dot | 13 + .../only_iterator_expression/input.json | 1 + .../only_iterator_expression/input.shexml | 20 ++ .../only_iterator_expression/input_pretty.dot | 13 + test/shexml/single_iterator/expected.nq | 10 + test/shexml/single_iterator/films.csv | 3 + test/shexml/single_iterator/input.dot | 11 + test/shexml/single_iterator/input.json | 1 + test/shexml/single_iterator/input.shexml | 19 ++ test/shexml/single_iterator/input_pretty.dot | 11 + test/shexml/string_concatenation/events.csv | 3 + test/shexml/string_concatenation/expected.nq | 6 + test/shexml/string_concatenation/input.dot | 13 + test/shexml/string_concatenation/input.json | 1 + test/shexml/string_concatenation/input.shexml | 18 ++ .../string_concatenation/input_pretty.dot | 13 + 163 files changed, 1340 insertions(+), 958 deletions(-) create mode 100644 .cmt create mode 100644 .prettierrc create mode 100644 test/shexml/blankprefix/events.csv create mode 100644 test/shexml/blankprefix/expected.nq create mode 100644 test/shexml/blankprefix/input.dot create mode 100644 test/shexml/blankprefix/input.json create mode 100644 test/shexml/blankprefix/input.shexml create mode 100644 test/shexml/blankprefix/input_pretty.dot create mode 100644 test/shexml/bnode/events.csv create mode 100644 test/shexml/bnode/expected.nq create mode 100644 test/shexml/bnode/input.dot create mode 100644 test/shexml/bnode/input.json create mode 100644 test/shexml/bnode/input.shexml create mode 100644 test/shexml/bnode/input_pretty.dot create mode 100644 test/shexml/bnode/pretty.png create mode 100644 test/shexml/constant/events.csv create mode 100644 test/shexml/constant/expected.nq create mode 100644 test/shexml/constant/input.dot create mode 100644 test/shexml/constant/input.json create mode 100644 test/shexml/constant/input.shexml create mode 100644 test/shexml/constant/input_pretty.dot create mode 100644 test/shexml/graph/expected.nq create mode 100644 test/shexml/graph/film2.csv create mode 100644 test/shexml/graph/films.csv create mode 100644 test/shexml/graph/input.dot create mode 100644 test/shexml/graph/input.json create mode 100644 test/shexml/graph/input.shexml create mode 100644 test/shexml/graph/input_pretty.dot create mode 100644 test/shexml/linking/events.csv create mode 100644 test/shexml/linking/expected.nq create mode 100644 test/shexml/linking/input.dot create mode 100644 test/shexml/linking/input.json create mode 100644 test/shexml/linking/input.shexml create mode 100644 test/shexml/linking/input_pretty.dot create mode 100644 test/shexml/literal/events.csv create mode 100644 test/shexml/literal/expected.nq create mode 100644 test/shexml/literal/input.dot create mode 100644 test/shexml/literal/input.json create mode 100644 test/shexml/literal/input.shexml create mode 100644 test/shexml/literal/input_pretty.dot create mode 100644 test/shexml/multiple_iterator/expected.nq create mode 100644 test/shexml/multiple_iterator/film2.csv create mode 100644 test/shexml/multiple_iterator/films.csv create mode 100644 test/shexml/multiple_iterator/input.dot create mode 100644 test/shexml/multiple_iterator/input.json create mode 100644 test/shexml/multiple_iterator/input.shexml create mode 100644 test/shexml/multiple_iterator/input_pretty.dot create mode 100644 test/shexml/only_iterator_expression/events.csv create mode 100644 test/shexml/only_iterator_expression/expected.nq create mode 100644 test/shexml/only_iterator_expression/input.dot create mode 100644 test/shexml/only_iterator_expression/input.json create mode 100644 test/shexml/only_iterator_expression/input.shexml create mode 100644 test/shexml/only_iterator_expression/input_pretty.dot create mode 100644 test/shexml/single_iterator/expected.nq create mode 100644 test/shexml/single_iterator/films.csv create mode 100644 test/shexml/single_iterator/input.dot create mode 100644 test/shexml/single_iterator/input.json create mode 100644 test/shexml/single_iterator/input.shexml create mode 100644 test/shexml/single_iterator/input_pretty.dot create mode 100644 test/shexml/string_concatenation/events.csv create mode 100644 test/shexml/string_concatenation/expected.nq create mode 100644 test/shexml/string_concatenation/input.dot create mode 100644 test/shexml/string_concatenation/input.json create mode 100644 test/shexml/string_concatenation/input.shexml create mode 100644 test/shexml/string_concatenation/input_pretty.dot diff --git a/.cmt b/.cmt new file mode 100644 index 0000000..74a7eca --- /dev/null +++ b/.cmt @@ -0,0 +1,34 @@ +# The input parts +{ + # Shows a list of options + "Type" = [ + "feat", + "fix", + "docs", + "style", + "refactor", + "test", + "chore" + ] + "Scope" = @ # Single line input + "Subject" = @ + "Body" = !@ # Multi-line input + "Footer" = !@ +} + +# predefined messages +# this section is optional +{ + vb = "chore: version bump" + readme = "docs: updated readme" +} + +# The output format +# Takes the values provided from the input stage +# and interpolates them in +${Type} (${Scope}): ${Subject} + +${Body} + +${Footer} + diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..cdbec04 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,5 @@ +{ + "tabWidth": 4, + "semi": false, + "singleQuote": true +} diff --git a/src/operator/extendOperator.js b/src/operator/extendOperator.js index 8b8a2c2..7dd373e 100644 --- a/src/operator/extendOperator.js +++ b/src/operator/extendOperator.js @@ -1,88 +1,144 @@ -import {Operator} from "./Operator.js"; -import Handlebars from 'handlebars'; -import {BlankNode, Iri, LanguageDataType, Literal} from "../types.js"; +import { Operator } from './Operator.js' +import Handlebars from 'handlebars' +import { BlankNode, Iri, LanguageDataType, Literal } from '../types.js' +import { forEach } from 'most' export class ExtendOp extends Operator { - generateMapping(key, mapping) { // In function so recursion is possible + generateMapping(key, mapping) { + // In function so recursion is possible if (key.charAt(0) === '?') key = key.slice(1) // Remove ? When we have a *variable* attribute - - const innerFunction = mapping.inner_function != null ? this.generateMapping(key, mapping.inner_function) : null; + let regex = /\{([^}]+)}/g // Match text between curly brackets. + const innerFunction = + mapping.inner_function != null + ? this.generateMapping(key, mapping.inner_function) + : null switch (mapping.type) { - - case('Iri'): - return obj => { - innerFunction(obj); - obj[key] = new Iri(obj[key]); - }; - - case('Literal'): - const dtypeFunction = mapping.dtype_function != null ? this.generateMapping(key, mapping.inner_function) : null; - const langtypeFunction = mapping.langtype_function != null ? this.generateMapping(key, mapping.inner_function) : null; - - - return obj => { - innerFunction(obj); - if(dtypeFunction !== null){ + case 'Iri': + return (obj) => { + innerFunction(obj) + obj[key] = new Iri(obj[key]) + } + + case 'Literal': + const dtypeFunction = + mapping.dtype_function != null + ? this.generateMapping(key, mapping.inner_function) + : null + const langtypeFunction = + mapping.langtype_function != null + ? this.generateMapping(key, mapping.inner_function) + : null + + return (obj) => { + innerFunction(obj) + if (dtypeFunction !== null) { dtypeFunction(obj) } - if(langtypeFunction !== null){ + if (langtypeFunction !== null) { langtypeFunction(obj) } - obj[key] = new Literal(obj[key]); - }; - - case('BlankNode'): - return obj => { - innerFunction(obj); - obj[key] = new BlankNode(obj[key]); - }; - - case('UriEncode'): - return obj => { - innerFunction(obj); - - obj[key] = encodeURI(obj[key]).replace(',', '%2C').replace('(', '%28').replace(')', '%29'); // Encode URI, Maybe manually in the future to match RML mapper. - }; - - case('Reference'): - return (obj => { - obj[key] = obj[mapping.value]; - }); - - case('Constant'): - return (obj => { - obj[key] = mapping.value; - }); - - case('TemplateString'): - const regex = /\{([^}]+)}/g; // Match text between curly brackets. - const template_string = mapping.value.replace(regex, (match, content) => `{{[${content}]}}`); // Double brackets for HandleBars. - const template = Handlebars.compile(template_string); - return (obj => { - obj[key] = template(obj); - }); + obj[key] = new Literal(obj[key]) + } + + case 'BlankNode': + return (obj) => { + innerFunction(obj) + obj[key] = new BlankNode(obj[key]) + } + + case 'UriEncode': + return (obj) => { + innerFunction(obj) + + obj[key] = encodeURI(obj[key]) + .replace(',', '%2C') + .replace('(', '%28') + .replace(')', '%29') // Encode URI, Maybe manually in the future to match RML mapper. + } + + case 'Reference': + return (obj) => { + obj[key] = obj[mapping.value] + } + + case 'Constant': + return (obj) => { + obj[key] = mapping.value + } + + case 'TemplateString': + // Match text between curly brackets. + let template_string = mapping.value.replace( + regex, + (match, content) => `{{[${content}]}}`, + ) // Double brackets for HandleBars. + let template = Handlebars.compile(template_string) + return (obj) => { + obj[key] = template(obj) + } + + case 'TemplateFunctionValue': + let template_string_2 = mapping.template.replace( + regex, + (match, content) => `{{[${content}]}}`, + ) // Double brackets for HandleBars. + let template2 = Handlebars.compile(template_string_2) + let var_function_pairs = {} + for (let pair of mapping.variable_function_pairs) { + let variable = pair[0] + let ext_func = pair[1] + ext_func = this.generateMapping(key, ext_func) + var_function_pairs[variable] = ext_func + } + + return (obj) => { + let temp_val = {}; + for (let variable in var_function_pairs) { + let nest_func = var_function_pairs[variable] + nest_func(obj) + temp_val[variable] = obj[key] + } + obj[key] = template2(temp_val) + } + + case 'Concatenate': + const left_function = this.generateMapping( + key, + mapping.left_value, + ) + const right_function = this.generateMapping( + key, + mapping.right_value, + ) + return (obj) => { + left_function(obj) + const left_value = obj[key] + right_function(obj) + const right_value = obj[key] + obj[key] = left_value + mapping.separator + right_value + } default: - throw Error(`Type (${mapping.type}) found in extend operator not supported!`); + throw Error( + `Type (${mapping.type}) found in extend operator not supported!`, + ) } } - constructor(id, config) { - super(id, config); - this.extensions = []; + super(id, config) + this.extensions = [] for (let key in config) { - this.extensions.push(this.generateMapping(key, config[key])); + this.extensions.push(this.generateMapping(key, config[key])) } } next(v) { - this.extensions.forEach(extend => { - extend(v); - }); - this.push(v); + this.extensions.forEach((extend) => { + extend(v) + }) + this.push(v) } - } diff --git a/src/operator/operatormanager.js b/src/operator/operatormanager.js index 2e17049..88cad25 100644 --- a/src/operator/operatormanager.js +++ b/src/operator/operatormanager.js @@ -5,6 +5,7 @@ import {SerializerOp} from "./serializerOperator.js"; import {TargetOp} from "./targetOperator.js"; import {FragmentOp} from "./fragmentOperator.js"; import {JoinOperator} from "./joinOperator.js"; +import { RenameOp } from "./renameOperator.js"; export class OpManager { @@ -49,8 +50,11 @@ export function parseOperator(id, type, config){ case 'JoinOp': operator = new JoinOperator(id, config); break; + case 'RenameOp': + operator = new RenameOp(id, config); + break; default: throw new Error(`Operator type ${type} is not supported`); } return operator -} \ No newline at end of file +} diff --git a/src/operator/renameOperator.js b/src/operator/renameOperator.js index 04a0a21..8195f20 100644 --- a/src/operator/renameOperator.js +++ b/src/operator/renameOperator.js @@ -4,19 +4,17 @@ import {BlankNode, Iri, Literal} from "../types.js"; export class RenameOp extends Operator { constructor(id, config) { super(id, config); - this.aliases = [] - for(let i =0; i < config.aliases; i++){ - const alias = config.aliases[i] - if(alias[0] !== alias[1]){ - this.aliases.append(alias) - } + this.aliases = {} + for (const from in config) { + this.aliases[from] = config[from] } } next(v) { - for(let [_, alias] of this.aliases){ - v[alias[0]] = v[alias[1]] - delete v[alias[1]] + for(let from in this.aliases){ + let to = this.aliases[from] + v[to] = v[from] + delete v[from] } this.push(v); } diff --git a/src/operator/serializerOperator.js b/src/operator/serializerOperator.js index a0e1d75..4af7888 100644 --- a/src/operator/serializerOperator.js +++ b/src/operator/serializerOperator.js @@ -1,68 +1,70 @@ -import {Operator} from "./Operator.js"; +import { Operator } from './Operator.js' export class SerializerOp extends Operator { constructor(id, config) { - super(id, config); - let templates; - switch(config.format){ - case("NTriples"): + super(id, config) + let templates + switch (config.format) { + case 'NTriples': templates = parseTemplate(config.template) - break; - case("NQuads"): + break + case 'NQuads': templates = parseTemplate(config.template) - break; + break default: - throw Error(`Serialiser formatting type: "${config.format}" not supported.`); + throw Error( + `Serialiser formatting type: "${config.format}" not supported.`, + ) } - this.serializers = templates.map(templateString => - generateQuadTemplate(templateString) + this.serializers = templates.map((templateString) => + generateQuadTemplate(templateString), ) - if(global.dup_removal){ + if (global.dup_removal) { this.seen = new Set() - this.next = (v => { - this.serializers.forEach(func => { + this.next = (v) => { + this.serializers.forEach((func) => { const triple = func(v) // Efficiently detect if item was already passed through this function - if(!this.seen.has(triple) && triple != null){ + if (!this.seen.has(triple) && triple != null) { this.seen.add(triple) this.push(triple) } - }); - }) - }else{ - this.next = (v =>{ - this.serializers.forEach(func => { + }) + } + } else { + this.next = (v) => { + this.serializers.forEach((func) => { const triple = func(v) - if(triple != null){ - this.push(triple); + if (triple != null) { + this.push(triple) } - }); - }) + }) + } } } } -function parseTemplate(template){ + +function parseTemplate(template) { const fields = template.split(/\s+/) let templates = [[]] let currIndex = 0 - fields.forEach(value => { + fields.forEach((value) => { value = value.trim().replace(/\\n/g, '') - if(value.charAt(0) === '.'){ + if (value.charAt(0) === '.') { currIndex++ templates[currIndex] = [value.slice(1)] - }else{ + } else { templates[currIndex].push(value) } }) - return templates.slice(0,-1).map(list => list.join(' ')) + return templates.slice(0, -1).map((list) => list.join(' ')) } - -export function generateQuadTemplate (template) { +export function generateQuadTemplate(template) { template = template.trim() // Remove '.' on the end const fields = template.split(' ') const variables = [] // Hold the indices of fields containing variables. So we can change these later. - const tags = new Array(fields.length).fill(""); // Hold the indices of fields containing language tags. + const tags = new Array(fields.length).fill('') // Hold the indices of fields containing language tags. const values = fields.map((value, index) => { // extract langtag and datatpe using regex const langTag = value.match(/@([a-zA-Z]+(-[a-zA-Z0-9]+)*)/) @@ -77,9 +79,9 @@ export function generateQuadTemplate (template) { tags[index] = langTag[0] } if (dataType) { - if(tags[index] !== undefined){ + if (tags[index] !== undefined) { tags[index] += dataType[0] - }else { + } else { tags[index] = dataType[0] } } @@ -91,25 +93,31 @@ export function generateQuadTemplate (template) { return value } }) - if(tags !== {}){ + if (tags !== {}) { return (obj) => { - variables.forEach(i => { - if(obj[i[1]] === undefined){ - return null; + variables.forEach((i) => { + if (obj[i[1]].render() === undefined) { + return null + } else { + values[i[0]] = obj[i[1]].render() + tags[i[0]] } - values[i[0]] = obj[i[1]].render() + tags[i[0]] }) - return values.join(' ') + " ." + + if (values.includes('')) { + return undefined + } else { + return values.join(' ') + ' .' + } } - }else{ + } else { return (obj) => { - variables.forEach(i => { - if(obj[i[1]] === undefined){ - return null; + variables.forEach((i) => { + if (obj[i[1]] === undefined) { + return null } values[i[0]] = obj[i[1]].render() }) - return values.join(' ') + " ." + return values.join(' ') + ' .' } } } diff --git a/src/operator/sourceOperator.js b/src/operator/sourceOperator.js index 3f35351..bc108d1 100644 --- a/src/operator/sourceOperator.js +++ b/src/operator/sourceOperator.js @@ -1,118 +1,159 @@ -import {Operator} from "./Operator.js"; -import fs from "fs"; -import * as readline from "readline"; +import { Operator } from './Operator.js' +import fs from 'fs' +import * as readline from 'readline' export class SourceOp extends Operator { - // because it's a source, you need to set the next and complete yourself async start() { - super.start(); + super.start() switch (this.config.source_type) { - case "File": - this.read_file(); - break; + case 'File': + this.read_file() + break } } read_file() { // Process file - var path = this.config.path; + var path = this.config.path const iterator = this.config.root_iterator - switch (this.config.source_type){ - case "File": - break; + switch (this.config.source_type) { + case 'File': + break default: - throw new Error("Iterator source type not supported.") + throw new Error('Iterator source type not supported.') } switch (iterator.reference_formulation) { - case "CSVRows": + case 'CSVRows': try { // CSV parser, on a async continuous stream for memory performance reasons. - const stream = fs.createReadStream(global.dot_directory + "/" + path, {flags: 'r', encoding: 'utf-8'}); - const readLine = readline.createInterface({input:stream, crlfDelay: Infinity}); - let csvFields = []; + const stream = fs.createReadStream( + global.dot_directory + '/' + path, + { flags: 'r', encoding: 'utf-8' }, + ) + const readLine = readline.createInterface({ + input: stream, + crlfDelay: Infinity, + }) + let csvFields = [] + let fields_alias_map = {} + for (const field of iterator.fields) { + let from = field.reference + let to = field.alias + fields_alias_map[from] = to + } let handleLine = (line) => { csvFields = line.split(',') // Insert csv fields // After the first line is processed, change the handler to process subsequent lines + if (iterator.alias !== null) { + for ( + let i = 0, len = csvFields.length; + i < len; + i++ + ) { + csvFields[i] = + iterator.alias + '.' + fields_alias_map[csvFields[i]] + } + } - handleLine = line => { - let fieldStart = 0; - let fieldIndex = 0; + handleLine = (line) => { + let fieldStart = 0 + let fieldIndex = 0 let quoteLevel = 0 let v = {} - for(let i = 0; i < line.length; i++) { + for (let i = 0; i < line.length; i++) { if (line[i] === '"') { quoteLevel = quoteLevel + 1 } - if (line[i] === "," && quoteLevel % 2 === 0) { // field has ended - v[csvFields[fieldIndex]] = line.substring(fieldStart + quoteLevel / 2, i - quoteLevel / 2) - fieldIndex++; - fieldStart = i + 1; - quoteLevel = 0 + if (line[i] === ',' && quoteLevel % 2 === 0) { + // field has ended + v[csvFields[fieldIndex]] = line.substring( + fieldStart + quoteLevel / 2, + i - quoteLevel / 2, + ) + fieldIndex++ + fieldStart = i + 1 + quoteLevel = 0 } } - v[csvFields[fieldIndex]] = line.substring(fieldStart + quoteLevel / 2, line.length - quoteLevel / 2) + v[csvFields[fieldIndex]] = line.substring( + fieldStart + quoteLevel / 2, + line.length - quoteLevel / 2, + ) this.push(v) } - }; - readLine.on('line', line => { + } + readLine.on('line', (line) => { handleLine(line) - }); + }) - let closed = false; + let closed = false readLine.on('close', () => { // All lines are read, file is closed now. - closed = true; - this.complete(); // Call the complete method here to signify the end of the file processing - }); - + closed = true + this.complete() // Call the complete method here to signify the end of the file processing + }) } catch (err) { // Handle any errors that occur during file reading // throw err throw err } - break; + break - case "JSONPath": - try{ + case 'JSONPath': + try { // JSON parser, on an async continuous stream for memory performance reasons. - const stream = fs.createReadStream(global.dot_directory + "/" + path, {flags: 'r', encoding: 'utf-8'}); + const stream = fs.createReadStream( + global.dot_directory + '/' + path, + { flags: 'r', encoding: 'utf-8' }, + ) const reference = iterator.reference let sub_fields = reference.split('.') - if(!(sub_fields[0] === '$' && sub_fields[sub_fields.length - 1].slice(-3) == "[*]")){ - throw new Error("Error in parsing iterator reference.") + if ( + !( + sub_fields[0] === '$' && + sub_fields[sub_fields.length - 1].slice(-3) == '[*]' + ) + ) { + throw new Error('Error in parsing iterator reference.') } sub_fields = sub_fields.slice(1) - sub_fields.push(sub_fields.pop().slice(0,-3)) // remove trailing [*] + sub_fields.push(sub_fields.pop().slice(0, -3)) // remove trailing [*] // parse reference - let remainder = "" + let remainder = '' - let extract_records = (chunk) =>{ - chunk = " " + remainder + chunk // parse remainder of last chunk, add a space. Thus start can never be 0 + let extract_records = (chunk) => { + chunk = ' ' + remainder + chunk // parse remainder of last chunk, add a space. Thus start can never be 0 let bracelet_level = 0 let ci = 0 // assume first char is a {} let start = 0 - while(ci < chunk.length){ - if(chunk[ci] === "]" && start === 0){ + while (ci < chunk.length) { + if (chunk[ci] === ']' && start === 0) { // the list is finished (we reach a list end + there is no active object, this can only be the end of the iterator list) this.complete() - return; + return } - if(chunk[ci] === '{') {bracelet_level++; start = start === 0 ? ci : start;} - if(chunk[ci] === '}') bracelet_level-- - if(bracelet_level === 0 && start !== 0){ + if (chunk[ci] === '{') { + bracelet_level++ + start = start === 0 ? ci : start + } + if (chunk[ci] === '}') bracelet_level-- + if (bracelet_level === 0 && start !== 0) { // we have a finished object - const json_string = chunk.substring(start, ci + 1) // include the end + const json_string = chunk.substring( + start, + ci + 1, + ) // include the end const json = JSON.parse(json_string) let output = {} - iterator.fields.forEach(field => { + iterator.fields.forEach((field) => { output[field.alias] = json[field.reference] - if(field.innerFields != []){ + if (field.innerFields != []) { //TODO parse inner fields } }) @@ -124,52 +165,52 @@ export class SourceOp extends Operator { } } - // First we have to navigate the root iterator reference - let curr_string = "" // outside of function so it can also act as a remainder + let curr_string = '' // outside of function so it can also act as a remainder let curr_level = 1 let bracelet_count = 0 // n - let handleChunk = (chunk) => { + let handleChunk = (chunk) => { // navigate through the file to find the list that should be iterated. let open_string = false - for(let i = 0; i < chunk.length; i++ ){ - if(chunk[i] === '{') bracelet_count++; - if(chunk[i] === '}') bracelet_count--; - if(bracelet_count === curr_level){ - if((chunk[i] === "\"" || chunk[i] === "'")){ - if(open_string === false){ + for (let i = 0; i < chunk.length; i++) { + if (chunk[i] === '{') bracelet_count++ + if (chunk[i] === '}') bracelet_count-- + if (bracelet_count === curr_level) { + if (chunk[i] === '"' || chunk[i] === "'") { + if (open_string === false) { open_string = true - }else{ - if(curr_string === sub_fields[0]){ + } else { + if (curr_string === sub_fields[0]) { // the data is in this object sub_fields = sub_fields.slice(1) - if(sub_fields.length === 0){ + if (sub_fields.length === 0) { // we found the iterator object handleChunk = extract_records - extract_records(chunk.substring(i)) + extract_records( + chunk.substring(i), + ) } } open_string = false } - }else{ - if(open_string === true){ + } else { + if (open_string === true) { curr_string += chunk[i] } } } } } - stream.on('data', chunk => { - handleChunk(chunk) - } - ) - }catch(err){ + stream.on('data', (chunk) => { + handleChunk(chunk) + }) + } catch (err) { throw err } - break; + break default: - throw new Error("Reference formulation not supported.") + throw new Error('Reference formulation not supported.') } } } diff --git a/src/types.js b/src/types.js index baa541d..13e3fb0 100644 --- a/src/types.js +++ b/src/types.js @@ -1,54 +1,60 @@ class DataType { - constructor (value) { - this.value = value - } + constructor(value) { + this.value = value + } - getValue () { - return this.value - } + getValue() { + return this.value + } - render () { - return this.value - } + render() { + return this.value + } } -export class LanguageDataType extends DataType{ - content = null - language = "" - constructor (content, language) { - super(content) - this.language = language - } - render () { - return this.content.render() + this.language - } +export class LanguageDataType extends DataType { + content = null + language = '' + constructor(content, language) { + super(content) + this.language = language + } + render() { + return this.content.render() + this.language + } } export class Iri extends DataType { - constructor (value) { - super(value) - } - - render () { - return `<${this.value}>` - } + constructor(value) { + super(value) + } + + render() { + if (this.value === undefined) { + return undefined + } + return `<${this.value}>` + } } export class Literal extends DataType { - constructor (value) { - super(value) - } - - render () { - return `"${this.value}"` - } + constructor(value) { + super(value) + } + + render() { + if (this.value === undefined) { + return undefined + } + return `"${this.value}"` + } } export class BlankNode extends DataType { - constructor (value) { - super(value) - } + constructor(value) { + super(value) + } - render () { - return `_:${this.value}` - } + render() { + return `_:${this.value}` + } } diff --git a/test/rml-mapper-test-cases-csv/GTFS-case/mapping.json b/test/rml-mapper-test-cases-csv/GTFS-case/mapping.json index e4457f8..5aadffa 100644 --- a/test/rml-mapper-test-cases-csv/GTFS-case/mapping.json +++ b/test/rml-mapper-test-cases-csv/GTFS-case/mapping.json @@ -1,174 +1 @@ -{ - "nodes": [ - { - "id": "Source_0", - "operator": { - "type": "SourceOp", - "config": { - "path": "stops.csv", - "source_type": "File", - "root_iterator": { - "reference": null, - "reference_formulation": "CSVRows", - "fields": [], - "alias": null - } - } - } - }, - { - "id": "Projection_1", - "operator": { - "type": "ProjectOp", - "config": { - "projection_attributes": [ - "stop_id", - "parent_station" - ] - } - } - }, - { - "id": "Fragmenter_2", - "operator": { - "type": "FragmentOp", - "config": { - "from": "default", - "to": [ - "default", - "join_0", - "join_0" - ] - } - } - }, - { - "id": "Join_3", - "operator": { - "type": "JoinOp", - "config": { - "left_right_attr_pairs": [ - [ - "parent_station", - "stop_id" - ] - ], - "join_type": "InnerJoin", - "predicate_type": "Equal", - "join_alias": "join_0" - } - } - }, - { - "id": "Extend_4", - "operator": { - "type": "ExtendOp", - "config": { - "?tm0_p0_0": { - "type": "Iri", - "inner_function": { - "type": "UriEncode", - "inner_function": { - "type": "Constant", - "value": "http://vocab.gtfs.org/terms#parentStation" - } - } - }, - "?tm0_o0_0": { - "type": "Iri", - "inner_function": { - "type": "UriEncode", - "inner_function": { - "type": "TemplateString", - "value": "http://transport.linkeddata.es/madrid/metro/stops/{join_0_stop_id}" - } - } - }, - "?tm0_sm": { - "type": "Iri", - "inner_function": { - "type": "UriEncode", - "inner_function": { - "type": "TemplateString", - "value": "http://transport.linkeddata.es/madrid/metro/stops/{stop_id}" - } - } - } - } - } - }, - { - "id": "Serialize_5", - "operator": { - "type": "SerializerOp", - "config": { - "template": "?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .", - "format": "NQuads" - } - } - }, - { - "id": "Sink_6", - "operator": { - "type": "TargetOp", - "config": { - "target_type": "StdOut", - "data_format": "NQuads" - } - } - } - ], - "node_holes": [], - "edge_property": "directed", - "edges": [ - [ - 0, - 1, - { - "fragment": "default" - } - ], - [ - 1, - 2, - { - "fragment": "default" - } - ], - [ - 2, - 3, - { - "fragment": "join_0" - } - ], - [ - 2, - 3, - { - "fragment": "join_0" - } - ], - [ - 3, - 4, - { - "fragment": "default" - } - ], - [ - 4, - 5, - { - "fragment": "default" - } - ], - [ - 5, - 6, - { - "fragment": "default" - } - ] - ] -} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"stops.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["stop_id","parent_station"]}}},{"id":"Fragmenter_2","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_0","join_0"]}}},{"id":"Join_3","operator":{"type":"JoinOp","config":{"left_right_attr_pairs":[["parent_station","stop_id"]],"join_type":"InnerJoin","predicate_type":"Equal","join_alias":"join_0"}}},{"id":"Extend_4","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://transport.linkeddata.es/madrid/metro/stops/{join_0_stop_id}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://vocab.gtfs.org/terms#parentStation"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://transport.linkeddata.es/madrid/metro/stops/{stop_id}"}}}}}},{"id":"Serialize_5","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_6","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"join_0"}],[2,3,{"fragment":"join_0"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[5,6,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/GTFS-case/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/GTFS-case/mapping_pretty.dot index ba8b0da..4c8bc5a 100644 --- a/test/rml-mapper-test-cases-csv/GTFS-case/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/GTFS-case/mapping_pretty.dot @@ -1,9 +1,9 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"stops.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"stops.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: stop_id, parent_station, " ] 2 [ label = "id:Fragmenter_2 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_0\",\"join_0\"]" ] 3 [ label = "id:Join_3 \lJoin Operator\ltype: InnerJoin\lpredicate_type: Equal\lattribute_pairs: [\l [\l \"parent_station\",\l \"stop_id\"\l ]\l]\lptm_alias: join_0" ] - 4 [ label = "id:Extend_4 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://vocab.gtfs.org/terms#parentStation\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://transport.linkeddata.es/madrid/metro/stops/{join_0_stop_id}\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://transport.linkeddata.es/madrid/metro/stops/{stop_id}\" } } }" ] + 4 [ label = "id:Extend_4 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://transport.linkeddata.es/madrid/metro/stops/{join_0_stop_id}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://vocab.gtfs.org/terms#parentStation\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://transport.linkeddata.es/madrid/metro/stops/{stop_id}\" } } }" ] 5 [ label = "id:Serialize_5 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 6 [ label = "id:Sink_6 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0000-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0000-CSV/mapping.json index 97648f3..854d2da 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0000-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0000-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Name}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Name}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0000-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0000-CSV/mapping_pretty.dot index ddafdf8..d9def5a 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0000-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0000-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Name}\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Name}\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0001a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0001a-CSV/mapping.json index 97648f3..69ca816 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0001a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0001a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Name}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Name}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0001a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0001a-CSV/mapping_pretty.dot index ddafdf8..3dfb50b 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0001a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0001a-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Name}\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Name}\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0001b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0001b-CSV/mapping.json index 33d1d67..5a6f085 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0001b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0001b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"{Name}"}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"{Name}"}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0001b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0001b-CSV/mapping_pretty.dot index 1f9ae4a..0c4d098 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0001b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0001b-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> BlankNode { inner_function: TemplateString { value: \"{Name}\" } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> BlankNode { inner_function: TemplateString { value: \"{Name}\" } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0002a-CSV/mapping.json index 68b772a..d4ddc27 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0002a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{ID}/{Name}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm .\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{ID}/{Name}"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm .\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0002a-CSV/mapping_pretty.dot index a9e5725..6595613 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0002a-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o1_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{ID}/{Name}\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{ID}/{Name}\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm .\l?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping.dot index 0e50959..3284a63 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"students{ID}\"},\"type\":\"BlankNode\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping.json index 1a057f3..ae26c0d 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"students{ID}"}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"students{ID}"}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping_pretty.dot index 437d454..d741766 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0002b-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, ID, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> BlankNode { inner_function: TemplateString { value: \"students{ID}\" } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, Name, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> BlankNode { inner_function: TemplateString { value: \"students{ID}\" } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping.dot index b920d0c..e27db7c 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"IDs\",\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"IDs\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"IDs\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/id\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping.json index bb8f5bf..6b64252 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["IDs","ID","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"IDs"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{ID}/{Name}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","IDs","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"IDs"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{ID}/{Name}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping_pretty.dot index 750d969..fe2e755 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0002c-CSV/mapping_pretty.dot @@ -1,6 +1,6 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: IDs, ID, Name, " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, IDs, Name, " ] 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"IDs\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{ID}/{Name}\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping.dot index 9b2501a..2fdc5b0 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student2.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"IDs\",\"Name\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Name\",\"IDs\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"IDs\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/id\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping.json index cb10f09..ea3496a 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student2.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["IDs","Name","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{ID}/{Name}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"IDs"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student2.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name","IDs"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{ID}/{Name}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"IDs"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping_pretty.dot index 63d9fef..675f487 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0002e-CSV/mapping_pretty.dot @@ -1,6 +1,6 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student2.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: IDs, Name, ID, " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student2.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, Name, IDs, " ] 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{ID}/{Name}\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"IDs\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping.dot index ee41f9b..506efe7 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"FirstName\",\"LastName\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"LastName\",\"FirstName\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"{FirstName} {LastName}\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping.json index 595a079..8a5dfbb 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","FirstName","LastName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"{FirstName} {LastName}"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student{ID}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","LastName","FirstName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student{ID}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"{FirstName} {LastName}"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping_pretty.dot index 528e31c..2681511 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0003c-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, FirstName, LastName, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"{FirstName} {LastName}\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student{ID}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, LastName, FirstName, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student{ID}\" } } }\l?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"{FirstName} {LastName}\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping.dot index a6ff730..439b09b 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping.dot @@ -1,13 +1,13 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student_sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Student\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Sport\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"student_sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"Sport\"]},\"type\":\"ProjectOp\"}}" ] - 4 [ label = "{\"id\":\"ExtendOp_4\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Student\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Student}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 5 [ label = "{\"id\":\"Serialize_5\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm .\\n?tm0_sm ?tm1_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] + 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"Student\"]},\"type\":\"ProjectOp\"}}" ] + 4 [ label = "{\"id\":\"ExtendOp_4\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Sport\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Sport}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 5 [ label = "{\"id\":\"Serialize_5\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm .\\n?tm0_sm ?tm1_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 6 [ label = "{\"id\":\"Sink_6\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] - 7 [ label = "{\"id\":\"ExtendOp_7\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Sport\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Sport}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm .\\n?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] + 7 [ label = "{\"id\":\"ExtendOp_7\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Student\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Student}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm .\\n?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 9 [ label = "{\"id\":\"Sink_9\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 0 -> 1 [ label = "{\"fragment\": default}" ] 2 -> 3 [ label = "{\"fragment\": default}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping.json index 8d75a47..918666c 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student_sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Student"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"student_sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["Sport"]}}},{"id":"ExtendOp_4","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Student"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Student}"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_5","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm .\n?tm0_sm ?tm1_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_6","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_7","operator":{"type":"ExtendOp","config":{"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Sport"},"dtype_function":null,"langtype_function":null},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Sport}"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm .\n?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[5,6,{"fragment":"default"}],[3,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student_sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Sport"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"student_sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["Student"]}}},{"id":"ExtendOp_4","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Sport"},"dtype_function":null,"langtype_function":null},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Sport}"}}}}}},{"id":"Serialize_5","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm .\n?tm0_sm ?tm1_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_6","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_7","operator":{"type":"ExtendOp","config":{"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Student}"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Student"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm .\n?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[5,6,{"fragment":"default"}],[3,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping_pretty.dot index 8e31b9a..965a206 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0004a-CSV/mapping_pretty.dot @@ -1,13 +1,13 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student_sport.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Student, " ] - 2 [ label = "id:Source_2 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student_sport.csv\"\l}\l " ] - 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: Sport, " ] - 4 [ label = "id:ExtendOp_4 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Student\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Student}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] - 5 [ label = "id:Serialize_5 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm .\l?tm0_sm ?tm1_p0_0 ?tm0_o0_0 ." ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student_sport.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Sport, " ] + 2 [ label = "id:Source_2 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student_sport.csv\"\l}\l " ] + 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: Student, " ] + 4 [ label = "id:ExtendOp_4 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Sport\" }, dtype_function: None, langtype_function: None }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Sport}\" } } }" ] + 5 [ label = "id:Serialize_5 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm .\l?tm0_sm ?tm1_p0_0 ?tm0_o0_0 ." ] 6 [ label = "id:Sink_6 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 7 [ label = "id:ExtendOp_7 \lExtension Operator\lExtended pairs: \l ?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Sport\" }, dtype_function: None, langtype_function: None }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Sport}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] - 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm .\l?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ." ] + 7 [ label = "id:ExtendOp_7 \lExtension Operator\lExtended pairs: \l ?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Student}\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Student\" }, dtype_function: None, langtype_function: None }" ] + 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm .\l?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ." ] 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] 2 -> 3 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0005a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0005a-CSV/mapping_pretty.dot index 284e682..1d07d86 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0005a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0005a-CSV/mapping_pretty.dot @@ -1,5 +1,5 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"ious.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"ious.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: fname, lname, amount, " ] 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"amount\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{fname};{lname}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/owes\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm .\l?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0006a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0006a-CSV/mapping.json index 8833444..80453fb 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0006a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0006a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":[]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/student"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/description"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Constant","value":"Bad Student"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/BadStudent"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":[]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/student"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Constant","value":"Bad Student"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/BadStudent"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/description"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0006a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0006a-CSV/mapping_pretty.dot index e3d81c0..58859fc 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0006a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0006a-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/student\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/description\" } } }\l?tm0_o0_0 -> Literal { inner_function: Constant { value: \"Bad Student\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/BadStudent\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/student\" } } }\l?tm0_o0_0 -> Literal { inner_function: Constant { value: \"Bad Student\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/BadStudent\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/description\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0007a-CSV/mapping.json index 3a32bf1..fff0841 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0007a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0007a-CSV/mapping_pretty.dot index 04b02ee..4b69682 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007a-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: FirstName, ID, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0007b-CSV/mapping.json index 610a380..24560a1 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0007b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/PersonGraph"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/PersonGraph"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0007b-CSV/mapping_pretty.dot index 2a1b369..eb0fe2f 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007b-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: FirstName, ID, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/PersonGraph\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/PersonGraph\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping.dot index ac53a8a..5f6c4a0 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"FirstName\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"FirstName\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"ID\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_o1_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"FirstName\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/id\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{FirstName}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm .\\n?tm0_sm .\\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping.json index 089835c..642cee2 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm .\n?tm0_sm .\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","FirstName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm .\n?tm0_sm .\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping_pretty.dot index 35d1074..16921c2 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007c-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: FirstName, ID, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, FirstName, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm .\l?tm0_sm .\l?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping.dot index af0989b..b2112ce 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"FirstName\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"FirstName\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/Person\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_o1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/Student\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_o2_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"ID\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_o3_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"FirstName\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p2_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/id\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p3_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{FirstName}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p1_0 ?tm0_o0_0 .\\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 .\\n?tm0_sm ?tm0_p3_0 ?tm0_o3_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping.json index 90c0d7f..0418cd8 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/Student"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_o2_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_p3_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_p2_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_o3_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p1_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 .\n?tm0_sm ?tm0_p3_0 ?tm0_o3_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","FirstName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/Student"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_o2_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_p3_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_p2_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_o3_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p1_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 .\n?tm0_sm ?tm0_p3_0 ?tm0_o3_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping_pretty.dot index de185d7..abeb4b1 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007d-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: FirstName, ID, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/Student\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_o2_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_p3_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_p2_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_o3_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, FirstName, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/Student\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_o2_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_p3_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_p2_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_o3_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p1_0 ?tm0_o0_0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\l?tm0_sm ?tm0_p2_0 ?tm0_o2_0 .\l?tm0_sm ?tm0_p3_0 ?tm0_o3_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007e-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0007e-CSV/mapping.json index d360755..995e9d9 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007e-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0007e-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/PersonGraph"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}},"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/PersonGraph"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007e-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0007e-CSV/mapping_pretty.dot index 6f381f3..d5efdd8 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007e-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007e-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, ID, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/PersonGraph\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }\l?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/PersonGraph\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007f-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0007f-CSV/mapping.json index dd76c8c..fdc634a 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007f-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0007f-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","FirstName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/PersonGraph"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_o2_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_p2_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","FirstName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_p2_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_o2_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/PersonGraph"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007f-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0007f-CSV/mapping_pretty.dot index c05ce80..842aebd 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007f-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007f-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, FirstName, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/PersonGraph\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_o2_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_p2_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_p2_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_o2_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/PersonGraph\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p2_0 ?tm0_o2_0 ?tm0_sm_gm0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping.dot index 50bc6ba..0532162 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"FirstName\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"FirstName\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"FirstName\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{FirstName}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/ns/r2rml#defaultGraph\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping.json index 1cb0b41..8d788d7 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","FirstName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/ns/r2rml#defaultGraph"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/ns/r2rml#defaultGraph"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{FirstName}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping_pretty.dot index 5fdf9ef..bd1e1b5 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0007g-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, FirstName, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/ns/r2rml#defaultGraph\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: FirstName, ID, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/ns/r2rml#defaultGraph\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{FirstName}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping.dot index 4ac0098..b8ee330 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Sport\",\"Name\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"Sport\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/Person\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_o1_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"ID\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_o2_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_o3_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Sport\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/id\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p2_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p3_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/Sport\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/graph/Student/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .\\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 ?tm0_sm_gm0 .\\n?tm0_sm ?tm0_p3_0 ?tm0_o3_0 ?tm0_sm_gm0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping.json index a3856d7..21a1afd 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Sport","Name","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o2_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_p3_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/Sport"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_p2_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}},"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/graph/Student/{ID}/{Name}"}}},"?tm0_o3_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Sport"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p3_0 ?tm0_o3_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","Sport","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm0_p3_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/Sport"}}},"?tm0_o3_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Sport"},"dtype_function":null,"langtype_function":null},"?tm0_o2_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}},"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/graph/Student/{ID}/{Name}"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_p2_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p3_0 ?tm0_o3_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping_pretty.dot index 8601089..4b471bf 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0008a-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Sport, Name, ID, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o2_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_p3_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/Sport\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_p2_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }\l?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/graph/Student/{ID}/{Name}\" } } }\l?tm0_o3_0 -> Literal { inner_function: Reference { value: \"Sport\" }, dtype_function: None, langtype_function: None }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, Sport, ID, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm0_p3_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/Sport\" } } }\l?tm0_o3_0 -> Literal { inner_function: Reference { value: \"Sport\" }, dtype_function: None, langtype_function: None }\l?tm0_o2_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }\l?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/graph/Student/{ID}/{Name}\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_p2_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p2_0 ?tm0_o2_0 ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p3_0 ?tm0_o3_0 ?tm0_sm_gm0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping.dot index a7687eb..7a520dd 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping.dot @@ -1,26 +1,26 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Sport\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] - 4 [ label = "{\"id\":\"Fragmenter_4\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_0\"]},\"type\":\"FragmentOp\"}}" ] - 5 [ label = "{\"id\":\"Fragmenter_5\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_0\"]},\"type\":\"FragmentOp\"}}" ] - 6 [ label = "{\"id\":\"Join_6\",\"operator\":{\"config\":{\"join_alias\":\"join_0\",\"join_type\":\"NaturalJoin\",\"left_right_attr_pairs\":[],\"predicate_type\":\"Equal\"},\"type\":\"JoinOp\"}}" ] - 7 [ label = "{\"id\":\"Extend_7\",\"operator\":{\"config\":{\"?tm1_o3_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{join_0_Sport}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p3_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/Sport\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p3_0 ?tm1_o3_0 .\"},\"type\":\"SerializerOp\"}}" ] + 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"Sport\"]},\"type\":\"ProjectOp\"}}" ] + 4 [ label = "{\"id\":\"Fragmenter_4\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_1\"]},\"type\":\"FragmentOp\"}}" ] + 5 [ label = "{\"id\":\"Fragmenter_5\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_1\"]},\"type\":\"FragmentOp\"}}" ] + 6 [ label = "{\"id\":\"Join_6\",\"operator\":{\"config\":{\"join_alias\":\"join_1\",\"join_type\":\"NaturalJoin\",\"left_right_attr_pairs\":[],\"predicate_type\":\"Equal\"},\"type\":\"JoinOp\"}}" ] + 7 [ label = "{\"id\":\"Extend_7\",\"operator\":{\"config\":{\"?tm0_o3_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{join_1_Sport}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p3_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/Sport\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p3_0 ?tm0_o3_0 .\"},\"type\":\"SerializerOp\"}}" ] 9 [ label = "{\"id\":\"Sink_9\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] - 10 [ label = "{\"id\":\"ExtendOp_10\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/Person\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_o1_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"ID\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_o2_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/id\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p2_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 11 [ label = "{\"id\":\"Serialize_11\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 .\\n?tm1_sm ?tm1_p2_0 ?tm1_o2_0 .\"},\"type\":\"SerializerOp\"}}" ] + 10 [ label = "{\"id\":\"ExtendOp_10\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/Person\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_o1_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"ID\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_o2_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/id\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p2_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 11 [ label = "{\"id\":\"Serialize_11\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 .\\n?tm0_sm ?tm1_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 12 [ label = "{\"id\":\"Sink_12\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] - 13 [ label = "{\"id\":\"ExtendOp_13\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/activity/Sport\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Sport}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 14 [ label = "{\"id\":\"Serialize_14\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm1_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] + 13 [ label = "{\"id\":\"ExtendOp_13\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/activity/Sport\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Sport}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 14 [ label = "{\"id\":\"Serialize_14\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 15 [ label = "{\"id\":\"Sink_15\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 0 -> 1 [ label = "{\"fragment\": default}" ] 2 -> 3 [ label = "{\"fragment\": default}" ] - 1 -> 4 [ label = "{\"fragment\": default}" ] - 3 -> 5 [ label = "{\"fragment\": default}" ] - 5 -> 6 [ label = "{\"fragment\": join_0}" ] - 4 -> 6 [ label = "{\"fragment\": join_0}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 1 -> 5 [ label = "{\"fragment\": default}" ] + 5 -> 6 [ label = "{\"fragment\": join_1}" ] + 4 -> 6 [ label = "{\"fragment\": join_1}" ] 6 -> 7 [ label = "{\"fragment\": default}" ] 7 -> 8 [ label = "{\"fragment\": default}" ] 8 -> 9 [ label = "{\"fragment\": default}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping.json index 5919581..d3f07aa 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Sport"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"Fragmenter_4","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_0"]}}},{"id":"Fragmenter_5","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_0"]}}},{"id":"Join_6","operator":{"type":"JoinOp","config":{"left_right_attr_pairs":[],"join_type":"NaturalJoin","predicate_type":"Equal","join_alias":"join_0"}}},{"id":"Extend_7","operator":{"type":"ExtendOp","config":{"?tm1_p3_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/Sport"}}},"?tm1_o3_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{join_0_Sport}"}}},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p3_0 ?tm1_o3_0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_10","operator":{"type":"ExtendOp","config":{"?tm1_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm1_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm1_p2_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm1_o2_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}},"?tm1_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}}}}},{"id":"Serialize_11","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 .\n?tm1_sm ?tm1_p2_0 ?tm1_o2_0 .","format":"NQuads"}}},{"id":"Sink_12","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_13","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/activity/Sport"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Sport}"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}}}}},{"id":"Serialize_14","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm1_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_15","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[3,5,{"fragment":"default"}],[5,6,{"fragment":"join_0"}],[4,6,{"fragment":"join_0"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}],[5,10,{"fragment":"default"}],[10,11,{"fragment":"default"}],[11,12,{"fragment":"default"}],[4,13,{"fragment":"default"}],[13,14,{"fragment":"default"}],[14,15,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["Sport"]}}},{"id":"Fragmenter_4","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_1"]}}},{"id":"Fragmenter_5","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_1"]}}},{"id":"Join_6","operator":{"type":"JoinOp","config":{"left_right_attr_pairs":[],"join_type":"NaturalJoin","predicate_type":"Equal","join_alias":"join_1"}}},{"id":"Extend_7","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}},"?tm0_p3_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/Sport"}}},"?tm0_o3_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{join_1_Sport}"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p3_0 ?tm0_o3_0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_10","operator":{"type":"ExtendOp","config":{"?tm0_p2_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_o2_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}}}}},{"id":"Serialize_11","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\n?tm0_sm ?tm0_p2_0 ?tm0_o2_0 .\n?tm0_sm ?tm1_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_12","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_13","operator":{"type":"ExtendOp","config":{"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Sport}"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm1_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/activity/Sport"}}}}}},{"id":"Serialize_14","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .","format":"NQuads"}}},{"id":"Sink_15","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[1,5,{"fragment":"default"}],[5,6,{"fragment":"join_1"}],[4,6,{"fragment":"join_1"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}],[5,10,{"fragment":"default"}],[10,11,{"fragment":"default"}],[11,12,{"fragment":"default"}],[4,13,{"fragment":"default"}],[13,14,{"fragment":"default"}],[14,15,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping_pretty.dot index b3b7bbd..e74e8ca 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0008b-CSV/mapping_pretty.dot @@ -1,26 +1,26 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Sport, " ] - 2 [ label = "id:Source_2 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: ID, Name, " ] - 4 [ label = "id:Fragmenter_4 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_0\"]" ] - 5 [ label = "id:Fragmenter_5 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_0\"]" ] - 6 [ label = "id:Join_6 \lJoin Operator\ltype: NaturalJoin\lpredicate_type: Equal\lattribute_pairs: []\lptm_alias: join_0" ] - 7 [ label = "id:Extend_7 \lExtension Operator\lExtended pairs: \l ?tm1_p3_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/Sport\" } } }\l?tm1_o3_0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{join_0_Sport}\" } } }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }" ] - 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p3_0 ?tm1_o3_0 ." ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, Name, " ] + 2 [ label = "id:Source_2 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: Sport, " ] + 4 [ label = "id:Fragmenter_4 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_1\"]" ] + 5 [ label = "id:Fragmenter_5 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_1\"]" ] + 6 [ label = "id:Join_6 \lJoin Operator\ltype: NaturalJoin\lpredicate_type: Equal\lattribute_pairs: []\lptm_alias: join_1" ] + 7 [ label = "id:Extend_7 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }\l?tm0_p3_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/Sport\" } } }\l?tm0_o3_0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{join_1_Sport}\" } } }" ] + 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p3_0 ?tm0_o3_0 ." ] 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 10 [ label = "id:ExtendOp_10 \lExtension Operator\lExtended pairs: \l ?tm1_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm1_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm1_p2_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm1_o2_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }\l?tm1_o1_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }" ] - 11 [ label = "id:Serialize_11 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\l?tm1_sm ?tm1_p1_0 ?tm1_o1_0 .\l?tm1_sm ?tm1_p2_0 ?tm1_o2_0 ." ] + 10 [ label = "id:ExtendOp_10 \lExtension Operator\lExtended pairs: \l ?tm0_p2_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_o2_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }" ] + 11 [ label = "id:Serialize_11 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\l?tm0_sm ?tm0_p2_0 ?tm0_o2_0 .\l?tm0_sm ?tm1_p0_0 ?tm0_o0_0 ." ] 12 [ label = "id:Sink_12 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 13 [ label = "id:ExtendOp_13 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/activity/Sport\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Sport}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }" ] - 14 [ label = "id:Serialize_14 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm1_p0_0 ?tm0_o0_0 ." ] + 13 [ label = "id:ExtendOp_13 \lExtension Operator\lExtended pairs: \l ?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Sport}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm1_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/activity/Sport\" } } }" ] + 14 [ label = "id:Serialize_14 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ." ] 15 [ label = "id:Sink_15 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] 2 -> 3 [ label = "Fragment:default" ] - 1 -> 4 [ label = "Fragment:default" ] - 3 -> 5 [ label = "Fragment:default" ] - 5 -> 6 [ label = "Fragment:join_0" ] - 4 -> 6 [ label = "Fragment:join_0" ] + 3 -> 4 [ label = "Fragment:default" ] + 1 -> 5 [ label = "Fragment:default" ] + 5 -> 6 [ label = "Fragment:join_1" ] + 4 -> 6 [ label = "Fragment:join_1" ] 6 -> 7 [ label = "Fragment:default" ] 7 -> 8 [ label = "Fragment:default" ] 8 -> 9 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping.dot index ee35fc6..7fadb79 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p0_1\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/Student/{ID}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\\n?tm0_sm ?tm0_p0_1 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping.json index 67f84a8..9b91bb0 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_p0_1":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p0_1 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","ID"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_1":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/Student/{ID}/{Name}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p0_1 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping_pretty.dot index 52578ca..fc5c105 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0008c-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_p0_1 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, ID, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_1 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/Student/{ID}/{Name}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\l?tm0_sm ?tm0_p0_1 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping.dot index a1066ca..6182034 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping.dot @@ -1,26 +1,26 @@ digraph { - 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"ID\",\"Sport\"]},\"type\":\"ProjectOp\"}}" ] - 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] - 4 [ label = "{\"id\":\"Fragmenter_4\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_1\"]},\"type\":\"FragmentOp\"}}" ] - 5 [ label = "{\"id\":\"Fragmenter_5\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_1\"]},\"type\":\"FragmentOp\"}}" ] - 6 [ label = "{\"id\":\"Join_6\",\"operator\":{\"config\":{\"join_alias\":\"join_1\",\"join_type\":\"InnerJoin\",\"left_right_attr_pairs\":[[\"Sport\",\"ID\"]],\"predicate_type\":\"Equal\"},\"type\":\"JoinOp\"}}" ] - 7 [ label = "{\"id\":\"Extend_7\",\"operator\":{\"config\":{\"?tm0_o1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/sport_{join_1_ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/ontology/practises\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/student_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\"},\"type\":\"SerializerOp\"}}" ] + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] + 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Sport\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] + 4 [ label = "{\"id\":\"Fragmenter_4\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_0\"]},\"type\":\"FragmentOp\"}}" ] + 5 [ label = "{\"id\":\"Fragmenter_5\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_0\"]},\"type\":\"FragmentOp\"}}" ] + 6 [ label = "{\"id\":\"Join_6\",\"operator\":{\"config\":{\"join_alias\":\"join_0\",\"join_type\":\"InnerJoin\",\"left_right_attr_pairs\":[[\"Sport\",\"ID\"]],\"predicate_type\":\"Equal\"},\"type\":\"JoinOp\"}}" ] + 7 [ label = "{\"id\":\"Extend_7\",\"operator\":{\"config\":{\"?tm1_o1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/sport_{join_0_ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/ontology/practises\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/student_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p1_0 ?tm1_o1_0 .\"},\"type\":\"SerializerOp\"}}" ] 9 [ label = "{\"id\":\"Sink_9\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] - 10 [ label = "{\"id\":\"ExtendOp_10\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/student_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 11 [ label = "{\"id\":\"Serialize_11\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] + 10 [ label = "{\"id\":\"ExtendOp_10\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/student_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 11 [ label = "{\"id\":\"Serialize_11\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 12 [ label = "{\"id\":\"Sink_12\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] - 13 [ label = "{\"id\":\"ExtendOp_13\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/2000/01/rdf-schema#label\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/sport_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 14 [ label = "{\"id\":\"Serialize_14\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] + 13 [ label = "{\"id\":\"ExtendOp_13\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/2000/01/rdf-schema#label\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/sport_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 14 [ label = "{\"id\":\"Serialize_14\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 15 [ label = "{\"id\":\"Sink_15\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 0 -> 1 [ label = "{\"fragment\": default}" ] 2 -> 3 [ label = "{\"fragment\": default}" ] - 3 -> 4 [ label = "{\"fragment\": default}" ] - 1 -> 5 [ label = "{\"fragment\": default}" ] - 5 -> 6 [ label = "{\"fragment\": join_1}" ] - 4 -> 6 [ label = "{\"fragment\": join_1}" ] + 1 -> 4 [ label = "{\"fragment\": default}" ] + 3 -> 5 [ label = "{\"fragment\": default}" ] + 5 -> 6 [ label = "{\"fragment\": join_0}" ] + 4 -> 6 [ label = "{\"fragment\": join_0}" ] 6 -> 7 [ label = "{\"fragment\": default}" ] 7 -> 8 [ label = "{\"fragment\": default}" ] 8 -> 9 [ label = "{\"fragment\": default}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping.json index 56e5ef0..a34b88f 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","ID","Sport"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"Fragmenter_4","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_1"]}}},{"id":"Fragmenter_5","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_1"]}}},{"id":"Join_6","operator":{"type":"JoinOp","config":{"left_right_attr_pairs":[["Sport","ID"]],"join_type":"InnerJoin","predicate_type":"Equal","join_alias":"join_1"}}},{"id":"Extend_7","operator":{"type":"ExtendOp","config":{"?tm0_o1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/sport_{join_1_ID}"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/ontology/practises"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/student_{ID}"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_10","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/student_{ID}"}}}}}},{"id":"Serialize_11","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_12","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_13","operator":{"type":"ExtendOp","config":{"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/sport_{ID}"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_14","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .","format":"NQuads"}}},{"id":"Sink_15","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[1,5,{"fragment":"default"}],[5,6,{"fragment":"join_1"}],[4,6,{"fragment":"join_1"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}],[5,10,{"fragment":"default"}],[10,11,{"fragment":"default"}],[11,12,{"fragment":"default"}],[4,13,{"fragment":"default"}],[13,14,{"fragment":"default"}],[14,15,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Sport","Name"]}}},{"id":"Fragmenter_4","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_0"]}}},{"id":"Fragmenter_5","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_0"]}}},{"id":"Join_6","operator":{"type":"JoinOp","config":{"left_right_attr_pairs":[["Sport","ID"]],"join_type":"InnerJoin","predicate_type":"Equal","join_alias":"join_0"}}},{"id":"Extend_7","operator":{"type":"ExtendOp","config":{"?tm1_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/ontology/practises"}}},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/student_{ID}"}}},"?tm1_o1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/sport_{join_0_ID}"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p1_0 ?tm1_o1_0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_10","operator":{"type":"ExtendOp","config":{"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/student_{ID}"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}}}}},{"id":"Serialize_11","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .","format":"NQuads"}}},{"id":"Sink_12","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_13","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/sport_{ID}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_14","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_15","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[3,5,{"fragment":"default"}],[5,6,{"fragment":"join_0"}],[4,6,{"fragment":"join_0"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}],[5,10,{"fragment":"default"}],[10,11,{"fragment":"default"}],[11,12,{"fragment":"default"}],[4,13,{"fragment":"default"}],[13,14,{"fragment":"default"}],[14,15,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping_pretty.dot index c3482a1..48e2fba 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0009a-CSV/mapping_pretty.dot @@ -1,26 +1,26 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, ID, Sport, " ] - 2 [ label = "id:Source_2 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"sport.csv\"\l}\l " ] - 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: ID, Name, " ] - 4 [ label = "id:Fragmenter_4 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_1\"]" ] - 5 [ label = "id:Fragmenter_5 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_1\"]" ] - 6 [ label = "id:Join_6 \lJoin Operator\ltype: InnerJoin\lpredicate_type: Equal\lattribute_pairs: [\l [\l \"Sport\",\l \"ID\"\l ]\l]\lptm_alias: join_1" ] - 7 [ label = "id:Extend_7 \lExtension Operator\lExtended pairs: \l ?tm0_o1_0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/sport_{join_1_ID}\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/ontology/practises\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/student_{ID}\" } } }" ] - 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ." ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"sport.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID, Name, " ] + 2 [ label = "id:Source_2 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: ID, Sport, Name, " ] + 4 [ label = "id:Fragmenter_4 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_0\"]" ] + 5 [ label = "id:Fragmenter_5 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_0\"]" ] + 6 [ label = "id:Join_6 \lJoin Operator\ltype: InnerJoin\lpredicate_type: Equal\lattribute_pairs: [\l [\l \"Sport\",\l \"ID\"\l ]\l]\lptm_alias: join_0" ] + 7 [ label = "id:Extend_7 \lExtension Operator\lExtended pairs: \l ?tm1_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/ontology/practises\" } } }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/student_{ID}\" } } }\l?tm1_o1_0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/sport_{join_0_ID}\" } } }" ] + 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p1_0 ?tm1_o1_0 ." ] 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 10 [ label = "id:ExtendOp_10 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/student_{ID}\" } } }" ] - 11 [ label = "id:Serialize_11 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] + 10 [ label = "id:ExtendOp_10 \lExtension Operator\lExtended pairs: \l ?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/student_{ID}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] + 11 [ label = "id:Serialize_11 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ." ] 12 [ label = "id:Sink_12 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 13 [ label = "id:ExtendOp_13 \lExtension Operator\lExtended pairs: \l ?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/sport_{ID}\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] - 14 [ label = "id:Serialize_14 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ." ] + 13 [ label = "id:ExtendOp_13 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/sport_{ID}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] + 14 [ label = "id:Serialize_14 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 15 [ label = "id:Sink_15 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] 2 -> 3 [ label = "Fragment:default" ] - 3 -> 4 [ label = "Fragment:default" ] - 1 -> 5 [ label = "Fragment:default" ] - 5 -> 6 [ label = "Fragment:join_1" ] - 4 -> 6 [ label = "Fragment:join_1" ] + 1 -> 4 [ label = "Fragment:default" ] + 3 -> 5 [ label = "Fragment:default" ] + 5 -> 6 [ label = "Fragment:join_0" ] + 4 -> 6 [ label = "Fragment:join_0" ] 6 -> 7 [ label = "Fragment:default" ] 7 -> 8 [ label = "Fragment:default" ] 8 -> 9 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping.dot index 5b882b6..2560509 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping.dot @@ -1,26 +1,26 @@ digraph { - 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Sport\",\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] - 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] - 4 [ label = "{\"id\":\"Fragmenter_4\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_1\"]},\"type\":\"FragmentOp\"}}" ] - 5 [ label = "{\"id\":\"Fragmenter_5\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_1\"]},\"type\":\"FragmentOp\"}}" ] - 6 [ label = "{\"id\":\"Join_6\",\"operator\":{\"config\":{\"join_alias\":\"join_1\",\"join_type\":\"InnerJoin\",\"left_right_attr_pairs\":[[\"Sport\",\"ID\"]],\"predicate_type\":\"Equal\"},\"type\":\"JoinOp\"}}" ] - 7 [ label = "{\"id\":\"Extend_7\",\"operator\":{\"config\":{\"?tm0_o1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/sport_{join_1_ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/ontology/practises\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_pom0_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/graph/students\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_pom1_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/graph/practise\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/student_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_pom0_gm0 .\\n?tm0_sm ?tm0_pom1_gm0 .\\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_pom0_gm0 .\\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_pom1_gm0 .\"},\"type\":\"SerializerOp\"}}" ] + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Sport\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] + 4 [ label = "{\"id\":\"Fragmenter_4\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_0\"]},\"type\":\"FragmentOp\"}}" ] + 5 [ label = "{\"id\":\"Fragmenter_5\",\"operator\":{\"config\":{\"from\":\"default\",\"to\":[\"default\",\"join_0\"]},\"type\":\"FragmentOp\"}}" ] + 6 [ label = "{\"id\":\"Join_6\",\"operator\":{\"config\":{\"join_alias\":\"join_0\",\"join_type\":\"InnerJoin\",\"left_right_attr_pairs\":[[\"Sport\",\"ID\"]],\"predicate_type\":\"Equal\"},\"type\":\"JoinOp\"}}" ] + 7 [ label = "{\"id\":\"Extend_7\",\"operator\":{\"config\":{\"?tm1_o1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/sport_{join_0_ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/ontology/practises\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_pom0_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/graph/students\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_pom1_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/graph/practise\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/student_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_pom0_gm0 .\\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 ?tm1_pom0_gm0 .\\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 ?tm1_pom1_gm0 .\"},\"type\":\"SerializerOp\"}}" ] 9 [ label = "{\"id\":\"Sink_9\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] - 10 [ label = "{\"id\":\"ExtendOp_10\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_pom0_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/graph/students\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/student_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 11 [ label = "{\"id\":\"Serialize_11\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_pom0_gm0 .\\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_pom0_gm0 .\"},\"type\":\"SerializerOp\"}}" ] + 10 [ label = "{\"id\":\"ExtendOp_10\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_pom0_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/graph/students\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/student_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 11 [ label = "{\"id\":\"Serialize_11\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_pom0_gm0 .\\n?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ?tm1_pom0_gm0 .\"},\"type\":\"SerializerOp\"}}" ] 12 [ label = "{\"id\":\"Sink_12\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] - 13 [ label = "{\"id\":\"ExtendOp_13\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/2000/01/rdf-schema#label\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/sport_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/graph/sports\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 14 [ label = "{\"id\":\"Serialize_14\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_sm_gm0 .\\n?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ?tm1_sm_gm0 .\"},\"type\":\"SerializerOp\"}}" ] + 13 [ label = "{\"id\":\"ExtendOp_13\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/2000/01/rdf-schema#label\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/resource/sport_{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm_gm0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/graph/sports\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 14 [ label = "{\"id\":\"Serialize_14\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_sm_gm0 .\\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .\"},\"type\":\"SerializerOp\"}}" ] 15 [ label = "{\"id\":\"Sink_15\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 0 -> 1 [ label = "{\"fragment\": default}" ] 2 -> 3 [ label = "{\"fragment\": default}" ] - 3 -> 4 [ label = "{\"fragment\": default}" ] - 1 -> 5 [ label = "{\"fragment\": default}" ] - 5 -> 6 [ label = "{\"fragment\": join_1}" ] - 4 -> 6 [ label = "{\"fragment\": join_1}" ] + 1 -> 4 [ label = "{\"fragment\": default}" ] + 3 -> 5 [ label = "{\"fragment\": default}" ] + 5 -> 6 [ label = "{\"fragment\": join_0}" ] + 4 -> 6 [ label = "{\"fragment\": join_0}" ] 6 -> 7 [ label = "{\"fragment\": default}" ] 7 -> 8 [ label = "{\"fragment\": default}" ] 8 -> 9 [ label = "{\"fragment\": default}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping.json index 8d301f1..5c6fefb 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Sport","ID","Name"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Name"]}}},{"id":"Fragmenter_4","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_1"]}}},{"id":"Fragmenter_5","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_1"]}}},{"id":"Join_6","operator":{"type":"JoinOp","config":{"left_right_attr_pairs":[["Sport","ID"]],"join_type":"InnerJoin","predicate_type":"Equal","join_alias":"join_1"}}},{"id":"Extend_7","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/student_{ID}"}}},"?tm0_pom0_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/students"}}},"?tm0_pom1_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/practise"}}},"?tm0_o1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/sport_{join_1_ID}"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/ontology/practises"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_pom0_gm0 .\n?tm0_sm ?tm0_pom1_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_pom0_gm0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_pom1_gm0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_10","operator":{"type":"ExtendOp","config":{"?tm0_pom0_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/students"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/student_{ID}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_11","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_pom0_gm0 .\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_pom0_gm0 .","format":"NQuads"}}},{"id":"Sink_12","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_13","operator":{"type":"ExtendOp","config":{"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/sport_{ID}"}}},"?tm1_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/sports"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_14","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_sm_gm0 .\n?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ?tm1_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_15","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[1,5,{"fragment":"default"}],[5,6,{"fragment":"join_1"}],[4,6,{"fragment":"join_1"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}],[5,10,{"fragment":"default"}],[10,11,{"fragment":"default"}],[11,12,{"fragment":"default"}],[4,13,{"fragment":"default"}],[13,14,{"fragment":"default"}],[14,15,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","ID"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Sport","Name"]}}},{"id":"Fragmenter_4","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_0"]}}},{"id":"Fragmenter_5","operator":{"type":"FragmentOp","config":{"from":"default","to":["default","join_0"]}}},{"id":"Join_6","operator":{"type":"JoinOp","config":{"left_right_attr_pairs":[["Sport","ID"]],"join_type":"InnerJoin","predicate_type":"Equal","join_alias":"join_0"}}},{"id":"Extend_7","operator":{"type":"ExtendOp","config":{"?tm1_pom0_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/students"}}},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/student_{ID}"}}},"?tm1_o1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/sport_{join_0_ID}"}}},"?tm1_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/ontology/practises"}}},"?tm1_pom1_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/practise"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_pom0_gm0 .\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 ?tm1_pom0_gm0 .\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 ?tm1_pom1_gm0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_10","operator":{"type":"ExtendOp","config":{"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm1_pom0_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/students"}}},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/student_{ID}"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_11","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_pom0_gm0 .\n?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ?tm1_pom0_gm0 .","format":"NQuads"}}},{"id":"Sink_12","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_13","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm0_sm_gm0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/graph/sports"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/resource/sport_{ID}"}}}}}},{"id":"Serialize_14","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_sm_gm0 .\n?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 .","format":"NQuads"}}},{"id":"Sink_15","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[3,5,{"fragment":"default"}],[5,6,{"fragment":"join_0"}],[4,6,{"fragment":"join_0"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}],[5,10,{"fragment":"default"}],[10,11,{"fragment":"default"}],[11,12,{"fragment":"default"}],[4,13,{"fragment":"default"}],[13,14,{"fragment":"default"}],[14,15,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping_pretty.dot index 461b36f..a539820 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0009b-CSV/mapping_pretty.dot @@ -1,26 +1,26 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Sport, ID, Name, " ] - 2 [ label = "id:Source_2 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"sport.csv\"\l}\l " ] - 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: ID, Name, " ] - 4 [ label = "id:Fragmenter_4 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_1\"]" ] - 5 [ label = "id:Fragmenter_5 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_1\"]" ] - 6 [ label = "id:Join_6 \lJoin Operator\ltype: InnerJoin\lpredicate_type: Equal\lattribute_pairs: [\l [\l \"Sport\",\l \"ID\"\l ]\l]\lptm_alias: join_1" ] - 7 [ label = "id:Extend_7 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/student_{ID}\" } } }\l?tm0_pom0_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/students\" } } }\l?tm0_pom1_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/practise\" } } }\l?tm0_o1_0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/sport_{join_1_ID}\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/ontology/practises\" } } }" ] - 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_pom0_gm0 .\l?tm0_sm ?tm0_pom1_gm0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_pom0_gm0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ?tm0_pom1_gm0 ." ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"sport.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, ID, " ] + 2 [ label = "id:Source_2 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: ID, Sport, Name, " ] + 4 [ label = "id:Fragmenter_4 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_0\"]" ] + 5 [ label = "id:Fragmenter_5 \lFragment Operator\lfrom_fragment: default \l to_fragments: [\"default\",\"join_0\"]" ] + 6 [ label = "id:Join_6 \lJoin Operator\ltype: InnerJoin\lpredicate_type: Equal\lattribute_pairs: [\l [\l \"Sport\",\l \"ID\"\l ]\l]\lptm_alias: join_0" ] + 7 [ label = "id:Extend_7 \lExtension Operator\lExtended pairs: \l ?tm1_pom0_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/students\" } } }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/student_{ID}\" } } }\l?tm1_o1_0 -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/sport_{join_0_ID}\" } } }\l?tm1_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/ontology/practises\" } } }\l?tm1_pom1_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/practise\" } } }" ] + 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_pom0_gm0 .\l?tm1_sm ?tm1_p1_0 ?tm1_o1_0 ?tm1_pom0_gm0 .\l?tm1_sm ?tm1_p1_0 ?tm1_o1_0 ?tm1_pom1_gm0 ." ] 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 10 [ label = "id:ExtendOp_10 \lExtension Operator\lExtended pairs: \l ?tm0_pom0_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/students\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/student_{ID}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] - 11 [ label = "id:Serialize_11 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_pom0_gm0 .\l?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_pom0_gm0 ." ] + 10 [ label = "id:ExtendOp_10 \lExtension Operator\lExtended pairs: \l ?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm1_pom0_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/students\" } } }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/student_{ID}\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] + 11 [ label = "id:Serialize_11 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_pom0_gm0 .\l?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ?tm1_pom0_gm0 ." ] 12 [ label = "id:Sink_12 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 13 [ label = "id:ExtendOp_13 \lExtension Operator\lExtended pairs: \l ?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/sport_{ID}\" } } }\l?tm1_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/sports\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] - 14 [ label = "id:Serialize_14 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_sm_gm0 .\l?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ?tm1_sm_gm0 ." ] + 13 [ label = "id:ExtendOp_13 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm0_sm_gm0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/graph/sports\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/resource/sport_{ID}\" } } }" ] + 14 [ label = "id:Serialize_14 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_sm_gm0 .\l?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ?tm0_sm_gm0 ." ] 15 [ label = "id:Sink_15 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] 2 -> 3 [ label = "Fragment:default" ] - 3 -> 4 [ label = "Fragment:default" ] - 1 -> 5 [ label = "Fragment:default" ] - 5 -> 6 [ label = "Fragment:join_1" ] - 4 -> 6 [ label = "Fragment:join_1" ] + 1 -> 4 [ label = "Fragment:default" ] + 3 -> 5 [ label = "Fragment:default" ] + 5 -> 6 [ label = "Fragment:join_0" ] + 4 -> 6 [ label = "Fragment:join_0" ] 6 -> 7 [ label = "Fragment:default" ] 7 -> 8 [ label = "Fragment:default" ] 8 -> 9 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping.dot index fbcbea4..123b4fd 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"country_info.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Country Code\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"Country Code\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Country Code}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping.json index bd3c033..486d489 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_info.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Country Code","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Country Code}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_info.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","Country Code"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/name"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Country Code}"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping_pretty.dot index 977ba04..b8bee66 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0010a-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_info.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Country Code, Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Country Code}\" } } }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_info.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, Country Code, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/name\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Country Code}\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping.dot index 25abb34..d213e06 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"country_info.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Country Code\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"Country Code\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Country Code}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping.json index 8a5cea7..cb83b10 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_info.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Country Code","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Country Code}/{Name}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_info.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","Country Code"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Country Code}/{Name}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping_pretty.dot index 6c27dd3..852e35e 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0010b-CSV/mapping_pretty.dot @@ -1,6 +1,6 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_info.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Country Code, Name, " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_info.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, Country Code, " ] 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Country Code}/{Name}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping.dot index 0ce75c1..a387fd5 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"country_info.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Country Code\",\"ISO 3166\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Country Code\",\"Name\",\"ISO 3166\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"\\\\{\\\\{\\\\{ {ISO 3166} \\\\}\\\\}\\\\}\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/code\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Country Code}/{Name}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping.json index fac94b7..8d5703e 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_info.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Country Code","ISO 3166","Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Country Code}/{Name}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/code"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"\\{\\{\\{ {ISO 3166} \\}\\}\\}"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_info.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Country Code","Name","ISO 3166"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/code"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Country Code}/{Name}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"\\{\\{\\{ {ISO 3166} \\}\\}\\}"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping_pretty.dot index aedc38b..2f7d38f 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0010c-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_info.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Country Code, ISO 3166, Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Country Code}/{Name}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/code\" } } }\l?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"\\\\{\\\\{\\\\{ {ISO 3166} \\\\}\\\\}\\\\}\" }, dtype_function: None, langtype_function: None }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_info.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Country Code, Name, ISO 3166, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/code\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Country Code}/{Name}\" } } }\l?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"\\\\{\\\\{\\\\{ {ISO 3166} \\\\}\\\\}\\\\}\" }, dtype_function: None, langtype_function: None }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping.dot index cd7db7e..a355362 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping.dot @@ -1,18 +1,18 @@ digraph { - 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"LastName\",\"FirstName\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"student_sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID_Student\",\"ID_Sport\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID\",\"Description\"]},\"type\":\"ProjectOp\"}}" ] - 4 [ label = "{\"id\":\"Source_4\",\"operator\":{\"config\":{\"path\":\"student_sport.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 5 [ label = "{\"id\":\"Projection_5\",\"operator\":{\"config\":{\"projection_attributes\":[\"ID_Student\",\"ID_Sport\"]},\"type\":\"ProjectOp\"}}" ] - 6 [ label = "{\"id\":\"ExtendOp_6\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"FirstName\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_o1_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"LastName\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/firstName\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/lastName\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/student/{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 7 [ label = "{\"id\":\"Serialize_7\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\"},\"type\":\"SerializerOp\"}}" ] + 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"Description\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 4 [ label = "{\"id\":\"Source_4\",\"operator\":{\"config\":{\"path\":\"student.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 5 [ label = "{\"id\":\"Projection_5\",\"operator\":{\"config\":{\"projection_attributes\":[\"FirstName\",\"LastName\",\"ID\"]},\"type\":\"ProjectOp\"}}" ] + 6 [ label = "{\"id\":\"ExtendOp_6\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/sport/{ID_Sport}\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/plays\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/student/{ID_Student}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 7 [ label = "{\"id\":\"Serialize_7\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 8 [ label = "{\"id\":\"Sink_8\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 9 [ label = "{\"id\":\"ExtendOp_9\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"ID\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_o1_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Description\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/id\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/description\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/sport/{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] 10 [ label = "{\"id\":\"Serialize_10\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 .\"},\"type\":\"SerializerOp\"}}" ] 11 [ label = "{\"id\":\"Sink_11\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] - 12 [ label = "{\"id\":\"ExtendOp_12\",\"operator\":{\"config\":{\"?tm2_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/sport/{ID_Sport}\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm2_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/plays\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm2_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/student/{ID_Student}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 13 [ label = "{\"id\":\"Serialize_13\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm2_sm ?tm2_p0_0 ?tm2_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] + 12 [ label = "{\"id\":\"ExtendOp_12\",\"operator\":{\"config\":{\"?tm2_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"FirstName\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm2_o1_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"LastName\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm2_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/firstName\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm2_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/lastName\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm2_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/student/{ID}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 13 [ label = "{\"id\":\"Serialize_13\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm2_sm ?tm2_p0_0 ?tm2_o0_0 .\\n?tm2_sm ?tm2_p1_0 ?tm2_o1_0 .\"},\"type\":\"SerializerOp\"}}" ] 14 [ label = "{\"id\":\"Sink_14\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 0 -> 1 [ label = "{\"fragment\": default}" ] 2 -> 3 [ label = "{\"fragment\": default}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping.json index 34b9d5c..3506fef 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["LastName","FirstName","ID"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID","Description"]}}},{"id":"Source_4","operator":{"type":"SourceOp","config":{"path":"student_sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_5","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID_Student","ID_Sport"]}}},{"id":"ExtendOp_6","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/firstName"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"LastName"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/student/{ID}"}}},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/lastName"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_7","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .","format":"NQuads"}}},{"id":"Sink_8","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_9","operator":{"type":"ExtendOp","config":{"?tm1_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Description"},"dtype_function":null,"langtype_function":null},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/sport/{ID}"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm1_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/description"}}}}}},{"id":"Serialize_10","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 .","format":"NQuads"}}},{"id":"Sink_11","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_12","operator":{"type":"ExtendOp","config":{"?tm2_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"http://example.com/sport/{ID_Sport}"},"dtype_function":null,"langtype_function":null},"?tm2_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/plays"}}},"?tm2_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/student/{ID_Student}"}}}}}},{"id":"Serialize_13","operator":{"type":"SerializerOp","config":{"template":"?tm2_sm ?tm2_p0_0 ?tm2_o0_0 .","format":"NQuads"}}},{"id":"Sink_14","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[4,5,{"fragment":"default"}],[1,6,{"fragment":"default"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[3,9,{"fragment":"default"}],[9,10,{"fragment":"default"}],[10,11,{"fragment":"default"}],[5,12,{"fragment":"default"}],[12,13,{"fragment":"default"}],[13,14,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student_sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["ID_Student","ID_Sport"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"sport.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["Description","ID"]}}},{"id":"Source_4","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_5","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName","LastName","ID"]}}},{"id":"ExtendOp_6","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/plays"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/student/{ID_Student}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"http://example.com/sport/{ID_Sport}"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_7","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_8","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_9","operator":{"type":"ExtendOp","config":{"?tm1_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/description"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/id"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"ID"},"dtype_function":null,"langtype_function":null},"?tm1_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Description"},"dtype_function":null,"langtype_function":null},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/sport/{ID}"}}}}}},{"id":"Serialize_10","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\n?tm1_sm ?tm1_p1_0 ?tm1_o1_0 .","format":"NQuads"}}},{"id":"Sink_11","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_12","operator":{"type":"ExtendOp","config":{"?tm2_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm2_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/lastName"}}},"?tm2_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/student/{ID}"}}},"?tm2_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/firstName"}}},"?tm2_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"LastName"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_13","operator":{"type":"SerializerOp","config":{"template":"?tm2_sm ?tm2_p0_0 ?tm2_o0_0 .\n?tm2_sm ?tm2_p1_0 ?tm2_o1_0 .","format":"NQuads"}}},{"id":"Sink_14","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[4,5,{"fragment":"default"}],[1,6,{"fragment":"default"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[3,9,{"fragment":"default"}],[9,10,{"fragment":"default"}],[10,11,{"fragment":"default"}],[5,12,{"fragment":"default"}],[12,13,{"fragment":"default"}],[13,14,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping_pretty.dot index 9c5b389..d5217d1 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0011b-CSV/mapping_pretty.dot @@ -1,18 +1,18 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: LastName, FirstName, ID, " ] - 2 [ label = "id:Source_2 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"sport.csv\"\l}\l " ] - 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: ID, Description, " ] - 4 [ label = "id:Source_4 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student_sport.csv\"\l}\l " ] - 5 [ label = "id:Projection_5 \lProjection Operator\lProjected attributes: ID_Student, ID_Sport, " ] - 6 [ label = "id:ExtendOp_6 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/firstName\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"LastName\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/student/{ID}\" } } }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/lastName\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }" ] - 7 [ label = "id:Serialize_7 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ." ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student_sport.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: ID_Student, ID_Sport, " ] + 2 [ label = "id:Source_2 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"sport.csv\"\l}\l " ] + 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: Description, ID, " ] + 4 [ label = "id:Source_4 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 5 [ label = "id:Projection_5 \lProjection Operator\lProjected attributes: FirstName, LastName, ID, " ] + 6 [ label = "id:ExtendOp_6 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/plays\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/student/{ID_Student}\" } } }\l?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"http://example.com/sport/{ID_Sport}\" }, dtype_function: None, langtype_function: None }" ] + 7 [ label = "id:Serialize_7 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 8 [ label = "id:Sink_8 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 9 [ label = "id:ExtendOp_9 \lExtension Operator\lExtended pairs: \l ?tm1_o1_0 -> Literal { inner_function: Reference { value: \"Description\" }, dtype_function: None, langtype_function: None }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/sport/{ID}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm1_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/description\" } } }" ] + 9 [ label = "id:ExtendOp_9 \lExtension Operator\lExtended pairs: \l ?tm1_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/description\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/id\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"ID\" }, dtype_function: None, langtype_function: None }\l?tm1_o1_0 -> Literal { inner_function: Reference { value: \"Description\" }, dtype_function: None, langtype_function: None }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/sport/{ID}\" } } }" ] 10 [ label = "id:Serialize_10 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .\l?tm1_sm ?tm1_p1_0 ?tm1_o1_0 ." ] 11 [ label = "id:Sink_11 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 12 [ label = "id:ExtendOp_12 \lExtension Operator\lExtended pairs: \l ?tm2_o0_0 -> Literal { inner_function: TemplateString { value: \"http://example.com/sport/{ID_Sport}\" }, dtype_function: None, langtype_function: None }\l?tm2_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/plays\" } } }\l?tm2_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/student/{ID_Student}\" } } }" ] - 13 [ label = "id:Serialize_13 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm2_sm ?tm2_p0_0 ?tm2_o0_0 ." ] + 12 [ label = "id:ExtendOp_12 \lExtension Operator\lExtended pairs: \l ?tm2_o0_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm2_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/lastName\" } } }\l?tm2_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/student/{ID}\" } } }\l?tm2_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/firstName\" } } }\l?tm2_o1_0 -> Literal { inner_function: Reference { value: \"LastName\" }, dtype_function: None, langtype_function: None }" ] + 13 [ label = "id:Serialize_13 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm2_sm ?tm2_p0_0 ?tm2_o0_0 .\l?tm2_sm ?tm2_p1_0 ?tm2_o1_0 ." ] 14 [ label = "id:Sink_14 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] 2 -> 3 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping.dot index aeade68..942a1c3 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping.dot @@ -1,6 +1,6 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"persons.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"fname\",\"lname\",\"amount\"]},\"type\":\"ProjectOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"amount\",\"fname\",\"lname\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"ExtendOp_2\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"{fname} {lname}\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_o1_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"amount\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_p1_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://example.com/amount\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"{fname}{lname}{amount}\"},\"type\":\"BlankNode\"}},\"type\":\"ExtendOp\"}}" ] 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .\"},\"type\":\"SerializerOp\"}}" ] 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping.json index 8f53170..c934bba 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"persons.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["fname","lname","amount"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/amount"}}},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"amount"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"{fname}{lname}{amount}"}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"{fname} {lname}"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"persons.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["amount","fname","lname"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"{fname}{lname}{amount}"}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"{fname} {lname}"},"dtype_function":null,"langtype_function":null},"?tm0_o1_0":{"type":"Literal","inner_function":{"type":"Reference","value":"amount"},"dtype_function":null,"langtype_function":null},"?tm0_p1_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/amount"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\n?tm0_sm ?tm0_p1_0 ?tm0_o1_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping_pretty.dot index 7d12986..eb8e0e2 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0012a-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"persons.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: fname, lname, amount, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/amount\" } } }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"amount\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> BlankNode { inner_function: TemplateString { value: \"{fname}{lname}{amount}\" } }\l?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"{fname} {lname}\" }, dtype_function: None, langtype_function: None }" ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"persons.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: amount, fname, lname, " ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> BlankNode { inner_function: TemplateString { value: \"{fname}{lname}{amount}\" } }\l?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"{fname} {lname}\" }, dtype_function: None, langtype_function: None }\l?tm0_o1_0 -> Literal { inner_function: Reference { value: \"amount\" }, dtype_function: None, langtype_function: None }\l?tm0_p1_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/amount\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\l?tm0_sm ?tm0_p1_0 ?tm0_o1_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping.dot index 299e1aa..36085e6 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping.dot @@ -2,7 +2,7 @@ digraph { 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"persons.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"lname\",\"fname\"]},\"type\":\"ProjectOp\"}}" ] 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"lives.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"city\",\"fname\",\"lname\"]},\"type\":\"ProjectOp\"}}" ] + 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"lname\",\"fname\",\"city\"]},\"type\":\"ProjectOp\"}}" ] 4 [ label = "{\"id\":\"ExtendOp_4\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"{fname} {lname}\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://xmlns.com/foaf/0.1/name\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm0_sm\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"{fname}{lname}\"},\"type\":\"BlankNode\"}},\"type\":\"ExtendOp\"}}" ] 5 [ label = "{\"id\":\"Serialize_5\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .\"},\"type\":\"SerializerOp\"}}" ] 6 [ label = "{\"id\":\"Sink_6\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping.json index a58546e..201d9f3 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"persons.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["lname","fname"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"lives.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["city","fname","lname"]}}},{"id":"ExtendOp_4","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"{fname} {lname}"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"{fname}{lname}"}}}}},{"id":"Serialize_5","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_6","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_7","operator":{"type":"ExtendOp","config":{"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/city"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"city"},"dtype_function":null,"langtype_function":null},"?tm1_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"{fname}{lname}"}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[5,6,{"fragment":"default"}],[3,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"persons.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["lname","fname"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"lives.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["lname","fname","city"]}}},{"id":"ExtendOp_4","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"{fname}{lname}"}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"TemplateString","value":"{fname} {lname}"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_5","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_6","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_7","operator":{"type":"ExtendOp","config":{"?tm1_sm":{"type":"BlankNode","inner_function":{"type":"TemplateString","value":"{fname}{lname}"}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"city"},"dtype_function":null,"langtype_function":null},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://example.com/city"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[5,6,{"fragment":"default"}],[3,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping_pretty.dot index 27b762b..6be644e 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0012b-CSV/mapping_pretty.dot @@ -1,12 +1,12 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"persons.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"persons.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: lname, fname, " ] - 2 [ label = "id:Source_2 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"lives.csv\"\l}\l " ] - 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: city, fname, lname, " ] - 4 [ label = "id:ExtendOp_4 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"{fname} {lname}\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> BlankNode { inner_function: TemplateString { value: \"{fname}{lname}\" } }" ] + 2 [ label = "id:Source_2 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"lives.csv\"\l}\l " ] + 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: lname, fname, city, " ] + 4 [ label = "id:ExtendOp_4 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> BlankNode { inner_function: TemplateString { value: \"{fname}{lname}\" } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: TemplateString { value: \"{fname} {lname}\" }, dtype_function: None, langtype_function: None }" ] 5 [ label = "id:Serialize_5 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 6 [ label = "id:Sink_6 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 7 [ label = "id:ExtendOp_7 \lExtension Operator\lExtended pairs: \l ?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/city\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"city\" }, dtype_function: None, langtype_function: None }\l?tm1_sm -> BlankNode { inner_function: TemplateString { value: \"{fname}{lname}\" } }" ] + 7 [ label = "id:ExtendOp_7 \lExtension Operator\lExtended pairs: \l ?tm1_sm -> BlankNode { inner_function: TemplateString { value: \"{fname}{lname}\" } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"city\" }, dtype_function: None, langtype_function: None }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://example.com/city\" } } }" ] 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0 ." ] 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping.dot index 5672def..9d83e0b 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping.dot @@ -1,13 +1,13 @@ digraph { - 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"country_en.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] - 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Code\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] - 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"country_es.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"country_es.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"Code\"]},\"type\":\"ProjectOp\"}}" ] + 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"country_en.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"Name\",\"Code\"]},\"type\":\"ProjectOp\"}}" ] 4 [ label = "{\"id\":\"ExtendOp_4\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Code}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/2000/01/rdf-schema#label\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 5 [ label = "{\"id\":\"Serialize_5\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm1_p0_0 ?tm0_o0_0@en .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Serialize_5\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm1_p0_0 ?tm0_o0_0@es .\"},\"type\":\"SerializerOp\"}}" ] 6 [ label = "{\"id\":\"Sink_6\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 7 [ label = "{\"id\":\"ExtendOp_7\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/2000/01/rdf-schema#label\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Code}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0@es .\"},\"type\":\"SerializerOp\"}}" ] + 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0@en .\"},\"type\":\"SerializerOp\"}}" ] 9 [ label = "{\"id\":\"Sink_9\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 0 -> 1 [ label = "{\"fragment\": default}" ] 2 -> 3 [ label = "{\"fragment\": default}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping.json index 3c34322..a9fb154 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping.json @@ -1,234 +1 @@ -{ - "nodes": [ - { - "id": "Source_0", - "operator": { - "type": "SourceOp", - "config": { - "path": "country_en.csv", - "source_type": "File", - "root_iterator": { - "reference": null, - "reference_formulation": "CSVRows", - "fields": [], - "alias": null - } - } - } - }, - { - "id": "Projection_1", - "operator": { - "type": "ProjectOp", - "config": { - "projection_attributes": [ - "Code", - "Name" - ] - } - } - }, - { - "id": "Source_2", - "operator": { - "type": "SourceOp", - "config": { - "path": "country_es.csv", - "source_type": "File", - "root_iterator": { - "reference": null, - "reference_formulation": "CSVRows", - "fields": [], - "alias": null - } - } - } - }, - { - "id": "Projection_3", - "operator": { - "type": "ProjectOp", - "config": { - "projection_attributes": [ - "Name", - "Code" - ] - } - } - }, - { - "id": "ExtendOp_4", - "operator": { - "type": "ExtendOp", - "config": { - "?tm0_o0_0": { - "type": "Literal", - "inner_function": { - "type": "Reference", - "value": "Name" - }, - "dtype_function": null, - "langtype_function": null - }, - "?tm0_sm": { - "type": "Iri", - "inner_function": { - "type": "UriEncode", - "inner_function": { - "type": "TemplateString", - "value": "http://example.com/{Code}" - } - } - }, - "?tm1_p0_0": { - "type": "Iri", - "inner_function": { - "type": "UriEncode", - "inner_function": { - "type": "Constant", - "value": "http://www.w3.org/2000/01/rdf-schema#label" - } - } - } - } - } - }, - { - "id": "Serialize_5", - "operator": { - "type": "SerializerOp", - "config": { - "template": "?tm0_sm ?tm1_p0_0 ?tm0_o0_0@en .", - "format": "NQuads" - } - } - }, - { - "id": "Sink_6", - "operator": { - "type": "TargetOp", - "config": { - "target_type": "StdOut", - "data_format": "NQuads" - } - } - }, - { - "id": "ExtendOp_7", - "operator": { - "type": "ExtendOp", - "config": { - "?tm1_sm": { - "type": "Iri", - "inner_function": { - "type": "UriEncode", - "inner_function": { - "type": "TemplateString", - "value": "http://example.com/{Code}" - } - } - }, - "?tm1_p0_0": { - "type": "Iri", - "inner_function": { - "type": "UriEncode", - "inner_function": { - "type": "Constant", - "value": "http://www.w3.org/2000/01/rdf-schema#label" - } - } - }, - "?tm1_o0_0": { - "type": "Literal", - "inner_function": { - "type": "Reference", - "value": "Name" - }, - "dtype_function": null, - "langtype_function": null - } - } - } - }, - { - "id": "Serialize_8", - "operator": { - "type": "SerializerOp", - "config": { - "template": "?tm1_sm ?tm1_p0_0 ?tm1_o0_0@es .", - "format": "NQuads" - } - } - }, - { - "id": "Sink_9", - "operator": { - "type": "TargetOp", - "config": { - "target_type": "StdOut", - "data_format": "NQuads" - } - } - } - ], - "node_holes": [], - "edge_property": "directed", - "edges": [ - [ - 0, - 1, - { - "fragment": "default" - } - ], - [ - 2, - 3, - { - "fragment": "default" - } - ], - [ - 1, - 4, - { - "fragment": "default" - } - ], - [ - 4, - 5, - { - "fragment": "default" - } - ], - [ - 5, - 6, - { - "fragment": "default" - } - ], - [ - 3, - 7, - { - "fragment": "default" - } - ], - [ - 7, - 8, - { - "fragment": "default" - } - ], - [ - 8, - 9, - { - "fragment": "default" - } - ] - ] -} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_es.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","Code"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"country_en.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name","Code"]}}},{"id":"ExtendOp_4","operator":{"type":"ExtendOp","config":{"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Code}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_5","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm1_p0_0 ?tm0_o0_0@es .","format":"NQuads"}}},{"id":"Sink_6","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_7","operator":{"type":"ExtendOp","config":{"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Code}"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0@en .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[5,6,{"fragment":"default"}],[3,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping_pretty.dot index 47c16f3..660fa25 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0015a-CSV/mapping_pretty.dot @@ -1,13 +1,13 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_en.csv\"\l}\l " ] - 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Code, Name, " ] - 2 [ label = "id:Source_2 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_es.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_es.csv\"\l}\l " ] + 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, Code, " ] + 2 [ label = "id:Source_2 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_en.csv\"\l}\l " ] 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: Name, Code, " ] - 4 [ label = "id:ExtendOp_4 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Code}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }" ] - 5 [ label = "id:Serialize_5 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm1_p0_0 ?tm0_o0_0@en ." ] + 4 [ label = "id:ExtendOp_4 \lExtension Operator\lExtended pairs: \l ?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Code}\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] + 5 [ label = "id:Serialize_5 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm1_p0_0 ?tm0_o0_0@es ." ] 6 [ label = "id:Sink_6 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 7 [ label = "id:ExtendOp_7 \lExtension Operator\lExtended pairs: \l ?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Code}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] - 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0@es ." ] + 7 [ label = "id:ExtendOp_7 \lExtension Operator\lExtended pairs: \l ?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Code}\" } } }" ] + 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0@en ." ] 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] 2 -> 3 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping.dot b/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping.dot index 7097f2f..6238cc2 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping.dot @@ -1,13 +1,13 @@ digraph { - 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"country_en.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"country_es.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] 1 [ label = "{\"id\":\"Projection_1\",\"operator\":{\"config\":{\"projection_attributes\":[\"Code\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] - 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"country_es.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 2 [ label = "{\"id\":\"Source_2\",\"operator\":{\"config\":{\"path\":\"country_en.csv\",\"root_iterator\":{\"alias\":null,\"fields\":[],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] 3 [ label = "{\"id\":\"Projection_3\",\"operator\":{\"config\":{\"projection_attributes\":[\"Code\",\"Name\"]},\"type\":\"ProjectOp\"}}" ] 4 [ label = "{\"id\":\"ExtendOp_4\",\"operator\":{\"config\":{\"?tm0_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm0_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Code}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/2000/01/rdf-schema#label\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 5 [ label = "{\"id\":\"Serialize_5\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm1_p0_0 ?tm0_o0_0@english .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Serialize_5\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm0_sm ?tm1_p0_0 ?tm0_o0_0@spanish .\"},\"type\":\"SerializerOp\"}}" ] 6 [ label = "{\"id\":\"Sink_6\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 7 [ label = "{\"id\":\"ExtendOp_7\",\"operator\":{\"config\":{\"?tm1_o0_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"Name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"?tm1_p0_0\":{\"inner_function\":{\"inner_function\":{\"type\":\"Constant\",\"value\":\"http://www.w3.org/2000/01/rdf-schema#label\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"},\"?tm1_sm\":{\"inner_function\":{\"inner_function\":{\"type\":\"TemplateString\",\"value\":\"http://example.com/{Code}\"},\"type\":\"UriEncode\"},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] - 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0@spanish .\"},\"type\":\"SerializerOp\"}}" ] + 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?tm1_sm ?tm1_p0_0 ?tm1_o0_0@english .\"},\"type\":\"SerializerOp\"}}" ] 9 [ label = "{\"id\":\"Sink_9\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] 0 -> 1 [ label = "{\"fragment\": default}" ] 2 -> 3 [ label = "{\"fragment\": default}" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping.json index 7232c45..535abea 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_en.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Code","Name"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"country_es.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["Code","Name"]}}},{"id":"ExtendOp_4","operator":{"type":"ExtendOp","config":{"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Code}"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_5","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm1_p0_0 ?tm0_o0_0@english .","format":"NQuads"}}},{"id":"Sink_6","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_7","operator":{"type":"ExtendOp","config":{"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Code}"}}},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0@spanish .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[5,6,{"fragment":"default"}],[3,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"country_es.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Code","Name"]}}},{"id":"Source_2","operator":{"type":"SourceOp","config":{"path":"country_en.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_3","operator":{"type":"ProjectOp","config":{"projection_attributes":["Code","Name"]}}},{"id":"ExtendOp_4","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Code}"}}}}}},{"id":"Serialize_5","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm1_p0_0 ?tm0_o0_0@spanish .","format":"NQuads"}}},{"id":"Sink_6","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"ExtendOp_7","operator":{"type":"ExtendOp","config":{"?tm1_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/2000/01/rdf-schema#label"}}},"?tm1_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"Name"},"dtype_function":null,"langtype_function":null},"?tm1_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"http://example.com/{Code}"}}}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?tm1_sm ?tm1_p0_0 ?tm1_o0_0@english .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[2,3,{"fragment":"default"}],[1,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[5,6,{"fragment":"default"}],[3,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping_pretty.dot index b1fe881..403047c 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0015b-CSV/mapping_pretty.dot @@ -1,13 +1,13 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_en.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_es.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Code, Name, " ] - 2 [ label = "id:Source_2 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_es.csv\"\l}\l " ] + 2 [ label = "id:Source_2 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"country_en.csv\"\l}\l " ] 3 [ label = "id:Projection_3 \lProjection Operator\lProjected attributes: Code, Name, " ] - 4 [ label = "id:ExtendOp_4 \lExtension Operator\lExtended pairs: \l ?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Code}\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] - 5 [ label = "id:Serialize_5 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm1_p0_0 ?tm0_o0_0@english ." ] + 4 [ label = "id:ExtendOp_4 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Code}\" } } }" ] + 5 [ label = "id:Serialize_5 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm1_p0_0 ?tm0_o0_0@spanish ." ] 6 [ label = "id:Sink_6 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] - 7 [ label = "id:ExtendOp_7 \lExtension Operator\lExtended pairs: \l ?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Code}\" } } }\l?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }" ] - 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0@spanish ." ] + 7 [ label = "id:ExtendOp_7 \lExtension Operator\lExtended pairs: \l ?tm1_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/2000/01/rdf-schema#label\" } } }\l?tm1_o0_0 -> Literal { inner_function: Reference { value: \"Name\" }, dtype_function: None, langtype_function: None }\l?tm1_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"http://example.com/{Code}\" } } }" ] + 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm1_sm ?tm1_p0_0 ?tm1_o0_0@english ." ] 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] 2 -> 3 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0019a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0019a-CSV/mapping_pretty.dot index d257404..67e53b0 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0019a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0019a-CSV/mapping_pretty.dot @@ -1,5 +1,5 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"persons.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"persons.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: FirstName, " ] 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: Reference { value: \"FirstName\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0019b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0019b-CSV/mapping.json index bbb225e..0d9d822 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0019b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0019b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"persons.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Reference","value":"FirstName"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"persons.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["FirstName"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Literal","inner_function":{"type":"Reference","value":"FirstName"},"dtype_function":null,"langtype_function":null},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/name"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Reference","value":"FirstName"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0019b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0019b-CSV/mapping_pretty.dot index baf1d09..4462533 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0019b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0019b-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"persons.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"persons.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: FirstName, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_o0_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: Reference { value: \"FirstName\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Literal { inner_function: Reference { value: \"FirstName\" }, dtype_function: None, langtype_function: None }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/name\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: Reference { value: \"FirstName\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0020a-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0020a-CSV/mapping.json index fde703b..93475a8 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0020a-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0020a-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"{Name}"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"TemplateString","value":"{Name}"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0020a-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0020a-CSV/mapping_pretty.dot index 8690bc9..876cd92 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0020a-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0020a-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"{Name}\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: TemplateString { value: \"{Name}\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml-mapper-test-cases-csv/RMLTC0020b-CSV/mapping.json b/test/rml-mapper-test-cases-csv/RMLTC0020b-CSV/mapping.json index fe6b7fb..93f16b4 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0020b-CSV/mapping.json +++ b/test/rml-mapper-test-cases-csv/RMLTC0020b-CSV/mapping.json @@ -1 +1 @@ -{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Reference","value":"Name"}}},"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"student.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[],"alias":null}}}},{"id":"Projection_1","operator":{"type":"ProjectOp","config":{"projection_attributes":["Name"]}}},{"id":"ExtendOp_2","operator":{"type":"ExtendOp","config":{"?tm0_p0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://www.w3.org/1999/02/22-rdf-syntax-ns#type"}}},"?tm0_sm":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Reference","value":"Name"}}},"?tm0_o0_0":{"type":"Iri","inner_function":{"type":"UriEncode","inner_function":{"type":"Constant","value":"http://xmlns.com/foaf/0.1/Person"}}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?tm0_sm ?tm0_p0_0 ?tm0_o0_0 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/rml-mapper-test-cases-csv/RMLTC0020b-CSV/mapping_pretty.dot b/test/rml-mapper-test-cases-csv/RMLTC0020b-CSV/mapping_pretty.dot index c6efcde..5af5feb 100644 --- a/test/rml-mapper-test-cases-csv/RMLTC0020b-CSV/mapping_pretty.dot +++ b/test/rml-mapper-test-cases-csv/RMLTC0020b-CSV/mapping_pretty.dot @@ -1,7 +1,7 @@ digraph { - 0 [ label = "id:Source_0 \lSource Opeartor\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [],\l alias: None,\l} \lconfig: {\l \"path\": \"student.csv\"\l}\l " ] 1 [ label = "id:Projection_1 \lProjection Operator\lProjected attributes: Name, " ] - 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_sm -> Iri { inner_function: UriEncode { inner_function: Reference { value: \"Name\" } } }\l?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }" ] + 2 [ label = "id:ExtendOp_2 \lExtension Operator\lExtended pairs: \l ?tm0_p0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://www.w3.org/1999/02/22-rdf-syntax-ns#type\" } } }\l?tm0_sm -> Iri { inner_function: UriEncode { inner_function: Reference { value: \"Name\" } } }\l?tm0_o0_0 -> Iri { inner_function: UriEncode { inner_function: Constant { value: \"http://xmlns.com/foaf/0.1/Person\" } } }" ] 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?tm0_sm ?tm0_p0_0 ?tm0_o0_0 ." ] 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] 0 -> 1 [ label = "Fragment:default" ] diff --git a/test/rml_tests.js b/test/rml_tests.js index ba1020f..bfe0032 100644 --- a/test/rml_tests.js +++ b/test/rml_tests.js @@ -5,6 +5,7 @@ const TC_CSV = 'test/rml-mapper-test-cases-csv' // Test cases directory (csv) const TC_JSON = 'test/rml-mapper-test-cases-json' // Test cases directory (json) const TC_KGCW = 'test/KGCW' // Test cases directory KGCW tool const OTC = 'test/rml-operator-test-cases' // Operator test cases directory +const SHEXML= 'test/shexml' // Test cases directory for ShExML /* All RML-Mapper csv test-cases (https://github.com/kg-construct/rml-test-cases) @@ -23,6 +24,19 @@ const OTC = 'test/rml-operator-test-cases' // Operator test cases directory it('Serializer Test 1', operatorTest(`${OTC}/SERIALIZER_1.json`)); }); TODO: Update these operator tests to the latest specifications */ +describe("ShExML Tests", () => { + it('BlankPrefix', dotFileTest(`${SHEXML}/blankprefix/input.dot`, `${SHEXML}/blankprefix/expected.nq`)); + it('bnode', dotFileTest(`${SHEXML}/bnode/input.dot`, `${SHEXML}/bnode/expected.nq`)); + it('constant', dotFileTest(`${SHEXML}/constant/input.dot`, `${SHEXML}/constant/expected.nq`)); + it('graph', dotFileTest(`${SHEXML}/graph/input.dot`, `${SHEXML}/graph/expected.nq`)); + it('linking', dotFileTest(`${SHEXML}/linking/input.dot`, `${SHEXML}/linking/expected.nq`)); + it('literal', dotFileTest(`${SHEXML}/literal/input.dot`, `${SHEXML}/literal/expected.nq`)); + it('multiple_iterator', dotFileTest(`${SHEXML}/multiple_iterator/input.dot`, `${SHEXML}/multiple_iterator/expected.nq`)); + it('only_iterator_expression', dotFileTest(`${SHEXML}/only_iterator_expression/input.dot`, `${SHEXML}/only_iterator_expression/expected.nq`)); + it('single_iterator', dotFileTest(`${SHEXML}/single_iterator/input.dot`, `${SHEXML}/single_iterator/expected.nq`)); + it('string_concatenation', dotFileTest(`${SHEXML}/string_concatenation/input.dot`, `${SHEXML}/string_concatenation/expected.nq`)); +}); + describe("RML Mapper Tests CSV", () => { it('RMLTC0000-CSV', dotFileTest(`${TC_CSV}/RMLTC0000-CSV/mapping.dot`, `${TC_CSV}/RMLTC0000-CSV/output.nq`)); it('RMLTC0001a-CSV', dotFileTest(`${TC_CSV}/RMLTC0001a-CSV/mapping.dot`, `${TC_CSV}/RMLTC0001a-CSV/output.nq`)); @@ -65,47 +79,47 @@ describe("RML Mapper Tests CSV", () => { it('RMLTC0020b-CSV', dotFileTest(`${TC_CSV}/RMLTC0020b-CSV/mapping.dot`, `${TC_CSV}/RMLTC0020b-CSV/output.nq`)); it('GTFS-case', dotFileTest(`${TC_CSV}/GTFS-case/mapping.dot`, `${TC_CSV}/GTFS-case/output.nq`)); }); - - -describe("RML Mapper Tests JSON", () => { - it('RMLTC0000-JSON', dotFileTest(`${TC_JSON}/RMLTC0000-JSON/mapping.dot`, `${TC_JSON}/RMLTC0000-JSON/output.nq`)); - it('RMLTC0001a-JSON', dotFileTest(`${TC_JSON}/RMLTC0001a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0001a-JSON/output.nq`)); - it('RMLTC0001b-JSON', dotFileTest(`${TC_JSON}/RMLTC0001b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0001b-JSON/output.nq`)); - it('RMLTC0002a-JSON', dotFileTest(`${TC_JSON}/RMLTC0002a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0002a-JSON/output.nq`)); - it('RMLTC0002b-JSON', dotFileTest(`${TC_JSON}/RMLTC0002b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0002b-JSON/output.nq`)); - it('RMLTC0002c-JSON', dotFileTest(`${TC_JSON}/RMLTC0002c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0002c-JSON/output.nq`)); - it('RMLTC0002e-JSON', throwErrorTest(`${TC_JSON}/RMLTC0002e-JSON/mapping.dot`, FileNotFoundError)); - it('RMLTC0003c-JSON', dotFileTest(`${TC_JSON}/RMLTC0003c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0003c-JSON/output.nq`)); - it('RMLTC0004a-JSON', dotFileTest(`${TC_JSON}/RMLTC0004a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0004a-JSON/output.nq`)); - it('RMLTC0004b-JSON', dotFileTest(`${TC_JSON}/RMLTC0004b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0004b-JSON/output.nq`)); - it('RMLTC0005a-JSON', dotFileTest(`${TC_JSON}/RMLTC0005a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0005a-JSON/output.nq`)); - it('RMLTC0006a-JSON', dotFileTest(`${TC_JSON}/RMLTC0006a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0006a-JSON/output.nq`)); - it('RMLTC0007a-JSON', dotFileTest(`${TC_JSON}/RMLTC0007a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007a-JSON/output.nq`)); - it('RMLTC0007b-JSON', dotFileTest(`${TC_JSON}/RMLTC0007b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007b-JSON/output.nq`)); - it('RMLTC0007c-JSON', dotFileTest(`${TC_JSON}/RMLTC0007c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007c-JSON/output.nq`)); - it('RMLTC0007d-JSON', dotFileTest(`${TC_JSON}/RMLTC0007d-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007d-JSON/output.nq`)); - it('RMLTC0007e-JSON', dotFileTest(`${TC_JSON}/RMLTC0007e-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007e-JSON/output.nq`)); - it('RMLTC0007f-JSON', dotFileTest(`${TC_JSON}/RMLTC0007f-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007f-JSON/output.nq`)); - it('RMLTC0007g-JSON', dotFileTest(`${TC_JSON}/RMLTC0007g-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007g-JSON/output.nq`)); - it('RMLTC0007h-JSON', dotFileTest(`${TC_JSON}/RMLTC0007h-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007h-JSON/output.nq`)); - it('RMLTC0008a-JSON', dotFileTest(`${TC_JSON}/RMLTC0008a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0008a-JSON/output.nq`)); - it('RMLTC0008b-JSON', dotFileTest(`${TC_JSON}/RMLTC0008b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0008b-JSON/output.nq`)); - it('RMLTC0008c-JSON', dotFileTest(`${TC_JSON}/RMLTC0008c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0008c-JSON/output.nq`)); - it('RMLTC0009a-JSON', dotFileTest(`${TC_JSON}/RMLTC0009a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0009a-JSON/output.nq`)); - it('RMLTC0009b-JSON', dotFileTest(`${TC_JSON}/RMLTC0009b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0009b-JSON/output.nq`)); - it('RMLTC0010a-JSON', dotFileTest(`${TC_JSON}/RMLTC0010a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0010a-JSON/output.nq`)); - it('RMLTC0010b-JSON', dotFileTest(`${TC_JSON}/RMLTC0010b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0010b-JSON/output.nq`)); - it('RMLTC0010c-JSON', dotFileTest(`${TC_JSON}/RMLTC0010c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0010c-JSON/output.nq`)); - it('RMLTC0011b-JSON', dotFileTest(`${TC_JSON}/RMLTC0011b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0011b-JSON/output.nq`)); - it('RMLTC0012a-JSON', dotFileTest(`${TC_JSON}/RMLTC0012a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0012a-JSON/output.nq`)); - it('RMLTC0012b-JSON', dotFileTest(`${TC_JSON}/RMLTC0012b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0012b-JSON/output.nq`)); - it('RMLTC0012c-JSON', dotFileTest(`${TC_JSON}/RMLTC0012c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0012c-JSON/output.nq`)); - it('RMLTC0012d-JSON', dotFileTest(`${TC_JSON}/RMLTC0012d-JSON/mapping.dot`, `${TC_JSON}/RMLTC0012d-JSON/output.nq`)); - it('RMLTC0015a-JSON', dotFileTest(`${TC_JSON}/RMLTC0015a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0015a-JSON/output.nq`)); - it('RMLTC0015b-JSON', dotFileTest(`${TC_JSON}/RMLTC0015b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0015b-JSON/output.nq`)); - it('RMLTC0019a-JSON', dotFileTest(`${TC_JSON}/RMLTC0019a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0019a-JSON/output.nq`)); - it('RMLTC0019b-JSON', dotFileTest(`${TC_JSON}/RMLTC0019b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0019b-JSON/output.nq`)); - it('RMLTC0020a-JSON', dotFileTest(`${TC_JSON}/RMLTC0020a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0020a-JSON/output.nq`)); - it('RMLTC0020b-JSON', dotFileTest(`${TC_JSON}/RMLTC0020b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0020b-JSON/output.nq`)); -}); - +// +// +//describe("RML Mapper Tests JSON", () => { +// it('RMLTC0000-JSON', dotFileTest(`${TC_JSON}/RMLTC0000-JSON/mapping.dot`, `${TC_JSON}/RMLTC0000-JSON/output.nq`)); +// it('RMLTC0001a-JSON', dotFileTest(`${TC_JSON}/RMLTC0001a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0001a-JSON/output.nq`)); +// it('RMLTC0001b-JSON', dotFileTest(`${TC_JSON}/RMLTC0001b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0001b-JSON/output.nq`)); +// it('RMLTC0002a-JSON', dotFileTest(`${TC_JSON}/RMLTC0002a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0002a-JSON/output.nq`)); +// it('RMLTC0002b-JSON', dotFileTest(`${TC_JSON}/RMLTC0002b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0002b-JSON/output.nq`)); +// it('RMLTC0002c-JSON', dotFileTest(`${TC_JSON}/RMLTC0002c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0002c-JSON/output.nq`)); +// it('RMLTC0002e-JSON', throwErrorTest(`${TC_JSON}/RMLTC0002e-JSON/mapping.dot`, FileNotFoundError)); +// it('RMLTC0003c-JSON', dotFileTest(`${TC_JSON}/RMLTC0003c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0003c-JSON/output.nq`)); +// it('RMLTC0004a-JSON', dotFileTest(`${TC_JSON}/RMLTC0004a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0004a-JSON/output.nq`)); +// it('RMLTC0004b-JSON', dotFileTest(`${TC_JSON}/RMLTC0004b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0004b-JSON/output.nq`)); +// it('RMLTC0005a-JSON', dotFileTest(`${TC_JSON}/RMLTC0005a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0005a-JSON/output.nq`)); +// it('RMLTC0006a-JSON', dotFileTest(`${TC_JSON}/RMLTC0006a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0006a-JSON/output.nq`)); +// it('RMLTC0007a-JSON', dotFileTest(`${TC_JSON}/RMLTC0007a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007a-JSON/output.nq`)); +// it('RMLTC0007b-JSON', dotFileTest(`${TC_JSON}/RMLTC0007b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007b-JSON/output.nq`)); +// it('RMLTC0007c-JSON', dotFileTest(`${TC_JSON}/RMLTC0007c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007c-JSON/output.nq`)); +// it('RMLTC0007d-JSON', dotFileTest(`${TC_JSON}/RMLTC0007d-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007d-JSON/output.nq`)); +// it('RMLTC0007e-JSON', dotFileTest(`${TC_JSON}/RMLTC0007e-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007e-JSON/output.nq`)); +// it('RMLTC0007f-JSON', dotFileTest(`${TC_JSON}/RMLTC0007f-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007f-JSON/output.nq`)); +// it('RMLTC0007g-JSON', dotFileTest(`${TC_JSON}/RMLTC0007g-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007g-JSON/output.nq`)); +// it('RMLTC0007h-JSON', dotFileTest(`${TC_JSON}/RMLTC0007h-JSON/mapping.dot`, `${TC_JSON}/RMLTC0007h-JSON/output.nq`)); +// it('RMLTC0008a-JSON', dotFileTest(`${TC_JSON}/RMLTC0008a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0008a-JSON/output.nq`)); +// it('RMLTC0008b-JSON', dotFileTest(`${TC_JSON}/RMLTC0008b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0008b-JSON/output.nq`)); +// it('RMLTC0008c-JSON', dotFileTest(`${TC_JSON}/RMLTC0008c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0008c-JSON/output.nq`)); +// it('RMLTC0009a-JSON', dotFileTest(`${TC_JSON}/RMLTC0009a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0009a-JSON/output.nq`)); +// it('RMLTC0009b-JSON', dotFileTest(`${TC_JSON}/RMLTC0009b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0009b-JSON/output.nq`)); +// it('RMLTC0010a-JSON', dotFileTest(`${TC_JSON}/RMLTC0010a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0010a-JSON/output.nq`)); +// it('RMLTC0010b-JSON', dotFileTest(`${TC_JSON}/RMLTC0010b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0010b-JSON/output.nq`)); +// it('RMLTC0010c-JSON', dotFileTest(`${TC_JSON}/RMLTC0010c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0010c-JSON/output.nq`)); +// it('RMLTC0011b-JSON', dotFileTest(`${TC_JSON}/RMLTC0011b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0011b-JSON/output.nq`)); +// it('RMLTC0012a-JSON', dotFileTest(`${TC_JSON}/RMLTC0012a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0012a-JSON/output.nq`)); +// it('RMLTC0012b-JSON', dotFileTest(`${TC_JSON}/RMLTC0012b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0012b-JSON/output.nq`)); +// it('RMLTC0012c-JSON', dotFileTest(`${TC_JSON}/RMLTC0012c-JSON/mapping.dot`, `${TC_JSON}/RMLTC0012c-JSON/output.nq`)); +// it('RMLTC0012d-JSON', dotFileTest(`${TC_JSON}/RMLTC0012d-JSON/mapping.dot`, `${TC_JSON}/RMLTC0012d-JSON/output.nq`)); +// it('RMLTC0015a-JSON', dotFileTest(`${TC_JSON}/RMLTC0015a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0015a-JSON/output.nq`)); +// it('RMLTC0015b-JSON', dotFileTest(`${TC_JSON}/RMLTC0015b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0015b-JSON/output.nq`)); +// it('RMLTC0019a-JSON', dotFileTest(`${TC_JSON}/RMLTC0019a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0019a-JSON/output.nq`)); +// it('RMLTC0019b-JSON', dotFileTest(`${TC_JSON}/RMLTC0019b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0019b-JSON/output.nq`)); +// it('RMLTC0020a-JSON', dotFileTest(`${TC_JSON}/RMLTC0020a-JSON/mapping.dot`, `${TC_JSON}/RMLTC0020a-JSON/output.nq`)); +// it('RMLTC0020b-JSON', dotFileTest(`${TC_JSON}/RMLTC0020b-JSON/mapping.dot`, `${TC_JSON}/RMLTC0020b-JSON/output.nq`)); +//}); +// diff --git a/test/shexml/blankprefix/events.csv b/test/shexml/blankprefix/events.csv new file mode 100644 index 0000000..5b66e14 --- /dev/null +++ b/test/shexml/blankprefix/events.csv @@ -0,0 +1,3 @@ +id,venue_name,venue_id,lat,long +567,STAM,78,51.043611,3.717222 +989,STEM,68,51.043613,3.717333 diff --git a/test/shexml/blankprefix/expected.nq b/test/shexml/blankprefix/expected.nq new file mode 100644 index 0000000..2c663c5 --- /dev/null +++ b/test/shexml/blankprefix/expected.nq @@ -0,0 +1,6 @@ + . + . + . + . + . + . diff --git a/test/shexml/blankprefix/input.dot b/test/shexml/blankprefix/input.dot new file mode 100644 index 0000000..a8e2bbd --- /dev/null +++ b/test/shexml/blankprefix/input.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"events.csv\",\"root_iterator\":{\"alias\":\"performances_iterator\",\"fields\":[{\"alias\":\"ids\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venues_names\",\"inner_fields\":[],\"reference\":\"venue_name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venue_id\",\"inner_fields\":[],\"reference\":\"venue_id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"lat\",\"inner_fields\":[],\"reference\":\"lat\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"long\",\"inner_fields\":[],\"reference\":\"long\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Extend_Concatenate_1\",\"operator\":{\"config\":{\"location\":{\"left_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.lat\"},\"right_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.long\"},\"separator\":\"-\",\"type\":\"Concatenate\"}},\"type\":\"ExtendOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"performances_iterator.ids\":\"performances.ids\",\"performances_iterator.lat\":\"performances.lat\",\"performances_iterator.long\":\"performances.long\",\"performances_iterator.venue_id\":\"performances.venue_id\",\"performances_iterator.venues_names\":\"performances.venues_names\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"_om_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venues_names\"}]]},\"type\":\"Iri\"},\"_om_1\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venue_id\"}]]},\"type\":\"Iri\"},\"_om_2\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"location\"}]]},\"type\":\"Iri\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.ids\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 0 -> 1 [ label = "{\"fragment\": default}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/blankprefix/input.json b/test/shexml/blankprefix/input.json new file mode 100644 index 0000000..479d67c --- /dev/null +++ b/test/shexml/blankprefix/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"events.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"ids","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venues_names","reference":"venue_name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venue_id","reference":"venue_id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"lat","reference":"lat","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"long","reference":"long","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"performances_iterator"}}}},{"id":"Extend_Concatenate_1","operator":{"type":"ExtendOp","config":{"location":{"type":"Concatenate","left_value":{"type":"Reference","value":"performances_iterator.lat"},"separator":"-","right_value":{"type":"Reference","value":"performances_iterator.long"}}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"performances_iterator.long":"performances.long","performances_iterator.venue_id":"performances.venue_id","performances_iterator.venues_names":"performances.venues_names","performances_iterator.ids":"performances.ids","performances_iterator.lat":"performances.lat"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"_om_1":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venue_id"}]]}},"_om_2":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"location"}]]}},"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.ids"}]]}},"_om_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venues_names"}]]}}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/blankprefix/input.shexml b/test/shexml/blankprefix/input.shexml new file mode 100644 index 0000000..d21073a --- /dev/null +++ b/test/shexml/blankprefix/input.shexml @@ -0,0 +1,18 @@ +PREFIX : +SOURCE performances_csv +ITERATOR performances_iterator { + FIELD ids + FIELD venues_names + FIELD venue_id + FIELD lat + FIELD long +} + +EXPRESSION performances +EXPRESSION location + +:Performance :[performances.ids] { + :venue :[performances.venues_names] ; + :venue_id :[performances.venue_id]; + :location :[location]; +} diff --git a/test/shexml/blankprefix/input_pretty.dot b/test/shexml/blankprefix/input_pretty.dot new file mode 100644 index 0000000..dda8c4c --- /dev/null +++ b/test/shexml/blankprefix/input_pretty.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"ids\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venues_names\",\l reference: \"venue_name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venue_id\",\l reference: \"venue_id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"lat\",\l reference: \"lat\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"long\",\l reference: \"long\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"performances_iterator\",\l ),\l} \lconfig: {\l \"path\": \"events.csv\"\l}\l " ] + 1 [ label = "id:Extend_Concatenate_1 \lExtension Operator\lExtended pairs: \l location -> Concatenate { left_value: Reference { value: \"performances_iterator.lat\" }, separator: \"-\", right_value: Reference { value: \"performances_iterator.long\" } }" ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l performances_iterator.long -> performances.long\lperformances_iterator.venue_id -> performances.venue_id\lperformances_iterator.venues_names -> performances.venues_names\lperformances_iterator.ids -> performances.ids\lperformances_iterator.lat -> performances.lat" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l _om_1 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venue_id\" })] } }\l_om_2 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"location\" })] } }\l_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.ids\" })] } }\l_om_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venues_names\" })] } }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 0 -> 1 [ label = "Fragment:default" ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] +} diff --git a/test/shexml/bnode/events.csv b/test/shexml/bnode/events.csv new file mode 100644 index 0000000..5b66e14 --- /dev/null +++ b/test/shexml/bnode/events.csv @@ -0,0 +1,3 @@ +id,venue_name,venue_id,lat,long +567,STAM,78,51.043611,3.717222 +989,STEM,68,51.043613,3.717333 diff --git a/test/shexml/bnode/expected.nq b/test/shexml/bnode/expected.nq new file mode 100644 index 0000000..86ec62d --- /dev/null +++ b/test/shexml/bnode/expected.nq @@ -0,0 +1,6 @@ +_:989 . +_:989 . +_:989 . +_:567 . +_:567 . +_:567 . diff --git a/test/shexml/bnode/input.dot b/test/shexml/bnode/input.dot new file mode 100644 index 0000000..f3d9c5b --- /dev/null +++ b/test/shexml/bnode/input.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"events.csv\",\"root_iterator\":{\"alias\":\"performances_iterator\",\"fields\":[{\"alias\":\"ids\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venues_names\",\"inner_fields\":[],\"reference\":\"venue_name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venue_id\",\"inner_fields\":[],\"reference\":\"venue_id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"lat\",\"inner_fields\":[],\"reference\":\"lat\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"long\",\"inner_fields\":[],\"reference\":\"long\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Extend_Concatenate_1\",\"operator\":{\"config\":{\"location\":{\"left_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.lat\"},\"right_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.long\"},\"separator\":\"-\",\"type\":\"Concatenate\"}},\"type\":\"ExtendOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"performances_iterator.ids\":\"performances.ids\",\"performances_iterator.lat\":\"performances.lat\",\"performances_iterator.long\":\"performances.long\",\"performances_iterator.venue_id\":\"performances.venue_id\",\"performances_iterator.venues_names\":\"performances.venues_names\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"_om_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venues_names\"}]]},\"type\":\"Iri\"},\"_om_1\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venue_id\"}]]},\"type\":\"Iri\"},\"_om_2\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"location\"}]]},\"type\":\"Iri\"},\"_sm_0\":{\"inner_function\":{\"type\":\"Reference\",\"value\":\"performances.ids\"},\"type\":\"BlankNode\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 0 -> 1 [ label = "{\"fragment\": default}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/bnode/input.json b/test/shexml/bnode/input.json new file mode 100644 index 0000000..da862ab --- /dev/null +++ b/test/shexml/bnode/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"events.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"ids","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venues_names","reference":"venue_name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venue_id","reference":"venue_id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"lat","reference":"lat","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"long","reference":"long","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"performances_iterator"}}}},{"id":"Extend_Concatenate_1","operator":{"type":"ExtendOp","config":{"location":{"type":"Concatenate","left_value":{"type":"Reference","value":"performances_iterator.lat"},"separator":"-","right_value":{"type":"Reference","value":"performances_iterator.long"}}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"performances_iterator.lat":"performances.lat","performances_iterator.venue_id":"performances.venue_id","performances_iterator.ids":"performances.ids","performances_iterator.venues_names":"performances.venues_names","performances_iterator.long":"performances.long"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"_om_2":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"location"}]]}},"_om_1":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venue_id"}]]}},"_sm_0":{"type":"BlankNode","inner_function":{"type":"Reference","value":"performances.ids"}},"_om_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venues_names"}]]}}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/bnode/input.shexml b/test/shexml/bnode/input.shexml new file mode 100644 index 0000000..b9a9686 --- /dev/null +++ b/test/shexml/bnode/input.shexml @@ -0,0 +1,18 @@ +PREFIX : +SOURCE performances_csv +ITERATOR performances_iterator { + FIELD ids + FIELD venues_names + FIELD venue_id + FIELD lat + FIELD long +} + +EXPRESSION performances +EXPRESSION location + +:Performance _:[performances.ids] { + :venue :[performances.venues_names] ; + :venue_id :[performances.venue_id]; + :location :[location]; +} diff --git a/test/shexml/bnode/input_pretty.dot b/test/shexml/bnode/input_pretty.dot new file mode 100644 index 0000000..b99a918 --- /dev/null +++ b/test/shexml/bnode/input_pretty.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"ids\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venues_names\",\l reference: \"venue_name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venue_id\",\l reference: \"venue_id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"lat\",\l reference: \"lat\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"long\",\l reference: \"long\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"performances_iterator\",\l ),\l} \lconfig: {\l \"path\": \"events.csv\"\l}\l " ] + 1 [ label = "id:Extend_Concatenate_1 \lExtension Operator\lExtended pairs: \l location -> Concatenate { left_value: Reference { value: \"performances_iterator.lat\" }, separator: \"-\", right_value: Reference { value: \"performances_iterator.long\" } }" ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l performances_iterator.lat -> performances.lat\lperformances_iterator.venue_id -> performances.venue_id\lperformances_iterator.ids -> performances.ids\lperformances_iterator.venues_names -> performances.venues_names\lperformances_iterator.long -> performances.long" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l _om_2 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"location\" })] } }\l_om_1 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venue_id\" })] } }\l_sm_0 -> BlankNode { inner_function: Reference { value: \"performances.ids\" } }\l_om_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venues_names\" })] } }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 0 -> 1 [ label = "Fragment:default" ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] +} diff --git a/test/shexml/bnode/pretty.png b/test/shexml/bnode/pretty.png new file mode 100644 index 0000000000000000000000000000000000000000..6af6f865e5d82a639d0e5252b4051d10c4821464 GIT binary patch literal 294398 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 literal 0 HcmV?d00001 diff --git a/test/shexml/constant/events.csv b/test/shexml/constant/events.csv new file mode 100644 index 0000000..5b66e14 --- /dev/null +++ b/test/shexml/constant/events.csv @@ -0,0 +1,3 @@ +id,venue_name,venue_id,lat,long +567,STAM,78,51.043611,3.717222 +989,STEM,68,51.043613,3.717333 diff --git a/test/shexml/constant/expected.nq b/test/shexml/constant/expected.nq new file mode 100644 index 0000000..8daedf7 --- /dev/null +++ b/test/shexml/constant/expected.nq @@ -0,0 +1,8 @@ + . + . + . + . + . + . + . + . diff --git a/test/shexml/constant/input.dot b/test/shexml/constant/input.dot new file mode 100644 index 0000000..a4bd906 --- /dev/null +++ b/test/shexml/constant/input.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"events.csv\",\"root_iterator\":{\"alias\":\"performances_iterator\",\"fields\":[{\"alias\":\"ids\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venues_names\",\"inner_fields\":[],\"reference\":\"venue_name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venue_id\",\"inner_fields\":[],\"reference\":\"venue_id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"lat\",\"inner_fields\":[],\"reference\":\"lat\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"long\",\"inner_fields\":[],\"reference\":\"long\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Extend_Concatenate_1\",\"operator\":{\"config\":{\"location\":{\"left_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.lat\"},\"right_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.long\"},\"separator\":\"-\",\"type\":\"Concatenate\"}},\"type\":\"ExtendOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"performances_iterator.ids\":\"performances.ids\",\"performances_iterator.lat\":\"performances.lat\",\"performances_iterator.long\":\"performances.long\",\"performances_iterator.venue_id\":\"performances.venue_id\",\"performances_iterator.venues_names\":\"performances.venues_names\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"_om_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venues_names\"}]]},\"type\":\"Iri\"},\"_om_1\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venue_id\"}]]},\"type\":\"Iri\"},\"_om_2\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"location\"}]]},\"type\":\"Iri\"},\"_om_3\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Constant\",\"value\":\"Performance\"}]]},\"type\":\"Iri\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.ids\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\\n?_sm_0 ?_om_3 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 0 -> 1 [ label = "{\"fragment\": default}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/constant/input.json b/test/shexml/constant/input.json new file mode 100644 index 0000000..4d19b15 --- /dev/null +++ b/test/shexml/constant/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"events.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"ids","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venues_names","reference":"venue_name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venue_id","reference":"venue_id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"lat","reference":"lat","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"long","reference":"long","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"performances_iterator"}}}},{"id":"Extend_Concatenate_1","operator":{"type":"ExtendOp","config":{"location":{"type":"Concatenate","left_value":{"type":"Reference","value":"performances_iterator.lat"},"separator":"-","right_value":{"type":"Reference","value":"performances_iterator.long"}}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"performances_iterator.ids":"performances.ids","performances_iterator.long":"performances.long","performances_iterator.lat":"performances.lat","performances_iterator.venue_id":"performances.venue_id","performances_iterator.venues_names":"performances.venues_names"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.ids"}]]}},"_om_2":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"location"}]]}},"_om_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venues_names"}]]}},"_om_1":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venue_id"}]]}},"_om_3":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Constant","value":"Performance"}]]}}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .\n?_sm_0 ?_om_3 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/constant/input.shexml b/test/shexml/constant/input.shexml new file mode 100644 index 0000000..7ece8a0 --- /dev/null +++ b/test/shexml/constant/input.shexml @@ -0,0 +1,19 @@ +PREFIX : +SOURCE performances_csv +ITERATOR performances_iterator { + FIELD ids + FIELD venues_names + FIELD venue_id + FIELD lat + FIELD long +} + +EXPRESSION performances +EXPRESSION location + +:Performance :[performances.ids] { + a :Performance; + :venue :[performances.venues_names] ; + :venue_id :[performances.venue_id]; + :location :[location]; +} diff --git a/test/shexml/constant/input_pretty.dot b/test/shexml/constant/input_pretty.dot new file mode 100644 index 0000000..2f03a23 --- /dev/null +++ b/test/shexml/constant/input_pretty.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"ids\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venues_names\",\l reference: \"venue_name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venue_id\",\l reference: \"venue_id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"lat\",\l reference: \"lat\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"long\",\l reference: \"long\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"performances_iterator\",\l ),\l} \lconfig: {\l \"path\": \"events.csv\"\l}\l " ] + 1 [ label = "id:Extend_Concatenate_1 \lExtension Operator\lExtended pairs: \l location -> Concatenate { left_value: Reference { value: \"performances_iterator.lat\" }, separator: \"-\", right_value: Reference { value: \"performances_iterator.long\" } }" ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l performances_iterator.ids -> performances.ids\lperformances_iterator.long -> performances.long\lperformances_iterator.lat -> performances.lat\lperformances_iterator.venue_id -> performances.venue_id\lperformances_iterator.venues_names -> performances.venues_names" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l _sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.ids\" })] } }\l_om_2 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"location\" })] } }\l_om_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venues_names\" })] } }\l_om_1 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venue_id\" })] } }\l_om_3 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Constant { value: \"Performance\" })] } }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 .\l?_sm_0 ?_om_3 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 0 -> 1 [ label = "Fragment:default" ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] +} diff --git a/test/shexml/graph/expected.nq b/test/shexml/graph/expected.nq new file mode 100644 index 0000000..11848ed --- /dev/null +++ b/test/shexml/graph/expected.nq @@ -0,0 +1,10 @@ + . + "Insomnia" . + "2002"^^ . + "USA" . + "Christopher Nolan" . + . + "Memento" . + "2000"^^ . + "USA" . + "Christopher Nolan" . diff --git a/test/shexml/graph/film2.csv b/test/shexml/graph/film2.csv new file mode 100644 index 0000000..09cb58f --- /dev/null +++ b/test/shexml/graph/film2.csv @@ -0,0 +1,3 @@ +id,name,year,comment +5,Memento,2000,A pretty pyschotic movie +6,Insomnia,2002,Not bad diff --git a/test/shexml/graph/films.csv b/test/shexml/graph/films.csv new file mode 100644 index 0000000..7381395 --- /dev/null +++ b/test/shexml/graph/films.csv @@ -0,0 +1,3 @@ +id,name,year,country,director +5,Memento,2000,USA,Christopher Nolan +6,Insomnia,2002,USA,Christopher Nolan \ No newline at end of file diff --git a/test/shexml/graph/input.dot b/test/shexml/graph/input.dot new file mode 100644 index 0000000..1299a3a --- /dev/null +++ b/test/shexml/graph/input.dot @@ -0,0 +1,20 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"films.csv\",\"root_iterator\":{\"alias\":\"film_xml\",\"fields\":[{\"alias\":\"id\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"name\",\"inner_fields\":[],\"reference\":\"name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"year\",\"inner_fields\":[],\"reference\":\"year\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"country\",\"inner_fields\":[],\"reference\":\"country\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"directors\",\"inner_fields\":[],\"reference\":\"director\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Source_1\",\"operator\":{\"config\":{\"path\":\"film2.csv\",\"root_iterator\":{\"alias\":\"film_json\",\"fields\":[{\"alias\":\"id\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"name\",\"inner_fields\":[],\"reference\":\"name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"year\",\"inner_fields\":[],\"reference\":\"year\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"comment\",\"inner_fields\":[],\"reference\":\"comment\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"film_json.comment\":\"films.comment\",\"film_json.id\":\"films.id\",\"film_json.name\":\"films.name\",\"film_json.year\":\"films.year\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"MyFilms_om_0\":{\"dtype_function\":{\"template\":\"http://www.w3.org/2001/XMLSchema#{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Constant\",\"value\":\"gYear\"}]]},\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.year\"},\"langtype_function\":null,\"type\":\"Literal\"},\"MyFilms_om_1\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"MyFilms_om_2\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.country\"},\"langtype_function\":null,\"type\":\"Literal\"},\"MyFilms_om_3\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.directors\"},\"langtype_function\":null,\"type\":\"Literal\"},\"MyFilms_om_4\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Constant\",\"value\":\"Film\"}]]},\"type\":\"Iri\"},\"MyFilms_sm_0\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"films.id\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?MyFilms_sm_0 ?MyFilms_om_0 .\\n?MyFilms_sm_0 ?MyFilms_om_1 .\\n?MyFilms_sm_0 ?MyFilms_om_2 .\\n?MyFilms_sm_0 ?MyFilms_om_3 .\\n?MyFilms_sm_0 ?MyFilms_om_4 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 6 [ label = "{\"id\":\"Rename_expression_6\",\"operator\":{\"config\":{\"film_xml.country\":\"films.country\",\"film_xml.directors\":\"films.directors\",\"film_xml.id\":\"films.id\",\"film_xml.name\":\"films.name\",\"film_xml.year\":\"films.year\"},\"type\":\"RenameOp\"}}" ] + 7 [ label = "{\"id\":\"Extend_for_Serializer_7\",\"operator\":{\"config\":{\"MyFilms_om_0\":{\"dtype_function\":{\"template\":\"http://www.w3.org/2001/XMLSchema#{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Constant\",\"value\":\"gYear\"}]]},\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.year\"},\"langtype_function\":null,\"type\":\"Literal\"},\"MyFilms_om_1\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"MyFilms_om_2\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.country\"},\"langtype_function\":null,\"type\":\"Literal\"},\"MyFilms_om_3\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.directors\"},\"langtype_function\":null,\"type\":\"Literal\"},\"MyFilms_om_4\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Constant\",\"value\":\"Film\"}]]},\"type\":\"Iri\"},\"MyFilms_sm_0\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"films.id\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?MyFilms_sm_0 ?MyFilms_om_0 .\\n?MyFilms_sm_0 ?MyFilms_om_1 .\\n?MyFilms_sm_0 ?MyFilms_om_2 .\\n?MyFilms_sm_0 ?MyFilms_om_3 .\\n?MyFilms_sm_0 ?MyFilms_om_4 .\"},\"type\":\"SerializerOp\"}}" ] + 9 [ label = "{\"id\":\"Sink_9\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] + 0 -> 6 [ label = "{\"fragment\": default}" ] + 6 -> 7 [ label = "{\"fragment\": default}" ] + 7 -> 8 [ label = "{\"fragment\": default}" ] + 8 -> 9 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/graph/input.json b/test/shexml/graph/input.json new file mode 100644 index 0000000..e16d942 --- /dev/null +++ b/test/shexml/graph/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"films.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"id","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"name","reference":"name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"year","reference":"year","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"country","reference":"country","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"directors","reference":"director","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"film_xml"}}}},{"id":"Source_1","operator":{"type":"SourceOp","config":{"path":"film2.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"id","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"name","reference":"name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"year","reference":"year","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"comment","reference":"comment","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"film_json"}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"film_json.name":"films.name","film_json.comment":"films.comment","film_json.year":"films.year","film_json.id":"films.id"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"MyFilms_om_4":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Constant","value":"Film"}]]}},"MyFilms_om_0":{"type":"Literal","inner_function":{"type":"Reference","value":"films.year"},"dtype_function":{"type":"TemplateFunctionValue","template":"http://www.w3.org/2001/XMLSchema#{func_value}","variable_function_pairs":[["func_value",{"type":"Constant","value":"gYear"}]]},"langtype_function":null},"MyFilms_om_3":{"type":"Literal","inner_function":{"type":"Reference","value":"films.directors"},"dtype_function":null,"langtype_function":null},"MyFilms_om_1":{"type":"Literal","inner_function":{"type":"Reference","value":"films.name"},"dtype_function":null,"langtype_function":null},"MyFilms_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"films.id"}]]}},"MyFilms_om_2":{"type":"Literal","inner_function":{"type":"Reference","value":"films.country"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?MyFilms_sm_0 ?MyFilms_om_0 .\n?MyFilms_sm_0 ?MyFilms_om_1 .\n?MyFilms_sm_0 ?MyFilms_om_2 .\n?MyFilms_sm_0 ?MyFilms_om_3 .\n?MyFilms_sm_0 ?MyFilms_om_4 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"Rename_expression_6","operator":{"type":"RenameOp","config":{"film_xml.country":"films.country","film_xml.id":"films.id","film_xml.directors":"films.directors","film_xml.name":"films.name","film_xml.year":"films.year"}}},{"id":"Extend_for_Serializer_7","operator":{"type":"ExtendOp","config":{"MyFilms_om_1":{"type":"Literal","inner_function":{"type":"Reference","value":"films.name"},"dtype_function":null,"langtype_function":null},"MyFilms_om_2":{"type":"Literal","inner_function":{"type":"Reference","value":"films.country"},"dtype_function":null,"langtype_function":null},"MyFilms_om_4":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Constant","value":"Film"}]]}},"MyFilms_om_0":{"type":"Literal","inner_function":{"type":"Reference","value":"films.year"},"dtype_function":{"type":"TemplateFunctionValue","template":"http://www.w3.org/2001/XMLSchema#{func_value}","variable_function_pairs":[["func_value",{"type":"Constant","value":"gYear"}]]},"langtype_function":null},"MyFilms_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"films.id"}]]}},"MyFilms_om_3":{"type":"Literal","inner_function":{"type":"Reference","value":"films.directors"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?MyFilms_sm_0 ?MyFilms_om_0 .\n?MyFilms_sm_0 ?MyFilms_om_1 .\n?MyFilms_sm_0 ?MyFilms_om_2 .\n?MyFilms_sm_0 ?MyFilms_om_3 .\n?MyFilms_sm_0 ?MyFilms_om_4 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[0,6,{"fragment":"default"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/graph/input.shexml b/test/shexml/graph/input.shexml new file mode 100644 index 0000000..09b5a6b --- /dev/null +++ b/test/shexml/graph/input.shexml @@ -0,0 +1,30 @@ +PREFIX : +PREFIX xs: +SOURCE films_xml_file +SOURCE films_json_file +ITERATOR film_xml { + FIELD id + FIELD name + FIELD year + FIELD country + FIELD directors +} +ITERATOR film_json { + FIELD id + FIELD name + FIELD year + FIELD comment +} + +EXPRESSION films + +:MyFilms [[ + :Films :[films.id] { + :type :Film ; + :name [films.name] ; + :year [films.year] xs:gYear ; + :country [films.country] ; + :director [films.directors] ; + } +]] + diff --git a/test/shexml/graph/input_pretty.dot b/test/shexml/graph/input_pretty.dot new file mode 100644 index 0000000..162a3f6 --- /dev/null +++ b/test/shexml/graph/input_pretty.dot @@ -0,0 +1,20 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"id\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"name\",\l reference: \"name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"year\",\l reference: \"year\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"country\",\l reference: \"country\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"directors\",\l reference: \"director\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"film_xml\",\l ),\l} \lconfig: {\l \"path\": \"films.csv\"\l}\l " ] + 1 [ label = "id:Source_1 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"id\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"name\",\l reference: \"name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"year\",\l reference: \"year\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"comment\",\l reference: \"comment\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"film_json\",\l ),\l} \lconfig: {\l \"path\": \"film2.csv\"\l}\l " ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l film_json.name -> films.name\lfilm_json.comment -> films.comment\lfilm_json.year -> films.year\lfilm_json.id -> films.id" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l MyFilms_om_4 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Constant { value: \"Film\" })] } }\lMyFilms_om_0 -> Literal { inner_function: Reference { value: \"films.year\" }, dtype_function: Some(TemplateFunctionValue { template: \"http://www.w3.org/2001/XMLSchema#{func_value}\", variable_function_pairs: [(\"func_value\", Constant { value: \"gYear\" })] }), langtype_function: None }\lMyFilms_om_3 -> Literal { inner_function: Reference { value: \"films.directors\" }, dtype_function: None, langtype_function: None }\lMyFilms_om_1 -> Literal { inner_function: Reference { value: \"films.name\" }, dtype_function: None, langtype_function: None }\lMyFilms_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"films.id\" })] } }\lMyFilms_om_2 -> Literal { inner_function: Reference { value: \"films.country\" }, dtype_function: None, langtype_function: None }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?MyFilms_sm_0 ?MyFilms_om_0 .\l?MyFilms_sm_0 ?MyFilms_om_1 .\l?MyFilms_sm_0 ?MyFilms_om_2 .\l?MyFilms_sm_0 ?MyFilms_om_3 .\l?MyFilms_sm_0 ?MyFilms_om_4 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 6 [ label = "id:Rename_expression_6 \lRename Operator\lRenaming pairs:\l film_xml.country -> films.country\lfilm_xml.id -> films.id\lfilm_xml.directors -> films.directors\lfilm_xml.name -> films.name\lfilm_xml.year -> films.year" ] + 7 [ label = "id:Extend_for_Serializer_7 \lExtension Operator\lExtended pairs: \l MyFilms_om_1 -> Literal { inner_function: Reference { value: \"films.name\" }, dtype_function: None, langtype_function: None }\lMyFilms_om_2 -> Literal { inner_function: Reference { value: \"films.country\" }, dtype_function: None, langtype_function: None }\lMyFilms_om_4 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Constant { value: \"Film\" })] } }\lMyFilms_om_0 -> Literal { inner_function: Reference { value: \"films.year\" }, dtype_function: Some(TemplateFunctionValue { template: \"http://www.w3.org/2001/XMLSchema#{func_value}\", variable_function_pairs: [(\"func_value\", Constant { value: \"gYear\" })] }), langtype_function: None }\lMyFilms_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"films.id\" })] } }\lMyFilms_om_3 -> Literal { inner_function: Reference { value: \"films.directors\" }, dtype_function: None, langtype_function: None }" ] + 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?MyFilms_sm_0 ?MyFilms_om_0 .\l?MyFilms_sm_0 ?MyFilms_om_1 .\l?MyFilms_sm_0 ?MyFilms_om_2 .\l?MyFilms_sm_0 ?MyFilms_om_3 .\l?MyFilms_sm_0 ?MyFilms_om_4 ." ] + 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] + 0 -> 6 [ label = "Fragment:default" ] + 6 -> 7 [ label = "Fragment:default" ] + 7 -> 8 [ label = "Fragment:default" ] + 8 -> 9 [ label = "Fragment:default" ] +} diff --git a/test/shexml/linking/events.csv b/test/shexml/linking/events.csv new file mode 100644 index 0000000..5b66e14 --- /dev/null +++ b/test/shexml/linking/events.csv @@ -0,0 +1,3 @@ +id,venue_name,venue_id,lat,long +567,STAM,78,51.043611,3.717222 +989,STEM,68,51.043613,3.717333 diff --git a/test/shexml/linking/expected.nq b/test/shexml/linking/expected.nq new file mode 100644 index 0000000..d49921d --- /dev/null +++ b/test/shexml/linking/expected.nq @@ -0,0 +1,10 @@ + . + . + . + . + . + . + "51.043613" . + "3.717333" . + "51.043611" . + "3.717222" . diff --git a/test/shexml/linking/input.dot b/test/shexml/linking/input.dot new file mode 100644 index 0000000..721d0a2 --- /dev/null +++ b/test/shexml/linking/input.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"events.csv\",\"root_iterator\":{\"alias\":\"performances_iterator\",\"fields\":[{\"alias\":\"ids\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venues_names\",\"inner_fields\":[],\"reference\":\"venue_name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venue_id\",\"inner_fields\":[],\"reference\":\"venue_id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"lat\",\"inner_fields\":[],\"reference\":\"lat\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"long\",\"inner_fields\":[],\"reference\":\"long\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Extend_Concatenate_1\",\"operator\":{\"config\":{\"location_union\":{\"left_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.lat\"},\"right_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.long\"},\"separator\":\"-\",\"type\":\"Concatenate\"}},\"type\":\"ExtendOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"performances_iterator.ids\":\"performances.ids\",\"performances_iterator.lat\":\"performances.lat\",\"performances_iterator.long\":\"performances.long\",\"performances_iterator.venue_id\":\"performances.venue_id\",\"performances_iterator.venues_names\":\"performances.venues_names\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"_om_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venue_id\"}]]},\"type\":\"Iri\"},\"_om_1\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venues_names\"}]]},\"type\":\"Iri\"},\"_om_3\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"performances.long\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_4\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"performances.lat\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.ids\"}]]},\"type\":\"Iri\"},\"_sm_3\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"location_union\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_sm_3 .\\n?_sm_3 ?_om_3 .\\n?_sm_3 ?_om_4 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 0 -> 1 [ label = "{\"fragment\": default}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/linking/input.json b/test/shexml/linking/input.json new file mode 100644 index 0000000..57cd76a --- /dev/null +++ b/test/shexml/linking/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"events.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"ids","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venues_names","reference":"venue_name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venue_id","reference":"venue_id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"lat","reference":"lat","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"long","reference":"long","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"performances_iterator"}}}},{"id":"Extend_Concatenate_1","operator":{"type":"ExtendOp","config":{"location_union":{"type":"Concatenate","left_value":{"type":"Reference","value":"performances_iterator.lat"},"separator":"-","right_value":{"type":"Reference","value":"performances_iterator.long"}}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"performances_iterator.ids":"performances.ids","performances_iterator.venue_id":"performances.venue_id","performances_iterator.long":"performances.long","performances_iterator.venues_names":"performances.venues_names","performances_iterator.lat":"performances.lat"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"_sm_3":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"location_union"}]]}},"_om_4":{"type":"Literal","inner_function":{"type":"Reference","value":"performances.lat"},"dtype_function":null,"langtype_function":null},"_om_3":{"type":"Literal","inner_function":{"type":"Reference","value":"performances.long"},"dtype_function":null,"langtype_function":null},"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.ids"}]]}},"_om_1":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venues_names"}]]}},"_om_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venue_id"}]]}}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_sm_3 .\n?_sm_3 ?_om_3 .\n?_sm_3 ?_om_4 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/linking/input.shexml b/test/shexml/linking/input.shexml new file mode 100644 index 0000000..c94bd81 --- /dev/null +++ b/test/shexml/linking/input.shexml @@ -0,0 +1,23 @@ +PREFIX ex: +SOURCE performances_csv +ITERATOR performances_iterator { + FIELD ids + FIELD venues_names + FIELD venue_id + FIELD lat + FIELD long +} + +EXPRESSION performances +EXPRESSION location_union + +ex:Performance ex:[performances.ids] { + ex:venue ex:[performances.venues_names] ; + ex:venue_id ex:[performances.venue_id]; + ex:location @ex:Location ; +} + +ex:Location ex:[location_union] { + ex:lat [performances.lat] ; + ex:long [performances.long] ; +} diff --git a/test/shexml/linking/input_pretty.dot b/test/shexml/linking/input_pretty.dot new file mode 100644 index 0000000..14b333e --- /dev/null +++ b/test/shexml/linking/input_pretty.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"ids\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venues_names\",\l reference: \"venue_name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venue_id\",\l reference: \"venue_id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"lat\",\l reference: \"lat\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"long\",\l reference: \"long\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"performances_iterator\",\l ),\l} \lconfig: {\l \"path\": \"events.csv\"\l}\l " ] + 1 [ label = "id:Extend_Concatenate_1 \lExtension Operator\lExtended pairs: \l location_union -> Concatenate { left_value: Reference { value: \"performances_iterator.lat\" }, separator: \"-\", right_value: Reference { value: \"performances_iterator.long\" } }" ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l performances_iterator.ids -> performances.ids\lperformances_iterator.venue_id -> performances.venue_id\lperformances_iterator.long -> performances.long\lperformances_iterator.venues_names -> performances.venues_names\lperformances_iterator.lat -> performances.lat" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l _sm_3 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"location_union\" })] } }\l_om_4 -> Literal { inner_function: Reference { value: \"performances.lat\" }, dtype_function: None, langtype_function: None }\l_om_3 -> Literal { inner_function: Reference { value: \"performances.long\" }, dtype_function: None, langtype_function: None }\l_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.ids\" })] } }\l_om_1 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venues_names\" })] } }\l_om_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venue_id\" })] } }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_sm_3 .\l?_sm_3 ?_om_3 .\l?_sm_3 ?_om_4 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 0 -> 1 [ label = "Fragment:default" ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] +} diff --git a/test/shexml/literal/events.csv b/test/shexml/literal/events.csv new file mode 100644 index 0000000..5b66e14 --- /dev/null +++ b/test/shexml/literal/events.csv @@ -0,0 +1,3 @@ +id,venue_name,venue_id,lat,long +567,STAM,78,51.043611,3.717222 +989,STEM,68,51.043613,3.717333 diff --git a/test/shexml/literal/expected.nq b/test/shexml/literal/expected.nq new file mode 100644 index 0000000..af9c765 --- /dev/null +++ b/test/shexml/literal/expected.nq @@ -0,0 +1,6 @@ + "STEM" . + "68" . + "51.043613-3.717333" . + "STAM" . + "78" . + "51.043611-3.717222" . diff --git a/test/shexml/literal/input.dot b/test/shexml/literal/input.dot new file mode 100644 index 0000000..dcb54be --- /dev/null +++ b/test/shexml/literal/input.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"events.csv\",\"root_iterator\":{\"alias\":\"performances_iterator\",\"fields\":[{\"alias\":\"ids\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venues_names\",\"inner_fields\":[],\"reference\":\"venue_name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venue_id\",\"inner_fields\":[],\"reference\":\"venue_id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"lat\",\"inner_fields\":[],\"reference\":\"lat\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"long\",\"inner_fields\":[],\"reference\":\"long\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Extend_Concatenate_1\",\"operator\":{\"config\":{\"location\":{\"left_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.lat\"},\"right_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.long\"},\"separator\":\"-\",\"type\":\"Concatenate\"}},\"type\":\"ExtendOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"performances_iterator.ids\":\"performances.ids\",\"performances_iterator.lat\":\"performances.lat\",\"performances_iterator.long\":\"performances.long\",\"performances_iterator.venue_id\":\"performances.venue_id\",\"performances_iterator.venues_names\":\"performances.venues_names\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"_om_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"performances.venues_names\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_1\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"location\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_2\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"performances.venue_id\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.ids\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 0 -> 1 [ label = "{\"fragment\": default}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/literal/input.json b/test/shexml/literal/input.json new file mode 100644 index 0000000..a3fe035 --- /dev/null +++ b/test/shexml/literal/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"events.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"ids","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venues_names","reference":"venue_name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venue_id","reference":"venue_id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"lat","reference":"lat","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"long","reference":"long","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"performances_iterator"}}}},{"id":"Extend_Concatenate_1","operator":{"type":"ExtendOp","config":{"location":{"type":"Concatenate","left_value":{"type":"Reference","value":"performances_iterator.lat"},"separator":"-","right_value":{"type":"Reference","value":"performances_iterator.long"}}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"performances_iterator.venue_id":"performances.venue_id","performances_iterator.ids":"performances.ids","performances_iterator.long":"performances.long","performances_iterator.venues_names":"performances.venues_names","performances_iterator.lat":"performances.lat"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"_om_2":{"type":"Literal","inner_function":{"type":"Reference","value":"performances.venue_id"},"dtype_function":null,"langtype_function":null},"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.ids"}]]}},"_om_1":{"type":"Literal","inner_function":{"type":"Reference","value":"location"},"dtype_function":null,"langtype_function":null},"_om_0":{"type":"Literal","inner_function":{"type":"Reference","value":"performances.venues_names"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/literal/input.shexml b/test/shexml/literal/input.shexml new file mode 100644 index 0000000..46cc898 --- /dev/null +++ b/test/shexml/literal/input.shexml @@ -0,0 +1,18 @@ +PREFIX : +SOURCE performances_csv +ITERATOR performances_iterator { + FIELD ids + FIELD venues_names + FIELD venue_id + FIELD lat + FIELD long +} + +EXPRESSION performances +EXPRESSION location + +:Performance :[performances.ids] { + :venue [performances.venues_names] ; + :venue_id [performances.venue_id]; + :location [location]; +} diff --git a/test/shexml/literal/input_pretty.dot b/test/shexml/literal/input_pretty.dot new file mode 100644 index 0000000..4425cfe --- /dev/null +++ b/test/shexml/literal/input_pretty.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"ids\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venues_names\",\l reference: \"venue_name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venue_id\",\l reference: \"venue_id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"lat\",\l reference: \"lat\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"long\",\l reference: \"long\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"performances_iterator\",\l ),\l} \lconfig: {\l \"path\": \"events.csv\"\l}\l " ] + 1 [ label = "id:Extend_Concatenate_1 \lExtension Operator\lExtended pairs: \l location -> Concatenate { left_value: Reference { value: \"performances_iterator.lat\" }, separator: \"-\", right_value: Reference { value: \"performances_iterator.long\" } }" ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l performances_iterator.venue_id -> performances.venue_id\lperformances_iterator.ids -> performances.ids\lperformances_iterator.long -> performances.long\lperformances_iterator.venues_names -> performances.venues_names\lperformances_iterator.lat -> performances.lat" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l _om_2 -> Literal { inner_function: Reference { value: \"performances.venue_id\" }, dtype_function: None, langtype_function: None }\l_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.ids\" })] } }\l_om_1 -> Literal { inner_function: Reference { value: \"location\" }, dtype_function: None, langtype_function: None }\l_om_0 -> Literal { inner_function: Reference { value: \"performances.venues_names\" }, dtype_function: None, langtype_function: None }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 0 -> 1 [ label = "Fragment:default" ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] +} diff --git a/test/shexml/multiple_iterator/expected.nq b/test/shexml/multiple_iterator/expected.nq new file mode 100644 index 0000000..f6dbf06 --- /dev/null +++ b/test/shexml/multiple_iterator/expected.nq @@ -0,0 +1,12 @@ + "Not bad" . + . + "Insomnia" . + "2002" . + "USA" . + "Christopher Nolan" . + "A pretty pyschotic movie" . + . + "Memento" . + "2000" . + "USA" . + "Christopher Nolan" . diff --git a/test/shexml/multiple_iterator/film2.csv b/test/shexml/multiple_iterator/film2.csv new file mode 100644 index 0000000..09cb58f --- /dev/null +++ b/test/shexml/multiple_iterator/film2.csv @@ -0,0 +1,3 @@ +id,name,year,comment +5,Memento,2000,A pretty pyschotic movie +6,Insomnia,2002,Not bad diff --git a/test/shexml/multiple_iterator/films.csv b/test/shexml/multiple_iterator/films.csv new file mode 100644 index 0000000..7381395 --- /dev/null +++ b/test/shexml/multiple_iterator/films.csv @@ -0,0 +1,3 @@ +id,name,year,country,director +5,Memento,2000,USA,Christopher Nolan +6,Insomnia,2002,USA,Christopher Nolan \ No newline at end of file diff --git a/test/shexml/multiple_iterator/input.dot b/test/shexml/multiple_iterator/input.dot new file mode 100644 index 0000000..f6b4774 --- /dev/null +++ b/test/shexml/multiple_iterator/input.dot @@ -0,0 +1,20 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"film2.csv\",\"root_iterator\":{\"alias\":\"film_partial\",\"fields\":[{\"alias\":\"id\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"name\",\"inner_fields\":[],\"reference\":\"name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"year\",\"inner_fields\":[],\"reference\":\"year\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"comment\",\"inner_fields\":[],\"reference\":\"comment\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Source_1\",\"operator\":{\"config\":{\"path\":\"films.csv\",\"root_iterator\":{\"alias\":\"film_full\",\"fields\":[{\"alias\":\"id\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"name\",\"inner_fields\":[],\"reference\":\"name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"year\",\"inner_fields\":[],\"reference\":\"year\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"country\",\"inner_fields\":[],\"reference\":\"country\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"directors\",\"inner_fields\":[],\"reference\":\"director\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"film_full.country\":\"films.country\",\"film_full.directors\":\"films.directors\",\"film_full.id\":\"films.id\",\"film_full.name\":\"films.name\",\"film_full.year\":\"films.year\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"_om_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.directors\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_1\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_2\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.country\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_3\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.comment\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_4\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Constant\",\"value\":\"Film\"}]]},\"type\":\"Iri\"},\"_om_5\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.year\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"films.id\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\\n?_sm_0 ?_om_3 .\\n?_sm_0 ?_om_4 .\\n?_sm_0 ?_om_5 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 6 [ label = "{\"id\":\"Rename_expression_6\",\"operator\":{\"config\":{\"film_partial.comment\":\"films.comment\",\"film_partial.id\":\"films.id\",\"film_partial.name\":\"films.name\",\"film_partial.year\":\"films.year\"},\"type\":\"RenameOp\"}}" ] + 7 [ label = "{\"id\":\"Extend_for_Serializer_7\",\"operator\":{\"config\":{\"_om_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.directors\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_1\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_2\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.country\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_3\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.comment\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_4\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Constant\",\"value\":\"Film\"}]]},\"type\":\"Iri\"},\"_om_5\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.year\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"films.id\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 8 [ label = "{\"id\":\"Serialize_8\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\\n?_sm_0 ?_om_3 .\\n?_sm_0 ?_om_4 .\\n?_sm_0 ?_om_5 .\"},\"type\":\"SerializerOp\"}}" ] + 9 [ label = "{\"id\":\"Sink_9\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] + 0 -> 6 [ label = "{\"fragment\": default}" ] + 6 -> 7 [ label = "{\"fragment\": default}" ] + 7 -> 8 [ label = "{\"fragment\": default}" ] + 8 -> 9 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/multiple_iterator/input.json b/test/shexml/multiple_iterator/input.json new file mode 100644 index 0000000..7312afe --- /dev/null +++ b/test/shexml/multiple_iterator/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"film2.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"id","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"name","reference":"name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"year","reference":"year","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"comment","reference":"comment","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"film_partial"}}}},{"id":"Source_1","operator":{"type":"SourceOp","config":{"path":"films.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"id","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"name","reference":"name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"year","reference":"year","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"country","reference":"country","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"directors","reference":"director","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"film_full"}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"film_full.id":"films.id","film_full.name":"films.name","film_full.country":"films.country","film_full.directors":"films.directors","film_full.year":"films.year"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"_om_3":{"type":"Literal","inner_function":{"type":"Reference","value":"films.comment"},"dtype_function":null,"langtype_function":null},"_om_4":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Constant","value":"Film"}]]}},"_om_5":{"type":"Literal","inner_function":{"type":"Reference","value":"films.year"},"dtype_function":null,"langtype_function":null},"_om_2":{"type":"Literal","inner_function":{"type":"Reference","value":"films.country"},"dtype_function":null,"langtype_function":null},"_om_0":{"type":"Literal","inner_function":{"type":"Reference","value":"films.directors"},"dtype_function":null,"langtype_function":null},"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"films.id"}]]}},"_om_1":{"type":"Literal","inner_function":{"type":"Reference","value":"films.name"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .\n?_sm_0 ?_om_3 .\n?_sm_0 ?_om_4 .\n?_sm_0 ?_om_5 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}},{"id":"Rename_expression_6","operator":{"type":"RenameOp","config":{"film_partial.name":"films.name","film_partial.id":"films.id","film_partial.year":"films.year","film_partial.comment":"films.comment"}}},{"id":"Extend_for_Serializer_7","operator":{"type":"ExtendOp","config":{"_om_1":{"type":"Literal","inner_function":{"type":"Reference","value":"films.name"},"dtype_function":null,"langtype_function":null},"_om_4":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Constant","value":"Film"}]]}},"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"films.id"}]]}},"_om_3":{"type":"Literal","inner_function":{"type":"Reference","value":"films.comment"},"dtype_function":null,"langtype_function":null},"_om_5":{"type":"Literal","inner_function":{"type":"Reference","value":"films.year"},"dtype_function":null,"langtype_function":null},"_om_0":{"type":"Literal","inner_function":{"type":"Reference","value":"films.directors"},"dtype_function":null,"langtype_function":null},"_om_2":{"type":"Literal","inner_function":{"type":"Reference","value":"films.country"},"dtype_function":null,"langtype_function":null}}}},{"id":"Serialize_8","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .\n?_sm_0 ?_om_3 .\n?_sm_0 ?_om_4 .\n?_sm_0 ?_om_5 .","format":"NQuads"}}},{"id":"Sink_9","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}],[0,6,{"fragment":"default"}],[6,7,{"fragment":"default"}],[7,8,{"fragment":"default"}],[8,9,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/multiple_iterator/input.shexml b/test/shexml/multiple_iterator/input.shexml new file mode 100644 index 0000000..5ff360a --- /dev/null +++ b/test/shexml/multiple_iterator/input.shexml @@ -0,0 +1,29 @@ +PREFIX : +SOURCE films_csv_file1 +SOURCE films_csv_file2 + +ITERATOR film_full { + FIELD id + FIELD name + FIELD year + FIELD country + FIELD directors +} + +ITERATOR film_partial { + FIELD id + FIELD name + FIELD year + FIELD comment +} + +EXPRESSION films + +:Films :[films.id] { + a :Film ; + :name [films.name] ; + :year [films.year] ; + :country [films.country] ; + :director [films.directors] ; + :comment [films.comment] ; +} diff --git a/test/shexml/multiple_iterator/input_pretty.dot b/test/shexml/multiple_iterator/input_pretty.dot new file mode 100644 index 0000000..9d1c972 --- /dev/null +++ b/test/shexml/multiple_iterator/input_pretty.dot @@ -0,0 +1,20 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"id\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"name\",\l reference: \"name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"year\",\l reference: \"year\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"comment\",\l reference: \"comment\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"film_partial\",\l ),\l} \lconfig: {\l \"path\": \"film2.csv\"\l}\l " ] + 1 [ label = "id:Source_1 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"id\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"name\",\l reference: \"name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"year\",\l reference: \"year\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"country\",\l reference: \"country\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"directors\",\l reference: \"director\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"film_full\",\l ),\l} \lconfig: {\l \"path\": \"films.csv\"\l}\l " ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l film_full.id -> films.id\lfilm_full.name -> films.name\lfilm_full.country -> films.country\lfilm_full.directors -> films.directors\lfilm_full.year -> films.year" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l _om_3 -> Literal { inner_function: Reference { value: \"films.comment\" }, dtype_function: None, langtype_function: None }\l_om_4 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Constant { value: \"Film\" })] } }\l_om_5 -> Literal { inner_function: Reference { value: \"films.year\" }, dtype_function: None, langtype_function: None }\l_om_2 -> Literal { inner_function: Reference { value: \"films.country\" }, dtype_function: None, langtype_function: None }\l_om_0 -> Literal { inner_function: Reference { value: \"films.directors\" }, dtype_function: None, langtype_function: None }\l_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"films.id\" })] } }\l_om_1 -> Literal { inner_function: Reference { value: \"films.name\" }, dtype_function: None, langtype_function: None }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 .\l?_sm_0 ?_om_3 .\l?_sm_0 ?_om_4 .\l?_sm_0 ?_om_5 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 6 [ label = "id:Rename_expression_6 \lRename Operator\lRenaming pairs:\l film_partial.name -> films.name\lfilm_partial.id -> films.id\lfilm_partial.year -> films.year\lfilm_partial.comment -> films.comment" ] + 7 [ label = "id:Extend_for_Serializer_7 \lExtension Operator\lExtended pairs: \l _om_1 -> Literal { inner_function: Reference { value: \"films.name\" }, dtype_function: None, langtype_function: None }\l_om_4 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Constant { value: \"Film\" })] } }\l_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"films.id\" })] } }\l_om_3 -> Literal { inner_function: Reference { value: \"films.comment\" }, dtype_function: None, langtype_function: None }\l_om_5 -> Literal { inner_function: Reference { value: \"films.year\" }, dtype_function: None, langtype_function: None }\l_om_0 -> Literal { inner_function: Reference { value: \"films.directors\" }, dtype_function: None, langtype_function: None }\l_om_2 -> Literal { inner_function: Reference { value: \"films.country\" }, dtype_function: None, langtype_function: None }" ] + 8 [ label = "id:Serialize_8 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 .\l?_sm_0 ?_om_3 .\l?_sm_0 ?_om_4 .\l?_sm_0 ?_om_5 ." ] + 9 [ label = "id:Sink_9 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] + 0 -> 6 [ label = "Fragment:default" ] + 6 -> 7 [ label = "Fragment:default" ] + 7 -> 8 [ label = "Fragment:default" ] + 8 -> 9 [ label = "Fragment:default" ] +} diff --git a/test/shexml/only_iterator_expression/events.csv b/test/shexml/only_iterator_expression/events.csv new file mode 100644 index 0000000..5b66e14 --- /dev/null +++ b/test/shexml/only_iterator_expression/events.csv @@ -0,0 +1,3 @@ +id,venue_name,venue_id,lat,long +567,STAM,78,51.043611,3.717222 +989,STEM,68,51.043613,3.717333 diff --git a/test/shexml/only_iterator_expression/expected.nq b/test/shexml/only_iterator_expression/expected.nq new file mode 100644 index 0000000..2c663c5 --- /dev/null +++ b/test/shexml/only_iterator_expression/expected.nq @@ -0,0 +1,6 @@ + . + . + . + . + . + . diff --git a/test/shexml/only_iterator_expression/input.dot b/test/shexml/only_iterator_expression/input.dot new file mode 100644 index 0000000..5e9be75 --- /dev/null +++ b/test/shexml/only_iterator_expression/input.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"events.csv\",\"root_iterator\":{\"alias\":\"performances_iterator\",\"fields\":[{\"alias\":\"ids\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venues_names\",\"inner_fields\":[],\"reference\":\"venue_name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venue_id\",\"inner_fields\":[],\"reference\":\"venue_id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"lat\",\"inner_fields\":[],\"reference\":\"lat\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"long\",\"inner_fields\":[],\"reference\":\"long\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Extend_Concatenate_1\",\"operator\":{\"config\":{\"locations\":{\"left_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.lat\"},\"right_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.long\"},\"separator\":\"-\",\"type\":\"Concatenate\"}},\"type\":\"ExtendOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"performances_iterator.ids\":\"performance_ids\",\"performances_iterator.venue_id\":\"venue_ids\",\"performances_iterator.venues_names\":\"venue_names\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"_om_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"locations\"}]]},\"type\":\"Iri\"},\"_om_1\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"venue_names\"}]]},\"type\":\"Iri\"},\"_om_2\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"venue_ids\"}]]},\"type\":\"Iri\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performance_ids\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 0 -> 1 [ label = "{\"fragment\": default}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/only_iterator_expression/input.json b/test/shexml/only_iterator_expression/input.json new file mode 100644 index 0000000..02d25c9 --- /dev/null +++ b/test/shexml/only_iterator_expression/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"events.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"ids","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venues_names","reference":"venue_name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venue_id","reference":"venue_id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"lat","reference":"lat","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"long","reference":"long","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"performances_iterator"}}}},{"id":"Extend_Concatenate_1","operator":{"type":"ExtendOp","config":{"locations":{"type":"Concatenate","left_value":{"type":"Reference","value":"performances_iterator.lat"},"separator":"-","right_value":{"type":"Reference","value":"performances_iterator.long"}}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"performances_iterator.venues_names":"venue_names","performances_iterator.venue_id":"venue_ids","performances_iterator.ids":"performance_ids"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performance_ids"}]]}},"_om_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"locations"}]]}},"_om_1":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"venue_names"}]]}},"_om_2":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"venue_ids"}]]}}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/only_iterator_expression/input.shexml b/test/shexml/only_iterator_expression/input.shexml new file mode 100644 index 0000000..c796bc1 --- /dev/null +++ b/test/shexml/only_iterator_expression/input.shexml @@ -0,0 +1,20 @@ +PREFIX : +SOURCE performances_csv +ITERATOR performances_iterator { + FIELD ids + FIELD venues_names + FIELD venue_id + FIELD lat + FIELD long +} + +EXPRESSION performance_ids +EXPRESSION venue_names +EXPRESSION venue_ids +EXPRESSION locations + +:Performance :[performance_ids] { + :venue :[venue_names] ; + :venue_id :[venue_ids]; + :location :[locations]; +} diff --git a/test/shexml/only_iterator_expression/input_pretty.dot b/test/shexml/only_iterator_expression/input_pretty.dot new file mode 100644 index 0000000..def6727 --- /dev/null +++ b/test/shexml/only_iterator_expression/input_pretty.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"ids\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venues_names\",\l reference: \"venue_name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venue_id\",\l reference: \"venue_id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"lat\",\l reference: \"lat\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"long\",\l reference: \"long\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"performances_iterator\",\l ),\l} \lconfig: {\l \"path\": \"events.csv\"\l}\l " ] + 1 [ label = "id:Extend_Concatenate_1 \lExtension Operator\lExtended pairs: \l locations -> Concatenate { left_value: Reference { value: \"performances_iterator.lat\" }, separator: \"-\", right_value: Reference { value: \"performances_iterator.long\" } }" ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l performances_iterator.venues_names -> venue_names\lperformances_iterator.venue_id -> venue_ids\lperformances_iterator.ids -> performance_ids" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l _sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performance_ids\" })] } }\l_om_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"locations\" })] } }\l_om_1 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"venue_names\" })] } }\l_om_2 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"venue_ids\" })] } }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 0 -> 1 [ label = "Fragment:default" ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] +} diff --git a/test/shexml/single_iterator/expected.nq b/test/shexml/single_iterator/expected.nq new file mode 100644 index 0000000..76f3e92 --- /dev/null +++ b/test/shexml/single_iterator/expected.nq @@ -0,0 +1,10 @@ + . + "Insomnia" . + "2002" . + "USA" . + "Christopher Nolan" . + . + "Memento" . + "2000" . + "USA" . + "Christopher Nolan" . diff --git a/test/shexml/single_iterator/films.csv b/test/shexml/single_iterator/films.csv new file mode 100644 index 0000000..7381395 --- /dev/null +++ b/test/shexml/single_iterator/films.csv @@ -0,0 +1,3 @@ +id,name,year,country,director +5,Memento,2000,USA,Christopher Nolan +6,Insomnia,2002,USA,Christopher Nolan \ No newline at end of file diff --git a/test/shexml/single_iterator/input.dot b/test/shexml/single_iterator/input.dot new file mode 100644 index 0000000..0feb7ad --- /dev/null +++ b/test/shexml/single_iterator/input.dot @@ -0,0 +1,11 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"films.csv\",\"root_iterator\":{\"alias\":\"film_full\",\"fields\":[{\"alias\":\"id\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"name\",\"inner_fields\":[],\"reference\":\"name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"year\",\"inner_fields\":[],\"reference\":\"year\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"country\",\"inner_fields\":[],\"reference\":\"country\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"directors\",\"inner_fields\":[],\"reference\":\"director\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Rename_expression_1\",\"operator\":{\"config\":{\"film_full.country\":\"films.country\",\"film_full.directors\":\"films.directors\",\"film_full.id\":\"films.id\",\"film_full.name\":\"films.name\",\"film_full.year\":\"films.year\"},\"type\":\"RenameOp\"}}" ] + 2 [ label = "{\"id\":\"Extend_for_Serializer_2\",\"operator\":{\"config\":{\"_om_0\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.name\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_1\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.country\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_2\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Constant\",\"value\":\"Film\"}]]},\"type\":\"Iri\"},\"_om_3\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.directors\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_om_4\":{\"dtype_function\":null,\"inner_function\":{\"type\":\"Reference\",\"value\":\"films.year\"},\"langtype_function\":null,\"type\":\"Literal\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://example.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"films.id\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 3 [ label = "{\"id\":\"Serialize_3\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\\n?_sm_0 ?_om_3 .\\n?_sm_0 ?_om_4 .\"},\"type\":\"SerializerOp\"}}" ] + 4 [ label = "{\"id\":\"Sink_4\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 0 -> 1 [ label = "{\"fragment\": default}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/single_iterator/input.json b/test/shexml/single_iterator/input.json new file mode 100644 index 0000000..dfc27c4 --- /dev/null +++ b/test/shexml/single_iterator/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"films.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"id","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"name","reference":"name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"year","reference":"year","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"country","reference":"country","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"directors","reference":"director","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"film_full"}}}},{"id":"Rename_expression_1","operator":{"type":"RenameOp","config":{"film_full.name":"films.name","film_full.id":"films.id","film_full.year":"films.year","film_full.country":"films.country","film_full.directors":"films.directors"}}},{"id":"Extend_for_Serializer_2","operator":{"type":"ExtendOp","config":{"_om_1":{"type":"Literal","inner_function":{"type":"Reference","value":"films.country"},"dtype_function":null,"langtype_function":null},"_om_3":{"type":"Literal","inner_function":{"type":"Reference","value":"films.directors"},"dtype_function":null,"langtype_function":null},"_om_2":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Constant","value":"Film"}]]}},"_om_4":{"type":"Literal","inner_function":{"type":"Reference","value":"films.year"},"dtype_function":null,"langtype_function":null},"_om_0":{"type":"Literal","inner_function":{"type":"Reference","value":"films.name"},"dtype_function":null,"langtype_function":null},"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://example.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"films.id"}]]}}}}},{"id":"Serialize_3","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .\n?_sm_0 ?_om_3 .\n?_sm_0 ?_om_4 .","format":"NQuads"}}},{"id":"Sink_4","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/single_iterator/input.shexml b/test/shexml/single_iterator/input.shexml new file mode 100644 index 0000000..c2a1640 --- /dev/null +++ b/test/shexml/single_iterator/input.shexml @@ -0,0 +1,19 @@ +PREFIX : +SOURCE films_csv_file1 +ITERATOR film_full { + FIELD id + FIELD name + FIELD year + FIELD country + FIELD directors +} + +EXPRESSION films + +:Films :[films.id] { + a :Film ; + :name [films.name] ; + :year [films.year] ; + :country [films.country] ; + :director [films.directors] ; +} diff --git a/test/shexml/single_iterator/input_pretty.dot b/test/shexml/single_iterator/input_pretty.dot new file mode 100644 index 0000000..09425a1 --- /dev/null +++ b/test/shexml/single_iterator/input_pretty.dot @@ -0,0 +1,11 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"id\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"name\",\l reference: \"name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"year\",\l reference: \"year\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"country\",\l reference: \"country\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"directors\",\l reference: \"director\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"film_full\",\l ),\l} \lconfig: {\l \"path\": \"films.csv\"\l}\l " ] + 1 [ label = "id:Rename_expression_1 \lRename Operator\lRenaming pairs:\l film_full.name -> films.name\lfilm_full.id -> films.id\lfilm_full.year -> films.year\lfilm_full.country -> films.country\lfilm_full.directors -> films.directors" ] + 2 [ label = "id:Extend_for_Serializer_2 \lExtension Operator\lExtended pairs: \l _om_1 -> Literal { inner_function: Reference { value: \"films.country\" }, dtype_function: None, langtype_function: None }\l_om_3 -> Literal { inner_function: Reference { value: \"films.directors\" }, dtype_function: None, langtype_function: None }\l_om_2 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Constant { value: \"Film\" })] } }\l_om_4 -> Literal { inner_function: Reference { value: \"films.year\" }, dtype_function: None, langtype_function: None }\l_om_0 -> Literal { inner_function: Reference { value: \"films.name\" }, dtype_function: None, langtype_function: None }\l_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://example.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"films.id\" })] } }" ] + 3 [ label = "id:Serialize_3 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 .\l?_sm_0 ?_om_3 .\l?_sm_0 ?_om_4 ." ] + 4 [ label = "id:Sink_4 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 0 -> 1 [ label = "Fragment:default" ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] +} diff --git a/test/shexml/string_concatenation/events.csv b/test/shexml/string_concatenation/events.csv new file mode 100644 index 0000000..5b66e14 --- /dev/null +++ b/test/shexml/string_concatenation/events.csv @@ -0,0 +1,3 @@ +id,venue_name,venue_id,lat,long +567,STAM,78,51.043611,3.717222 +989,STEM,68,51.043613,3.717333 diff --git a/test/shexml/string_concatenation/expected.nq b/test/shexml/string_concatenation/expected.nq new file mode 100644 index 0000000..2c663c5 --- /dev/null +++ b/test/shexml/string_concatenation/expected.nq @@ -0,0 +1,6 @@ + . + . + . + . + . + . diff --git a/test/shexml/string_concatenation/input.dot b/test/shexml/string_concatenation/input.dot new file mode 100644 index 0000000..ebf517c --- /dev/null +++ b/test/shexml/string_concatenation/input.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "{\"id\":\"Source_0\",\"operator\":{\"config\":{\"path\":\"events.csv\",\"root_iterator\":{\"alias\":\"performances_iterator\",\"fields\":[{\"alias\":\"ids\",\"inner_fields\":[],\"reference\":\"id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venues_names\",\"inner_fields\":[],\"reference\":\"venue_name\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"venue_id\",\"inner_fields\":[],\"reference\":\"venue_id\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"lat\",\"inner_fields\":[],\"reference\":\"lat\",\"reference_formulation\":\"CSVRows\"},{\"alias\":\"long\",\"inner_fields\":[],\"reference\":\"long\",\"reference_formulation\":\"CSVRows\"}],\"reference\":null,\"reference_formulation\":\"CSVRows\"},\"source_type\":\"File\"},\"type\":\"SourceOp\"}}" ] + 1 [ label = "{\"id\":\"Extend_Concatenate_1\",\"operator\":{\"config\":{\"location\":{\"left_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.lat\"},\"right_value\":{\"type\":\"Reference\",\"value\":\"performances_iterator.long\"},\"separator\":\"-\",\"type\":\"Concatenate\"}},\"type\":\"ExtendOp\"}}" ] + 2 [ label = "{\"id\":\"Rename_expression_2\",\"operator\":{\"config\":{\"performances_iterator.ids\":\"performances.ids\",\"performances_iterator.lat\":\"performances.lat\",\"performances_iterator.long\":\"performances.long\",\"performances_iterator.venue_id\":\"performances.venue_id\",\"performances_iterator.venues_names\":\"performances.venues_names\"},\"type\":\"RenameOp\"}}" ] + 3 [ label = "{\"id\":\"Extend_for_Serializer_3\",\"operator\":{\"config\":{\"_om_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venue_id\"}]]},\"type\":\"Iri\"},\"_om_1\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"location\"}]]},\"type\":\"Iri\"},\"_om_2\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.venues_names\"}]]},\"type\":\"Iri\"},\"_sm_0\":{\"inner_function\":{\"template\":\"http://ex.com/{func_value}\",\"type\":\"TemplateFunctionValue\",\"variable_function_pairs\":[[\"func_value\",{\"type\":\"Reference\",\"value\":\"performances.ids\"}]]},\"type\":\"Iri\"}},\"type\":\"ExtendOp\"}}" ] + 4 [ label = "{\"id\":\"Serialize_4\",\"operator\":{\"config\":{\"format\":\"NQuads\",\"template\":\"?_sm_0 ?_om_0 .\\n?_sm_0 ?_om_1 .\\n?_sm_0 ?_om_2 .\"},\"type\":\"SerializerOp\"}}" ] + 5 [ label = "{\"id\":\"Sink_5\",\"operator\":{\"config\":{\"data_format\":\"NQuads\",\"target_type\":\"StdOut\"},\"type\":\"TargetOp\"}}" ] + 0 -> 1 [ label = "{\"fragment\": default}" ] + 1 -> 2 [ label = "{\"fragment\": default}" ] + 2 -> 3 [ label = "{\"fragment\": default}" ] + 3 -> 4 [ label = "{\"fragment\": default}" ] + 4 -> 5 [ label = "{\"fragment\": default}" ] +} diff --git a/test/shexml/string_concatenation/input.json b/test/shexml/string_concatenation/input.json new file mode 100644 index 0000000..cd7d48a --- /dev/null +++ b/test/shexml/string_concatenation/input.json @@ -0,0 +1 @@ +{"nodes":[{"id":"Source_0","operator":{"type":"SourceOp","config":{"path":"events.csv","source_type":"File","root_iterator":{"reference":null,"reference_formulation":"CSVRows","fields":[{"alias":"ids","reference":"id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venues_names","reference":"venue_name","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"venue_id","reference":"venue_id","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"lat","reference":"lat","reference_formulation":"CSVRows","inner_fields":[]},{"alias":"long","reference":"long","reference_formulation":"CSVRows","inner_fields":[]}],"alias":"performances_iterator"}}}},{"id":"Extend_Concatenate_1","operator":{"type":"ExtendOp","config":{"location":{"type":"Concatenate","left_value":{"type":"Reference","value":"performances_iterator.lat"},"separator":"-","right_value":{"type":"Reference","value":"performances_iterator.long"}}}}},{"id":"Rename_expression_2","operator":{"type":"RenameOp","config":{"performances_iterator.venue_id":"performances.venue_id","performances_iterator.long":"performances.long","performances_iterator.ids":"performances.ids","performances_iterator.venues_names":"performances.venues_names","performances_iterator.lat":"performances.lat"}}},{"id":"Extend_for_Serializer_3","operator":{"type":"ExtendOp","config":{"_om_1":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"location"}]]}},"_om_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venue_id"}]]}},"_sm_0":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.ids"}]]}},"_om_2":{"type":"Iri","inner_function":{"type":"TemplateFunctionValue","template":"http://ex.com/{func_value}","variable_function_pairs":[["func_value",{"type":"Reference","value":"performances.venues_names"}]]}}}}},{"id":"Serialize_4","operator":{"type":"SerializerOp","config":{"template":"?_sm_0 ?_om_0 .\n?_sm_0 ?_om_1 .\n?_sm_0 ?_om_2 .","format":"NQuads"}}},{"id":"Sink_5","operator":{"type":"TargetOp","config":{"target_type":"StdOut","data_format":"NQuads"}}}],"node_holes":[],"edge_property":"directed","edges":[[0,1,{"fragment":"default"}],[1,2,{"fragment":"default"}],[2,3,{"fragment":"default"}],[3,4,{"fragment":"default"}],[4,5,{"fragment":"default"}]]} \ No newline at end of file diff --git a/test/shexml/string_concatenation/input.shexml b/test/shexml/string_concatenation/input.shexml new file mode 100644 index 0000000..c9fcbe2 --- /dev/null +++ b/test/shexml/string_concatenation/input.shexml @@ -0,0 +1,18 @@ +PREFIX ex: +SOURCE performances_csv +ITERATOR performances_iterator { + FIELD ids + FIELD venues_names + FIELD venue_id + FIELD lat + FIELD long +} + +EXPRESSION performances +EXPRESSION location + +ex:Performance ex:[performances.ids] { + ex:venue ex:[performances.venues_names] ; + ex:venue_id ex:[performances.venue_id]; + ex:location ex:[location]; +} diff --git a/test/shexml/string_concatenation/input_pretty.dot b/test/shexml/string_concatenation/input_pretty.dot new file mode 100644 index 0000000..af6de88 --- /dev/null +++ b/test/shexml/string_concatenation/input_pretty.dot @@ -0,0 +1,13 @@ +digraph { + 0 [ label = "id:Source_0 \lSource Operator\ltype: File \lreference iterator: Iterator {\l reference: None,\l reference_formulation: CSVRows,\l fields: [\l Field {\l alias: \"ids\",\l reference: \"id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venues_names\",\l reference: \"venue_name\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"venue_id\",\l reference: \"venue_id\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"lat\",\l reference: \"lat\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l Field {\l alias: \"long\",\l reference: \"long\",\l reference_formulation: CSVRows,\l inner_fields: [],\l },\l ],\l alias: Some(\l \"performances_iterator\",\l ),\l} \lconfig: {\l \"path\": \"events.csv\"\l}\l " ] + 1 [ label = "id:Extend_Concatenate_1 \lExtension Operator\lExtended pairs: \l location -> Concatenate { left_value: Reference { value: \"performances_iterator.lat\" }, separator: \"-\", right_value: Reference { value: \"performances_iterator.long\" } }" ] + 2 [ label = "id:Rename_expression_2 \lRename Operator\lRenaming pairs:\l performances_iterator.venue_id -> performances.venue_id\lperformances_iterator.long -> performances.long\lperformances_iterator.ids -> performances.ids\lperformances_iterator.venues_names -> performances.venues_names\lperformances_iterator.lat -> performances.lat" ] + 3 [ label = "id:Extend_for_Serializer_3 \lExtension Operator\lExtended pairs: \l _om_1 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"location\" })] } }\l_om_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venue_id\" })] } }\l_sm_0 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.ids\" })] } }\l_om_2 -> Iri { inner_function: TemplateFunctionValue { template: \"http://ex.com/{func_value}\", variable_function_pairs: [(\"func_value\", Reference { value: \"performances.venues_names\" })] } }" ] + 4 [ label = "id:Serialize_4 \lSerializer Operator\lFormat type: NQuads\lTemplate: ?_sm_0 ?_om_0 .\l?_sm_0 ?_om_1 .\l?_sm_0 ?_om_2 ." ] + 5 [ label = "id:Sink_5 \lTarget Operator\ltype: StdOut \ldata format: NQuads \lconfig: {}\l " ] + 0 -> 1 [ label = "Fragment:default" ] + 1 -> 2 [ label = "Fragment:default" ] + 2 -> 3 [ label = "Fragment:default" ] + 3 -> 4 [ label = "Fragment:default" ] + 4 -> 5 [ label = "Fragment:default" ] +}