From 3356a401ac982b09111d923eb25ee614430157ea Mon Sep 17 00:00:00 2001
From: esikkala <esko.ikkala@aalto.fi>
Date: Fri, 23 Nov 2018 17:13:55 +0200
Subject: [PATCH] Count number of results in hierarchical facet

---
 src/client/components/Tree.js |  2 +-
 src/server/sparql/Mappers.js  | 77 +++++++++--------------------------
 2 files changed, 20 insertions(+), 59 deletions(-)

diff --git a/src/client/components/Tree.js b/src/client/components/Tree.js
index 6f03ec84..42085c59 100644
--- a/src/client/components/Tree.js
+++ b/src/client/components/Tree.js
@@ -157,7 +157,7 @@ class Tree extends Component {
                       color="primary"
                     />
                   }
-                  label={node.title}
+                  label={`${node.title} (${node.totalCnt == 0 ? node.cnt : node.totalCnt})`}
                   classes={{
                     root: classes.formControlRoot
                   }}
diff --git a/src/server/sparql/Mappers.js b/src/server/sparql/Mappers.js
index 4e0b0927..9561ec1b 100644
--- a/src/server/sparql/Mappers.js
+++ b/src/server/sparql/Mappers.js
@@ -1,4 +1,5 @@
 import _ from 'lodash';
+import { getTreeFromFlatData } from 'react-sortable-tree';
 
 //https://github.com/SemanticComputing/angular-paging-sparql-service/blob/master/src/sparql.object-mapper-service.js
 
@@ -130,77 +131,37 @@ export const mapFacet = (sparqlBindings) => {
       parent: _.has(b, 'parent',) ? b.parent.value : '0',
     };
   });
-  const treeData = getTreeFromFlatData({
+  let treeData = getTreeFromFlatData({
     flatData: results,
     getKey: node => node.id, // resolve a node's key
     getParentKey: node => node.parent, // resolve node's parent's key
     rootKey: 0, // The value of the parent key when there is no parent (i.e., at root level)
   });
+  treeData = recursiveSort(treeData);
+  treeData.forEach(node => sumUp(node));
   return treeData;
 };
 
-/**
- * Generate a tree structure from flat data.
- *
- * @param {!Object[]} flatData
- * @param {!function=} getKey - Function to get the key from the nodeData
- * @param {!function=} getParentKey - Function to get the parent key from the nodeData
- * @param {string|number=} rootKey - The value returned by `getParentKey` that corresponds to the root node.
- *                                  For example, if your nodes have id 1-99, you might use rootKey = 0
- *
- * @return {Object[]} treeData - The flat data represented as a tree
- */
-const getTreeFromFlatData = ({
-  flatData,
-  getKey = node => node.id,
-  getParentKey = node => node.parentId,
-  rootKey = '0',
-}) => {
-  if (!flatData) {
-    return [];
-  }
-
-  const childrenToParents = {};
-  flatData.forEach(child => {
-    const parentKey = getParentKey(child);
+const comparator = (a, b) => a.title.localeCompare(b.title);
 
-    if (parentKey in childrenToParents) {
-      childrenToParents[parentKey].push(child);
-    } else {
-      childrenToParents[parentKey] = [child];
+const sumUp = node => {
+  node.totalCnt = parseInt(node.cnt);
+  if (_.has(node, 'children')) {
+    for (let child of node.children) {
+      node.totalCnt += sumUp(child);
     }
-  });
-
-  if (!(rootKey in childrenToParents)) {
-    return [];
   }
+  return node.totalCnt;
+};
 
-  const trav = parent => {
-    const parentKey = getKey(parent);
-    if (parentKey in childrenToParents) {
-      return {
-        ... parent,
-        children: childrenToParents[parentKey].map(child => trav(child)),
-      };
+const recursiveSort = nodes => {
+  nodes.sort(comparator);
+  nodes.forEach(node => {
+    if (_.has(node, 'children')) {
+      recursiveSort(node.children);
     }
-    return { ...parent };
-  };
-
-  const comparator = (a, b) => a.title.localeCompare(b.title);
-
-  const recursiveSort = nodes => {
-    nodes.sort(comparator);
-    nodes.forEach(node => {
-      if (_.has(node, 'children')) {
-        recursiveSort(node.children);
-      }
-    });
-    return nodes;
-  };
-
-  const unsortedTreeData = childrenToParents[rootKey].map(child => trav(child));
-
-  return recursiveSort(unsortedTreeData);
+  });
+  return nodes;
 };
 
 export const mapAllResults = (results) => groupBy(results, 'id');
-- 
GitLab