annotate src/layout/rdf_value.ts @ 109:cbcd82d21356

cleanup
author drewp@bigasterisk.com
date Fri, 18 Mar 2022 12:00:33 -0700
parents 5e6840229a05
children 4b33a479dc2f
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 }