UNPKG

@rcsb/rcsb-saguaro-app

Version:
98 lines 4.83 kB
import { cloneDeep } from "lodash"; import { getBucketsFromFacets } from "@rcsb/rcsb-search-tools/lib/SearchParseTools/SearchFacetTools"; export class FacetTools { static getResultDrilldowns(facetMembers, searchResultFacets) { const out = new Array(); const bucketList = getBucketsFromFacets(searchResultFacets); bucketList.forEach(bucket => { const facet = FacetTools.getFacetFromName(facetMembers, bucket.name); if (!facet) return; const chart = FacetTools.getFacetChartTypeFromAttribute(facetMembers, bucket.name); out.push(Object.assign(Object.assign({}, chart), { attributeName: bucket.name, attribute: facet.attribute, data: applyChartConfigToData(bucket, facet === null || facet === void 0 ? void 0 : facet.facetConfig), filters: FacetTools.getFacetFiltersFromName(facetMembers, bucket.name), contentType: facet.contentType })); }); return out; } static subtractDrilldowns(partial, full) { const diff = cloneDeep(full); const dataMap = new Map(); diff.forEach(fullChart => { dataMap.set(fullChart.attributeName, new Map()); fullChart.data.forEach(d => { var _a; (_a = dataMap.get(fullChart.attributeName)) === null || _a === void 0 ? void 0 : _a.set(d.label, d); }); }); partial.forEach(partialChart => { partialChart.data.forEach(d => { var _a; const data = (_a = dataMap.get(partialChart.attributeName)) === null || _a === void 0 ? void 0 : _a.get(d.label); if (data) data.population -= d.population; }); }); FacetTools.includeMissingFacets(partial, diff); return diff; } static getFacetFromName(facetMembers, name) { return facetMembers.find((facet) => (facet.attributeName === name)); } static addChartDisplayConfig(chart, chartDisplayConfig) { return Object.assign(Object.assign({}, chart), { chartConfig: Object.assign(Object.assign({}, chart.chartConfig), { chartDisplayConfig: chartDisplayConfig }) }); } static includeMissingFacets(partial, full) { const partialFacetNameSet = new Set(partial.map(f => f.attributeName)); const fullFacetNameSet = new Map(full.map(f => [f.attributeName, f])); fullFacetNameSet.forEach((v, k) => { if (!partialFacetNameSet.has(k)) { partial.push(Object.assign(Object.assign({}, cloneDeep(v)), { data: [] })); } }); } static getFacetChartTypeFromAttribute(facetMembers, attribute) { const facet = facetMembers.find((facet) => (facet.attributeName === attribute)); if (!facet) throw `Unknown facet attribute ${attribute}`; return facet; } static getFacetFiltersFromName(facetMembers, attribute) { const facet = facetMembers.find((facet) => (facet.attributeName === attribute)); if (!facet) throw `Unknown facet attribute ${attribute}`; const filters = new Array(); if (facet.facet.filter) { filters.push(facet.facet.filter); } //TODO second level filters should be considered. However, when included, in some cases e.g. SCOP, the search service returns empty results /*const facets = (facet.facet as TermsFacet | HistogramFacet | DateHistogramFacet | RangeFacet | DateRangeFacet | FilterFacet).facets; if( facets ){ facets.forEach(facet=>{ if((facet as FilterFacet).filter ){ filters.push((facet as FilterFacet).filter as FilterQueryTerminalNode); } }) }*/ return filters.map((f) => ({ operator: f.parameters.operator, value: f.parameters.value, attribute: f.parameters.attribute, service: f.service })); } } function applyChartConfigToData(bucket, facetConfig) { if (facetConfig === null || facetConfig === void 0 ? void 0 : facetConfig.mergeDomainMaxValue) return mergeDomainMaxValue(bucket.data, facetConfig.mergeDomainMaxValue); if (facetConfig === null || facetConfig === void 0 ? void 0 : facetConfig.facetTransform) return facetConfig.facetTransform(bucket.data); return bucket.data; } function mergeDomainMaxValue(data, domMaxValue) { const n = data.filter(d => parseFloat(d.label.toString()) >= domMaxValue).reduce((prev, curr) => prev + curr.population, 0); return n > 0 ? data.filter(d => parseFloat(d.label.toString()) < domMaxValue).concat({ population: n, label: domMaxValue, labelPath: [domMaxValue.toString()] }) : data; } //# sourceMappingURL=FacetTools.js.map