From be3f77e1785e074aef7961a0e18ef9e62be7d984 Mon Sep 17 00:00:00 2001
From: esikkala <esko.ikkala@aalto.fi>
Date: Wed, 22 May 2019 15:29:49 +0300
Subject: [PATCH] Allow multiple facet classes

---
 src/server/sparql/FacetConfigs.js         | 16 +++++++++-------
 src/server/sparql/FacetResults.js         |  4 ++--
 src/server/sparql/FacetValues.js          |  5 +++--
 src/server/sparql/SparqlQueriesGeneral.js | 15 +++++++++------
 4 files changed, 23 insertions(+), 17 deletions(-)

diff --git a/src/server/sparql/FacetConfigs.js b/src/server/sparql/FacetConfigs.js
index b90da1b5..5e32cf39 100644
--- a/src/server/sparql/FacetConfigs.js
+++ b/src/server/sparql/FacetConfigs.js
@@ -4,7 +4,7 @@
 */
 export const facetConfigs = {
   manuscripts: {
-    rdfType: 'frbroo:F4_Manifestation_Singleton',
+    facetClass: 'frbroo:F4_Manifestation_Singleton',
     label: {
       id: 'label',
       type: 'text',
@@ -74,7 +74,7 @@ export const facetConfigs = {
     },
   },
   works: {
-    rdfType: 'frbroo:F1_Work',
+    facetClass: 'frbroo:F1_Work',
     label: {
       id: 'label',
       type: 'text',
@@ -101,14 +101,16 @@ export const facetConfigs = {
     },
   },
   events: {
-    rdfType: 'crm:E10_Transfer_of_Custody',
+    facetClass: 'crm:E10_Transfer_of_Custody crm:E12_Production', 
     label: {
       id: 'label',
       type: 'text',
       textQueryProperty: 'skos:prefLabel'
     },
-    // for sorting
     type: {
+      predicate: 'a',
+      facetValueFilter: '',
+      type: 'list',
       labelPath: 'a/(skos:prefLabel|rdfs:label)',
     },
     place: {
@@ -125,7 +127,7 @@ export const facetConfigs = {
     },
   },
   people: {
-    rdfType: 'mmm-schema:Person',
+    facetClass: 'mmm-schema:Person',
     label: {
       id: 'label',
       type: 'text',
@@ -153,7 +155,7 @@ export const facetConfigs = {
     },
   },
   organizations: {
-    rdfType: 'mmm-schema:Organization',
+    facetClass: 'mmm-schema:Organization',
     label: {
       id: 'label',
       type: 'text',
@@ -172,7 +174,7 @@ export const facetConfigs = {
     },
   },
   places: {
-    rdfType: 'crm:E53_Place',
+    facetClass: 'crm:E53_Place',
     label: {
       id: 'label',
       type: 'text',
diff --git a/src/server/sparql/FacetResults.js b/src/server/sparql/FacetResults.js
index a2413053..4c8290d0 100644
--- a/src/server/sparql/FacetResults.js
+++ b/src/server/sparql/FacetResults.js
@@ -100,7 +100,7 @@ export const getResultCount = ({
   textFilters
 }) => {
   let q = countQuery;
-  q = q.replace('<RDF_TYPE>', facetConfigs[resultClass].rdfType);
+  q = q.replace('<FACET_CLASS>', facetConfigs[resultClass].facetClass);
   const hasFilters = uriFilters !== null
     || spatialFilters !== null
     || textFilters !== null;
@@ -147,7 +147,7 @@ const getPaginatedData = ({
       filterTarget: 'id',
       facetID: null}));
   }
-  q = q.replace('<RDF_TYPE>', facetConfig.rdfType);
+  q = q.replace('<FACET_CLASS>', facetConfig.facetClass);
   q = q.replace('<ORDER_BY_PREDICATE>', facetConfig[sortBy].labelPath);
   q = q.replace('<SORT_DIRECTION>', sortDirection);
   q = q.replace('<PAGE>', `LIMIT ${pagesize} OFFSET ${page * pagesize}`);
diff --git a/src/server/sparql/FacetValues.js b/src/server/sparql/FacetValues.js
index c06b9574..2d577be4 100644
--- a/src/server/sparql/FacetValues.js
+++ b/src/server/sparql/FacetValues.js
@@ -93,7 +93,8 @@ export const getFacet = ({
             ${parentFilterStr}
             # these instances should not be counted, so use another variable name
             ?instance2 ${facetConfig.parentPredicate} ?id .
-            ?instance2 a <RDF_TYPE>
+            VALUES ?facetClass { <FACET_CLASS> }
+            ?instance2 a ?facetClass .
             BIND(false AS ?selected_)
             ${ignoreSelectedValues}
           }
@@ -104,7 +105,7 @@ export const getFacet = ({
   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(/<FACET_CLASS>/g, facetConfigs[facetClass].facetClass);
   q = q.replace(/<FILTER>/g, filterBlock );
   q = q.replace(/<PREDICATE>/g, facetConfig.predicate);
   // if (facetID == 'place') {
diff --git a/src/server/sparql/SparqlQueriesGeneral.js b/src/server/sparql/SparqlQueriesGeneral.js
index ed67c87d..23531c15 100644
--- a/src/server/sparql/SparqlQueriesGeneral.js
+++ b/src/server/sparql/SparqlQueriesGeneral.js
@@ -4,8 +4,8 @@ export const endpoint = 'http://ldf.fi/mmm-cidoc/sparql';
 export const countQuery = `
   SELECT (COUNT(DISTINCT ?id) as ?count)
   WHERE {
-    <FILTER>
-    ?id a <RDF_TYPE> .
+    VALUES ?facetClass { <FACET_CLASS> }
+    ?id a ?facetClass .
   }
 `;
 
@@ -35,7 +35,8 @@ export const facetResultSetQuery = `
     {
       SELECT DISTINCT ?id {
         <FILTER>
-        ?id a <RDF_TYPE> .
+        VALUES ?facetClass { <FACET_CLASS> }
+        ?id a ?facetClass .
         OPTIONAL { ?id <ORDER_BY_PREDICATE> ?orderBy }
       }
       ORDER BY (!BOUND(?orderBy)) <SORT_DIRECTION>(?orderBy)
@@ -55,7 +56,8 @@ export const facetValuesQuery = `
           {
             <FILTER>
             ?instance <PREDICATE> ?id .
-            ?instance a <RDF_TYPE> .
+            VALUES ?facetClass { <FACET_CLASS> }
+            ?instance a ?facetClass .
             <SELECTED_VALUES>
           }
           <SELECTED_VALUES_NO_HITS>
@@ -67,7 +69,7 @@ export const facetValuesQuery = `
       FILTER(BOUND(?id))
       <FACET_VALUE_FILTER>
       OPTIONAL { ?id gvp:broaderPreferred ?parent_ }
-      OPTIONAL { ?id skos:prefLabel ?prefLabel_ }
+      OPTIONAL { ?id skos:prefLabel|rdfs:label ?prefLabel_ }
       BIND(COALESCE(?parent_, '0') as ?parent)
       BIND(COALESCE(STR(?prefLabel_), STR(?id)) AS ?prefLabel)
     }
@@ -77,7 +79,8 @@ export const facetValuesQuery = `
       {
         SELECT DISTINCT (count(DISTINCT ?instance) as ?instanceCount) {
           <FILTER>
-          ?instance a <RDF_TYPE> .
+          VALUES ?facetClass { <FACET_CLASS> }
+          ?instance a ?facetClass .
           FILTER NOT EXISTS {
             ?instance <PREDICATE> ?value .
           }
-- 
GitLab