Treat GroupBy responses properly and insert groupbytag data

pull/10616/head
ebb-tide 2018-04-16 21:44:50 -07:00
parent b584249fe6
commit 3a3ce69fbd
2 changed files with 49 additions and 36 deletions

View File

@ -2,34 +2,65 @@ import _ from 'lodash'
import {shiftDate} from 'shared/query/helpers'
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 = []) => {
const groupBys = queryASTs.map(queryAST => {
return _.get(queryAST, ['groupBy', 'tags'], false)
})
const results = reduce(
raw,
(acc, rawResponse, responseIndex) => {
const responses = _.get(rawResponse, 'response.results', [])
const indexedResponses = map(responses, response => ({
...response,
responseIndex,
}))
const indexedResponses = groupBys[responseIndex]
? groupIt(responses, responseIndex, groupBys[responseIndex])
: map(responses, response => ({
...response,
responseIndex,
}))
return [...acc, ...indexedResponses]
},
[]
)
// collect each series
const serieses = reduce(
results,
(acc, {series = [], responseIndex}, index) => {
return [...acc, ...map(series, item => ({...item, responseIndex, index}))]
(acc, {series = [], responseIndex}) => {
return [
...acc,
...map(series, (item, index) => ({
...item,
responseIndex,
seriesIndex: index,
})),
]
},
[]
)
// console.log('serieses', serieses)
const size = reduce(
serieses,
(acc, {columns, values}) => {
@ -40,8 +71,6 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
},
0
)
// console.log('size', size)
// convert series into cells with rows and columns
let cellIndex = 0
let labels = []
@ -61,17 +90,13 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
name: measurement,
columns,
values,
index: seriesIndex,
seriesIndex,
responseIndex,
tags = {},
}) => {
const rows = map(values || [], vals => ({
vals,
}))
const groupByTags = groupBys[responseIndex]
const groupByNotSelected = groupByTags.filter(
gb => !_.includes(columns, gb)
)
const unsortedLabels = map(columns.slice(1), field => ({
label: `${measurement}.${field}`,
@ -79,7 +104,8 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
seriesIndex,
}))
labels = concat(labels, unsortedLabels)
cells.groupByLabels = groupByNotSelected
const groupByTags = groupBys[responseIndex]
cells.groupByLabels = groupByTags
forEach(rows, ({vals}) => {
const [time, ...rowValues] = vals
@ -87,10 +113,8 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
cells.label[cellIndex] = unsortedLabels[i].label
cells.value[cellIndex] = value
cells.time[cellIndex] = time
if (!_.isEmpty(groupByNotSelected)) {
cells.groupByVals[cellIndex] = groupByNotSelected.map(
gb => tags[gb]
)
if (!_.isEmpty(groupByTags)) {
cells.groupByVals[cellIndex] = groupByTags.map(gb => tags[gb])
}
cells.seriesIndex[cellIndex] = seriesIndex
cells.responseIndex[cellIndex] = responseIndex
@ -99,7 +123,7 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
})
}
)
// console.log('cells', cells)
const sortedLabels = _.sortBy(labels, 'label')
const tsMemo = {}
const nullArray = Array(sortedLabels.length).fill(null)
@ -113,7 +137,6 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
},
{}
)
// console.log('labelsToValueIndex', labelsToValueIndex)
const timeSeries = []
for (let i = 0; i < size; i++) {
@ -143,10 +166,8 @@ export const groupByTimeSeriesTransform = (raw = [], queryASTs = []) => {
labelsToValueIndex[label + seriesIndex]
] = value
}
// console.log('timeSeries', timeSeries)
const sortedTimeSeries = _.sortBy(timeSeries, 'time')
// console.log('sortedLabels', sortedLabels)
// console.log('sortedTimeSeries', sortedTimeSeries)
return {
sortedLabels,
sortedTimeSeries,

View File

@ -180,8 +180,6 @@ const hasGroupBy = queryASTs => {
}
export const timeSeriesToTableGraph = (raw, queryASTs) => {
// console.log('raw', raw)
// console.log('queryASTs', queryASTs)
const {sortedLabels, sortedTimeSeries} = hasGroupBy(queryASTs)
? groupByTimeSeriesTransform(raw, queryASTs)
: timeSeriesTransform(raw)
@ -190,7 +188,6 @@ export const timeSeriesToTableGraph = (raw, queryASTs) => {
const tableData = map(sortedTimeSeries, ({time, values}) => [time, ...values])
const data = tableData.length ? [labels, ...tableData] : [[]]
// console.log('data', data)
return {
data,
}
@ -211,7 +208,6 @@ export const filterTableColumns = (data, fieldNames) => {
}
export const orderTableColumns = (data, fieldNames) => {
// console.log('data[0]', data[0])
const fieldsSortOrder = fieldNames.map(fieldName => {
return _.findIndex(data[0], dataLabel => {
return dataLabel === fieldName.internalName
@ -237,13 +233,9 @@ export const processTableData = (
data[0],
..._.orderBy(_.drop(data, 1), sortIndex, [direction]),
]
// console.log('sortedData', sortedData)
const sortedTimeVals = map(sortedData, r => r[0])
// console.log('sortedTimeVals', sortedTimeVals)
const filteredData = filterTableColumns(sortedData, fieldNames)
// console.log('filteredData', filteredData)
const orderedData = orderTableColumns(filteredData, fieldNames)
// console.log('orderedData', orderedData)
const processedData = verticalTimeAxis ? orderedData : _.unzip(orderedData)
const {widths: columnWidths, totalWidths} = calculateColumnWidths(
processedData,