Newer
Older
import { runSelectQuery } from './SparqlApi';
import {
endpoint,
facetValuesQuery,
facetValuesQueryTimespan
} from './SparqlQueriesGeneral';
import { prefixes } from './SparqlQueriesPrefixes';
hasPreviousSelections,
hasPreviousSelectionsFromOtherFacets,
getUriFilters,
generateConstraintsBlock,
generateSelectedFilter
} from './Filters';
export const getFacet = ({
facetClass,
facetID,
sortBy,
sortDirection,
const facetConfig = facetConfigs[facetClass][facetID];
// choose query template and result mapper:
switch(facetConfig.type) {
case 'list':
q = facetValuesQuery;
mapper = mapFacet;
break;
case 'hierarchical':
q = facetValuesQuery;
break;
case 'timespan':
q = facetValuesQueryTimespan;
break;
default:
q = facetValuesQuery;
let selectedNoHitsBlock = '# no filters from other facets';
let filterBlock = '# no filters';
let parentBlock = '# no parents';
if (constraints !== null) {
filterBlock = generateConstraintsBlock({
facetID: facetID,
inverse: false,
// if this facet has previous selections, include them in the query
if (hasPreviousSelections(constraints, facetID)) {
selectedBlock = generateSelectedBlock({
/* if there are also filters from other facets, we need this
additional block for facet values that return 0 hits */
if (hasPreviousSelectionsFromOtherFacets(constraints, facetID)) {
selectedNoHitsBlock = generateSelectedNoHitsBlock({
facetClass,
facetID,
constraints
});
}
const { parentPredicate } = facetConfig;
parentBlock = generateParentBlock({
facetClass,
facetID,
q = q.replace('<SELECTED_VALUES>', selectedBlock);
q = q.replace('<SELECTED_VALUES_NO_HITS>', selectedNoHitsBlock);
q = q.replace(/<FACET_VALUE_FILTER>/g, facetConfig.facetValueFilter);
if (facetConfig.type === 'list') {
q = q.replace('<ORDER_BY>', `ORDER BY ${sortDirection}(?${sortBy})` );
} else {
q = q.replace('<ORDER_BY>', '# no need for ordering');
}
q = q.replace(/<FACET_CLASS>/g, facetConfigs[facetClass].facetClass);
q = q.replace(/<FILTER>/g, filterBlock );
q = q.replace(/<PREDICATE>/g, facetConfig.predicate);
if (facetConfig.type === 'timespan') {
q = q.replace('<START_PROPERTY>', facetConfig.startProperty);
q = q.replace('<END_PROPERTY>', facetConfig.endProperty);
}
// if (facetID == 'productionPlace') {
// console.log(prefixes + q)
// }
return runSelectQuery(prefixes + q, endpoint, mapper, resultFormat);
const generateSelectedBlock = ({
facetID,
}) => {
const selectedFilter = generateSelectedFilter({
inverse: false
});
return `
OPTIONAL {
${selectedFilter}
BIND(true AS ?selected_)
}
`;
};
const generateSelectedNoHitsBlock = ({
facetClass,
facetID,
const noHitsFilter = generateConstraintsBlock({
filterTarget: 'instance',
facetID: facetID,
inverse: true,
});
return `
UNION
{
# facet values that have been selected but return no results
VALUES ?id { <${getUriFilters(constraints, facetID).join('> <')}> }
${noHitsFilter}
BIND(true AS ?selected_)
}
`;
};
const generateParentBlock = ({
facetClass,
facetID,
parentPredicate
}) => {
let parentFilterStr = '# no filters';
let ignoreSelectedValues = '# no selected values';
if (constraints !== null) {
parentFilterStr = generateConstraintsBlock({
facetClass: facetClass,
constraints: constraints,
filterTarget: 'instance2',
facetID: facetID,
inverse: false
if (hasPreviousSelections) {
ignoreSelectedValues = generateSelectedFilter({
facetID: facetID,
constraints: constraints,
inverse: true
});
}
}
return `
UNION
# parents for all facet values
{
${parentFilterStr}
# these instances should not be counted, so use another variable name
?instance2 ${parentPredicate} ?id .
VALUES ?facetClass { <FACET_CLASS> }
?instance2 a ?facetClass .
BIND(false AS ?selected_)
${ignoreSelectedValues}
}
`;
};