diff --git a/src/server/sparql/Filters.js b/src/server/sparql/Filters.js index 1898e5542ce86143c85d38ac14c646bd24c1a1ae..5ced5a4d4ee07f32a7e0c567ea7a0cd40b0ecd34 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 = ({