@openhps/rdf 0.1.8 → 0.1.9
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/dist/cjs/service/SPARQLDataDriver.d.ts +4 -10
- package/dist/cjs/service/SPARQLDataDriver.js +2 -78
- package/dist/cjs/service/SPARQLDataDriver.js.map +1 -1
- package/dist/cjs/service/SPARQLDriverBase.d.ts +20 -0
- package/dist/cjs/service/SPARQLDriverBase.js +90 -0
- package/dist/cjs/service/SPARQLDriverBase.js.map +1 -0
- package/dist/cjs/service/SPARQLGenerator.js +15 -1
- package/dist/cjs/service/SPARQLGenerator.js.map +1 -1
- package/dist/cjs/service/index.d.ts +1 -0
- package/dist/cjs/service/index.js +1 -0
- package/dist/cjs/service/index.js.map +1 -1
- package/dist/esm/service/SPARQLDataDriver.d.ts +4 -10
- package/dist/esm/service/SPARQLDataDriver.js +3 -79
- package/dist/esm/service/SPARQLDataDriver.js.map +1 -1
- package/dist/esm/service/SPARQLDriverBase.d.ts +20 -0
- package/dist/esm/service/SPARQLDriverBase.js +86 -0
- package/dist/esm/service/SPARQLDriverBase.js.map +1 -0
- package/dist/esm/service/SPARQLGenerator.js +15 -1
- package/dist/esm/service/SPARQLGenerator.js.map +1 -1
- package/dist/esm/service/index.d.ts +1 -0
- package/dist/esm/service/index.js +1 -0
- package/dist/esm/service/index.js.map +1 -1
- package/dist/types/service/SPARQLDataDriver.d.ts +4 -10
- package/dist/types/service/SPARQLDriverBase.d.ts +20 -0
- package/dist/types/service/index.d.ts +1 -0
- package/dist/web/openhps-rdf.all.es.js +115 -72
- package/dist/web/openhps-rdf.all.es.js.map +1 -1
- package/dist/web/openhps-rdf.all.es.min.js +1 -1
- package/dist/web/openhps-rdf.all.es.min.js.map +1 -1
- package/dist/web/openhps-rdf.all.js +115 -72
- package/dist/web/openhps-rdf.all.js.map +1 -1
- package/dist/web/openhps-rdf.all.min.js +1 -1
- package/dist/web/openhps-rdf.all.min.js.map +1 -1
- package/dist/web/openhps-rdf.sparql.es.js +114 -72
- package/dist/web/openhps-rdf.sparql.es.js.map +1 -1
- package/dist/web/openhps-rdf.sparql.es.min.js +1 -1
- package/dist/web/openhps-rdf.sparql.es.min.js.map +1 -1
- package/dist/web/openhps-rdf.sparql.js +114 -72
- package/dist/web/openhps-rdf.sparql.js.map +1 -1
- package/dist/web/openhps-rdf.sparql.min.js +1 -1
- package/dist/web/openhps-rdf.sparql.min.js.map +1 -1
- package/package.json +1 -1
- package/src/service/SPARQLDataDriver.ts +6 -95
- package/src/service/SPARQLDriverBase.ts +112 -0
- package/src/service/SPARQLGenerator.ts +15 -1
- package/src/service/index.ts +1 -0
package/package.json
CHANGED
|
@@ -1,25 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
FindOptions,
|
|
5
|
-
Constructor,
|
|
6
|
-
MemoryQueryEvaluator,
|
|
7
|
-
DataServiceDriver,
|
|
8
|
-
} from '@openhps/core';
|
|
9
|
-
import { DataFactory, Store } from 'n3';
|
|
10
|
-
import { IriString, RDFSerializer, UrlString } from '../rdf';
|
|
1
|
+
import { FilterQuery, Constructor } from '@openhps/core';
|
|
2
|
+
import { Store } from 'n3';
|
|
3
|
+
import { IriString, UrlString } from '../rdf';
|
|
11
4
|
import SparqlClient from 'sparql-http-client';
|
|
12
|
-
import {
|
|
13
|
-
import { SPARQLGenerator } from './SPARQLGenerator';
|
|
5
|
+
import { SPARQLDriverBase, SPARQLDriverOptions } from './SPARQLDriverBase';
|
|
14
6
|
|
|
15
|
-
export class SPARQLDataDriver<T> extends
|
|
7
|
+
export class SPARQLDataDriver<T> extends SPARQLDriverBase<T> {
|
|
16
8
|
protected options: SPARQLDataDriverOptions;
|
|
17
9
|
protected client: SparqlClient;
|
|
18
|
-
protected generator: SPARQLGenerator<T>;
|
|
19
10
|
|
|
20
11
|
constructor(dataType?: Constructor<T>, options?: SPARQLDataDriverOptions) {
|
|
21
12
|
super(dataType, options);
|
|
22
|
-
this.generator = new SPARQLGenerator(this.dataType, this.options.baseUri);
|
|
23
13
|
this.once('build', this._onBuild.bind(this));
|
|
24
14
|
}
|
|
25
15
|
|
|
@@ -36,30 +26,6 @@ export class SPARQLDataDriver<T> extends DataServiceDriver<IriString, T> {
|
|
|
36
26
|
});
|
|
37
27
|
}
|
|
38
28
|
|
|
39
|
-
findByUID(id: IriString): Promise<T> {
|
|
40
|
-
return new Promise((resolve, reject) => {
|
|
41
|
-
const identifierMember = RDFSerializer.getUriMetadata(this.dataType);
|
|
42
|
-
this.findOne({
|
|
43
|
-
[identifierMember.key]: id,
|
|
44
|
-
} as any)
|
|
45
|
-
.then(resolve)
|
|
46
|
-
.catch(reject);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
findOne(query?: FilterQuery<T>, options: FindOptions = {}): Promise<T> {
|
|
51
|
-
return new Promise((resolve, reject) => {
|
|
52
|
-
this.findAll(query, {
|
|
53
|
-
limit: 1,
|
|
54
|
-
sort: options.sort,
|
|
55
|
-
})
|
|
56
|
-
.then((results) => {
|
|
57
|
-
resolve(results[0]);
|
|
58
|
-
})
|
|
59
|
-
.catch(reject);
|
|
60
|
-
});
|
|
61
|
-
}
|
|
62
|
-
|
|
63
29
|
protected findAllSerialized(query?: FilterQuery<T>): Promise<Store> {
|
|
64
30
|
return new Promise((resolve, reject) => {
|
|
65
31
|
this.client.query
|
|
@@ -77,60 +43,6 @@ export class SPARQLDataDriver<T> extends DataServiceDriver<IriString, T> {
|
|
|
77
43
|
});
|
|
78
44
|
}
|
|
79
45
|
|
|
80
|
-
findAll(query?: FilterQuery<T>, options: FindOptions = {}): Promise<T[]> {
|
|
81
|
-
return new Promise((resolve, reject) => {
|
|
82
|
-
this.findAllSerialized(query)
|
|
83
|
-
.then((store) => {
|
|
84
|
-
if (store.size === 0) {
|
|
85
|
-
return resolve([]);
|
|
86
|
-
}
|
|
87
|
-
const subjects = store
|
|
88
|
-
.getSubjects(DataFactory.namedNode(rdf.type), null, null)
|
|
89
|
-
.filter((subject) => subject.termType === 'NamedNode');
|
|
90
|
-
let data: T[] = subjects.map((subject) =>
|
|
91
|
-
RDFSerializer.deserializeFromStore(subject as any, store),
|
|
92
|
-
);
|
|
93
|
-
if (options.sort) {
|
|
94
|
-
data = data
|
|
95
|
-
.sort((a, b) =>
|
|
96
|
-
options.sort
|
|
97
|
-
.map((s) => {
|
|
98
|
-
const res1 = MemoryQueryEvaluator.getValueFromPath(s[1] > 0 ? a : b, s[0])[1];
|
|
99
|
-
const res2 = MemoryQueryEvaluator.getValueFromPath(s[1] > 0 ? b : a, s[0])[1];
|
|
100
|
-
if (typeof res1 === 'number') {
|
|
101
|
-
return res1 - res2;
|
|
102
|
-
} else if (typeof res1 === 'string') {
|
|
103
|
-
return res1.localeCompare(res2);
|
|
104
|
-
} else {
|
|
105
|
-
return 0;
|
|
106
|
-
}
|
|
107
|
-
})
|
|
108
|
-
.reduce((a, b) => a + b),
|
|
109
|
-
)
|
|
110
|
-
.slice(0, options.limit);
|
|
111
|
-
}
|
|
112
|
-
resolve(data);
|
|
113
|
-
})
|
|
114
|
-
.catch(reject);
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
count(query?: FilterQuery<T>): Promise<number> {
|
|
119
|
-
return new Promise((resolve, reject) => {
|
|
120
|
-
this.findAllSerialized(query)
|
|
121
|
-
.then((store) => {
|
|
122
|
-
if (store.size === 0) {
|
|
123
|
-
return resolve(0);
|
|
124
|
-
}
|
|
125
|
-
const subjects = store
|
|
126
|
-
.getSubjects(DataFactory.namedNode(rdf.type), null, null)
|
|
127
|
-
.filter((subject) => subject.termType === 'NamedNode');
|
|
128
|
-
resolve(subjects.length);
|
|
129
|
-
})
|
|
130
|
-
.catch(reject);
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
|
-
|
|
134
46
|
insert(_: IriString, object: T): Promise<T> {
|
|
135
47
|
return new Promise((resolve, reject) => {
|
|
136
48
|
this.client.query
|
|
@@ -170,13 +82,12 @@ export class SPARQLDataDriver<T> extends DataServiceDriver<IriString, T> {
|
|
|
170
82
|
}
|
|
171
83
|
}
|
|
172
84
|
|
|
173
|
-
export interface SPARQLDataDriverOptions extends
|
|
85
|
+
export interface SPARQLDataDriverOptions extends SPARQLDriverOptions {
|
|
174
86
|
endpointUrl: UrlString;
|
|
175
87
|
storeUrl?: UrlString;
|
|
176
88
|
updateUrl?: UrlString;
|
|
177
89
|
headers?: HeadersInit;
|
|
178
90
|
user?: string;
|
|
179
91
|
password?: string;
|
|
180
|
-
baseUri?: IriString;
|
|
181
92
|
operation?: 'get' | 'postUrlencoded' | 'postDirect';
|
|
182
93
|
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import {
|
|
2
|
+
DataServiceOptions,
|
|
3
|
+
FilterQuery,
|
|
4
|
+
FindOptions,
|
|
5
|
+
Constructor,
|
|
6
|
+
MemoryQueryEvaluator,
|
|
7
|
+
DataServiceDriver,
|
|
8
|
+
} from '@openhps/core';
|
|
9
|
+
import { DataFactory, Store } from 'n3';
|
|
10
|
+
import { IriString, RDFSerializer } from '../rdf';
|
|
11
|
+
import { rdf } from '../vocab';
|
|
12
|
+
import { SPARQLGenerator } from './SPARQLGenerator';
|
|
13
|
+
|
|
14
|
+
export abstract class SPARQLDriverBase<T> extends DataServiceDriver<IriString, T> {
|
|
15
|
+
protected options: SPARQLDriverOptions;
|
|
16
|
+
protected generator: SPARQLGenerator<T>;
|
|
17
|
+
|
|
18
|
+
constructor(dataType?: Constructor<T>, options?: SPARQLDriverOptions) {
|
|
19
|
+
super(dataType, options);
|
|
20
|
+
this.generator = new SPARQLGenerator(this.dataType, this.options.baseUri);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
findByUID(id: IriString): Promise<T> {
|
|
24
|
+
return new Promise((resolve, reject) => {
|
|
25
|
+
const identifierMember = RDFSerializer.getUriMetadata(this.dataType);
|
|
26
|
+
this.findOne({
|
|
27
|
+
[identifierMember.key]: id,
|
|
28
|
+
} as any)
|
|
29
|
+
.then(resolve)
|
|
30
|
+
.catch(reject);
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
findOne(query?: FilterQuery<T>, options: FindOptions = {}): Promise<T> {
|
|
35
|
+
return new Promise((resolve, reject) => {
|
|
36
|
+
this.findAll(query, {
|
|
37
|
+
limit: 1,
|
|
38
|
+
sort: options.sort,
|
|
39
|
+
})
|
|
40
|
+
.then((results) => {
|
|
41
|
+
resolve(results[0]);
|
|
42
|
+
})
|
|
43
|
+
.catch(reject);
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
protected abstract findAllSerialized(query?: FilterQuery<T>): Promise<Store>;
|
|
48
|
+
|
|
49
|
+
findAll(query?: FilterQuery<T>, options: FindOptions = {}): Promise<T[]> {
|
|
50
|
+
return new Promise((resolve, reject) => {
|
|
51
|
+
this.findAllSerialized(query)
|
|
52
|
+
.then((store) => {
|
|
53
|
+
if (store.size === 0) {
|
|
54
|
+
return resolve([]);
|
|
55
|
+
}
|
|
56
|
+
const subjects = store
|
|
57
|
+
.getSubjects(DataFactory.namedNode(rdf.type), null, null)
|
|
58
|
+
.filter((subject) => subject.termType === 'NamedNode');
|
|
59
|
+
let data: T[] = subjects
|
|
60
|
+
.map((subject) => RDFSerializer.deserializeFromStore(subject as any, store))
|
|
61
|
+
.filter((data) => data.constructor.name === this.dataType.name) as T[];
|
|
62
|
+
if (options.sort) {
|
|
63
|
+
data = data
|
|
64
|
+
.sort((a, b) =>
|
|
65
|
+
options.sort
|
|
66
|
+
.map((s) => {
|
|
67
|
+
const res1 = MemoryQueryEvaluator.getValueFromPath(s[1] > 0 ? a : b, s[0])[1];
|
|
68
|
+
const res2 = MemoryQueryEvaluator.getValueFromPath(s[1] > 0 ? b : a, s[0])[1];
|
|
69
|
+
if (typeof res1 === 'number') {
|
|
70
|
+
return res1 - res2;
|
|
71
|
+
} else if (typeof res1 === 'string') {
|
|
72
|
+
return res1.localeCompare(res2);
|
|
73
|
+
} else {
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
})
|
|
77
|
+
.reduce((a, b) => a + b),
|
|
78
|
+
)
|
|
79
|
+
.slice(0, options.limit);
|
|
80
|
+
}
|
|
81
|
+
resolve(data);
|
|
82
|
+
})
|
|
83
|
+
.catch(reject);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
count(query?: FilterQuery<T>): Promise<number> {
|
|
88
|
+
return new Promise((resolve, reject) => {
|
|
89
|
+
this.findAllSerialized(query)
|
|
90
|
+
.then((store) => {
|
|
91
|
+
if (store.size === 0) {
|
|
92
|
+
return resolve(0);
|
|
93
|
+
}
|
|
94
|
+
const subjects = store
|
|
95
|
+
.getSubjects(DataFactory.namedNode(rdf.type), null, null)
|
|
96
|
+
.filter((subject) => subject.termType === 'NamedNode');
|
|
97
|
+
resolve(subjects.length);
|
|
98
|
+
})
|
|
99
|
+
.catch(reject);
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
abstract insert(_: IriString, object: T): Promise<T>;
|
|
104
|
+
|
|
105
|
+
abstract delete(id: IriString): Promise<void>;
|
|
106
|
+
|
|
107
|
+
abstract deleteAll(query?: FilterQuery<T>): Promise<void>;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export interface SPARQLDriverOptions extends DataServiceOptions {
|
|
111
|
+
baseUri?: IriString;
|
|
112
|
+
}
|
|
@@ -491,7 +491,21 @@ export class SPARQLGenerator<T> {
|
|
|
491
491
|
// result = result && !Array.from(value).includes(subquery[selector]);
|
|
492
492
|
break;
|
|
493
493
|
case '$elemMatch':
|
|
494
|
-
patterns.push(
|
|
494
|
+
patterns.push({
|
|
495
|
+
type: 'group',
|
|
496
|
+
patterns: [
|
|
497
|
+
{
|
|
498
|
+
type: 'bgp',
|
|
499
|
+
triples: [
|
|
500
|
+
{
|
|
501
|
+
subject: DataFactory.variable('subject'),
|
|
502
|
+
predicate: DataFactory.namedNode(predicate),
|
|
503
|
+
object: DataFactory.namedNode(this.baseUri + 'dataobject_mvdewync'),
|
|
504
|
+
},
|
|
505
|
+
],
|
|
506
|
+
},
|
|
507
|
+
],
|
|
508
|
+
});
|
|
495
509
|
break;
|
|
496
510
|
}
|
|
497
511
|
return patterns;
|
package/src/service/index.ts
CHANGED