@rcsb/rcsb-saguaro-app
Version:
RCSB 1D Saguaro Web App
98 lines • 4.83 kB
JavaScript
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