annotate src/layout/rdf_value.ts @ 114:4b33a479dc2f

fix layout test to match new layout return types. clean up UriPairMap
author drewp@bigasterisk.com
date Sat, 19 Mar 2022 16:12:49 -0700
parents cbcd82d21356
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
109
cbcd82d21356 cleanup
drewp@bigasterisk.com
parents: 108
diff changeset
1 import { NamedNode, Store, Term } from "n3";
95
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
2 import { RDFS } from "./namespaces";
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
3
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
4 function _singleValue(g: Store, s: Term, p: Term): Term {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
5 const quads = g.getQuads(s, p, null, null);
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
6 const objs = new Set(quads.map((q) => q.object));
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
7 if (objs.size == 0) {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
8 throw new Error("no value for " + s.value + " " + p.value);
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
9 } else if (objs.size == 1) {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
10 const obj = objs.values().next().value;
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
11 return obj as Term;
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
12 } else {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
13 throw new Error("too many different values: " + JSON.stringify(quads));
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
14 }
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
15 }
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
16
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
17 export function stringValue(g: Store, s: Term, p: Term): string {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
18 const ret = _singleValue(g, s, p);
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
19 if (ret.termType != "Literal") {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
20 throw new Error(`ret=${ret}`);
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
21 }
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
22 return ret.value as string;
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
23 }
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
24
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
25 export function uriValue(g: Store, s: Term, p: Term): NamedNode {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
26 const ret = _singleValue(g, s, p);
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
27 if (ret.termType != "NamedNode") {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
28 throw new Error(`ret=${ret}`);
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
29 }
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
30
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
31 return ret;
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
32 }
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
33
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
34 export function labelOrTail(g: Store, uri: NamedNode): string {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
35 let ret: string;
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
36 try {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
37 ret = stringValue(g, uri, RDFS("label"));
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
38 } catch (e) {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
39 const words = uri.value.split("/");
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
40 ret = words[words.length - 1];
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
41 }
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
42 if (!ret) {
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
43 ret = uri.value;
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
44 }
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
45 return ret;
47d3b5a5bd5e refactor
drewp@bigasterisk.com
parents:
diff changeset
46 }
108
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
47
109
cbcd82d21356 cleanup
drewp@bigasterisk.com
parents: 108
diff changeset
48 export function uniqueSortedTerms<T extends NamedNode | Term>(
cbcd82d21356 cleanup
drewp@bigasterisk.com
parents: 108
diff changeset
49 terms: Iterable<T>
cbcd82d21356 cleanup
drewp@bigasterisk.com
parents: 108
diff changeset
50 ): T[] {
108
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
51 const uniques: T[] = [];
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
52 const seen = new Set();
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
53 for (let o of terms) {
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
54 if (!seen.has(o.id)) {
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
55 seen.add(o.id);
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
56 uniques.push(o);
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
57 }
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
58 }
109
cbcd82d21356 cleanup
drewp@bigasterisk.com
parents: 108
diff changeset
59 uniques.sort((a, b) => {
cbcd82d21356 cleanup
drewp@bigasterisk.com
parents: 108
diff changeset
60 return a.id.localeCompare(b.id);
cbcd82d21356 cleanup
drewp@bigasterisk.com
parents: 108
diff changeset
61 });
108
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
62 return uniques;
5e6840229a05 rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents: 106
diff changeset
63 }
114
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
64
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
65 // A default dict of Term[] with (NamedNode,NamedNode) pairs as keys.
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
66 //
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
67 // Immutable.Map<Immutable.Record<Uri,Uri>, Immutable.Set<Term>>() didn't seem to work.
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
68 export class UriPairMap {
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
69 _d = new Map<string, Term[]>();
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
70
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
71 _key(k1: NamedNode, k2: NamedNode): string {
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
72 return k1.id + "|" + k2.id;
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
73 }
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
74
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
75 add(k1: NamedNode, k2: NamedNode, v: Term) {
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
76 const key = this._key(k1, k2);
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
77 let cur = this._d.get(key);
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
78 if (cur === undefined) {
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
79 cur = [];
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
80 this._d.set(key, cur);
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
81 }
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
82 cur.push(v);
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
83 }
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
84
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
85 get(k1: NamedNode, k2: NamedNode): Term[] {
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
86 const key = this._key(k1, k2);
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
87 const v = this._d.get(key);
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
88 if (v === undefined) {
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
89 return [];
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
90 }
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
91 return v;
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
92 }
4b33a479dc2f fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents: 109
diff changeset
93 }