Newer
Older
import { runSelectQuery } from './SparqlApi';
import { endpoint, facetValuesQuery } from './SparqlQueriesGeneral';
import { prefixes } from './SparqlQueriesPrefixes';
import { generateFilter, generateSelectedFilter } from './Filters';
import {
mapFacet,
mapHierarchicalFacet,
} from './Mappers';
export const getFacet = ({
facetClass,
facetID,
sortBy,
sortDirection,
uriFilters,
spatialFilters,
let q = facetValuesQuery;
const facetConfig = facetConfigs[facetClass][facetID];
let selectedNoHitsBlock = '# no filters from other facets';
let filterBlock = '# no filters';
let parentBlock = '# no parents';
let mapper = mapFacet;
const hasFilters = uriFilters !== null
|| spatialFilters !== null
|| textFilters !== null;
if (hasFilters) {
filterBlock = generateFilter({
facetClass: facetClass,
uriFilters: uriFilters,
spatialFilters: spatialFilters,
facetID: facetID,
inverse: false,
});
}
if (uriFilters !== null && has(uriFilters, facetID)) {
const selectedFilter = generateSelectedFilter({
selectedValues:uriFilters[facetID],
inverse: false
});
OPTIONAL {
${selectedFilter}
BIND(true AS ?selected_)
}
`;
const facetIDs = Object.keys(uriFilters);
// get selected values with no hits, only when there are filters from
// other facets
if (facetIDs.length > 1) {
const noHitsFilter = generateFilter({
facetClass: facetClass,
uriFilters: uriFilters,
spatialFilters: spatialFilters,
filterTarget: 'instance',
facetID: facetID,
inverse: true,
});
selectedNoHitsBlock = `
UNION
{
# facet values that have been selected but return no results
VALUES ?id { <${uriFilters[facetID].join('> <')}> }
${noHitsFilter}
BIND(true AS ?selected_)
}
}
if (facetConfig.type === 'hierarchical') {
mapper = mapHierarchicalFacet;
const parentFilterStr = generateFilter({
facetClass: facetClass,
uriFilters: uriFilters,
spatialFilters: spatialFilters,
facetID: facetID,
inverse: false
});
let ignoreSelectedValues = '';
if (uriFilters !== null && has(uriFilters, facetID)) {
ignoreSelectedValues = generateSelectedFilter({
selectedValues:uriFilters[facetID],
inverse: true
});
UNION
# parents for all facet values
{
${parentFilterStr}
# these instances should not be counted, so use another variable name
?instance2 ${facetConfig.parentPredicate} ?id .
VALUES ?facetClass { <FACET_CLASS> }
?instance2 a ?facetClass .
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>', facetConfig.facetValueFilter);
q = q.replace('<PARENTS>', parentBlock);
q = q.replace('<ORDER_BY>', `ORDER BY ${sortDirection}(?${sortBy})` );
q = q.replace(/<FACET_CLASS>/g, facetConfigs[facetClass].facetClass);
q = q.replace(/<FILTER>/g, filterBlock );
q = q.replace(/<PREDICATE>/g, facetConfig.predicate);
// if (facetID == 'productionPlace') {
return runSelectQuery(prefixes + q, endpoint, mapper);