in src/datasource.ts [215:258]
getNodeTypes(nodes: Node[], metrics: Recordable) {
const idField = { name: NodeGraphDataFrameFieldNames.id, type: FieldType.string, values: new ArrayVector(), config: {}};
const titleField = { name: NodeGraphDataFrameFieldNames.title, type: FieldType.string, values: new ArrayVector(), config: {}};
const mainStatField = { name: NodeGraphDataFrameFieldNames.mainStat, type: FieldType.number, values: new ArrayVector(), config: {}};
const secondaryStatField = { name: NodeGraphDataFrameFieldNames.secondaryStat, type: FieldType.number, values: new ArrayVector(), config: {}};
const detailsFields: any = [];
for (const [index, k] of Object.keys(metrics.data).entries()) {
const c = metrics.config.find((d: MetricData) => d.name === k) || {};
const config = {displayName: c.label, unit: c.unit};
if (index === 0) {
mainStatField.config = config;
} else if (index === 1) {
secondaryStatField.config = config;
} else {
detailsFields.push({
name: `${NodeGraphDataFrameFieldNames.detail}${k}`,
type: FieldType.number,
values: new ArrayVector(),
config: {displayName: `${c.label || k } ${c.unit || ''}`}
});
}
}
for (const node of nodes) {
idField.values.add(node.id || '');
titleField.values.add(node.name);
for (let i = 0; i < metrics.config.length; i++) {
const item = metrics.config[i];
const m = (metrics.data[item.name].values).find((v: {id: string}) => v.id === node.id) || {isEmptyValue: true};
const value = m.isEmptyValue ? NaN : this.expression(Number(m.value), item.calculation);
if(i > 1) {
detailsFields[i - 2]?.values.add(Number(value));
} else {
if (i === 0) {
mainStatField.values.add(Number(value));
}
if (i === 1) {
secondaryStatField.values.add(Number(value));
}
}
}
}
return [idField, titleField, mainStatField, secondaryStatField, ...detailsFields];
}