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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
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
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
11 interface ColumnHeader {
118
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
12 rdfTypes: NamedNode[];
103
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
13 pred: NamedNode;
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
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
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
17 columnHeaders: ColumnHeader[];
110
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
18 rowHeaders: NamedNode[];
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
19 rows: Term[][][];
103
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
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
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
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
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
36 export interface LayoutResult {
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
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
069c1f70afa5 cleanup
drewp@bigasterisk.com
parents: 116
diff changeset
88 subjSet: UriSet = Immutable.Set();
069c1f70afa5 cleanup
drewp@bigasterisk.com
parents: 116
diff changeset
89 predSet: UriSet = Immutable.Set();
118
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
90 subjsSeenWithPred: Immutable.Map<NamedNode, NamedNode[]> = Immutable.Map();
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
91 typesSeenForSubj: Immutable.Map<NamedNode, NamedNode[]> = Immutable.Map();
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
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
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
94 constructor(public primaryType: NamedNode, public joinTypes: NamedNode[]) {}
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
95
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
96 showsType(rdfType: NamedNode): boolean {
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
97 return (
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
98 this.primaryType.equals(rdfType) ||
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
99 Immutable.Set<NamedNode>(this.joinTypes).has(rdfType)
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
100 );
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
106 this.subjSet = this.subjSet.add(subj);
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
109
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
110 if (pred.equals(rdf.type)) {
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
111 this.trackTypes(subj, q.object as NamedNode);
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
112 }
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
113 this.trackSubjs(subj, pred);
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
114 }
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
115
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
116 private trackTypes(subj: NamedNode<string>, rdfType: NamedNode) {
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
117 let cur = this.typesSeenForSubj.get(subj, undefined);
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
118 if (cur === undefined) {
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
119 cur = [];
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
120 this.typesSeenForSubj = this.typesSeenForSubj.set(subj, cur);
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
121 }
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
122 cur.push(rdfType);
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
123 }
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
159
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
160 gotStatements(): boolean {
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
161 return !this.subjSet.isEmpty();
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
162 }
118
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
178 const outputGrid: Term[][][] = [];
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
179 for (let subj of subjs) {
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
180 const row: Term[][] = [];
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
183 const uniq = uniqueSortedTerms(objs);
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
184 row.push(uniq);
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
185 });
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
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
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
196 type SubjectTableBuilders = Immutable.Map<
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
197 NamedNode<string>,
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
198 AlignedTableBuilder[]
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
199 >;
104
1aea03d306af WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents: 103
diff changeset
200
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
201 function subjectsToTablesMap(
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
202 graph: Store,
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
203 tableBuilders: AlignedTableBuilder[]
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
204 ): SubjectTableBuilders {
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
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
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
208 const s = q.subject as NamedNode;
118
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
209 const rdfType = q.object as NamedNode;
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
210 tableBuilders.forEach((tb) => {
118
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
211 if (tb.showsType(rdfType)) {
120
a7519d92dbc6 refactor addToValues, multiColumnSort
drewp@bigasterisk.com
parents: 119
diff changeset
212 out = addToValues(out, s, tb);
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
213 }
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
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
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
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
3584f24becf4 cleanup
drewp@bigasterisk.com
parents: 120
diff changeset
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
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
251 export class Layout {
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
252 constructor(public viewConfig?: ViewConfig) {}
117
069c1f70afa5 cleanup
drewp@bigasterisk.com
parents: 116
diff changeset
253
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
254 _groupAllStatements(
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
255 graph: Store,
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
256 tablesWantingSubject: SubjectTableBuilders,
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
257 ungrouped: Quad[]
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
258 ) {
103
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
259 graph.forEach(
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
260 (q: Quad) => {
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
261 const tables = tablesWantingSubject.get(q.subject as NamedNode);
118
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
262
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
263 if (tables && tables.length) {
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
264 tables.forEach((t: AlignedTableBuilder) => t.addQuad(q));
110
3cdbbd913f1d table displays now just barely
drewp@bigasterisk.com
parents: 108
diff changeset
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
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
268 },
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
269 null,
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
270 null,
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
271 null,
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
272 null
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
273 );
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
274 }
117
069c1f70afa5 cleanup
drewp@bigasterisk.com
parents: 116
diff changeset
275
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
276 plan(graph: Store): LayoutResult {
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
277 const ungrouped: Quad[] = [];
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
278
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
279 const tableBuilders = this.viewConfig
118
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
280 ? this.viewConfig.tables.map(
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
281 (t) => new AlignedTableBuilder(t.primary, t.joins)
c2923b20bf5c support multi labels per column
drewp@bigasterisk.com
parents: 117
diff changeset
282 )
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
283 : [];
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
284
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
285 const tablesWantingSubject = subjectsToTablesMap(graph, tableBuilders);
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
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
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
288 for (const t of tableBuilders) {
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
289 if (t.gotStatements()) {
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
290 res.sections.push(t.value());
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
291 }
104
1aea03d306af WIP Layout. tests are passing but they're a little wrong
drewp@bigasterisk.com
parents: 103
diff changeset
292 }
116
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
293 if (ungrouped.length) {
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
294 res.sections.push(freeStatmentsSection(ungrouped));
dd3325cc023e multiple table support in Layout
drewp@bigasterisk.com
parents: 115
diff changeset
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
f12feced00ce WIP rewriting Layout
drewp@bigasterisk.com
parents: 97
diff changeset
297 }
88
ac7ad087d474 graph view rewrites and fixes for the multi-subject table
drewp@bigasterisk.com
parents:
diff changeset
298 }