From 426e883e0fd271cfbba24f7fcf3faba5450b6eaf Mon Sep 17 00:00:00 2001
From: Esko Ikkala <esko.ikkala@aalto.fi>
Date: Thu, 11 Oct 2018 17:55:38 +0300
Subject: [PATCH] Add tentative filter to facet and result queries

---
 src/client/actions/index.js          |  4 ++--
 src/client/components/FacetDialog.js |  3 ++-
 src/client/epics/index.js            |  2 +-
 src/client/reducers/facet.js         | 23 ++++++++++++++---------
 src/client/reducers/search.js        |  1 -
 src/server/index.js                  | 23 +++++++++++++++++++----
 src/server/sparql/Datasets.js        |  2 ++
 src/server/sparql/Manuscripts.js     | 22 ++++++++++++++++++----
 8 files changed, 58 insertions(+), 22 deletions(-)

diff --git a/src/client/actions/index.js b/src/client/actions/index.js
index 199b7ab5..04bbfbc8 100644
--- a/src/client/actions/index.js
+++ b/src/client/actions/index.js
@@ -149,9 +149,9 @@ export const fetchFacet = (property) => ({
   type: FETCH_FACET,
   property
 });
-export const updateFacet = ({ values }) => ({
+export const updateFacet = ({ facetValues }) => ({
   type: UPDATE_FACET,
-  values
+  facetValues
 });
 export const clearFacet = () => ({
   type: CLEAR_FACET,
diff --git a/src/client/components/FacetDialog.js b/src/client/components/FacetDialog.js
index a41ad097..ebcc972c 100644
--- a/src/client/components/FacetDialog.js
+++ b/src/client/components/FacetDialog.js
@@ -51,6 +51,7 @@ class FacetDialog extends React.Component {
 
   render() {
     const { classes, propertyLabel, facet } = this.props;
+    console.log(facet)
     return (
       <div className={classes.root}>
         <IconButton
@@ -69,7 +70,7 @@ class FacetDialog extends React.Component {
             <Typography variant="h6">{propertyLabel}</Typography>
           </DialogTitle>
           <DialogContent>
-            {this.state.isLoading ? <CircularProgress style={{ color: purple[500] }} thickness={5} /> : <Tree data={facet.values} />  }
+            {this.state.isLoading ? <CircularProgress style={{ color: purple[500] }} thickness={5} /> : <Tree data={facet.facetValues.creationPlace} />  }
           </DialogContent>
         </Dialog>
       </div>
diff --git a/src/client/epics/index.js b/src/client/epics/index.js
index ffeb5e6b..6653209f 100644
--- a/src/client/epics/index.js
+++ b/src/client/epics/index.js
@@ -51,7 +51,7 @@ const getFacet = action$ => action$.pipe(
     const searchUrl = hiplaApiUrl + 'facet';
     const requestUrl = `${searchUrl}?property=${action.property}`;
     return ajax.getJSON(requestUrl).pipe(
-      map(response => updateFacet({ values: response }))
+      map(response => updateFacet({ facetValues: response }))
     );
   })
 );
diff --git a/src/client/reducers/facet.js b/src/client/reducers/facet.js
index c8ae06e6..1c7d0cb1 100644
--- a/src/client/reducers/facet.js
+++ b/src/client/reducers/facet.js
@@ -1,11 +1,21 @@
 import {
   FETCH_FACET,
   UPDATE_FACET,
-  CLEAR_FACET
 } from '../actions';
 
 export const INITIAL_STATE = {
-  values : [],
+  facetOptions : {
+    creationPlace: {
+      hierarchical: true,
+    },
+    author: {
+      hierarchical: false,
+    }
+  },
+  facetValues : {
+    creationPlace: [],
+    author: []
+  },
   fetchingFacet : false
 };
 
@@ -16,17 +26,12 @@ const facet = (state = INITIAL_STATE, action) => {
     case UPDATE_FACET:
       return {
         ...state,
-        values: action.values,
-        fetchingFacet: false
-      };
-    case CLEAR_FACET:
-      return {
-        ...state,
-        values: [],
+        facetValues: action.facetValues,
         fetchingFacet: false
       };
     default:
       return state;
   }
 };
+
 export default facet;
diff --git a/src/client/reducers/search.js b/src/client/reducers/search.js
index 3996ce1a..3eebf3e6 100644
--- a/src/client/reducers/search.js
+++ b/src/client/reducers/search.js
@@ -6,7 +6,6 @@ import {
   CLEAR_SUGGESTIONS,
   FETCH_RESULTS,
   UPDATE_RESULTS,
-  CLEAR_RESULTS,
   FETCH_MANUSCRIPTS,
   FETCH_PLACES,
   UPDATE_MANUSCRIPTS,
diff --git a/src/server/index.js b/src/server/index.js
index 67ecba41..59295bb3 100644
--- a/src/server/index.js
+++ b/src/server/index.js
@@ -1,7 +1,6 @@
 import express from 'express';
 import bodyParser from 'body-parser';
 import request from 'superagent';
-import _ from 'lodash';
 import { getManuscripts, getManuscriptCount, getPlaces, getFacet } from './sparql/Manuscripts';
 const DEFAULT_PORT = 3001;
 const app = express();
@@ -19,10 +18,22 @@ app.use(function(req, res, next) {
 
 app.use(express.static(__dirname + './../public/'));
 
+const filterObj = {
+  creationPlace: {
+    predicate: '^<http://erlangen-crm.org/efrbroo/R18_created>/<http://www.cidoc-crm.org/cidoc-crm/P7_took_place_at>',
+    values: ['<http://ldf.fi/mmm/place/7>', '<http://ldf.fi/mmm/place/5>']
+  },
+  author: {
+    predicate: '^<http://erlangen-crm.org/efrbroo/R18_created>/<http://www.cidoc-crm.org/cidoc-crm/P14_carried_out_by>',
+    values: ['<http://ldf.fi/mmm/person/84>', '<http://ldf.fi/mmm/person/894>']
+  }
+};
+//const filterObj = {}
 
 app.get('/manuscripts', (req, res) => {
   const page = req.query.page || 1;
-  return getManuscripts(page).then((data) => {
+
+  return getManuscripts(page, filterObj).then((data) => {
     // console.log(data);
     res.json(data);
   })
@@ -33,7 +44,7 @@ app.get('/manuscripts', (req, res) => {
 });
 
 app.get('/manuscript-count', (req, res) => {
-  return getManuscriptCount().then((data) => {
+  return getManuscriptCount(filterObj).then((data) => {
     // console.log(data);
     res.json(data);
   })
@@ -57,8 +68,12 @@ app.get('/places', (req, res) => {
 app.get('/facet', (req, res) => {
   const property = req.query.property;
   return getFacet(property).then((data) => {
+    const facetValues = {
+      creationPlace: data,
+      author: []
+    };
     //console.log(data);
-    res.json(data);
+    res.json(facetValues);
   })
     .catch((err) => {
       console.log(err);
diff --git a/src/server/sparql/Datasets.js b/src/server/sparql/Datasets.js
index 6a236e1e..6543ff5c 100644
--- a/src/server/sparql/Datasets.js
+++ b/src/server/sparql/Datasets.js
@@ -30,6 +30,7 @@ module.exports = {
       PREFIX sdbm: <https://sdbm.library.upenn.edu/>
       SELECT (COUNT(DISTINCT ?id) as ?count)
       WHERE {
+        <FILTER>
         ?id a frbroo:F4_Manifestation_Singleton .
       }
       `,
@@ -49,6 +50,7 @@ module.exports = {
       WHERE {
         {
           SELECT DISTINCT ?id {
+            <FILTER>
             ?id a frbroo:F4_Manifestation_Singleton .
           }
           <PAGE>
diff --git a/src/server/sparql/Manuscripts.js b/src/server/sparql/Manuscripts.js
index eeb1a11a..ca0ee863 100644
--- a/src/server/sparql/Manuscripts.js
+++ b/src/server/sparql/Manuscripts.js
@@ -8,16 +8,18 @@ import { makeObjectList } from './SparqlObjectMapper';
 
 const sparqlSearchEngine = new SparqlSearchEngine();
 
-export const getManuscripts = (page) => {
+export const getManuscripts = (page, filterObj) => {
   let { endpoint, manuscriptQuery } = datasetConfig['mmm'];
   const pageSize = 5;
+  manuscriptQuery = manuscriptQuery.replace('<FILTER>', generateFilter(filterObj));
   manuscriptQuery = manuscriptQuery.replace('<PAGE>', `ORDER BY ?id LIMIT ${pageSize} OFFSET ${page * pageSize}`);
-  //console.log(manuscriptQuery)
+  console.log(manuscriptQuery)
   return sparqlSearchEngine.doSearch(manuscriptQuery, endpoint, makeObjectList);
 };
 
-export const getManuscriptCount = () => {
-  const { endpoint, countQuery } = datasetConfig['mmm'];
+export const getManuscriptCount = (filterObj) => {
+  let { endpoint, countQuery } = datasetConfig['mmm'];
+  countQuery = countQuery.replace('<FILTER>', generateFilter(filterObj));
   return sparqlSearchEngine.doSearch(countQuery, endpoint, mapCount);
 };
 
@@ -28,9 +30,21 @@ export const getPlaces = () => {
 
 export const getFacet = (property) => {
   const { endpoint } = datasetConfig['mmm'];
+  console.log(facetQuery)
   return sparqlSearchEngine.doSearch(facetQuery, endpoint, mapFacet);
 };
 
+const generateFilter = (filterObj) => {
+  let filterStr = '';
+  for (let property in filterObj) {
+    filterStr += `
+            ?id ${filterObj[property].predicate} ?${property}Filter
+            VALUES ?${property}Filter { ${filterObj[property].values.join(' ')} }
+      `;
+  }
+  return filterStr;
+};
+
 const facetQuery = `
   PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
   PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
-- 
GitLab