comparison src/MultiStore.ts @ 128:5a1a79f54779

big rewrite
author drewp@bigasterisk.com
date Fri, 05 May 2023 21:26:36 -0700
parents
children 27fad20dc101
comparison
equal deleted inserted replaced
127:d2580faef057 128:5a1a79f54779
1 import { EventEmitter } from "events";
2 import {
3 BlankNode,
4 OTerm,
5 Quad,
6 QuadPredicate,
7 Store,
8 Term,
9 extractListOptions,
10 } from "n3";
11 import * as RDF from "rdf-js";
12 import { SubEvent } from "sub-events";
13 import { Patch } from "./Patch";
14 import { SourceGraph } from "./SourceGraph";
15
16 // queries over multiple Store objects
17 export class MultiStore implements Store {
18 // emitted when there's been a net change to the graph data
19 graphChanged: SubEvent<Patch> = new SubEvent();
20
21 // sources of statements
22 private stores: Store[] = [];
23 private tempCombinedGraph: Store;
24
25 constructor() {
26 this.tempCombinedGraph = new Store();
27 }
28
29 newStore(s: SourceGraph) {
30 this.stores.push(s.store);
31 const p = new Patch(); // todo
32 s.sourceGraphChanged.subscribe((p) => {
33 console.log("patchlife1: ");
34 this.sourceGraphDataChanged(p); // todo
35 });
36 }
37
38 lostStore(s: Store) {
39 throw new Error("notimplemented");
40 }
41
42 sourceGraphDataChanged(p: Patch) {
43 console.log("patchlife2: multistore saw a graph change", p);
44
45 this.tempCombinedGraph = new Store();
46 for (let st of this.stores) {
47 for (let q of st.getQuads(null, null, null, null)) {
48 this.tempCombinedGraph.addQuad(q);
49 }
50 }
51 console.log("patchlife3: tempgraph is rebuilt");
52 this.graphChanged.emit(p);
53 }
54
55 //
56 // Store interface follows:
57 //
58 forEach(qfn: (qfn: Quad) => void, s: OTerm, p: OTerm, o: OTerm, g: OTerm) {
59 this.tempCombinedGraph.forEach(qfn, s, p, o, g);
60 }
61 countQuads(s: OTerm, p: OTerm, o: OTerm, g: OTerm): number {
62 return this.tempCombinedGraph.countQuads(s, p, o, g);
63 // const seen: Set<Quad> = new Set();
64 // let count = 0;
65 // for (let src of this.sources.currentSourceGraphs) {
66 // for (let q of src.store.getQuads(s, p, o, g)) {
67 // if (!seen.has(q)) {
68 // count++;
69 // seen.add(q);
70 // }
71 // }
72 // }
73 // return count;
74 }
75
76 get size(): number {
77 return this.countQuads(null, null, null, null);
78 }
79 has(quad: Quad): boolean {
80 throw new Error("notimplemented");
81 }
82 getQuads(
83 subject: OTerm,
84 predicate: OTerm,
85 object: OTerm | OTerm[],
86 graph: OTerm
87 ): Quad[] {
88 return this.tempCombinedGraph.getQuads(subject, predicate, object, graph);
89 }
90 match(
91 subject?: Term | null,
92 predicate?: Term | null,
93 object?: Term | null,
94 graph?: Term | null
95 ): RDF.Stream<Quad> & RDF.DatasetCore<Quad, Quad> {
96 throw new Error("notimplemented");
97 }
98
99 every(
100 callback: QuadPredicate<Quad>,
101 subject: OTerm,
102 predicate: OTerm,
103 object: OTerm,
104 graph: OTerm
105 ): boolean {
106 throw new Error("notimplemented");
107 }
108 some(
109 callback: QuadPredicate<Quad>,
110 subject: OTerm,
111 predicate: OTerm,
112 object: OTerm,
113 graph: OTerm
114 ): boolean {
115 throw new Error("notimplemented");
116 }
117 getSubjects(
118 predicate: OTerm,
119 object: OTerm,
120 graph: OTerm
121 ): Array<Quad["subject"]> {
122 throw new Error("notimplemented");
123 }
124 forSubjects(
125 callback: (result: Quad["subject"]) => void,
126 predicate: OTerm,
127 object: OTerm,
128 graph: OTerm
129 ): void {
130 throw new Error("notimplemented");
131 }
132 getPredicates(
133 subject: OTerm,
134 object: OTerm,
135 graph: OTerm
136 ): Array<Quad["predicate"]> {
137 throw new Error("notimplemented");
138 return [];
139 }
140 forPredicates(
141 callback: (result: Quad["predicate"]) => void,
142 subject: OTerm,
143 object: OTerm,
144 graph: OTerm
145 ): void {
146 throw new Error("notimplemented");
147 }
148 getObjects(
149 subject: OTerm,
150 predicate: OTerm,
151 graph: OTerm
152 ): Array<Quad["object"]> {
153 return this.tempCombinedGraph.getObjects(subject, predicate, graph);
154 }
155 forObjects(
156 callback: (result: Quad["object"]) => void,
157 subject: OTerm,
158 predicate: OTerm,
159 graph: OTerm
160 ): void {
161 throw new Error("notimplemented");
162 }
163 getGraphs(
164 subject: OTerm,
165 predicate: OTerm,
166 object: OTerm
167 ): Array<Quad["graph"]> {
168 throw new Error("notimplemented");
169 }
170 forGraphs(
171 callback: (result: Quad["graph"]) => void,
172 subject: OTerm,
173 predicate: OTerm,
174 object: OTerm
175 ): void {
176 throw new Error("notimplemented");
177 }
178 extractLists(options?: extractListOptions): Record<string, RDF.Term[]> {
179 throw new Error("notimplemented");
180 }
181 [Symbol.iterator](): Iterator<Quad> {
182 throw new Error("notimplemented");
183 }
184
185 add(): this {
186 throw new Error("MultiStore is readonly");
187 }
188 addQuad() {
189 throw new Error("notimplemented");
190 }
191 addQuads(): void {
192 throw new Error("MultiStore is readonly");
193 }
194 delete(): this {
195 throw new Error("MultiStore is readonly");
196 }
197 import(): EventEmitter {
198 throw new Error("MultiStore is readonly");
199 }
200 removeQuad(): void {
201 throw new Error("MultiStore is readonly");
202 }
203 removeQuads(): void {
204 throw new Error("MultiStore is readonly");
205 }
206 remove(): EventEmitter {
207 throw new Error("MultiStore is readonly");
208 }
209 removeMatches(): EventEmitter {
210 throw new Error("MultiStore is readonly");
211 }
212 deleteGraph(): EventEmitter {
213 throw new Error("MultiStore is readonly");
214 }
215 createBlankNode(): BlankNode {
216 throw new Error("MultiStore is readonly");
217 }
218 }