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