From 8e4d7a711ca77cf761c1a8cfbc53074d77e91acb Mon Sep 17 00:00:00 2001 From: akhuoa Date: Fri, 3 Oct 2025 11:39:01 +1300 Subject: [PATCH] Facet search with curie --- src/algolia/algolia.js | 13 ++++++++++--- src/algolia/utils.js | 17 +++++++++++++++-- src/components/DatasetExplorer.vue | 6 ++++-- 3 files changed, 29 insertions(+), 7 deletions(-) diff --git a/src/algolia/algolia.js b/src/algolia/algolia.js index 6180ad9f..b3923734 100644 --- a/src/algolia/algolia.js +++ b/src/algolia/algolia.js @@ -276,7 +276,14 @@ export class AlgoliaClient { return o.curie } }).filter(Boolean) - : [] + : [], + labels: h.anatomy + ? h.anatomy.organ.map(o => { + if (filteredOrganNames.includes(o.name.toLowerCase())) { + return o.name + } + }).filter(Boolean) + : [], } return data }) @@ -293,7 +300,7 @@ export class AlgoliaClient { const anatomyOrganSubcategoryNames = anatomyOrganSubcategoryName ? Object.keys(anatomyOrganSubcategoryName) : [] const anatomyOrganSubsubcategoryNames = anatomyOrganSubsubcategoryName ? Object.keys(anatomyOrganSubsubcategoryName) : [] const filteredOrganNames = [] - + anatomyOrganCategoryNames.forEach((_categoryName) => { const categoryName = _categoryName.toLowerCase(); anatomyOrganNames.forEach((_organName) => { @@ -308,7 +315,7 @@ export class AlgoliaClient { } else { return anatomyOrganSubsubcategoryNames.find((name) => { const fullsubsubname = `${subcategoryName}.${organName}` - return (fullsubsubname === name) + return (fullsubsubname === name) }) } }); diff --git a/src/algolia/utils.js b/src/algolia/utils.js index 37c9546d..16681399 100644 --- a/src/algolia/utils.js +++ b/src/algolia/utils.js @@ -62,7 +62,7 @@ export const shownFilters = { /* Returns filter for searching algolia. All facets of the same category are joined with OR, * and each of those results is then joined with an AND. * i.e. (color:blue OR color:red) AND (shape:circle OR shape:red) */ -export function getFilters(selectedFacetArray = undefined) { +export function getFilters(selectedFacetArray = undefined, anatomyInDatasets = []) { // return all datasets if no filter if (selectedFacetArray === undefined) { return 'NOT item.published.status:embargo' @@ -101,7 +101,20 @@ export function getFilters(selectedFacetArray = undefined) { facet.facetSubPropPath : facetFilterPath ? facetFilterPath : facetPropPath if (facet.AND) { - andFilters += `AND "${facetPropPathToUse}":"${facet.label}"`; + let term = ''; + if (facetPropPathToUse === "anatomy.organ.name" && anatomyInDatasets.length > 0) { + const lowerLabel = facet.label.toLowerCase(); + const dataset = anatomyInDatasets.find(item => item.labels.map(label => label.toLowerCase()).includes(lowerLabel)); + if (dataset) { + const index = dataset.labels.map(label => label.toLowerCase()).indexOf(lowerLabel); + term = dataset.terms[index]; + } + } + if (term) { + andFilters += `AND "anatomy.organ.curie":"${term}"`; + } else { + andFilters += `AND "${facetPropPathToUse}":"${facet.label}"`; + } } else { orFilters += `"${facetPropPathToUse}":"${facet.label}" OR `; } diff --git a/src/components/DatasetExplorer.vue b/src/components/DatasetExplorer.vue index c0b3ab9e..4608ad69 100644 --- a/src/components/DatasetExplorer.vue +++ b/src/components/DatasetExplorer.vue @@ -161,6 +161,7 @@ export default { display: 'flex', }, cascaderIsReady: false, + anatomyInDatasets: [], } }, computed: { @@ -304,14 +305,15 @@ export default { // Algolia search this.loadingCards = true this.algoliaClient - .anatomyInSearch(getFilters(filters), query) + .anatomyInSearch(getFilters(filters, this.anatomyInDatasets), query) .then((r) => { // Send result anatomy to the scaffold and flatmap + this.anatomyInDatasets = r.forFlatmap; EventBus.emit('anatomy-in-datasets', r.forFlatmap) EventBus.emit('number-of-datasets-for-anatomies', r.forScaffold) }) this.algoliaClient - .search(getFilters(filters), query, this.numberPerPage, this.page) + .search(getFilters(filters, this.anatomyInDatasets), query, this.numberPerPage, this.page) .then((searchData) => { this.numberOfHits = searchData.total this.discoverIds = searchData.discoverIds