-
Notifications
You must be signed in to change notification settings - Fork 4
/
deltaProcessor.ts
99 lines (87 loc) · 3.27 KB
/
deltaProcessor.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
import { LowLevelStore, QuadPosition } from "@ontologies/core";
import { equals } from "../factoryHelpers";
import rdfFactory, {
NamedNode,
Node,
Quad,
Quadruple,
} from "../rdf";
import { StoreProcessor, StoreProcessorResult } from "../types";
const matchSingle = (graphIRI: NamedNode): (graph: Node) => boolean => {
const value = graphIRI.value;
return (graph: Node): boolean => equals(graph, graphIRI) || graph.value.startsWith(value);
};
const isInGraph = (graphIRIS: NamedNode[]): (graph: Node) => boolean => {
if (graphIRIS.length === 0) {
throw new Error("Pass a default graph explicitly");
}
const matchers = graphIRIS.map((iri) => matchSingle(iri));
return (graph: Node): boolean => matchers.some((matcher) => matcher(graph));
};
const pushQuadruple = (arr: Quadruple[], quadruple: Quadruple, graph: NamedNode): void => {
arr.push([
quadruple[QuadPosition.subject],
quadruple[QuadPosition.predicate],
quadruple[QuadPosition.object],
graph,
]);
};
export const deltaProcessor = (
addGraphIRIS: NamedNode[],
replaceGraphIRIS: NamedNode[],
removeGraphIRIS: NamedNode[],
purgeGraphIRIS: NamedNode[],
sliceGraphIRIS: NamedNode[],
): (store: LowLevelStore) => StoreProcessor => {
const defaultGraph = rdfFactory.defaultGraph();
const isAdd = isInGraph(addGraphIRIS);
const isReplace = isInGraph(replaceGraphIRIS);
const isRemove = isInGraph(removeGraphIRIS);
const isPurge = isInGraph(purgeGraphIRIS);
const isSlice = isInGraph(sliceGraphIRIS);
return (store: LowLevelStore): StoreProcessor => (delta: Quadruple[]): StoreProcessorResult => {
const addable: Quadruple[] = [];
const replaceable: Quadruple[] = [];
const removable: Quad[] = [];
let quad: Quadruple;
for (let i = 0, len = delta.length; i < len; i++) {
quad = delta[i];
if (!quad) {
continue;
}
const g = new URL(quad[QuadPosition.graph].value).searchParams.get("graph");
const graph = g ? rdfFactory.termFromNQ(g) : defaultGraph;
if (isAdd(quad[QuadPosition.graph])) {
pushQuadruple(addable, quad, graph);
} else if (isReplace(quad[QuadPosition.graph])) {
pushQuadruple(replaceable, quad, graph);
} else if (isRemove(quad[QuadPosition.graph])) {
removable.push(...store.match(
quad[QuadPosition.subject],
quad[QuadPosition.predicate],
null,
graph,
));
} else if (isPurge(quad[QuadPosition.graph])) {
removable.push(...store.match(
quad[QuadPosition.subject],
null,
null,
graph,
));
} else if (isSlice(quad[QuadPosition.graph])) {
removable.push(...store.match(
quad[QuadPosition.subject],
quad[QuadPosition.predicate],
quad[QuadPosition.object],
graph,
));
}
}
return [
addable,
replaceable,
removable,
];
};
};