@seasketch/geoprocessing
Version:
Geoprocessing and reporting framework for SeaSketch 2.0
51 lines • 2.38 kB
JavaScript
import { keyBy } from "./keyBy.js";
/**
* Returns the objectiveId assigned to the given MetricGroup.
* If classId provided, returns the objective ID assigned to data class with that classId, else fallback to metricGroup objectiveId.
* @param metricGroup the metricGroup to get the objective for
* @param classId the classId to get the objective for
* @returns objectiveId
* @throws if data class does not exist with classId
* @throws if no objectiveId found for metricGroup or its class
*/
export const getMetricGroupObjectiveId = (metricGroup, classId) => {
if (classId) {
const classesByName = keyBy(metricGroup.classes, (curClass) => curClass.classId);
const classObjective = classesByName[classId];
if (!classObjective) {
throw new Error(`Data class with classId = ${classId} not found in metricGroup ${metricGroup.metricId}`);
}
if (classObjective.objectiveId) {
return classObjective.objectiveId; // return class level objectiveId if available
}
}
if (!metricGroup.objectiveId) {
throw new Error(`No objectiveId found for metricGroup ${metricGroup.metricId} or its class ${classId}`);
}
return metricGroup.objectiveId; // fallback to metricGroup objectiveId
};
/**
* Returns array of objective IDs for the given MetricGroup.
* If at least one class has an objectiveId assigned, then it returns those, missing classes with no objectiveId get the top-level objectiveId
* If no class-level objectives are found, then it returns the top-level objectiveId
* If no objectives are found, returns an empty array
* @param metricGroup the metricGroup to get the objectives for
* @returns array of objectiveIds
*/
export const getMetricGroupObjectiveIds = (metricGroup) => {
const classIds = metricGroup.classes.reduce((idsSoFar, curClass) => {
return curClass.objectiveId
? idsSoFar.concat(curClass.objectiveId)
: idsSoFar.concat(metricGroup.objectiveId || []);
}, []);
// If at least one class has an objectiveId, return those
if (classIds.length > 0) {
return [...new Set(classIds)]; // deduplicate
}
// fallback to top-level objectiveId
if (metricGroup.objectiveId) {
return [metricGroup.objectiveId];
}
return []; // no objectives found
};
//# sourceMappingURL=metricGroup.js.map