in src/ServerClient/ADXTrenderClient.ts [123:215]
async getAggregates(
tags: string[],
startDate: Date,
endDate: Date,
interval: string
) {
const aggregatesTableName = "TrenderAggregates";
const metadataTableName = "TrenderMetadata";
const result = await this.executeQuery(
"declare query_parameters(TimeSeries:dynamic,StartTime:datetime,EndTime:datetime,Interval:timespan);" +
`GetAggregates(TimeSeries, StartTime, EndTime, Interval) | order by TimeseriesId | as ${aggregatesTableName};
GetMetaData(TimeSeries) | as ${metadataTableName}`,
{
parameters: {
TimeSeries: `dynamic(${JSON.stringify(tags)})`,
StartTime: startDate,
EndTime: endDate,
Interval: interval,
},
}
);
const table = result.getTable(aggregatesTableName);
const metadataTable = result.getTable(metadataTableName)
if (table.Rows.length == 0) {
throw new Error("Aggregates array is empty.");
}
if (metadataTable.Rows.length == 0) {
throw new Error("Aggregates array is empty.");
}
const metadata = result.unfoldTable<TagMetadata>(metadataTable).reduce((col, tag) => {
col[tag.TimeseriesId] = tag;
return col
}, {} as Record<string, TagMetadata>)
const headers = table.Columns.map((c) => c.ColumnName);
headers.splice(0, 2);
const grouped = table.Rows.reduce((prev, curr) => {
const id = curr.shift() as string;
const timestamp = curr.shift();
const name = metadata[id].TimeseriesName
const group = metadata[id].Path.slice(-1)
if (!prev.hasOwnProperty(group)) {
prev[group] = {};
}
if (!prev[group].hasOwnProperty(name)) {
prev[group][name] = {};
}
prev[group][name][timestamp as string] = headers.reduce((obj, col, i) => {
obj[col] = curr[i];
return obj;
}, {});
return prev;
}, {} as Record<string, Record<string, Record<string, unknown>>>);
console.log(grouped)
return Object.keys(grouped).map(key => {
return {
[key]: grouped[key]
}
})
;
// Groups
const groups = table.Rows.reduce((prev, curr) => {
const id = curr.shift() as string;
const timestamp = curr.shift();
if (!prev.hasOwnProperty(id)) {
prev[id] = { [id]: {} };
}
prev[id][id][timestamp] = headers.reduce((obj, col, i) => {
obj[col] = curr[i];
return obj;
}, {});
return prev;
}, {});
return Object.keys(groups).map((key) => ({ [key]: groups[key] }));
}