Mercurial > code > home > repos > streamed-graph
diff src/layout/Layout.ts @ 119:8715633f5213
fancier column sorting to bring preds from the same type together
author | drewp@bigasterisk.com |
---|---|
date | Sun, 20 Mar 2022 01:17:35 -0700 |
parents | c2923b20bf5c |
children | a7519d92dbc6 |
line wrap: on
line diff
--- a/src/layout/Layout.ts Sun Mar 20 00:54:19 2022 -0700 +++ b/src/layout/Layout.ts Sun Mar 20 01:17:35 2022 -0700 @@ -90,13 +90,36 @@ return !p.equals(rdf.type); }); const tagged = preds.map((p, i) => { - if (p.equals(rdfs.label)) { - i = -1; - } - return { sort: i, val: p }; + const types = this.typesSeenWithPred(p); + return { + sort: [ + p.equals(rdfs.label) ? 0 : 1, + types.length == 1 ? 0 : 1, + types[0].equals(this.primaryType) ? 0 : 1, + types[0], + i, + ], + val: p, + }; }); tagged.sort((a, b) => { - return a.sort - b.sort; + let ib = 0; + for (let k1 of a.sort) { + const k2 = b.sort[ib]; + if (!Immutable.is(k1, k2)) { + if (typeof k1 === "number") { + if (typeof k2 === "number") { + return k1 - k2; + } else { + throw new Error(`${k1} vs ${k2}`); + } + } else { + return (k1 as NamedNode).id.localeCompare((k2 as NamedNode).id); + } + } + ib++; + } + return 0; }); preds = tagged.map((e) => e.val); return preds; @@ -106,6 +129,17 @@ return !this.subjSet.isEmpty(); } + private typesSeenWithPred(pred: NamedNode): NamedNode[] { + const subs = this.subjsSeenWithPred.get(pred, []); + const types: NamedNode[] = []; + subs.forEach((s) => { + this.typesSeenForSubj.get(s, []).forEach((t) => { + types.push(t); + }); + }); + return uniqueSortedTerms(types); + } + value(): AlignedTable { const subjs = uniqueSortedTerms(this.subjSet); const preds = this._displayedPreds(); @@ -121,15 +155,7 @@ } const headers: ColumnHeader[] = preds.map((pred) => { - const subs = this.subjsSeenWithPred.get(pred, []); - const types: NamedNode[] = []; - subs.forEach((s) => { - this.typesSeenForSubj.get(s, []).forEach((t) => { - types.push(t); - }); - }); - - return { rdfTypes: uniqueSortedTerms(types), pred: pred }; + return { rdfTypes: this.typesSeenWithPred(pred), pred: pred }; }); return { columnHeaders: headers, rowHeaders: subjs, rows: outputGrid }; }