From ea581726ce349fd10f13b6960dacb0c4ad5901e7 Mon Sep 17 00:00:00 2001 From: esikkala <esko.ikkala@aalto.fi> Date: Wed, 14 Aug 2019 15:26:16 +0300 Subject: [PATCH] Add inverse version for all filter types --- src/server/sparql/Filters.js | 47 ++++++++++++++++++++++++++++++------ 1 file changed, 40 insertions(+), 7 deletions(-) diff --git a/src/server/sparql/Filters.js b/src/server/sparql/Filters.js index 1898e554..5ced5a4d 100644 --- a/src/server/sparql/Filters.js +++ b/src/server/sparql/Filters.js @@ -56,7 +56,8 @@ export const generateConstraintsBlock = ({ facetClass: facetClass, facetID: c.id, filterTarget: filterTarget, - queryString: c.values + queryString: c.values, + inverse: inverse }); break; case 'uriFilter': @@ -74,6 +75,7 @@ export const generateConstraintsBlock = ({ facetID: c.id, filterTarget: filterTarget, values: c.values, + inverse: inverse }); break; case 'timespanFilter': @@ -82,6 +84,7 @@ export const generateConstraintsBlock = ({ facetID: c.id, filterTarget: filterTarget, values: c.values, + inverse: inverse }); break; } @@ -93,29 +96,50 @@ const generateTextFilter = ({ facetClass, facetID, filterTarget, - queryString + queryString, + inverse }) => { - return `?${filterTarget} text:query (${facetConfigs[facetClass][facetID].textQueryProperty} '${queryString}') . `; + const filterStr = `?${filterTarget} text:query (${facetConfigs[facetClass][facetID].textQueryProperty} '${queryString}') . `; + if (inverse) { + return ` + FILTER NOT EXISTS { + ${filterStr} + } + `; + } else { + return filterStr; + } }; const generateSpatialFilter = ({ facetClass, facetID, filterTarget, - values + values, + inverse }) => { const { latMin, longMin, latMax, longMax } = values; - return ` + const filterStr = ` ?${facetID}Filter spatial:withinBox (${latMin} ${longMin} ${latMax} ${longMax} 1000000) . ?${filterTarget} ${facetConfigs[facetClass][facetID].predicate} ?${facetID}Filter . `; + if (inverse) { + return ` + FILTER NOT EXISTS { + ${filterStr} + } + `; + } else { + return filterStr; + } }; const generateTimespanFilter = ({ facetClass, facetID, filterTarget, - values + values, + inverse }) => { const facetConfig = facetConfigs[facetClass][facetID]; const { start, end } = values; @@ -129,7 +153,7 @@ const generateTimespanFilter = ({ // FILTER(?start >= "${start}"^^xsd:date) // FILTER(?end <= "${end}"^^xsd:date) // `; - return ` + const filterStr = ` ?${filterTarget} ${facetConfig.predicate} ?${facetID} . ?${facetID} ${facetConfig.startProperty} ?${facetID}Start . ?${facetID} ${facetConfig.endProperty} ?${facetID}End . @@ -140,6 +164,15 @@ const generateTimespanFilter = ({ ?${facetID}End >= "${selectionStart}"^^xsd:date && ?${facetID}End <= "${selectionEnd}"^^xsd:date ) `; + if (inverse) { + return ` + FILTER NOT EXISTS { + ${filterStr} + } + `; + } else { + return filterStr; + } }; const generateUriFilter = ({ -- GitLab