Treat GroupBy responses properly and insert groupbytag data
parent
b584249fe6
commit
3a3ce69fbd
|
@ -2,34 +2,65 @@ import _ from 'lodash'
|
||||||
import {shiftDate} from 'shared/query/helpers'
|
import {shiftDate} from 'shared/query/helpers'
|
||||||
import {map, reduce, forEach, concat, clone} from 'fast.js'
|
import {map, reduce, forEach, concat, clone} from 'fast.js'
|
||||||
|
|
||||||
|
const groupIt = (responses, responseIndex, groupBys) => {
|
||||||
|
const firstColumns = _.get(responses, [0, 'series', 0, 'columns'])
|
||||||
|
const accum = [
|
||||||
|
{
|
||||||
|
responseIndex,
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
columns: [firstColumns[0], ...groupBys, ...firstColumns.slice(1)],
|
||||||
|
name: _.get(responses, [0, 'series', 0, 'name']),
|
||||||
|
values: [],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
const seriesArray = _.get(responses, [0, 'series'])
|
||||||
|
seriesArray.forEach(s => {
|
||||||
|
const prevValues = accum[0].series[0].values
|
||||||
|
const tagsToAdd = groupBys.map(gb => s.tags[gb])
|
||||||
|
const newValues = s.values.map(v => [v[0], ...tagsToAdd, ...v.slice(1)])
|
||||||
|
accum[0].series[0].values = [...prevValues, ...newValues]
|
||||||
|
})
|
||||||
|
return accum
|
||||||
|
}
|
||||||
|
|
||||||
export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
||||||
const groupBys = queryASTs.map(queryAST => {
|
const groupBys = queryASTs.map(queryAST => {
|
||||||
return _.get(queryAST, ['groupBy', 'tags'], false)
|
return _.get(queryAST, ['groupBy', 'tags'], false)
|
||||||
})
|
})
|
||||||
|
|
||||||
const results = reduce(
|
const results = reduce(
|
||||||
raw,
|
raw,
|
||||||
(acc, rawResponse, responseIndex) => {
|
(acc, rawResponse, responseIndex) => {
|
||||||
const responses = _.get(rawResponse, 'response.results', [])
|
const responses = _.get(rawResponse, 'response.results', [])
|
||||||
const indexedResponses = map(responses, response => ({
|
|
||||||
...response,
|
const indexedResponses = groupBys[responseIndex]
|
||||||
responseIndex,
|
? groupIt(responses, responseIndex, groupBys[responseIndex])
|
||||||
}))
|
: map(responses, response => ({
|
||||||
|
...response,
|
||||||
|
responseIndex,
|
||||||
|
}))
|
||||||
|
|
||||||
return [...acc, ...indexedResponses]
|
return [...acc, ...indexedResponses]
|
||||||
},
|
},
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
|
|
||||||
// collect each series
|
|
||||||
const serieses = reduce(
|
const serieses = reduce(
|
||||||
results,
|
results,
|
||||||
(acc, {series = [], responseIndex}, index) => {
|
(acc, {series = [], responseIndex}) => {
|
||||||
return [...acc, ...map(series, item => ({...item, responseIndex, index}))]
|
return [
|
||||||
|
...acc,
|
||||||
|
...map(series, (item, index) => ({
|
||||||
|
...item,
|
||||||
|
responseIndex,
|
||||||
|
seriesIndex: index,
|
||||||
|
})),
|
||||||
|
]
|
||||||
},
|
},
|
||||||
[]
|
[]
|
||||||
)
|
)
|
||||||
// console.log('serieses', serieses)
|
|
||||||
|
|
||||||
const size = reduce(
|
const size = reduce(
|
||||||
serieses,
|
serieses,
|
||||||
(acc, {columns, values}) => {
|
(acc, {columns, values}) => {
|
||||||
|
@ -40,8 +71,6 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
||||||
},
|
},
|
||||||
0
|
0
|
||||||
)
|
)
|
||||||
// console.log('size', size)
|
|
||||||
|
|
||||||
// convert series into cells with rows and columns
|
// convert series into cells with rows and columns
|
||||||
let cellIndex = 0
|
let cellIndex = 0
|
||||||
let labels = []
|
let labels = []
|
||||||
|
@ -61,17 +90,13 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
||||||
name: measurement,
|
name: measurement,
|
||||||
columns,
|
columns,
|
||||||
values,
|
values,
|
||||||
index: seriesIndex,
|
seriesIndex,
|
||||||
responseIndex,
|
responseIndex,
|
||||||
tags = {},
|
tags = {},
|
||||||
}) => {
|
}) => {
|
||||||
const rows = map(values || [], vals => ({
|
const rows = map(values || [], vals => ({
|
||||||
vals,
|
vals,
|
||||||
}))
|
}))
|
||||||
const groupByTags = groupBys[responseIndex]
|
|
||||||
const groupByNotSelected = groupByTags.filter(
|
|
||||||
gb => !_.includes(columns, gb)
|
|
||||||
)
|
|
||||||
|
|
||||||
const unsortedLabels = map(columns.slice(1), field => ({
|
const unsortedLabels = map(columns.slice(1), field => ({
|
||||||
label: `${measurement}.${field}`,
|
label: `${measurement}.${field}`,
|
||||||
|
@ -79,7 +104,8 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
||||||
seriesIndex,
|
seriesIndex,
|
||||||
}))
|
}))
|
||||||
labels = concat(labels, unsortedLabels)
|
labels = concat(labels, unsortedLabels)
|
||||||
cells.groupByLabels = groupByNotSelected
|
const groupByTags = groupBys[responseIndex]
|
||||||
|
cells.groupByLabels = groupByTags
|
||||||
|
|
||||||
forEach(rows, ({vals}) => {
|
forEach(rows, ({vals}) => {
|
||||||
const [time, ...rowValues] = vals
|
const [time, ...rowValues] = vals
|
||||||
|
@ -87,10 +113,8 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
||||||
cells.label[cellIndex] = unsortedLabels[i].label
|
cells.label[cellIndex] = unsortedLabels[i].label
|
||||||
cells.value[cellIndex] = value
|
cells.value[cellIndex] = value
|
||||||
cells.time[cellIndex] = time
|
cells.time[cellIndex] = time
|
||||||
if (!_.isEmpty(groupByNotSelected)) {
|
if (!_.isEmpty(groupByTags)) {
|
||||||
cells.groupByVals[cellIndex] = groupByNotSelected.map(
|
cells.groupByVals[cellIndex] = groupByTags.map(gb => tags[gb])
|
||||||
gb => tags[gb]
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
cells.seriesIndex[cellIndex] = seriesIndex
|
cells.seriesIndex[cellIndex] = seriesIndex
|
||||||
cells.responseIndex[cellIndex] = responseIndex
|
cells.responseIndex[cellIndex] = responseIndex
|
||||||
|
@ -99,7 +123,7 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
// console.log('cells', cells)
|
|
||||||
const sortedLabels = _.sortBy(labels, 'label')
|
const sortedLabels = _.sortBy(labels, 'label')
|
||||||
const tsMemo = {}
|
const tsMemo = {}
|
||||||
const nullArray = Array(sortedLabels.length).fill(null)
|
const nullArray = Array(sortedLabels.length).fill(null)
|
||||||
|
@ -113,7 +137,6 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
||||||
},
|
},
|
||||||
{}
|
{}
|
||||||
)
|
)
|
||||||
// console.log('labelsToValueIndex', labelsToValueIndex)
|
|
||||||
|
|
||||||
const timeSeries = []
|
const timeSeries = []
|
||||||
for (let i = 0; i < size; i++) {
|
for (let i = 0; i < size; i++) {
|
||||||
|
@ -143,10 +166,8 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
|
||||||
labelsToValueIndex[label + seriesIndex]
|
labelsToValueIndex[label + seriesIndex]
|
||||||
] = value
|
] = value
|
||||||
}
|
}
|
||||||
// console.log('timeSeries', timeSeries)
|
|
||||||
const sortedTimeSeries = _.sortBy(timeSeries, 'time')
|
const sortedTimeSeries = _.sortBy(timeSeries, 'time')
|
||||||
// console.log('sortedLabels', sortedLabels)
|
|
||||||
// console.log('sortedTimeSeries', sortedTimeSeries)
|
|
||||||
return {
|
return {
|
||||||
sortedLabels,
|
sortedLabels,
|
||||||
sortedTimeSeries,
|
sortedTimeSeries,
|
||||||
|
|
|
@ -180,8 +180,6 @@ const hasGroupBy = queryASTs => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const timeSeriesToTableGraph = (raw, queryASTs) => {
|
export const timeSeriesToTableGraph = (raw, queryASTs) => {
|
||||||
// console.log('raw', raw)
|
|
||||||
// console.log('queryASTs', queryASTs)
|
|
||||||
const {sortedLabels, sortedTimeSeries} = hasGroupBy(queryASTs)
|
const {sortedLabels, sortedTimeSeries} = hasGroupBy(queryASTs)
|
||||||
? groupByTimeSeriesTransform(raw, queryASTs)
|
? groupByTimeSeriesTransform(raw, queryASTs)
|
||||||
: timeSeriesTransform(raw)
|
: timeSeriesTransform(raw)
|
||||||
|
@ -190,7 +188,6 @@ export const timeSeriesToTableGraph = (raw, queryASTs) => {
|
||||||
|
|
||||||
const tableData = map(sortedTimeSeries, ({time, values}) => [time, ...values])
|
const tableData = map(sortedTimeSeries, ({time, values}) => [time, ...values])
|
||||||
const data = tableData.length ? [labels, ...tableData] : [[]]
|
const data = tableData.length ? [labels, ...tableData] : [[]]
|
||||||
// console.log('data', data)
|
|
||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
}
|
}
|
||||||
|
@ -211,7 +208,6 @@ export const filterTableColumns = (data, fieldNames) => {
|
||||||
}
|
}
|
||||||
|
|
||||||
export const orderTableColumns = (data, fieldNames) => {
|
export const orderTableColumns = (data, fieldNames) => {
|
||||||
// console.log('data[0]', data[0])
|
|
||||||
const fieldsSortOrder = fieldNames.map(fieldName => {
|
const fieldsSortOrder = fieldNames.map(fieldName => {
|
||||||
return _.findIndex(data[0], dataLabel => {
|
return _.findIndex(data[0], dataLabel => {
|
||||||
return dataLabel === fieldName.internalName
|
return dataLabel === fieldName.internalName
|
||||||
|
@ -237,13 +233,9 @@ export const processTableData = (
|
||||||
data[0],
|
data[0],
|
||||||
..._.orderBy(_.drop(data, 1), sortIndex, [direction]),
|
..._.orderBy(_.drop(data, 1), sortIndex, [direction]),
|
||||||
]
|
]
|
||||||
// console.log('sortedData', sortedData)
|
|
||||||
const sortedTimeVals = map(sortedData, r => r[0])
|
const sortedTimeVals = map(sortedData, r => r[0])
|
||||||
// console.log('sortedTimeVals', sortedTimeVals)
|
|
||||||
const filteredData = filterTableColumns(sortedData, fieldNames)
|
const filteredData = filterTableColumns(sortedData, fieldNames)
|
||||||
// console.log('filteredData', filteredData)
|
|
||||||
const orderedData = orderTableColumns(filteredData, fieldNames)
|
const orderedData = orderTableColumns(filteredData, fieldNames)
|
||||||
// console.log('orderedData', orderedData)
|
|
||||||
const processedData = verticalTimeAxis ? orderedData : _.unzip(orderedData)
|
const processedData = verticalTimeAxis ? orderedData : _.unzip(orderedData)
|
||||||
const {widths: columnWidths, totalWidths} = calculateColumnWidths(
|
const {widths: columnWidths, totalWidths} = calculateColumnWidths(
|
||||||
processedData,
|
processedData,
|
||||||
|
|
Loading…
Reference in New Issue