ldkit 0.6.4 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/esm/library/encoder.js +5 -4
- package/esm/library/rdf.js +2 -2
- package/esm/library/resource/query_builder.js +33 -33
- package/esm/library/sparql/escape.js +22 -0
- package/esm/library/sparql/mod.js +3 -0
- package/esm/library/sparql/sparql_query_builders.js +35 -0
- package/esm/library/sparql/sparql_shared_builders.js +40 -0
- package/esm/library/sparql/sparql_tag.js +47 -0
- package/esm/library/sparql/sparql_update_builders.js +15 -0
- package/esm/library/sparql/stringify.js +50 -0
- package/esm/sparql.js +1 -1
- package/package.json +1 -3
- package/script/library/encoder.js +5 -4
- package/script/library/rdf.js +2 -1
- package/script/library/resource/query_builder.js +38 -38
- package/script/library/sparql/escape.js +26 -0
- package/script/library/sparql/mod.js +14 -0
- package/script/library/sparql/sparql_query_builders.js +38 -0
- package/script/library/sparql/sparql_shared_builders.js +47 -0
- package/script/library/sparql/sparql_tag.js +54 -0
- package/script/library/sparql/sparql_update_builders.js +18 -0
- package/script/library/sparql/stringify.js +61 -0
- package/script/sparql.js +1 -1
- package/types/library/rdf.d.ts +2 -2
- package/types/library/resource/types.d.ts +2 -2
- package/types/library/schema/interface.d.ts +2 -2
- package/types/library/schema/mod.d.ts +1 -1
- package/types/library/sparql/escape.d.ts +1 -0
- package/types/library/sparql/mod.d.ts +3 -0
- package/types/library/sparql/sparql_query_builders.d.ts +1178 -0
- package/types/library/sparql/sparql_shared_builders.d.ts +13 -0
- package/types/library/sparql/sparql_tag.d.ts +3 -0
- package/types/library/sparql/sparql_update_builders.d.ts +131 -0
- package/types/library/sparql/stringify.d.ts +6 -0
- package/types/sparql.d.ts +1 -1
- package/esm/library/sparql.js +0 -2
- package/script/library/sparql.js +0 -13
- package/types/library/sparql.d.ts +0 -2
package/esm/library/encoder.js
CHANGED
|
@@ -83,10 +83,11 @@ class Encoder {
|
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
if (property["@multilang"]) {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
86
|
+
const multiValue = value;
|
|
87
|
+
Object.keys(multiValue).forEach((language) => {
|
|
88
|
+
const languageValue = Array.isArray(multiValue[language])
|
|
89
|
+
? multiValue[language]
|
|
90
|
+
: [multiValue[language]];
|
|
90
91
|
languageValue.forEach((singleValue) => {
|
|
91
92
|
this.push(nodeId, propertyId, this.df.literal(singleValue, language.length > 0 ? language : undefined));
|
|
92
93
|
});
|
package/esm/library/rdf.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
export { fromRdf, toRdf } from "rdf-literal";
|
|
2
|
-
import { DataFactory } from "rdf-data-factory";
|
|
3
|
-
export { DataFactory };
|
|
2
|
+
import { DataFactory, DefaultGraph, } from "rdf-data-factory";
|
|
3
|
+
export { DataFactory, DefaultGraph };
|
|
4
4
|
export const quadsToGraph = (quads) => {
|
|
5
5
|
const graph = new Map();
|
|
6
6
|
for (const quad of quads) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { getSchemaProperties } from "../schema/mod.js";
|
|
2
|
-
import {
|
|
2
|
+
import { CONSTRUCT, DELETE, INSERT, SELECT, sparql as $, } from "../sparql/mod.js";
|
|
3
3
|
import { DataFactory } from "../rdf.js";
|
|
4
4
|
import ldkit from "../namespaces/ldkit.js";
|
|
5
5
|
import rdf from "../namespaces/rdf.js";
|
|
@@ -36,11 +36,11 @@ export class QueryBuilder {
|
|
|
36
36
|
configurable: true,
|
|
37
37
|
writable: true,
|
|
38
38
|
value: (iris) => {
|
|
39
|
-
return DELETE `
|
|
40
|
-
?s ?p ?o
|
|
41
|
-
`.WHERE `
|
|
42
|
-
?s ?p ?o .
|
|
43
|
-
VALUES ?s { ${iris.map(this.df.namedNode)} }
|
|
39
|
+
return DELETE `
|
|
40
|
+
?s ?p ?o
|
|
41
|
+
`.WHERE `
|
|
42
|
+
?s ?p ?o .
|
|
43
|
+
VALUES ?s { ${iris.map(this.df.namedNode)} }
|
|
44
44
|
`.build();
|
|
45
45
|
}
|
|
46
46
|
});
|
|
@@ -96,36 +96,36 @@ export class QueryBuilder {
|
|
|
96
96
|
return SELECT `(count(?iri) as ?count)`.WHERE `${quads}`.build();
|
|
97
97
|
}
|
|
98
98
|
getQuery(where, limit = 1000) {
|
|
99
|
-
const selectSubQuery = SELECT `
|
|
100
|
-
${this.df.variable("iri")}
|
|
101
|
-
`.WHERE `
|
|
102
|
-
${this.getShape(false, true)}
|
|
103
|
-
${where}
|
|
104
|
-
`.LIMIT(limit);
|
|
105
|
-
const query = CONSTRUCT `
|
|
106
|
-
${this.getResourceSignature()}
|
|
107
|
-
${this.getTypesSignature()}
|
|
108
|
-
${this.getShape(true, false, true)}
|
|
109
|
-
`.WHERE `
|
|
110
|
-
${this.getTypesSignature()}
|
|
111
|
-
${this.getShape(true, true, true)}
|
|
112
|
-
{
|
|
113
|
-
${selectSubQuery}
|
|
114
|
-
}
|
|
99
|
+
const selectSubQuery = SELECT `
|
|
100
|
+
${this.df.variable("iri")}
|
|
101
|
+
`.WHERE `
|
|
102
|
+
${this.getShape(false, true)}
|
|
103
|
+
${where}
|
|
104
|
+
`.LIMIT(limit).build();
|
|
105
|
+
const query = CONSTRUCT `
|
|
106
|
+
${this.getResourceSignature()}
|
|
107
|
+
${this.getTypesSignature()}
|
|
108
|
+
${this.getShape(true, false, true)}
|
|
109
|
+
`.WHERE `
|
|
110
|
+
${this.getTypesSignature()}
|
|
111
|
+
${this.getShape(true, true, true)}
|
|
112
|
+
{
|
|
113
|
+
${selectSubQuery}
|
|
114
|
+
}
|
|
115
115
|
`.build();
|
|
116
116
|
return query;
|
|
117
117
|
}
|
|
118
118
|
getByIrisQuery(iris) {
|
|
119
|
-
const query = CONSTRUCT `
|
|
120
|
-
${this.getResourceSignature()}
|
|
121
|
-
${this.getTypesSignature()}
|
|
122
|
-
${this.getShape(true, false, true)}
|
|
123
|
-
`.WHERE `
|
|
124
|
-
${this.getTypesSignature()}
|
|
125
|
-
${this.getShape(true, true, true)}
|
|
126
|
-
VALUES ?iri {
|
|
127
|
-
${iris.map(this.df.namedNode)}
|
|
128
|
-
}
|
|
119
|
+
const query = CONSTRUCT `
|
|
120
|
+
${this.getResourceSignature()}
|
|
121
|
+
${this.getTypesSignature()}
|
|
122
|
+
${this.getShape(true, false, true)}
|
|
123
|
+
`.WHERE `
|
|
124
|
+
${this.getTypesSignature()}
|
|
125
|
+
${this.getShape(true, true, true)}
|
|
126
|
+
VALUES ?iri {
|
|
127
|
+
${iris.map(this.df.namedNode)}
|
|
128
|
+
}
|
|
129
129
|
`.build();
|
|
130
130
|
return query;
|
|
131
131
|
}
|
|
@@ -137,7 +137,7 @@ export class QueryBuilder {
|
|
|
137
137
|
return INSERT.DATA `${quads}`.build();
|
|
138
138
|
}
|
|
139
139
|
deleteDataQuery(quads) {
|
|
140
|
-
return
|
|
140
|
+
return DELETE.DATA `${quads}`.build();
|
|
141
141
|
}
|
|
142
142
|
updateQuery(entities) {
|
|
143
143
|
const deleteQuads = [];
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
const escapeCharRegEx = /["\\\n\r]/;
|
|
2
|
+
const escapeCharRegExAll = /["\\\n\r]/g;
|
|
3
|
+
const replacer = (char) => {
|
|
4
|
+
switch (char) {
|
|
5
|
+
case `"`:
|
|
6
|
+
return `\\"`;
|
|
7
|
+
case `\\`:
|
|
8
|
+
return `\\\\`;
|
|
9
|
+
case `\n`:
|
|
10
|
+
return `\\n`;
|
|
11
|
+
case `\r`:
|
|
12
|
+
return `\\r`;
|
|
13
|
+
default:
|
|
14
|
+
return char; // this should never happen
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
export const escape = (value) => {
|
|
18
|
+
if (escapeCharRegEx.test(value)) {
|
|
19
|
+
return value.replace(escapeCharRegExAll, replacer);
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { build, createNumericBuilder, createTemplateBuilder, } from "./sparql_shared_builders.js";
|
|
2
|
+
const OFFSET = createNumericBuilder((value) => `OFFSET ${value}\n`, { build });
|
|
3
|
+
const LIMIT = createNumericBuilder((value) => `LIMIT ${value}\n`, { build, OFFSET });
|
|
4
|
+
const ORDER_BY = createTemplateBuilder((value) => `ORDER BY ${value}\n`, { build, LIMIT });
|
|
5
|
+
const HAVING = createTemplateBuilder((value) => `HAVING(${value})\n`, { build, LIMIT });
|
|
6
|
+
const GROUP_BY = createTemplateBuilder((value) => `GROUP BY ${value}\n`, { build, HAVING, ORDER_BY, LIMIT });
|
|
7
|
+
const WHERE = createTemplateBuilder((value) => `WHERE {\n${value}\n}\n`, { build, GROUP_BY, ORDER_BY, LIMIT });
|
|
8
|
+
const FROM_NAMED = createTemplateBuilder((value) => `FROM NAMED ${value}\n`, { WHERE });
|
|
9
|
+
const FROM = createTemplateBuilder((value) => `FROM ${value}\n`, { FROM_NAMED, WHERE });
|
|
10
|
+
const _SELECT = createTemplateBuilder((value) => `SELECT ${value}\n`, { FROM, FROM_NAMED, WHERE });
|
|
11
|
+
const DISTINCT = createTemplateBuilder((value) => `SELECT DISTINCT ${value}\n`, { FROM, WHERE });
|
|
12
|
+
const REDUCED = createTemplateBuilder((value) => `SELECT REDUCED ${value}\n`, {
|
|
13
|
+
FROM,
|
|
14
|
+
WHERE,
|
|
15
|
+
});
|
|
16
|
+
export const SELECT = Object.assign(_SELECT, {
|
|
17
|
+
DISTINCT,
|
|
18
|
+
REDUCED,
|
|
19
|
+
ALL: _SELECT `*`,
|
|
20
|
+
});
|
|
21
|
+
const _CONSTRUCT = createTemplateBuilder((value) => `CONSTRUCT {\n${value}\n}\n`, { WHERE });
|
|
22
|
+
const _CONSTRUCT_WHERE = createTemplateBuilder((value) => `CONSTRUCT WHERE {\n${value}\n}\n`, { build, GROUP_BY, ORDER_BY, LIMIT });
|
|
23
|
+
export const CONSTRUCT = Object.assign(_CONSTRUCT, {
|
|
24
|
+
WHERE: _CONSTRUCT_WHERE,
|
|
25
|
+
});
|
|
26
|
+
const _ASK = createTemplateBuilder((value) => `ASK {\n${value}\n}\n`, { build });
|
|
27
|
+
const _ASK_FROM = createTemplateBuilder((value) => `ASK\nFROM ${value}\n`, { FROM_NAMED, WHERE });
|
|
28
|
+
const _ASK_FROM_NAMED = createTemplateBuilder((value) => `ASK\nFROM NAMED ${value}\n`, { FROM_NAMED, WHERE });
|
|
29
|
+
const _ASK_WHERE = createTemplateBuilder((value) => `ASK\nWHERE {\n${value}\n}\n`, { build, GROUP_BY, ORDER_BY, LIMIT });
|
|
30
|
+
export const ASK = Object.assign(_ASK, {
|
|
31
|
+
FROM: _ASK_FROM,
|
|
32
|
+
FROM_NAMED: _ASK_FROM_NAMED,
|
|
33
|
+
WHERE: _ASK_WHERE,
|
|
34
|
+
});
|
|
35
|
+
export const DESCRIBE = createTemplateBuilder((value) => `DESCRIBE ${value}\n`, { build, FROM, FROM_NAMED, WHERE });
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { DataFactory } from "../rdf.js";
|
|
2
|
+
import { sparql } from "./sparql_tag.js";
|
|
3
|
+
const createContext = (self, current, builders) => {
|
|
4
|
+
const previousQuery = self?.$partialQuery || "";
|
|
5
|
+
const context = { $partialQuery: previousQuery + current };
|
|
6
|
+
return Object.keys(builders).reduce((acc, key) => {
|
|
7
|
+
acc[key] = builders[key].bind(context);
|
|
8
|
+
return acc;
|
|
9
|
+
}, {});
|
|
10
|
+
};
|
|
11
|
+
export const createTemplateBuilder = (wrap, builders) => {
|
|
12
|
+
return function (strings, ...values) {
|
|
13
|
+
const self = this;
|
|
14
|
+
const inner = sparql(strings, ...values);
|
|
15
|
+
const current = wrap(inner);
|
|
16
|
+
return createContext(self, current, builders);
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
export const createNumericBuilder = (wrap, builders) => {
|
|
20
|
+
return function (number) {
|
|
21
|
+
const self = this;
|
|
22
|
+
const current = wrap(number);
|
|
23
|
+
return createContext(self, current, builders);
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
const df = new DataFactory();
|
|
27
|
+
export const createNamedNodeBuilder = (wrap, builders) => {
|
|
28
|
+
return function (stringOrNamedNode) {
|
|
29
|
+
const self = this;
|
|
30
|
+
const namedNode = typeof stringOrNamedNode === "string"
|
|
31
|
+
? df.namedNode(stringOrNamedNode)
|
|
32
|
+
: stringOrNamedNode;
|
|
33
|
+
const inner = sparql `${namedNode}`;
|
|
34
|
+
const current = wrap(inner);
|
|
35
|
+
return createContext(self, current, builders);
|
|
36
|
+
};
|
|
37
|
+
};
|
|
38
|
+
export const build = function () {
|
|
39
|
+
return this?.$partialQuery || "";
|
|
40
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { DataFactory } from "../rdf.js";
|
|
2
|
+
import xsd from "../namespaces/xsd.js";
|
|
3
|
+
import { stringify } from "./stringify.js";
|
|
4
|
+
export const sparql = (strings, ...values) => {
|
|
5
|
+
let counter = 0;
|
|
6
|
+
let result = "";
|
|
7
|
+
for (const value of values) {
|
|
8
|
+
result += strings[counter++];
|
|
9
|
+
result += valueToString(value);
|
|
10
|
+
}
|
|
11
|
+
result += strings[counter];
|
|
12
|
+
return result;
|
|
13
|
+
};
|
|
14
|
+
const isIterable = (obj) => {
|
|
15
|
+
return Symbol.iterator in Object(obj);
|
|
16
|
+
};
|
|
17
|
+
const df = new DataFactory();
|
|
18
|
+
const valueToString = (value) => {
|
|
19
|
+
if (typeof value === "undefined" || value === null) {
|
|
20
|
+
return "";
|
|
21
|
+
}
|
|
22
|
+
if (typeof value === "string") {
|
|
23
|
+
return value;
|
|
24
|
+
}
|
|
25
|
+
if (typeof value === "number") {
|
|
26
|
+
const numberDataType = Number.isInteger(value) ? xsd.integer : xsd.decimal;
|
|
27
|
+
return stringify(df.literal(value.toString(), df.namedNode(numberDataType)));
|
|
28
|
+
}
|
|
29
|
+
if (typeof value === "boolean") {
|
|
30
|
+
return stringify(df.literal(value.toString(), df.namedNode(xsd.boolean)));
|
|
31
|
+
}
|
|
32
|
+
if (value instanceof Date) {
|
|
33
|
+
return stringify(df.literal(value.toISOString(), df.namedNode(xsd.dateTime)));
|
|
34
|
+
}
|
|
35
|
+
if (isIterable(value)) {
|
|
36
|
+
const [first, ...rest] = value;
|
|
37
|
+
let result = valueToString(first);
|
|
38
|
+
for (const part of rest) {
|
|
39
|
+
result += `\n${valueToString(part)}`;
|
|
40
|
+
}
|
|
41
|
+
return result;
|
|
42
|
+
}
|
|
43
|
+
if (value.termType) {
|
|
44
|
+
return stringify(value);
|
|
45
|
+
}
|
|
46
|
+
throw new Error("Not supported input type detected.");
|
|
47
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { build, createNamedNodeBuilder, createTemplateBuilder, } from "./sparql_shared_builders.js";
|
|
2
|
+
const WHERE = createTemplateBuilder((value) => `WHERE {\n${value}\n}\n`, { build });
|
|
3
|
+
const USING_NAMED = createNamedNodeBuilder((value) => `USING NAMED ${value}\n`, { WHERE });
|
|
4
|
+
const USING = createNamedNodeBuilder((value) => `USING ${value}\n`, { USING_NAMED, WHERE });
|
|
5
|
+
const _INSERT = createTemplateBuilder((value) => `INSERT {\n${value}\n}\n`, { USING, USING_NAMED, WHERE });
|
|
6
|
+
const _INSERT_DATA = createTemplateBuilder((value) => `INSERT DATA {\n${value}\n}\n`, { build });
|
|
7
|
+
export const INSERT = Object.assign(_INSERT, {
|
|
8
|
+
DATA: _INSERT_DATA,
|
|
9
|
+
});
|
|
10
|
+
const _DELETE = createTemplateBuilder((value) => `DELETE {\n${value}\n}\n`, { INSERT: _INSERT, USING, USING_NAMED, WHERE });
|
|
11
|
+
const _DELETE_DATA = createTemplateBuilder((value) => `DELETE DATA {\n${value}\n}\n`, { build });
|
|
12
|
+
export const DELETE = Object.assign(_DELETE, {
|
|
13
|
+
DATA: _DELETE_DATA,
|
|
14
|
+
});
|
|
15
|
+
export const WITH = createNamedNodeBuilder((value) => `WITH ${value}\n`, { build, INSERT: _INSERT, DELETE: _DELETE });
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { DefaultGraph } from "../rdf.js";
|
|
2
|
+
import xsd from "../namespaces/xsd.js";
|
|
3
|
+
import { escape } from "./escape.js";
|
|
4
|
+
export const blankNode = (term) => {
|
|
5
|
+
return `_:${term.value}`;
|
|
6
|
+
};
|
|
7
|
+
export const namedNode = (term) => {
|
|
8
|
+
return `<${term.value}>`;
|
|
9
|
+
};
|
|
10
|
+
export const variable = (term) => {
|
|
11
|
+
return `?${term.value}`;
|
|
12
|
+
};
|
|
13
|
+
export const literal = (term) => {
|
|
14
|
+
const datatype = term.datatype.value;
|
|
15
|
+
if (datatype === xsd.integer || datatype === xsd.boolean ||
|
|
16
|
+
datatype === xsd.decimal) {
|
|
17
|
+
return term.value;
|
|
18
|
+
}
|
|
19
|
+
const value = `"${escape(term.value)}"`;
|
|
20
|
+
if (term.language) {
|
|
21
|
+
return `${value}@${term.language}`;
|
|
22
|
+
}
|
|
23
|
+
if (datatype !== xsd.string) {
|
|
24
|
+
return `${value}^^${namedNode(term.datatype)}`;
|
|
25
|
+
}
|
|
26
|
+
return value;
|
|
27
|
+
};
|
|
28
|
+
const quad = (term) => {
|
|
29
|
+
const triple = `${stringify(term.subject)} ${stringify(term.predicate)} ${stringify(term.object)} .`;
|
|
30
|
+
if (term.graph.equals(DefaultGraph.INSTANCE)) {
|
|
31
|
+
return triple;
|
|
32
|
+
}
|
|
33
|
+
return `GRAPH ${stringify(term.graph)} { ${triple} }`;
|
|
34
|
+
};
|
|
35
|
+
export const stringify = (term) => {
|
|
36
|
+
switch (term.termType) {
|
|
37
|
+
case "BlankNode":
|
|
38
|
+
return blankNode(term);
|
|
39
|
+
case "NamedNode":
|
|
40
|
+
return namedNode(term);
|
|
41
|
+
case "Variable":
|
|
42
|
+
return variable(term);
|
|
43
|
+
case "Literal":
|
|
44
|
+
return literal(term);
|
|
45
|
+
case "Quad":
|
|
46
|
+
return quad(term);
|
|
47
|
+
default:
|
|
48
|
+
throw new Error("Unknown RDF type found.");
|
|
49
|
+
}
|
|
50
|
+
};
|
package/esm/sparql.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export * from "./library/sparql.js";
|
|
1
|
+
export * from "./library/sparql/mod.js";
|
package/package.json
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
"main": "./script/mod.js",
|
|
4
4
|
"types": "./types/mod.d.ts",
|
|
5
5
|
"name": "ldkit",
|
|
6
|
-
"version": "0.6.
|
|
6
|
+
"version": "0.6.5",
|
|
7
7
|
"description": "LDkit, a Linked Data query toolkit for TypeScript developers",
|
|
8
8
|
"homepage": "https://ldkit.io",
|
|
9
9
|
"author": "Karel Klima <karelklima@gmail.com> (https://karelklima.com)",
|
|
@@ -45,8 +45,6 @@
|
|
|
45
45
|
},
|
|
46
46
|
"dependencies": {
|
|
47
47
|
"@comunica/types": "2.4.0",
|
|
48
|
-
"@tpluscode/rdf-string": "0.2.26",
|
|
49
|
-
"@tpluscode/sparql-builder": "0.3.23",
|
|
50
48
|
"asynciterator": "3.7.0",
|
|
51
49
|
"rdf-data-factory": "1.1.1",
|
|
52
50
|
"rdf-js": "4.0.2",
|
|
@@ -90,10 +90,11 @@ class Encoder {
|
|
|
90
90
|
return;
|
|
91
91
|
}
|
|
92
92
|
if (property["@multilang"]) {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
93
|
+
const multiValue = value;
|
|
94
|
+
Object.keys(multiValue).forEach((language) => {
|
|
95
|
+
const languageValue = Array.isArray(multiValue[language])
|
|
96
|
+
? multiValue[language]
|
|
97
|
+
: [multiValue[language]];
|
|
97
98
|
languageValue.forEach((singleValue) => {
|
|
98
99
|
this.push(nodeId, propertyId, this.df.literal(singleValue, language.length > 0 ? language : undefined));
|
|
99
100
|
});
|
package/script/library/rdf.js
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.QuadFactory = exports.BindingsFactory = exports.ReadOnlyBindings = exports.TermFactory = exports.quadsToGraph = exports.DataFactory = exports.toRdf = exports.fromRdf = void 0;
|
|
3
|
+
exports.QuadFactory = exports.BindingsFactory = exports.ReadOnlyBindings = exports.TermFactory = exports.quadsToGraph = exports.DefaultGraph = exports.DataFactory = exports.toRdf = exports.fromRdf = void 0;
|
|
4
4
|
var rdf_literal_1 = require("rdf-literal");
|
|
5
5
|
Object.defineProperty(exports, "fromRdf", { enumerable: true, get: function () { return rdf_literal_1.fromRdf; } });
|
|
6
6
|
Object.defineProperty(exports, "toRdf", { enumerable: true, get: function () { return rdf_literal_1.toRdf; } });
|
|
7
7
|
const rdf_data_factory_1 = require("rdf-data-factory");
|
|
8
8
|
Object.defineProperty(exports, "DataFactory", { enumerable: true, get: function () { return rdf_data_factory_1.DataFactory; } });
|
|
9
|
+
Object.defineProperty(exports, "DefaultGraph", { enumerable: true, get: function () { return rdf_data_factory_1.DefaultGraph; } });
|
|
9
10
|
const quadsToGraph = (quads) => {
|
|
10
11
|
const graph = new Map();
|
|
11
12
|
for (const quad of quads) {
|
|
@@ -5,7 +5,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
6
|
exports.QueryBuilder = void 0;
|
|
7
7
|
const mod_js_1 = require("../schema/mod.js");
|
|
8
|
-
const
|
|
8
|
+
const mod_js_2 = require("../sparql/mod.js");
|
|
9
9
|
const rdf_js_1 = require("../rdf.js");
|
|
10
10
|
const ldkit_js_1 = __importDefault(require("../namespaces/ldkit.js"));
|
|
11
11
|
const rdf_js_2 = __importDefault(require("../namespaces/rdf.js"));
|
|
@@ -42,11 +42,11 @@ class QueryBuilder {
|
|
|
42
42
|
configurable: true,
|
|
43
43
|
writable: true,
|
|
44
44
|
value: (iris) => {
|
|
45
|
-
return (0,
|
|
46
|
-
?s ?p ?o
|
|
47
|
-
`.WHERE `
|
|
48
|
-
?s ?p ?o .
|
|
49
|
-
VALUES ?s { ${iris.map(this.df.namedNode)} }
|
|
45
|
+
return (0, mod_js_2.DELETE) `
|
|
46
|
+
?s ?p ?o
|
|
47
|
+
`.WHERE `
|
|
48
|
+
?s ?p ?o .
|
|
49
|
+
VALUES ?s { ${iris.map(this.df.namedNode)} }
|
|
50
50
|
`.build();
|
|
51
51
|
}
|
|
52
52
|
});
|
|
@@ -83,14 +83,14 @@ class QueryBuilder {
|
|
|
83
83
|
return;
|
|
84
84
|
}
|
|
85
85
|
if (wrapOptional && isOptional) {
|
|
86
|
-
conditions.push((0,
|
|
86
|
+
conditions.push((0, mod_js_2.sparql) `\nOPTIONAL {`);
|
|
87
87
|
}
|
|
88
88
|
conditions.push(this.df.quad(this.df.variable(varPrefix), this.df.namedNode(property["@id"]), this.df.variable(`${varPrefix}_${index}`)));
|
|
89
89
|
if (typeof property["@context"] === "object") {
|
|
90
90
|
populateConditionsRecursive(property["@context"], `${varPrefix}_${index}`);
|
|
91
91
|
}
|
|
92
92
|
if (wrapOptional && isOptional) {
|
|
93
|
-
conditions.push((0,
|
|
93
|
+
conditions.push((0, mod_js_2.sparql) `\n}\n`);
|
|
94
94
|
}
|
|
95
95
|
});
|
|
96
96
|
};
|
|
@@ -99,39 +99,39 @@ class QueryBuilder {
|
|
|
99
99
|
}
|
|
100
100
|
countQuery() {
|
|
101
101
|
const quads = this.getShape();
|
|
102
|
-
return (0,
|
|
102
|
+
return (0, mod_js_2.SELECT) `(count(?iri) as ?count)`.WHERE `${quads}`.build();
|
|
103
103
|
}
|
|
104
104
|
getQuery(where, limit = 1000) {
|
|
105
|
-
const selectSubQuery = (0,
|
|
106
|
-
${this.df.variable("iri")}
|
|
107
|
-
`.WHERE `
|
|
108
|
-
${this.getShape(false, true)}
|
|
109
|
-
${where}
|
|
110
|
-
`.LIMIT(limit);
|
|
111
|
-
const query = (0,
|
|
112
|
-
${this.getResourceSignature()}
|
|
113
|
-
${this.getTypesSignature()}
|
|
114
|
-
${this.getShape(true, false, true)}
|
|
115
|
-
`.WHERE `
|
|
116
|
-
${this.getTypesSignature()}
|
|
117
|
-
${this.getShape(true, true, true)}
|
|
118
|
-
{
|
|
119
|
-
${selectSubQuery}
|
|
120
|
-
}
|
|
105
|
+
const selectSubQuery = (0, mod_js_2.SELECT) `
|
|
106
|
+
${this.df.variable("iri")}
|
|
107
|
+
`.WHERE `
|
|
108
|
+
${this.getShape(false, true)}
|
|
109
|
+
${where}
|
|
110
|
+
`.LIMIT(limit).build();
|
|
111
|
+
const query = (0, mod_js_2.CONSTRUCT) `
|
|
112
|
+
${this.getResourceSignature()}
|
|
113
|
+
${this.getTypesSignature()}
|
|
114
|
+
${this.getShape(true, false, true)}
|
|
115
|
+
`.WHERE `
|
|
116
|
+
${this.getTypesSignature()}
|
|
117
|
+
${this.getShape(true, true, true)}
|
|
118
|
+
{
|
|
119
|
+
${selectSubQuery}
|
|
120
|
+
}
|
|
121
121
|
`.build();
|
|
122
122
|
return query;
|
|
123
123
|
}
|
|
124
124
|
getByIrisQuery(iris) {
|
|
125
|
-
const query = (0,
|
|
126
|
-
${this.getResourceSignature()}
|
|
127
|
-
${this.getTypesSignature()}
|
|
128
|
-
${this.getShape(true, false, true)}
|
|
129
|
-
`.WHERE `
|
|
130
|
-
${this.getTypesSignature()}
|
|
131
|
-
${this.getShape(true, true, true)}
|
|
132
|
-
VALUES ?iri {
|
|
133
|
-
${iris.map(this.df.namedNode)}
|
|
134
|
-
}
|
|
125
|
+
const query = (0, mod_js_2.CONSTRUCT) `
|
|
126
|
+
${this.getResourceSignature()}
|
|
127
|
+
${this.getTypesSignature()}
|
|
128
|
+
${this.getShape(true, false, true)}
|
|
129
|
+
`.WHERE `
|
|
130
|
+
${this.getTypesSignature()}
|
|
131
|
+
${this.getShape(true, true, true)}
|
|
132
|
+
VALUES ?iri {
|
|
133
|
+
${iris.map(this.df.namedNode)}
|
|
134
|
+
}
|
|
135
135
|
`.build();
|
|
136
136
|
return query;
|
|
137
137
|
}
|
|
@@ -140,10 +140,10 @@ class QueryBuilder {
|
|
|
140
140
|
return this.insertDataQuery(quads);
|
|
141
141
|
}
|
|
142
142
|
insertDataQuery(quads) {
|
|
143
|
-
return
|
|
143
|
+
return mod_js_2.INSERT.DATA `${quads}`.build();
|
|
144
144
|
}
|
|
145
145
|
deleteDataQuery(quads) {
|
|
146
|
-
return
|
|
146
|
+
return mod_js_2.DELETE.DATA `${quads}`.build();
|
|
147
147
|
}
|
|
148
148
|
updateQuery(entities) {
|
|
149
149
|
const deleteQuads = [];
|
|
@@ -155,7 +155,7 @@ class QueryBuilder {
|
|
|
155
155
|
insertQuads.push(...helper.getInsertQuads());
|
|
156
156
|
whereQuads.push(...helper.getWhereQuads());
|
|
157
157
|
});
|
|
158
|
-
return (0,
|
|
158
|
+
return (0, mod_js_2.DELETE) `${deleteQuads}`.INSERT `${insertQuads}`
|
|
159
159
|
.WHERE `${deleteQuads}`.build();
|
|
160
160
|
}
|
|
161
161
|
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.escape = void 0;
|
|
4
|
+
const escapeCharRegEx = /["\\\n\r]/;
|
|
5
|
+
const escapeCharRegExAll = /["\\\n\r]/g;
|
|
6
|
+
const replacer = (char) => {
|
|
7
|
+
switch (char) {
|
|
8
|
+
case `"`:
|
|
9
|
+
return `\\"`;
|
|
10
|
+
case `\\`:
|
|
11
|
+
return `\\\\`;
|
|
12
|
+
case `\n`:
|
|
13
|
+
return `\\n`;
|
|
14
|
+
case `\r`:
|
|
15
|
+
return `\\r`;
|
|
16
|
+
default:
|
|
17
|
+
return char; // this should never happen
|
|
18
|
+
}
|
|
19
|
+
};
|
|
20
|
+
const escape = (value) => {
|
|
21
|
+
if (escapeCharRegEx.test(value)) {
|
|
22
|
+
return value.replace(escapeCharRegExAll, replacer);
|
|
23
|
+
}
|
|
24
|
+
return value;
|
|
25
|
+
};
|
|
26
|
+
exports.escape = escape;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WITH = exports.INSERT = exports.DELETE = exports.SELECT = exports.DESCRIBE = exports.CONSTRUCT = exports.ASK = exports.sparql = void 0;
|
|
4
|
+
var sparql_tag_js_1 = require("./sparql_tag.js");
|
|
5
|
+
Object.defineProperty(exports, "sparql", { enumerable: true, get: function () { return sparql_tag_js_1.sparql; } });
|
|
6
|
+
var sparql_query_builders_js_1 = require("./sparql_query_builders.js");
|
|
7
|
+
Object.defineProperty(exports, "ASK", { enumerable: true, get: function () { return sparql_query_builders_js_1.ASK; } });
|
|
8
|
+
Object.defineProperty(exports, "CONSTRUCT", { enumerable: true, get: function () { return sparql_query_builders_js_1.CONSTRUCT; } });
|
|
9
|
+
Object.defineProperty(exports, "DESCRIBE", { enumerable: true, get: function () { return sparql_query_builders_js_1.DESCRIBE; } });
|
|
10
|
+
Object.defineProperty(exports, "SELECT", { enumerable: true, get: function () { return sparql_query_builders_js_1.SELECT; } });
|
|
11
|
+
var sparql_update_builders_js_1 = require("./sparql_update_builders.js");
|
|
12
|
+
Object.defineProperty(exports, "DELETE", { enumerable: true, get: function () { return sparql_update_builders_js_1.DELETE; } });
|
|
13
|
+
Object.defineProperty(exports, "INSERT", { enumerable: true, get: function () { return sparql_update_builders_js_1.INSERT; } });
|
|
14
|
+
Object.defineProperty(exports, "WITH", { enumerable: true, get: function () { return sparql_update_builders_js_1.WITH; } });
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DESCRIBE = exports.ASK = exports.CONSTRUCT = exports.SELECT = void 0;
|
|
4
|
+
const sparql_shared_builders_js_1 = require("./sparql_shared_builders.js");
|
|
5
|
+
const OFFSET = (0, sparql_shared_builders_js_1.createNumericBuilder)((value) => `OFFSET ${value}\n`, { build: sparql_shared_builders_js_1.build });
|
|
6
|
+
const LIMIT = (0, sparql_shared_builders_js_1.createNumericBuilder)((value) => `LIMIT ${value}\n`, { build: sparql_shared_builders_js_1.build, OFFSET });
|
|
7
|
+
const ORDER_BY = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `ORDER BY ${value}\n`, { build: sparql_shared_builders_js_1.build, LIMIT });
|
|
8
|
+
const HAVING = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `HAVING(${value})\n`, { build: sparql_shared_builders_js_1.build, LIMIT });
|
|
9
|
+
const GROUP_BY = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `GROUP BY ${value}\n`, { build: sparql_shared_builders_js_1.build, HAVING, ORDER_BY, LIMIT });
|
|
10
|
+
const WHERE = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `WHERE {\n${value}\n}\n`, { build: sparql_shared_builders_js_1.build, GROUP_BY, ORDER_BY, LIMIT });
|
|
11
|
+
const FROM_NAMED = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `FROM NAMED ${value}\n`, { WHERE });
|
|
12
|
+
const FROM = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `FROM ${value}\n`, { FROM_NAMED, WHERE });
|
|
13
|
+
const _SELECT = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `SELECT ${value}\n`, { FROM, FROM_NAMED, WHERE });
|
|
14
|
+
const DISTINCT = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `SELECT DISTINCT ${value}\n`, { FROM, WHERE });
|
|
15
|
+
const REDUCED = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `SELECT REDUCED ${value}\n`, {
|
|
16
|
+
FROM,
|
|
17
|
+
WHERE,
|
|
18
|
+
});
|
|
19
|
+
exports.SELECT = Object.assign(_SELECT, {
|
|
20
|
+
DISTINCT,
|
|
21
|
+
REDUCED,
|
|
22
|
+
ALL: _SELECT `*`,
|
|
23
|
+
});
|
|
24
|
+
const _CONSTRUCT = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `CONSTRUCT {\n${value}\n}\n`, { WHERE });
|
|
25
|
+
const _CONSTRUCT_WHERE = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `CONSTRUCT WHERE {\n${value}\n}\n`, { build: sparql_shared_builders_js_1.build, GROUP_BY, ORDER_BY, LIMIT });
|
|
26
|
+
exports.CONSTRUCT = Object.assign(_CONSTRUCT, {
|
|
27
|
+
WHERE: _CONSTRUCT_WHERE,
|
|
28
|
+
});
|
|
29
|
+
const _ASK = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `ASK {\n${value}\n}\n`, { build: sparql_shared_builders_js_1.build });
|
|
30
|
+
const _ASK_FROM = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `ASK\nFROM ${value}\n`, { FROM_NAMED, WHERE });
|
|
31
|
+
const _ASK_FROM_NAMED = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `ASK\nFROM NAMED ${value}\n`, { FROM_NAMED, WHERE });
|
|
32
|
+
const _ASK_WHERE = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `ASK\nWHERE {\n${value}\n}\n`, { build: sparql_shared_builders_js_1.build, GROUP_BY, ORDER_BY, LIMIT });
|
|
33
|
+
exports.ASK = Object.assign(_ASK, {
|
|
34
|
+
FROM: _ASK_FROM,
|
|
35
|
+
FROM_NAMED: _ASK_FROM_NAMED,
|
|
36
|
+
WHERE: _ASK_WHERE,
|
|
37
|
+
});
|
|
38
|
+
exports.DESCRIBE = (0, sparql_shared_builders_js_1.createTemplateBuilder)((value) => `DESCRIBE ${value}\n`, { build: sparql_shared_builders_js_1.build, FROM, FROM_NAMED, WHERE });
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.build = exports.createNamedNodeBuilder = exports.createNumericBuilder = exports.createTemplateBuilder = void 0;
|
|
4
|
+
const rdf_js_1 = require("../rdf.js");
|
|
5
|
+
const sparql_tag_js_1 = require("./sparql_tag.js");
|
|
6
|
+
const createContext = (self, current, builders) => {
|
|
7
|
+
const previousQuery = self?.$partialQuery || "";
|
|
8
|
+
const context = { $partialQuery: previousQuery + current };
|
|
9
|
+
return Object.keys(builders).reduce((acc, key) => {
|
|
10
|
+
acc[key] = builders[key].bind(context);
|
|
11
|
+
return acc;
|
|
12
|
+
}, {});
|
|
13
|
+
};
|
|
14
|
+
const createTemplateBuilder = (wrap, builders) => {
|
|
15
|
+
return function (strings, ...values) {
|
|
16
|
+
const self = this;
|
|
17
|
+
const inner = (0, sparql_tag_js_1.sparql)(strings, ...values);
|
|
18
|
+
const current = wrap(inner);
|
|
19
|
+
return createContext(self, current, builders);
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
exports.createTemplateBuilder = createTemplateBuilder;
|
|
23
|
+
const createNumericBuilder = (wrap, builders) => {
|
|
24
|
+
return function (number) {
|
|
25
|
+
const self = this;
|
|
26
|
+
const current = wrap(number);
|
|
27
|
+
return createContext(self, current, builders);
|
|
28
|
+
};
|
|
29
|
+
};
|
|
30
|
+
exports.createNumericBuilder = createNumericBuilder;
|
|
31
|
+
const df = new rdf_js_1.DataFactory();
|
|
32
|
+
const createNamedNodeBuilder = (wrap, builders) => {
|
|
33
|
+
return function (stringOrNamedNode) {
|
|
34
|
+
const self = this;
|
|
35
|
+
const namedNode = typeof stringOrNamedNode === "string"
|
|
36
|
+
? df.namedNode(stringOrNamedNode)
|
|
37
|
+
: stringOrNamedNode;
|
|
38
|
+
const inner = (0, sparql_tag_js_1.sparql) `${namedNode}`;
|
|
39
|
+
const current = wrap(inner);
|
|
40
|
+
return createContext(self, current, builders);
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
exports.createNamedNodeBuilder = createNamedNodeBuilder;
|
|
44
|
+
const build = function () {
|
|
45
|
+
return this?.$partialQuery || "";
|
|
46
|
+
};
|
|
47
|
+
exports.build = build;
|