Skip to content
Snippets Groups Projects
Facets.js 2.34 KiB
Newer Older
esikkala's avatar
esikkala committed
import { has } from 'lodash';
import SparqlSearchEngine from './SparqlSearchEngine';
import { endpoint, facetValuesQuery } from './SparqlQueriesGeneral';
import { prefixes } from './SparqlQueriesPrefixes';
esikkala's avatar
esikkala committed
import { facetConfigs } from './FacetConfigs';
esikkala's avatar
esikkala committed
import { generateFilter } from './Filters';
esikkala's avatar
esikkala committed
import {
  mapFacet,
  mapHierarchicalFacet,
} from './Mappers';

const sparqlSearchEngine = new SparqlSearchEngine();

esikkala's avatar
esikkala committed
export const getFacet = (resultClass, facetID, sortBy, sortDirection, filters) => {
  let q = facetValuesQuery;
esikkala's avatar
esikkala committed
  const facetConfig = facetConfigs[resultClass][facetID];
esikkala's avatar
esikkala committed
  let selectedBlock = '# no selections';
  let filterBlock = '# no filters';
  let parentBlock = '# no parents';
  let mapper = mapFacet;
  if (filters !== null) {
esikkala's avatar
esikkala committed
    filterBlock = generateFilter(resultClass, resultClass, filters, 'instance', facetID);
esikkala's avatar
esikkala committed
    if (has(filters, facetID)) {
esikkala's avatar
esikkala committed
      selectedBlock = `
            OPTIONAL {
esikkala's avatar
esikkala committed
               FILTER(?id IN ( <${filters[facetID].join('>, <')}> ))
esikkala's avatar
esikkala committed
               BIND(true AS ?selected_)
            }
      `;
    }
  }
  if (facetConfig.type === 'hierarchical') {
    mapper = mapHierarchicalFacet;
    parentBlock = `
            UNION
            {
esikkala's avatar
esikkala committed
              ${generateFilter(resultClass, resultClass, filters, 'different_instance', facetID)}
              ?different_instance ${facetConfig.parentPredicate} ?id .
esikkala's avatar
esikkala committed
              BIND(COALESCE(?selected_, false) as ?selected)
              OPTIONAL { ?id skos:prefLabel ?prefLabel_ }
              BIND(COALESCE(STR(?prefLabel_), STR(?id)) AS ?prefLabel)
              OPTIONAL { ?id dct:source ?source }
              OPTIONAL { ?id gvp:broaderPreferred ?parent_ }
              BIND(COALESCE(?parent_, '0') as ?parent)
esikkala's avatar
esikkala committed
              FILTER(?id != <http://ldf.fi/mmm/places/tgn_7026519>)
  q = q.replace(/<RDF_TYPE>/g, facetConfigs[resultClass].rdfType);
  q = q.replace(/<FILTER>/g, filterBlock );
  q = q.replace(/<PREDICATE>/g, facetConfig.predicate);
  q = q.replace('<SELECTED_VALUES>', selectedBlock);
  q = q.replace('<FACET_VALUE_FILTER>', facetConfig.facetValueFilter);
  q = q.replace('<PARENTS>', parentBlock);
  q = q.replace('<ORDER_BY>', `ORDER BY ${sortDirection}(?${sortBy})` );
esikkala's avatar
esikkala committed
  // if (facetID == 'area') {
  //   //console.log(filters)
  //   console.log(prefixes + q)
esikkala's avatar
esikkala committed
  // }
  return sparqlSearchEngine.doSearch(prefixes + q, endpoint, mapper);
esikkala's avatar
esikkala committed
};