in src/datasource.ts [260:304]
getEdgeTypes(calls: Call[], metrics: Recordable) {
const idField = { name: NodeGraphDataFrameFieldNames.id, type: FieldType.string, values: new ArrayVector(), config: {}};
const targetField = { name: NodeGraphDataFrameFieldNames.target, type: FieldType.string, values: new ArrayVector(), config: {}};
const sourceField = { name: NodeGraphDataFrameFieldNames.source, 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 call of calls) {
idField.values.add(call.id);
targetField.values.add(call.target);
sourceField.values.add(call.source);
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 === call.id) || {isEmptyValue: true};
const value = m.isEmptyValue ? NaN : this.expression(Number(m.value), item.calculation);
if (i === 0) {
mainStatField.values.add(Number(value));
} else if (i === 1) {
secondaryStatField.values.add(Number(value));
} else {
detailsFields[i - 2]?.values.add(Number(value));
}
}
}
return [idField, targetField, sourceField, mainStatField, secondaryStatField, ...detailsFields];
}