From 9c150458687814a08c405214c1bc447404ed75e9 Mon Sep 17 00:00:00 2001
From: esikkala <esko.ikkala@aalto.fi>
Date: Wed, 15 May 2019 15:37:03 +0300
Subject: [PATCH] Simplify facet values query

---
 .../components/facet_bar/HierarchicalFacet.js |  4 --
 src/server/sparql/FacetValues.js              | 71 ++++++++-----------
 src/server/sparql/SparqlQueriesGeneral.js     | 18 ++---
 3 files changed, 38 insertions(+), 55 deletions(-)

diff --git a/src/client/components/facet_bar/HierarchicalFacet.js b/src/client/components/facet_bar/HierarchicalFacet.js
index 44680e5d..88665741 100644
--- a/src/client/components/facet_bar/HierarchicalFacet.js
+++ b/src/client/components/facet_bar/HierarchicalFacet.js
@@ -149,10 +149,6 @@ class HierarchicalFacet extends Component {
   }
 
   generateNodeProps = treeObj => {
-    // TODO: sometimes this produces an empty treenode
-    if (treeObj.node.prefLabel === 'Unknown' && treeObj.node.instanceCount == 0) {
-      return null;
-    }
     const { uriFilter} = this.props.facet;
     let selectedCount = uriFilter == null ? 0 : Object.keys(this.props.facet.uriFilter).length;
     let isSelected = treeObj.node.selected === 'true' ? true : false;
diff --git a/src/server/sparql/FacetValues.js b/src/server/sparql/FacetValues.js
index 2bb051ba..31e59568 100644
--- a/src/server/sparql/FacetValues.js
+++ b/src/server/sparql/FacetValues.js
@@ -21,7 +21,7 @@ export const getFacet = ({
   let q = facetValuesQuery;
   const facetConfig = facetConfigs[facetClass][facetID];
   let selectedBlock = '# no selections';
-  let selectedNoHitsBlock = '# no selections';
+  let selectedNoHitsBlock = '# no filters from other facets';
   let filterBlock = '# no filters';
   let parentBlock = '# no parents';
   let mapper = mapFacet;
@@ -61,28 +61,13 @@ export const getFacet = ({
         inverse: true,
       });
       selectedNoHitsBlock = `
-      UNION
-      {
-        {
-          SELECT DISTINCT (count(DISTINCT ?instance) as ?instanceCount) ?id ?selected ?parent {
-            {
-              VALUES ?id { <${uriFilters[facetID].join('> <')}> }
-              ${noHitsFilter}
-              BIND(true AS ?selected)
-              OPTIONAL {
-                ?id gvp:broaderPreferred ?parent_
-              }
-              BIND(COALESCE(?parent_, '0') as ?parent)
-            }
-            <PARENTS>
-          }
-          GROUP BY ?id ?selected ?parent
-        }
-        FILTER(BOUND(?id))
-        <FACET_VALUE_FILTER>
-        OPTIONAL { ?id skos:prefLabel ?prefLabel_ }
-        BIND(COALESCE(STR(?prefLabel_), STR(?id)) AS ?prefLabel)
-      }
+    UNION
+    {
+    # facet values that have been selected but return no results
+      VALUES ?id { <${uriFilters[facetID].join('> <')}> }
+      ${noHitsFilter}
+      BIND(true AS ?selected_)
+    }
       `;
     }
   }
@@ -94,33 +79,35 @@ export const getFacet = ({
       spatialFilters: spatialFilters,
       textFilters: textFilters,
       filterTarget: 'instance2',
-      facetID: facetID });
+      facetID: facetID,
+      inverse: false
+    });
+    let ignoreSelectedValues = '';
+    if (uriFilters !== null && has(uriFilters, facetID)) {
+      ignoreSelectedValues = `FILTER(?id NOT IN ( <${uriFilters[facetID].join('>, <')}> ))`;
+    }
     parentBlock = `
-          UNION
-          {
-            ${parentFilterStr}
-            ?instance2 ${facetConfig.parentPredicate} ?id .
-            OPTIONAL { ?id skos:prefLabel ?prefLabel_ }
-            BIND(COALESCE(STR(?prefLabel_), STR(?id)) AS ?prefLabel)
-            OPTIONAL {
-              ?id gvp:broaderPreferred ?parent_
-            }
-            BIND(COALESCE(?selected_, false) as ?selected)
-            BIND(COALESCE(?parent_, '0') as ?parent)
-          }
+    UNION
+    # parents for all facet values
+    {
+      ${parentFilterStr}
+      ?instance2 ${facetConfig.parentPredicate} ?id .
+      BIND(false AS ?selected_)
+      ${ignoreSelectedValues}
+    }
       `;
   }
   q = q.replace('<SELECTED_VALUES>', selectedBlock);
   q = q.replace('<SELECTED_VALUES_NO_HITS>', selectedNoHitsBlock);
