Skip to content
Snippets Groups Projects
Commit ca7042a6 authored by esikkala's avatar esikkala
Browse files

Make "Unknown" facet value selectable

parent b4be9add
No related branches found
No related tags found
No related merge requests found
......@@ -230,11 +230,11 @@ class HierarchicalFacet extends Component {
node.instanceCount === 0 &&
node.selected === 'false') ||
// prevent selecting unknown value:
node.id === 'http://ldf.fi/MISSING_VALUE' ||
// node.id === 'http://ldf.fi/MISSING_VALUE' ||
// prevent selecting when another facet is still updating:
this.props.someFacetIsFetching ||
// prevent selecting all facet values when there is a logical OR between the selections:
(this.props.facet.useConjuction && !isSelected && selectedCount >= this.props.facet.distinctValueCount - 1) ||
(!this.props.facet.useConjuction && !isSelected && selectedCount >= this.props.facet.distinctValueCount - 1) ||
// prevent selecting when parent has been selected
node.disabled === 'true'
}
......
......@@ -77,8 +77,8 @@ export const INITIAL_STATE = {
type: 'hierarchical',
selectAlsoSubconceptsButton: true,
selectAlsoSubconcepts: true,
useConjuctionButton: true,
useConjuction: false,
// useConjuctionButton: true,
// useConjuction: true,
priority: 5
},
productionTimespan: {
......
......@@ -74,6 +74,7 @@ export const getAllResults = ({
facetID: null
}))
}
q = q.replace(/<FACET_CLASS>/g, backendSearchConfig[config.perspectiveID].facetClass)
if (has(config, 'useNetworkAPI') && config.useNetworkAPI) {
return runNetworkQuery({
endpoint: endpoint.url,
......@@ -88,6 +89,7 @@ export const getAllResults = ({
if (uri !== null) {
q = q.replace('<ID>', `<${uri}>`)
}
// console.log(endpoint.prefixes + q)
return runSelectQuery({
query: endpoint.prefixes + q,
endpoint: endpoint.url,
......@@ -112,7 +114,6 @@ export const getResultCount = async ({
} else {
endpoint = backendSearchConfig[config.perspectiveID].endpoint
}
q = q.replace('<FACET_CLASS>', config.facetClass)
if (constraints == null) {
q = q.replace('<FILTER>', '# no filters')
} else {
......@@ -126,6 +127,7 @@ export const getResultCount = async ({
filterTripleFirst: true
}))
}
q = q.replace(/<FACET_CLASS>/g, config.facetClass)
// console.log(endpoint.prefixes + q)
const response = await runSelectQuery({
query: endpoint.prefixes + q,
......@@ -171,7 +173,7 @@ const getPaginatedData = ({
facetID: null
}))
}
q = q.replace('<FACET_CLASS>', config.facetClass)
q = q.replace(/<FACET_CLASS>/g, config.facetClass)
if (sortBy == null) {
q = q.replace('<ORDER_BY_TRIPLE>', '')
q = q.replace('<ORDER_BY>', '# no sorting')
......
......@@ -10,7 +10,8 @@ import {
hasPreviousSelectionsFromOtherFacets,
getUriFilters,
generateConstraintsBlock,
generateSelectedFilter
generateSelectedFilter,
handleUnknownValue
} from './Filters'
import {
mapFacet,
......@@ -59,6 +60,9 @@ export const getFacet = async ({
let filterBlock = '# no filters'
let parentBlock = '# no parents'
let parentsForFacetValues = '# no parents for facet values'
let unknownSelected = 'false'
let useConjuction = false
let selectParents = facetConfig.type === 'hierarchical'
if (constraints !== null) {
filterBlock = generateConstraintsBlock({
backendSearchConfig,
......@@ -69,7 +73,17 @@ export const getFacet = async ({
inverse: false,
constrainSelf
})
// previousSelections = new Set(getUriFilters(constraints, facetID))
const currentSelections = getUriFilters(constraints, facetID)
const { indexOfUnknown } = handleUnknownValue(currentSelections)
const facet = constraints.find(c => c.facetID === facetID)
useConjuction = (has(facet, 'useConjuction') && facet.useConjuction)
if (indexOfUnknown !== -1) {
unknownSelected = 'true'
// always ignore parents when 'Unknown' is selected in a hierarchical 'AND facet'
if (useConjuction) {
selectParents = false
}
}
// if this facet has previous selections, include them in the query
if (hasPreviousSelections(constraints, facetID)) {
selectedBlock = generateSelectedBlock({
......@@ -84,15 +98,13 @@ export const getFacet = async ({
backendSearchConfig,
facetClass,
facetID,
constraints
constraints,
constrainSelf
})
}
}
}
// if (facetID === 'productionPlace') {
// console.log(selectedBlock)
// }
if (facetConfig.type === 'hierarchical') {
if (selectParents) {
const { parentPredicate } = facetConfig
parentBlock = generateParentBlock({
backendSearchConfig,
......@@ -121,14 +133,16 @@ export const getFacet = async ({
} else {
q = q.replace('<ORDER_BY>', '# no need for ordering')
}
q = q.replace(/<FACET_CLASS>/g, backendSearchConfig[facetClass].facetClass)
q = q.replace(/<FILTER>/g, filterBlock)
q = q.replace(/<PREDICATE>/g, facetConfig.predicate)
q = q.replace(/<FACET_CLASS>/g, backendSearchConfig[facetClass].facetClass)
q = q.replace('<UNKNOWN_SELECTED>', unknownSelected)
q = q.replace('<MISSING_PREDICATE>', facetConfig.predicate)
q = q.replace('<PREDICATE>', facetConfig.predicate)
if (facetConfig.type === 'timespan') {
q = q.replace('<START_PROPERTY>', facetConfig.startProperty)
q = q.replace('<END_PROPERTY>', facetConfig.endProperty)
}
// if (facetID === 'owner') {
// if (facetID === 'productionPlace') {
// console.log(endpoint.prefixes + q)
// }
const response = await runSelectQuery({
......@@ -136,7 +150,6 @@ export const getFacet = async ({
endpoint: endpoint.url,
useAuth: endpoint.useAuth,
resultMapper: mapper,
// previousSelections,
resultFormat
})
if (facetConfig.type === 'hierarchical') {
......@@ -180,7 +193,8 @@ const generateSelectedNoHitsBlock = ({
backendSearchConfig,
facetClass,
facetID,
constraints
constraints,
constrainSelf
}) => {
const noHitsFilter = generateConstraintsBlock({
backendSearchConfig,
......@@ -188,12 +202,13 @@ const generateSelectedNoHitsBlock = ({
constraints: constraints,
filterTarget: 'instance',
facetID: facetID,
inverse: true
inverse: true,
constrainSelf
})
return `
UNION
{
# facet values that have been selected but return no results
{
VALUES ?id { <${getUriFilters(constraints, facetID).join('> <')}> }
${noHitsFilter}
BIND(true AS ?selected_)
......
......@@ -258,30 +258,72 @@ const generateUriFilter = ({
const facetConfig = backendSearchConfig[facetClass].facets[facetID]
const includeChildren = facetConfig.type === 'hierarchical' && selectAlsoSubconcepts
const { literal, predicate, parentProperty } = facetConfig
const valuesStr = generateValuesForUriFilter({ values, literal, useConjuction })
const s = useConjuction
? generateConjuctionForUriFilter({
facetID,
predicate,
parentProperty,
filterTarget,
inverse,
includeChildren,
valuesStr
})
: generateDisjunctionForUriFilter({
facetID,
predicate,
parentProperty,
filterTarget,
inverse,
filterTripleFirst,
includeChildren,
valuesStr
})
const { modifiedValues, indexOfUnknown } = handleUnknownValue(values)
let s
if (modifiedValues.length > 0) {
const valuesStr = generateValuesForUriFilter({ values: modifiedValues, literal, useConjuction })
s = useConjuction
? generateConjuctionForUriFilter({
facetID,
predicate,
parentProperty,
filterTarget,
inverse,
includeChildren,
valuesStr
})
: generateDisjunctionForUriFilter({
facetID,
predicate,
parentProperty,
filterTarget,
inverse,
filterTripleFirst,
includeChildren,
valuesStr
})
}
if (modifiedValues.length > 0 && indexOfUnknown !== -1) {
s = `
{
${s}
}
UNION
{
${generateMissingValueBlock({ predicate, filterTarget })}
}
`
}
if (modifiedValues.length === 0 && indexOfUnknown !== -1) {
s = `
${generateMissingValueBlock({ predicate, filterTarget })}
`
}
return s
}
export const handleUnknownValue = values => {
const modifiedValues = [...values]
const indexOfUnknown = values.indexOf('http://ldf.fi/MISSING_VALUE')
if (indexOfUnknown !== -1) {
modifiedValues.splice(indexOfUnknown, 1)
}
return {
indexOfUnknown,
modifiedValues
}
}
const generateMissingValueBlock = ({ predicate, filterTarget }) => {
return `
VALUES ?facetClass { <FACET_CLASS> }
?${filterTarget} a ?facetClass .
FILTER NOT EXISTS {
?${filterTarget} ${predicate} [] .
}
`
}
const generateValuesForUriFilter = ({ values, literal, useConjuction }) => {
let str = ''
if (literal && useConjuction) {
......@@ -324,8 +366,8 @@ const generateDisjunctionForUriFilter = ({
`
} else {
s += `
VALUES ?${facetID}Filter { ${valuesStr} }
`
VALUES ?${facetID}Filter { ${valuesStr} }
`
}
if (inverse) {
s += `
......@@ -357,7 +399,7 @@ const generateConjuctionForUriFilter = ({
return `
FILTER NOT EXISTS {
?${filterTarget} ?randomPredicate ?id .
?${filterTarget} ${predicateModified} ${valuesStr}
?${filterTarget} ${predicate} ${valuesStr}
}
`
} else {
......
......@@ -78,7 +78,7 @@ export const facetValuesQuery = `
VALUES ?facetClass { <FACET_CLASS> }
?instance a ?facetClass .
FILTER NOT EXISTS {
?instance <PREDICATE> [] .
?instance <MISSING_PREDICATE> [] .
}
}
}
......@@ -86,7 +86,7 @@ export const facetValuesQuery = `
BIND(IRI("http://ldf.fi/MISSING_VALUE") AS ?id)
BIND("Unknown" AS ?prefLabel)
BIND('0' as ?parent)
BIND(false as ?selected)
BIND(<UNKNOWN_SELECTED> as ?selected)
}
}
<ORDER_BY>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment