From 3511091b0fe9e68b23c68da047ccb4d7e4d36aac Mon Sep 17 00:00:00 2001
From: esikkala <esko.ikkala@aalto.fi>
Date: Tue, 12 Mar 2019 18:42:25 +0200
Subject: [PATCH] Harmonize facet state updating

---
 src/client/actions/index.js                   |  21 ++--
 src/client/components/facet_bar/FacetBar.js   |   4 +-
 src/client/components/facet_bar/Tree.js       |  18 ++-
 .../components/facet_results/LeafletMap.js    |  72 ++++++------
 .../components/perspectives/Manuscripts.js    |   4 +-
 src/client/components/perspectives/Places.js  |   2 +-
 src/client/containers/SemanticPortal.js       |  15 +--
 src/client/epics/index.js                     | 103 +++++++++++-------
 src/client/reducers/helpers.js                |  50 ++++-----
 src/client/reducers/manuscriptsFacets.js      |  18 +--
 src/client/reducers/organizationsFacets.js    |  17 +--
 src/client/reducers/peopleFacets.js           |  19 ++--
 src/client/reducers/placesFacets.js           |  35 ++----
 src/client/reducers/worksFacets.js            |  14 ++-
 src/server/index.js                           |   4 +-
 src/server/sparql/FacetValues.js              |  10 +-
 src/server/sparql/SparqlQueriesGeneral.js     |   3 +-
 17 files changed, 210 insertions(+), 199 deletions(-)

diff --git a/src/client/actions/index.js b/src/client/actions/index.js
index ba23a7fd..9002a21f 100644
--- a/src/client/actions/index.js
+++ b/src/client/actions/index.js
@@ -13,7 +13,6 @@ export const FETCH_FACET = 'FETCH_FACET';
 export const FETCH_FACET_FAILED = 'FETCH_FACET_FAILED';
 export const UPDATE_FACET = 'UPDATE_FACET';
 export const UPDATE_FILTER = 'UPDATE_FILTER';
-export const UPDATE_SPATIAL_FILTER = 'UPDATE_SPATIAL_FILTER';
 export const OPEN_MARKER_POPUP = 'OPEN_MARKER_POPUP';
 export const SHOW_ERROR = 'SHOW_ERROR';
 
@@ -61,25 +60,21 @@ export const updateInstance = ({ resultClass, instance }) => ({
   type: UPDATE_INSTANCE,
   resultClass, instance
 });
