Mercurial > code > home > repos > streamed-graph
annotate src/layout/Layout.ts @ 121:3584f24becf4
cleanup
author | drewp@bigasterisk.com |
---|---|
date | Sun, 20 Mar 2022 14:10:56 -0700 |
parents | a7519d92dbc6 |
children | 2e8fa3fec0c8 |
rev | line source |
---|---|
88
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
1 // Organize graph data into tables (column orders, etc) for the view layer. |
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
2 |
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
3 import Immutable from "immutable"; // mostly using this for the builtin equals() testing, since NamedNode(x)!=NamedNode(x) |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
4 import { NamedNode, Quad, Store, Term } from "n3"; |
110 | 5 import { rdf, rdfs } from "./namespaces"; |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
6 import { uniqueSortedTerms, UriPairMap } from "./rdf_value"; |
116 | 7 import { ViewConfig } from "./ViewConfig"; |
88
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
8 |
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
9 type UriSet = Immutable.Set<NamedNode>; |
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
10 |
103 | 11 interface ColumnHeader { |
118 | 12 rdfTypes: NamedNode[]; |
103 | 13 pred: NamedNode; |
14 } | |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
15 |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
16 export interface AlignedTable { |
103 | 17 columnHeaders: ColumnHeader[]; |
110 | 18 rowHeaders: NamedNode[]; |
19 rows: Term[][][]; | |
103 | 20 } |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
21 |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
22 export interface PredRow { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
23 pred: NamedNode; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
24 objs: Term[]; |
103 | 25 } |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
26 |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
27 export interface SubjRow { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
28 subj: NamedNode; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
29 predRows: PredRow[]; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
30 } |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
31 |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
32 export interface FreeStatements { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
33 subjRows: SubjRow[]; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
34 } |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
35 |
103 | 36 export interface LayoutResult { |
37 sections: (AlignedTable | FreeStatements)[]; | |
88
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
38 } |
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
39 |
120
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
40 function addToValues<K, V>( |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
41 imap: Immutable.Map<K, V[]>, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
42 key: K, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
43 newValue: V |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
44 ): Immutable.Map<K, V[]> { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
45 let cur = imap.get(key, undefined); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
46 let ret = imap; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
47 if (cur === undefined) { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
48 cur = []; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
49 ret = imap.set(key, cur); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
50 } |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
51 cur.push(newValue); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
52 return ret; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
53 } |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
54 |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
55 function multiColumnSort<T>( |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
56 elems: T[], |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
57 makeSortCols: (elem: T, index: number) => Array<number | string> |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
58 ): T[] { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
59 const tagged = elems.map((p, i) => { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
60 return { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
61 sort: makeSortCols(p, i), |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
62 val: p, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
63 }; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
64 }); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
65 tagged.sort((e1, e2) => { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
66 let index = 0; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
67 for (let k1 of e1.sort) { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
68 const k2 = e2.sort[index]; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
69 if (!Immutable.is(k1, k2)) { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
70 if (typeof k1 === "number") { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
71 if (typeof k2 === "number") { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
72 return k1 - k2; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
73 } else { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
74 throw new Error(`${k1} vs ${k2}`); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
75 } |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
76 } else { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
77 return k1.localeCompare(k2 as string); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
78 } |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
79 } |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
80 index++; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
81 } |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
82 return 0; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
83 }); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
84 return tagged.map((e) => e.val); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
85 } |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
86 |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
87 class AlignedTableBuilder { |
117 | 88 subjSet: UriSet = Immutable.Set(); |
89 predSet: UriSet = Immutable.Set(); | |
118 | 90 subjsSeenWithPred: Immutable.Map<NamedNode, NamedNode[]> = Immutable.Map(); |
91 typesSeenForSubj: Immutable.Map<NamedNode, NamedNode[]> = Immutable.Map(); | |
92 | |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
93 cell = new UriPairMap(); |
118 | 94 constructor(public primaryType: NamedNode, public joinTypes: NamedNode[]) {} |
95 | |
96 showsType(rdfType: NamedNode): boolean { | |
97 return ( | |
98 this.primaryType.equals(rdfType) || | |
99 Immutable.Set<NamedNode>(this.joinTypes).has(rdfType) | |
100 ); | |
101 } | |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
102 |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
103 addQuad(q: Quad) { |
110 | 104 const subj = q.subject as NamedNode; |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
105 const pred = q.predicate as NamedNode; |
110 | 106 this.subjSet = this.subjSet.add(subj); |
107 this.predSet = this.predSet.add(pred); | |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
108 this.cell.add(subj, pred, q.object); |
118 | 109 |
110 if (pred.equals(rdf.type)) { | |
111 this.trackTypes(subj, q.object as NamedNode); | |
112 } | |
113 this.trackSubjs(subj, pred); | |
114 } | |
115 | |
116 private trackTypes(subj: NamedNode<string>, rdfType: NamedNode) { | |
117 let cur = this.typesSeenForSubj.get(subj, undefined); | |
118 if (cur === undefined) { | |
119 cur = []; | |
120 this.typesSeenForSubj = this.typesSeenForSubj.set(subj, cur); | |
121 } | |
122 cur.push(rdfType); | |
123 } | |
124 | |
120
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
125 private trackTypes(unaliasedSubj: NamedNode<string>, rdfType: NamedNode) { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
126 this.typesSeenForSubj = addToValues( |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
127 this.typesSeenForSubj, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
128 unaliasedSubj, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
129 rdfType |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
130 ); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
131 } |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
132 |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
133 private trackSubjs(unaliasedSubj: NamedNode, pred: NamedNode<string>) { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
134 this.subjsSeenWithPred = addToValues( |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
135 this.subjsSeenWithPred, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
136 pred, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
137 unaliasedSubj |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
138 ); |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
139 } |
110 | 140 |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
141 _displayedPreds(): NamedNode[] { |
110 | 142 let preds = uniqueSortedTerms(this.predSet); |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
143 preds = preds.filter((p) => { |
120
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
144 if (p.equals(rdf.type)) return false; |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
145 return true; |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
146 }); |
120
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
147 preds = multiColumnSort(preds, (elem: NamedNode, index: number) => { |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
148 const types = this.typesSeenWithPred(elem); |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
149 return [ |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
150 elem.equals(rdfs.label) ? 0 : 1, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
151 types.length == 1 ? 0 : 1, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
152 types[0].equals(this.primaryType) ? 0 : 1, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
153 types[0].id, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
154 index, |
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
155 ]; |
110 | 156 }); |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
157 return preds; |
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
158 } |
118 | 159 |
116 | 160 gotStatements(): boolean { |
161 return !this.subjSet.isEmpty(); | |
162 } | |
118 | 163 |
119
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
164 private typesSeenWithPred(pred: NamedNode): NamedNode[] { |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
165 const subs = this.subjsSeenWithPred.get(pred, []); |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
166 const types: NamedNode[] = []; |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
167 subs.forEach((s) => { |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
168 this.typesSeenForSubj.get(s, []).forEach((t) => { |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
169 types.push(t); |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
170 }); |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
171 }); |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
172 return uniqueSortedTerms(types); |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
173 } |
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
174 |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
175 value(): AlignedTable { |
110 | 176 const subjs = uniqueSortedTerms(this.subjSet); |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
177 const preds = this._displayedPreds(); |
110 | 178 const outputGrid: Term[][][] = []; |
179 for (let subj of subjs) { | |
180 const row: Term[][] = []; | |
181 preds.forEach((pred) => { | |
114
4b33a479dc2f
fix layout test to match new layout return types. clean up UriPairMap
drewp@bigasterisk.com
parents:
110
diff
changeset
|
182 const objs = this.cell.get(subj, pred); |
110 | 183 const uniq = uniqueSortedTerms(objs); |
184 row.push(uniq); | |
185 }); | |
186 outputGrid.push(row); | |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
187 } |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
188 |
118 | 189 const headers: ColumnHeader[] = preds.map((pred) => { |
119
8715633f5213
fancier column sorting to bring preds from the same type together
drewp@bigasterisk.com
parents:
118
diff
changeset
|
190 return { rdfTypes: this.typesSeenWithPred(pred), pred: pred }; |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
191 }); |
110 | 192 return { columnHeaders: headers, rowHeaders: subjs, rows: outputGrid }; |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
193 } |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
194 } |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
195 |
116 | 196 type SubjectTableBuilders = Immutable.Map< |
197 NamedNode<string>, | |
198 AlignedTableBuilder[] | |
199 >; | |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
200 |
116 | 201 function subjectsToTablesMap( |
202 graph: Store, | |
203 tableBuilders: AlignedTableBuilder[] | |
204 ): SubjectTableBuilders { | |
205 let out: SubjectTableBuilders = Immutable.Map(); | |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
206 graph.forEach( |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
207 (q: Quad) => { |
116 | 208 const s = q.subject as NamedNode; |
118 | 209 const rdfType = q.object as NamedNode; |
116 | 210 tableBuilders.forEach((tb) => { |
118 | 211 if (tb.showsType(rdfType)) { |
120
a7519d92dbc6
refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents:
119
diff
changeset
|
212 out = addToValues(out, s, tb); |
116 | 213 } |
214 }); | |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
215 }, |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
216 null, |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
217 rdf.type, |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
218 null, |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
219 null |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
220 ); |
116 | 221 return out; |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
222 } |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
223 |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
224 function freeStatmentsSection(stmts: Quad[]): FreeStatements { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
225 const subjs: NamedNode[] = []; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
226 stmts.forEach((q) => { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
227 subjs.push(q.subject as NamedNode); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
228 }); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
229 return { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
230 subjRows: uniqueSortedTerms(subjs).map((subj) => { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
231 const preds: NamedNode[] = []; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
232 let po = Immutable.Map<NamedNode, Term[]>(); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
233 stmts.forEach((q) => { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
234 if (q.subject.equals(subj)) { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
235 const p = q.predicate as NamedNode; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
236 preds.push(p); |
121 | 237 po = addToValues(po, p, q.object as NamedNode); |
108
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
238 } |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
239 }); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
240 |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
241 const rows: PredRow[] = []; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
242 uniqueSortedTerms(preds).forEach((p) => { |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
243 rows.push({ pred: p, objs: uniqueSortedTerms(po.get(p, [])) }); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
244 }); |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
245 return { subj: subj, predRows: rows }; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
246 }), |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
247 }; |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
248 } |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
249 |
5e6840229a05
rewrite freeStatements rendering to put more planning in layout
drewp@bigasterisk.com
parents:
106
diff
changeset
|
250 // The description of how this page should look: sections, tables, etc. |
103 | 251 export class Layout { |
252 constructor(public viewConfig?: ViewConfig) {} | |
117 | 253 |
116 | 254 _groupAllStatements( |
255 graph: Store, | |
256 tablesWantingSubject: SubjectTableBuilders, | |
257 ungrouped: Quad[] | |
258 ) { | |
103 | 259 graph.forEach( |
260 (q: Quad) => { | |
116 | 261 const tables = tablesWantingSubject.get(q.subject as NamedNode); |
118 | 262 |
116 | 263 if (tables && tables.length) { |
264 tables.forEach((t: AlignedTableBuilder) => t.addQuad(q)); | |
110 | 265 } else { |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
266 ungrouped.push(q); |
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
267 } |
103 | 268 }, |
269 null, | |
270 null, | |
271 null, | |
272 null | |
273 ); | |
116 | 274 } |
117 | 275 |
116 | 276 plan(graph: Store): LayoutResult { |
277 const ungrouped: Quad[] = []; | |
278 | |
279 const tableBuilders = this.viewConfig | |
118 | 280 ? this.viewConfig.tables.map( |
281 (t) => new AlignedTableBuilder(t.primary, t.joins) | |
282 ) | |
116 | 283 : []; |
284 | |
285 const tablesWantingSubject = subjectsToTablesMap(graph, tableBuilders); | |
286 this._groupAllStatements(graph, tablesWantingSubject, ungrouped); | |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
287 const res: LayoutResult = { sections: [] }; |
116 | 288 for (const t of tableBuilders) { |
289 if (t.gotStatements()) { | |
290 res.sections.push(t.value()); | |
291 } | |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
292 } |
116 | 293 if (ungrouped.length) { |
294 res.sections.push(freeStatmentsSection(ungrouped)); | |
295 } | |
104
1aea03d306af
WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents:
103
diff
changeset
|
296 return res; |
103 | 297 } |
88
ac7ad087d474
graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff
changeset
|
298 } |