-  q = q.replace(/<FACET_VALUE_FILTER>/g, facetConfig.facetValueFilter);
-  q = q.replace(/<PARENTS>/g, parentBlock);
+  q = q.replace('<FACET_VALUE_FILTER>', facetConfig.facetValueFilter);
+  q = q.replace('<PARENTS>', parentBlock);
   q = q.replace('<ORDER_BY>', `ORDER BY ${sortDirection}(?${sortBy})` );
   q = q.replace(/<RDF_TYPE>/g, facetConfigs[facetClass].rdfType);
   q = q.replace(/<FILTER>/g, filterBlock );
   q = q.replace(/<PREDICATE>/g, facetConfig.predicate);
-  // if (facetID == 'place') {
-  //   // console.log(uriFilters)
-  //   console.log(prefixes + q)
-  // }
+  if (facetID == 'productionPlace') {
+    // console.log(uriFilters)
+    console.log(prefixes + q)
+  }
   return runSelectQuery(prefixes + q, endpoint, mapper);
 };
diff --git a/src/server/sparql/SparqlQueriesGeneral.js b/src/server/sparql/SparqlQueriesGeneral.js
index ad0ddd06..43e42bbb 100644
--- a/src/server/sparql/SparqlQueriesGeneral.js
+++ b/src/server/sparql/SparqlQueriesGeneral.js
@@ -48,32 +48,32 @@ export const facetResultSetQuery = `
 
 export const facetValuesQuery = `
   SELECT DISTINCT ?id ?prefLabel ?selected ?parent ?instanceCount {
-    # facet values that return results
     {
       {
-        SELECT DISTINCT (count(DISTINCT ?instance) as ?instanceCount) ?id ?selected ?parent {
+        SELECT DISTINCT (count(DISTINCT ?instance) as ?instanceCount) ?id ?selected {
+          # facet values that return results
           {
             <FILTER>
             ?instance <PREDICATE> ?id .
             ?instance a <RDF_TYPE> .
             <SELECTED_VALUES>
-            BIND(COALESCE(?selected_, false) as ?selected)
-            OPTIONAL { ?id gvp:broaderPreferred ?parent_ . }
-            BIND(COALESCE(?parent_, '0') as ?parent)
           }
+          <SELECTED_VALUES_NO_HITS>
           <PARENTS>
+          BIND(COALESCE(?selected_, false) as ?selected)
         }
-        GROUP BY ?id ?selected ?source ?parent
+        GROUP BY ?id ?selected
       }
       FILTER(BOUND(?id))
       <FACET_VALUE_FILTER>
+      OPTIONAL { ?id gvp:broaderPreferred ?parent_ }
       OPTIONAL { ?id skos:prefLabel ?prefLabel_ }
+      BIND(COALESCE(?parent_, '0') as ?parent)
       BIND(COALESCE(STR(?prefLabel_), STR(?id)) AS ?prefLabel)
     }
-    <SELECTED_VALUES_NO_HITS>
     UNION
-    # 'Unknown' facet value for results with no predicate path
     {
+      # 'Unknown' facet value for results with no predicate path
       {
         SELECT DISTINCT (count(DISTINCT ?instance) as ?instanceCount) {
           <FILTER>
@@ -83,12 +83,12 @@ export const facetValuesQuery = `
           }
         }
       }
+      FILTER(?instanceCount > 0)
       BIND(IRI("http://ldf.fi/MISSING_VALUE") AS ?id)
       BIND("Unknown" AS ?prefLabel)
       BIND('0' as ?parent)
       BIND(false as ?selected)
     }
-
   }
   <ORDER_BY>
 `;
-- 
GitLab