-export const fetchFacet = (resultClass, id, sortBy, sortDirection) => ({
+export const fetchFacet = ({ facetClass, id, sortBy, sortDirection }) => ({
   type: FETCH_FACET,
-  resultClass, id, sortBy, sortDirection
+  facetClass, id, sortBy, sortDirection
 });
-export const fetchFacetFailed = (resultClass, id, error, message) => ({
+export const fetchFacetFailed = (facetClass, id, error, message) => ({
   type: FETCH_FACET_FAILED,
-  resultClass, id, error, message
+  facetClass, id, error, message
 });
-export const updateFacet = ({ resultClass, id, distinctValueCount, values, flatValues, sortBy, sortDirection }) => ({
+export const updateFacet = ({ facetClass, id, distinctValueCount, values, flatValues, sortBy, sortDirection }) => ({
   type: UPDATE_FACET,
-  resultClass, id, distinctValueCount, values, flatValues, sortBy, sortDirection
+  facetClass, id, distinctValueCount, values, flatValues, sortBy, sortDirection
 });
-export const updateFilter = ({ resultClass, property, value }) => ({
+export const updateFilter = ({ facetClass, property, value }) => ({
   type: UPDATE_FILTER,
-  resultClass, property, value
-});
-export const updateSpatialFilter = ({ resultClass, property, filter }) => ({
-  type: UPDATE_SPATIAL_FILTER,
-  resultClass, property, filter
+  facetClass, property, value
 });
 export const openMarkerPopup = uri => ({
   type: OPEN_MARKER_POPUP,
diff --git a/src/client/components/facet_bar/FacetBar.js b/src/client/components/facet_bar/FacetBar.js
index 668be244..19c7b10d 100644
--- a/src/client/components/facet_bar/FacetBar.js
+++ b/src/client/components/facet_bar/FacetBar.js
@@ -65,7 +65,7 @@ class FacetBar extends React.Component {
                   facetFunctionality={true}
                   property={id}
                   data={facets[id].values}
-                  resultClass={this.props.resultClass}
+                  facetClass={this.props.facetClass}
                   sortBy={facets[id].sortBy}
                   sortDirection={facets[id].sortDirection}
                   fetchFacet={this.props.fetchFacet}
@@ -87,7 +87,7 @@ class FacetBar extends React.Component {
 FacetBar.propTypes = {
   classes: PropTypes.object.isRequired,
   facetData: PropTypes.object.isRequired,
-  resultClass: PropTypes.string.isRequired,
+  facetClass: PropTypes.string.isRequired,
   fetchFacet: PropTypes.func.isRequired,
   updateFilter: PropTypes.func.isRequired
 };
diff --git a/src/client/components/facet_bar/Tree.js b/src/client/components/facet_bar/Tree.js
index 07d38e76..cb3b06fc 100644
--- a/src/client/components/facet_bar/Tree.js
+++ b/src/client/components/facet_bar/Tree.js
@@ -75,7 +75,12 @@ class Tree extends Component {
 
   componentDidMount = () => {
     if (this.props.facetFunctionality) {
-      this.props.fetchFacet(this.props.resultClass, this.props.property, this.props.sortBy, this.props.sortDirection);
+      this.props.fetchFacet({
+        facetClass: this.props.facetClass,
+        id: this.props.property,
+        sortBy: this.props.sortBy,
+        sortDirection: this.props.sortDirection
+      });
     } else {
       this.props.fetchData();
     }
@@ -91,7 +96,12 @@ class Tree extends Component {
     }
     if (this.props.updatedFacet !== null && this.props.updatedFacet !== this.props.property && prevProps.facetFilters != this.props.facetFilters) {
       // console.log(`fetching new values for ${this.props.property}`)
-      this.props.fetchFacet(this.props.resultClass, this.props.property, this.props.sortBy, this.props.sortDirection);
+      this.props.fetchFacet({
+        facetClass: this.props.facetClass,
+        id: this.props.property,
+        sortBy: this.props.sortBy,
+        sortDirection: this.props.sortDirection
+      });
     }
   }
 
@@ -107,7 +117,7 @@ class Tree extends Component {
     });
     this.setState({ treeData: newTreeData });
     this.props.updateFilter({
-      resultClass: this.props.resultClass,
+      facetClass: this.props.facetClass,
       property: this.props.property,
       value: treeObj.node.id
     });
@@ -287,7 +297,7 @@ Tree.propTypes = {
   facetFunctionality: PropTypes.bool.isRequired,
   searchField: PropTypes.bool.isRequired,
   data: PropTypes.array.isRequired,
-  resultClass: PropTypes.string.isRequired,
+  facetClass: PropTypes.string.isRequired,
   fetchData: PropTypes.func,
   fetchFacet: PropTypes.func,
   property: PropTypes.string,
diff --git a/src/client/components/facet_results/LeafletMap.js b/src/client/components/facet_results/LeafletMap.js
index 236c8020..5f84561d 100644
--- a/src/client/components/facet_results/LeafletMap.js
+++ b/src/client/components/facet_results/LeafletMap.js
@@ -114,41 +114,41 @@ class LeafletMap extends React.Component {
     });
 
     // add Leaflet Draw toolbar
-    const editableLayers = new L.FeatureGroup();
-    this.leafletMap.addLayer(editableLayers);
-    const drawOptions = {
-      draw: {
-        polyline: false,
-        rectangle: {
-          allowIntersection: false, // Restricts shapes to simple polygons
-          drawError: {
-            color: '#e1e100', // Color the shape will turn when intersects
-            message: '<strong>Oh snap!<strong> you can\'t draw that!' // Message that will show when intersect
-          },
-          shapeOptions: {
-            color: '#bada55'
-          }
-        },
-        circle: false,
-        polygon: false,
-        marker: false,
-        circlemarker: false
-      },
-      edit: {
-        featureGroup: editableLayers,
-      }
-    };
-    const drawControl = new L.Control.Draw(drawOptions);
-    this.leafletMap.addControl(drawControl);
-    this.leafletMap.on(L.Draw.Event.CREATED, e => {
-      editableLayers.addLayer(e.layer);
-      const filterObj = this.boundsToValues(e.layer._bounds);
-      this.props.updateSpatialFilter({
-        resultClass: this.props.resultClass,
-        property: this.props.property,
-        filter: filterObj
-      });
-    });
+    // const editableLayers = new L.FeatureGroup();
+    // this.leafletMap.addLayer(editableLayers);
+    // const drawOptions = {
+    //   draw: {
+    //     polyline: false,
+    //     rectangle: {
+    //       allowIntersection: false, // Restricts shapes to simple polygons
+    //       drawError: {
+    //         color: '#e1e100', // Color the shape will turn when intersects
+    //         message: '<strong>Oh snap!<strong> you can\'t draw that!' // Message that will show when intersect
+    //       },
+    //       shapeOptions: {
+    //         color: '#bada55'
+    //       }
+    //     },
+    //     circle: false,
+    //     polygon: false,
+    //     marker: false,
+    //     circlemarker: false
+    //   },
+    //   edit: {
+    //     featureGroup: editableLayers,
+    //   }
+    // };
+    // const drawControl = new L.Control.Draw(drawOptions);
+    // this.leafletMap.addControl(drawControl);
+    // this.leafletMap.on(L.Draw.Event.CREATED, e => {
+    //   editableLayers.addLayer(e.layer);
+    //   const filterObj = this.boundsToValues(e.layer._bounds);
+    //   this.props.updateFilter({
+    //     resultClass: this.props.resultClass,
+    //     property: this.props.property,
+    //     value: filterObj
+    //   });
+    // });
 
     // layer controls
     // const baseMaps = {
@@ -421,7 +421,7 @@ LeafletMap.propTypes = {
   mapMode: PropTypes.string.isRequired,
   variant: PropTypes.string.isRequired,
   showInstanceCountInClusters: PropTypes.bool,
-  updateSpatialFilter: PropTypes.func,
+  updateFilter: PropTypes.func,
   property: PropTypes.string
 };
 
diff --git a/src/client/components/perspectives/Manuscripts.js b/src/client/components/perspectives/Manuscripts.js
index 510fe3b5..eb84ae0f 100644
--- a/src/client/components/perspectives/Manuscripts.js
+++ b/src/client/components/perspectives/Manuscripts.js
@@ -63,7 +63,7 @@ let Manuscripts = props => {
             mapMode={'cluster'}
             variant='productionPlaces'
             showInstanceCountInClusters={true}
-            updateSpatialFilter={props.updateSpatialFilter}
+            updateFilter={props.updateFilter}
             property={'productionPlace'}
           />}
       />
@@ -98,7 +98,7 @@ Manuscripts.propTypes = {
   updatePage: PropTypes.func.isRequired,
   sortResults: PropTypes.func.isRequired,
   routeProps: PropTypes.object.isRequired,
-  updateSpatialFilter: PropTypes.func.isRequired
+  updateFilter: PropTypes.func.isRequired
 };
 
 export default Manuscripts;
diff --git a/src/client/components/perspectives/Places.js b/src/client/components/perspectives/Places.js
index 4a6f8b02..807d3fc6 100644
--- a/src/client/components/perspectives/Places.js
+++ b/src/client/components/perspectives/Places.js
@@ -61,7 +61,7 @@ let Places = props => {
         render={() =>
           <LeafletMap
             results={props.places.results}
-            filters={props.facetData.filters}
+            facetUpdateID={props.facetData.facetUpdateID}
             resultClass='places'
             facetClass='places'
             instance={props.places.instance}
diff --git a/src/client/containers/SemanticPortal.js b/src/client/containers/SemanticPortal.js
index d2d6f1f5..9b2c4c70 100644
--- a/src/client/containers/SemanticPortal.js
+++ b/src/client/containers/SemanticPortal.js
@@ -25,7 +25,6 @@ import {
   fetchFacet,
   sortResults,
   updateFilter,
-  updateSpatialFilter,
   updatePage,
   showError
 } from '../actions';
@@ -93,7 +92,7 @@ let SemanticPortal = (props) => {
                   <Grid item sm={12} md={3} className={classes.facetBarContainer}>
                     <FacetBar
                       facetData={props.manuscriptsFacets}
-                      resultClass='manuscripts'
+                      facetClass='manuscripts'
                       fetchFacet={props.fetchFacet}
                       updateFilter={props.updateFilter}
                     />
@@ -108,7 +107,7 @@ let SemanticPortal = (props) => {
                         fetchResults={props.fetchResults}
                         fetchByURI={props.fetchByURI}
                         updatePage={props.updatePage}
-                        updateSpatialFilter={props.updateSpatialFilter}
+                        updateFilter={props.updateFilter}
                         sortResults={props.sortResults}
                         routeProps={routeProps}
                       />
@@ -124,7 +123,7 @@ let SemanticPortal = (props) => {
                   <Grid item sm={12} md={3} className={classes.facetBarContainer}>
                     <FacetBar
                       facetData={props.worksFacets}
-                      resultClass='works'
+                      facetClass='works'
                       fetchFacet={props.fetchFacet}
                       updateFilter={props.updateFilter}
                     />
@@ -154,7 +153,7 @@ let SemanticPortal = (props) => {
                   <Grid item sm={12} md={3} className={classes.facetBarContainer}>
                     <FacetBar
                       facetData={props.peopleFacets}
-                      resultClass='people'
+                      facetClass='people'
                       fetchFacet={props.fetchFacet}
                       updateFilter={props.updateFilter}
                     />
@@ -185,7 +184,7 @@ let SemanticPortal = (props) => {
                   <Grid item sm={12} md={3} className={classes.facetBarContainer}>
                     <FacetBar
                       facetData={props.organizationsFacets}
-                      resultClass='organizations'
+                      facetClass='organizations'
                       fetchFacet={props.fetchFacet}
                       updateFilter={props.updateFilter}
                     />
@@ -216,7 +215,7 @@ let SemanticPortal = (props) => {
                   <Grid item sm={12} md={3} className={classes.facetBarContainer}>
                     <FacetBar
                       facetData={props.placesFacets}
-                      resultClass='places'
+                      facetClass='places'
                       fetchFacet={props.fetchFacet}
                       updateFilter={props.updateFilter}
                     />
@@ -274,7 +273,6 @@ const mapDispatchToProps = ({
   fetchFacet,
   sortResults,
   updateFilter,
-  updateSpatialFilter,
   updatePage,
   showError
 });
@@ -300,7 +298,6 @@ SemanticPortal.propTypes = {
   sortResults: PropTypes.func.isRequired,
   updatePage: PropTypes.func.isRequired,
   updateFilter: PropTypes.func.isRequired,
-  updateSpatialFilter: PropTypes.func.isRequired,
   fetchFacet: PropTypes.func.isRequired,
   showError: PropTypes.func.isRequired
 };
diff --git a/src/client/epics/index.js b/src/client/epics/index.js
index 03e8ecca..93879335 100644
--- a/src/client/epics/index.js
+++ b/src/client/epics/index.js
@@ -30,7 +30,16 @@ const fetchPaginatedResultsEpic = (action$, state$) => action$.pipe(
   withLatestFrom(state$),
   mergeMap(([action, state]) => {
     const { resultClass, facetClass, sortBy, variant } = action;
-    const params = stateSlicesToUrl(state[resultClass], state[`${facetClass}Facets`], sortBy, variant, null);
+    const { page, pagesize, sortDirection } = state[resultClass];
+    const params = stateToUrl({
+      facets: state[`${facetClass}Facets`].facets,
+      facetClass: null,
+      page: page,
+      pagesize: pagesize,
+      sortBy: sortBy,
+      sortDirection: sortDirection,
+      variant: variant
+    });
     const requestUrl = `${apiUrl}${resultClass}/paginated?${params}`;
     // https://rxjs-dev.firebaseapp.com/api/ajax/ajax
     return ajax.getJSON(requestUrl).pipe(
@@ -54,7 +63,15 @@ const fetchResultsEpic = (action$, state$) => action$.pipe(
   withLatestFrom(state$),
   mergeMap(([action, state]) => {
     const { resultClass, facetClass, variant } = action;
-    const params = stateSlicesToUrl(null, state[`${facetClass}Facets`], null, variant, facetClass);
+    const params = stateToUrl({
+      facets: state[`${facetClass}Facets`].facets,
+      facetClass: facetClass,
+      page: null,
+      pagesize: null,
+      sortBy: null,
+      sortDirection: null,
+      variant: variant
+    });
     const requestUrl = `${apiUrl}${resultClass}/all?${params}`;
     return ajax.getJSON(requestUrl).pipe(
       map(response => updateResults({ resultClass: resultClass, data: response })),
@@ -76,7 +93,15 @@ const fetchByURIEpic = (action$, state$) => action$.pipe(
   withLatestFrom(state$),
   mergeMap(([action, state]) => {
     const { resultClass, facetClass, variant, uri } = action;
-    const params = stateSlicesToUrl(null, state[`${facetClass}Facets`], null, variant, facetClass);
+    const params = stateToUrl({
+      facets: state[`${facetClass}Facets`].facets,
+      facetClass: facetClass,
+      page: null,
+      pagesize: null,
+      sortBy: null,
+      sortDirection: null,
+      variant: variant
+    });
     const requestUrl = `${apiUrl}${resultClass}/instance/${encodeURIComponent(uri)}?${params}`;
     return ajax.getJSON(requestUrl).pipe(
       map(response => updateInstance({ resultClass: resultClass, instance: response })),
@@ -97,31 +122,26 @@ const fetchFacetEpic = (action$, state$) => action$.pipe(
   ofType(FETCH_FACET),
   withLatestFrom(state$),
   mergeMap(([action, state]) => {
-    let params = {
-      sortBy: action.sortBy,
-      sortDirection: action.sortDirection
-    };
-    let filters = {};
-    let activeFilters = false;
-    for (const [key, value] of Object.entries(state[`${action.resultClass}Facets`].filters)) {
-      if (value.size != 0) {
-        activeFilters = true;
-        filters[key] = Array.from(value);
-      }
-    }
-    if (activeFilters) {
-      params.filters = JSON.stringify(filters);
-    }
-    const requestUrl = `${apiUrl}${action.resultClass}/facet/${action.id}?${stringify(params)}`;
+    const { facetClass, id, sortBy, sortDirection } = action;
+    const params = stateToUrl({
+      facets: state[`${facetClass}Facets`].facets,
+      facetClass: null,
+      page: null,
+      pagesize: null,
+      sortBy: sortBy,
+      sortDirection: sortDirection,
+      variant: null
+    });
+    const requestUrl = `${apiUrl}${action.facetClass}/facet/${id}?${params}`;
     return ajax.getJSON(requestUrl).pipe(
       map(res => updateFacet({
-        resultClass: action.resultClass,
-        id: action.id,
+        facetClass: facetClass,
+        id: id,
         distinctValueCount: res.distinctValueCount,
         values: res.values,
         flatValues: res.flatValues,
-        sortBy: action.sortBy,
-        sortDirection: action.sortDirection
+        sortBy: sortBy,
+        sortDirection: sortDirection
       })),
       catchError(error => of({
         type: FETCH_FACET_FAILED,
@@ -137,29 +157,28 @@ const fetchFacetEpic = (action$, state$) => action$.pipe(
   })
 );
 
-export const stateSlicesToUrl = (pagination, facets, sortBy, variant, facetClass) => {
-  //console.log(facets.spatialFilters)
+export const stateToUrl = ({
+  facets,
+  facetClass,
+  page,
+  pagesize,
+  sortBy,
+  sortDirection,
+  variant
+}) => {
   let params = {};
-  if (pagination != null) {
-    params.page = pagination.page;
-    params.pagesize =  pagination.pagesize;
-    params.sortDirection = pagination.sortDirection;
-  }
-  if (sortBy !== null) {
-    params.sortBy = sortBy;
-  }
-  if (variant !== null) {
-    params.variant = variant;
-  }
-  if (facetClass !== null) {
-    params.facetClass = facetClass;
-  }
+  if (facetClass !== null) { params.facetClass = facetClass; }
+  if (page !== null) { params.page = page; }
+  if (pagesize !== null) { params.pagesize = pagesize; }
+  if (sortBy !== null) { params.sortBy = sortBy; }
+  if (sortDirection !== null) { params.sortDirection = sortDirection; }
+  if (variant !== null) { params.variant = variant; }
   let filters = {};
   let activeFilters = false;
-  for (const [key, value] of Object.entries(facets.filters)) {
-    if (value.size != 0) {
+  for (const [key, value] of Object.entries(facets)) {
+    if (value.uriFilter.size != 0) {
       activeFilters = true;
-      filters[key] = Array.from(value);
+      filters[key] = Array.from(value.uriFilter);
     }
   }
   if (activeFilters) {
diff --git a/src/client/reducers/helpers.js b/src/client/reducers/helpers.js
index 848a794f..77f06fb2 100644
--- a/src/client/reducers/helpers.js
+++ b/src/client/reducers/helpers.js
@@ -43,36 +43,34 @@ export const updateSortBy = (state, action) => {
 };
 
 export const updateFilter = (state, action) => {
-  const { property, value } = action;
-  let valueSet = state.filters[property];
-  if (valueSet.has(value)) {
-    valueSet.delete(value);
-  } else {
-    valueSet.add(value);
+  let { property, value } = action;
+  const oldFacet = state.facets[property];
+  let newFacet = {};
+  if (oldFacet.filterType === 'uri') {
+    let newUriFilter = oldFacet.uriFilter;
+    if (newUriFilter.has(value)) {
+      newUriFilter.delete(value);
+    } else {
+      newUriFilter.add(value);
+    }
+    newFacet = {
+      ...state.facets[property],
+      uriFilter: newUriFilter
+    };
+  } else if (oldFacet.filterType === 'spatial') {
+    newFacet = {
+      ...state.facets[property],
+      spatialFilter: value
+    };
   }
-  const newFacetFilters = {
-    ...state.filters,
-    [ property ] : valueSet
-  };
   return {
     ...state,
-    filters: newFacetFilters,
     updatedFacet: property,
-    facetUpdateID: ++state.facetUpdateID
-  };
-};
-
-export const updateSpatialFilter = (state, action) => {
-  const { property, filter } = action;
-  const newFacetFilters = {
-    ...state.spatialFilters,
-    [ property ] : filter
-  };
-  return {
-    ...state,
-    spatialFilters: newFacetFilters,
-    updatedFacet: property,
-    facetUpdateID: ++state.facetUpdateID
+    facetUpdateID: ++state.facetUpdateID,
+    facets: {
+      ...state.facets,
+      [ property ]: newFacet
+    }
   };
 };
 
diff --git a/src/client/reducers/manuscriptsFacets.js b/src/client/reducers/manuscriptsFacets.js
index 8fcc4935..30911a92 100644
--- a/src/client/reducers/manuscriptsFacets.js
+++ b/src/client/reducers/manuscriptsFacets.js
@@ -28,6 +28,8 @@ export const INITIAL_STATE = {
       isFetching: false,
       searchField: false,
       containerClass: 'three',
+      filterType: 'uri',
+      uriFilter: new Set()
     },
     productionPlace: {
       id: 'productionPlace',
@@ -42,7 +44,9 @@ export const INITIAL_STATE = {
       isFetching: false,
       searchField: true,
       containerClass: 'ten',
-      filterType: 'spatial'
+      filterType: 'uri',
+      uriFilter: new Set(),
+      spatialFilter: {}
     },
     author: {
       id: 'author',
@@ -57,6 +61,8 @@ export const INITIAL_STATE = {
       isFetching: false,
       searchField: true,
       containerClass: 'ten',
+      filterType: 'uri',
+      uriFilter: new Set()
     },
     // language: {
     //   id: 'language',
@@ -68,17 +74,11 @@ export const INITIAL_STATE = {
     //   sortDirection: 'asc',
     //   isFetching: false,
     // },
-  },
-  filters: {
-    productionPlace: new Set(),
-    author: new Set(),
-    source: new Set(),
-    language: new Set(),
-  },
+  }
 };
 
 const manuscriptsFacets = (state = INITIAL_STATE, action) => {
-  if (action.resultClass === 'manuscripts') {
+  if (action.facetClass === 'manuscripts') {
     switch (action.type) {
       case FETCH_FACET:
         return fetchFacet(state, action);
diff --git a/src/client/reducers/organizationsFacets.js b/src/client/reducers/organizationsFacets.js
index d31e0b82..613bc431 100644
--- a/src/client/reducers/organizationsFacets.js
+++ b/src/client/reducers/organizationsFacets.js
@@ -4,7 +4,12 @@ import {
   UPDATE_FACET,
   UPDATE_FILTER,
 } from '../actions';
-import { updateFilter, fetchFacet, fetchFacetFailed, updateFacet } from './helpers';
+import {
+  updateFilter,
+  fetchFacet,
+  fetchFacetFailed,
+  updateFacet
+} from './helpers';
 
 export const INITIAL_STATE = {
   updatedFacet: null,
@@ -23,16 +28,14 @@ export const INITIAL_STATE = {
       isFetching: false,
       searchField: false,
       containerClass: 'five',
+      filterType: 'uri',
+      uriFilter: new Set()
     },
-  },
-  filters: {
-    source: new Set(),
-    place: new Set(),
-  },
+  }
 };
 
 const organizationsFacets = (state = INITIAL_STATE, action) => {
-  if (action.resultClass === 'organizations') {
+  if (action.facetClass === 'organizations') {
     switch (action.type) {
       case FETCH_FACET:
         return fetchFacet(state, action);
diff --git a/src/client/reducers/peopleFacets.js b/src/client/reducers/peopleFacets.js
index c4d7a063..cfcf04cd 100644
--- a/src/client/reducers/peopleFacets.js
+++ b/src/client/reducers/peopleFacets.js
@@ -4,7 +4,12 @@ import {
   UPDATE_FACET,
   UPDATE_FILTER,
 } from '../actions';
-import { updateFilter, fetchFacet, fetchFacetFailed, updateFacet } from './helpers';
+import {
+  updateFilter,
+  fetchFacet,
+  fetchFacetFailed,
+  updateFacet
+} from './helpers';
 
 export const INITIAL_STATE = {
   updatedFacet: null,
@@ -23,6 +28,8 @@ export const INITIAL_STATE = {
       isFetching: false,
       searchField: false,
       containerClass: 'five',
+      filterType: 'uri',
+      uriFilter: new Set()
     },
     place: {
       id: 'place',
@@ -37,16 +44,14 @@ export const INITIAL_STATE = {
       isFetching: false,
       searchField: true,
       containerClass: 'ten',
+      filterType: 'uri',
+      uriFilter: new Set()
     },
-  },
-  filters: {
-    source: new Set(),
-    place: new Set(),
-  },
+  }
 };
 
 const peopleFacets = (state = INITIAL_STATE, action) => {
-  if (action.resultClass === 'people') {
+  if (action.facetClass === 'people') {
     switch (action.type) {
       case FETCH_FACET:
         return fetchFacet(state, action);
diff --git a/src/client/reducers/placesFacets.js b/src/client/reducers/placesFacets.js
index cb2e1360..a164e003 100644
--- a/src/client/reducers/placesFacets.js
+++ b/src/client/reducers/placesFacets.js
@@ -3,11 +3,9 @@ import {
   FETCH_FACET_FAILED,
   UPDATE_FACET,
   UPDATE_FILTER,
-  UPDATE_SPATIAL_FILTER,
 } from '../actions';
 import {
   updateFilter,
-  updateSpatialFilter,
   fetchFacet,
   fetchFacetFailed,
   updateFacet
@@ -30,6 +28,8 @@ export const INITIAL_STATE = {
       isFetching: false,
       searchField: false,
       containerClass: 'five',
+      filterType: 'uri',
+      uriFilter: new Set()
     },
     area: {
       id: 'area',
@@ -42,36 +42,17 @@ export const INITIAL_STATE = {
       sortDirection: 'asc',
       sortButton: false,
       isFetching: false,
-      searchField: false,
+      searchField: true,
       containerClass: 'ten',
+      filterType: 'uri',
+      uriFilter: new Set(),
+      spatialFilter: {}
     },
-    // type: {
-    //   id: 'type',
-    //   label: 'Type',
-    //   // predicate: defined in backend
-    //   distinctValueCount: 0,
-    //   values: [],
-    //   flatValues: [],
-    //   sortBy: 'instanceCount',
-    //   sortDirection: 'desc',
-    //   sortButton: false,
-    //   isFetching: false,
-    //   searchField: false,
-    //   containerSize: 'large',
-    //} ,
-  },
-  filters: {
-    source: new Set(),
-    area: new Set(),
-    type: new Set(),
-  },
-  spatialFilters: {
-    productionPlace: {}
   }
 };
 
 const placesFacets = (state = INITIAL_STATE, action) => {
-  if (action.resultClass === 'places') {
+  if (action.facetClass === 'places') {
     switch (action.type) {
       case FETCH_FACET:
         return fetchFacet(state, action);
@@ -81,8 +62,6 @@ const placesFacets = (state = INITIAL_STATE, action) => {
         return updateFacet(state, action);
       case UPDATE_FILTER:
         return updateFilter(state, action);
-      case UPDATE_SPATIAL_FILTER:
-        return updateSpatialFilter(state, action);
       default:
         return state;
     }
diff --git a/src/client/reducers/worksFacets.js b/src/client/reducers/worksFacets.js
index 5684f913..ba3df8d7 100644
--- a/src/client/reducers/worksFacets.js
+++ b/src/client/reducers/worksFacets.js
@@ -4,7 +4,12 @@ import {
   UPDATE_FACET,
   UPDATE_FILTER,
 } from '../actions';
-import { updateFilter, fetchFacet, fetchFacetFailed, updateFacet } from './helpers';
+import {
+  updateFilter,
+  fetchFacet,
+  fetchFacetFailed,
+  updateFacet
+} from './helpers';
 
 export const INITIAL_STATE = {
   updatedFacet: null,
@@ -23,15 +28,14 @@ export const INITIAL_STATE = {
       isFetching: false,
       searchField: false,
       containerClass: 'five',
+      filterType: 'uri',
+      uriFilter: new Set()
     },
   },
-  filters: {
-    source: new Set(),
-  }
 };
 
 const worksFacets = (state = INITIAL_STATE, action) => {
-  if (action.resultClass === 'works') {
+  if (action.facetClass === 'works') {
     switch (action.type) {
       case FETCH_FACET:
         return fetchFacet(state, action);
diff --git a/src/server/index.js b/src/server/index.js
index d740903d..733af853 100644
--- a/src/server/index.js
+++ b/src/server/index.js
@@ -55,9 +55,9 @@ app.get(`${apiPath}/:resultClass/instance/:uri`, (req, res, next) => {
   }).catch(next);
 });
 
-app.get(`${apiPath}/:resultClass/facet/:id`, (req, res, next) => {
+app.get(`${apiPath}/:facetClass/facet/:id`, (req, res, next) => {
   const filters = req.query.filters == null ? null : JSON.parse(req.query.filters);
-  return getFacet(req.params.resultClass, req.params.id, req.query.sortBy, req.query.sortDirection, filters).then(data => {
+  return getFacet(req.params.facetClass, req.params.id, req.query.sortBy, req.query.sortDirection, filters).then(data => {
     res.json(data);
   }).catch(next);
 });
diff --git a/src/server/sparql/FacetValues.js b/src/server/sparql/FacetValues.js
index 4888fcf8..9fc87ae1 100644
--- a/src/server/sparql/FacetValues.js
+++ b/src/server/sparql/FacetValues.js
@@ -11,15 +11,15 @@ import {
 
 const sparqlSearchEngine = new SparqlSearchEngine();
 
-export const getFacet = (resultClass, facetID, sortBy, sortDirection, filters) => {
+export const getFacet = (facetClass, facetID, sortBy, sortDirection, filters) => {
   let q = facetValuesQuery;
-  const facetConfig = facetConfigs[resultClass][facetID];
+  const facetConfig = facetConfigs[facetClass][facetID];
   let selectedBlock = '# no selections';
   let filterBlock = '# no filters';
   let parentBlock = '# no parents';
   let mapper = mapFacet;
   if (filters !== null) {
-    filterBlock = generateFilter(resultClass, resultClass, filters, 'instance', facetID);
+    filterBlock = generateFilter(facetClass, facetClass, filters, 'instance', facetID);
     if (has(filters, facetID)) {
       selectedBlock = `
             OPTIONAL {
@@ -34,7 +34,7 @@ export const getFacet = (resultClass, facetID, sortBy, sortDirection, filters) =
     parentBlock = `
             UNION
             {
-              ${generateFilter(resultClass, resultClass, filters, 'different_instance', facetID)}
+              ${generateFilter(facetClass, facetClass, filters, 'different_instance', facetID)}
               ?different_instance ${facetConfig.parentPredicate} ?id .
               BIND(COALESCE(?selected_, false) as ?selected)
               OPTIONAL { ?id skos:prefLabel ?prefLabel_ }
@@ -47,7 +47,7 @@ export const getFacet = (resultClass, facetID, sortBy, sortDirection, filters) =
             }
       `;
   }
-  q = q.replace(/<RDF_TYPE>/g, facetConfigs[resultClass].rdfType);
+  q = q.replace(/<RDF_TYPE>/g, facetConfigs[facetClass].rdfType);
   q = q.replace(/<FILTER>/g, filterBlock );
   q = q.replace(/<PREDICATE>/g, facetConfig.predicate);
   q = q.replace('<SELECTED_VALUES>', selectedBlock);
diff --git a/src/server/sparql/SparqlQueriesGeneral.js b/src/server/sparql/SparqlQueriesGeneral.js
index 630494bb..0c06c28d 100644
--- a/src/server/sparql/SparqlQueriesGeneral.js
+++ b/src/server/sparql/SparqlQueriesGeneral.js
@@ -1,4 +1,5 @@
-export const endpoint = 'http://ldf.fi/mmm-cidoc/sparql';
+// export const endpoint = 'http://ldf.fi/mmm-cidoc/sparql';
+export const endpoint = 'http://localhost:3050/ds/sparql';
 
 export const countQuery = `
   SELECT (COUNT(DISTINCT ?id) as ?count)
-- 
GitLab