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 };
   }