diff --git a/src/plugins/vis_types/vislib/public/vislib/helpers/accessor/accessor.ts b/src/plugins/vis_types/vislib/public/vislib/helpers/accessor/accessor.ts index ef3273050ccd2..1b2e186f70df5 100644 --- a/src/plugins/vis_types/vislib/public/vislib/helpers/accessor/accessor.ts +++ b/src/plugins/vis_types/vislib/public/vislib/helpers/accessor/accessor.ts @@ -8,6 +8,26 @@ import { ExpressionValueVisDimension } from '../../../../../../visualizations/public'; +const hasNextValue = (index: number, arrLength: number) => index < arrLength - 1; + +const getNextValue = (index: number, arr: T[]) => + hasNextValue(index, arr.length) ? arr[index + 1] : undefined; + +interface BaseColumn { + id: string | number; +} + +export const getNextToAccessorColumn = ( + columns: T[], + accessor: ExpressionValueVisDimension['accessor'] +) => { + if (typeof accessor === 'number') { + return getNextValue(accessor, columns); + } + const colIndex = columns.findIndex((column) => column.id === accessor.id); + return getNextValue(colIndex, columns); +}; + export const getValueByAccessor = >( data: T, accessor: ExpressionValueVisDimension['accessor'] | string @@ -19,7 +39,7 @@ export const getValueByAccessor = >( return typeof accessor === 'string' ? data[accessor] : data[accessor.id]; }; -export const getColumnByAccessor = ( +export const getColumnByAccessor = ( columns: T[], accessor: ExpressionValueVisDimension['accessor'] | null ) => { diff --git a/src/plugins/vis_types/vislib/public/vislib/helpers/hierarchical/build_hierarchical_data.ts b/src/plugins/vis_types/vislib/public/vislib/helpers/hierarchical/build_hierarchical_data.ts index abca2d85e9b13..f5b4e873024d1 100644 --- a/src/plugins/vis_types/vislib/public/vislib/helpers/hierarchical/build_hierarchical_data.ts +++ b/src/plugins/vis_types/vislib/public/vislib/helpers/hierarchical/build_hierarchical_data.ts @@ -7,11 +7,11 @@ */ import { toArray } from 'lodash'; -import { ExpressionValueVisDimension } from '../../../../../../visualizations/common'; import { getFormatService } from '../../../services'; import { Table } from '../../types'; import type { Dimensions } from '../../../../../pie/public'; import { getColumnByAccessor } from '../accessor'; +import { getNextToAccessorColumn } from '../accessor/accessor'; interface Slice { name: string; @@ -26,17 +26,6 @@ interface Slice { }; } -const getNextToAccessorColumn = ( - columns: Table['columns'], - accessor: ExpressionValueVisDimension['accessor'] -) => { - if (typeof accessor === 'number') { - return columns[accessor + 1]; - } - const colIndex = columns.findIndex((column) => column.id === accessor.id); - return columns[colIndex + 1]; -}; - export const buildHierarchicalData = (table: Table, { metric, buckets = [] }: Dimensions) => { let slices: Slice[]; const names: { [key: string]: string } = {}; @@ -62,7 +51,7 @@ export const buildHierarchicalData = (table: Table, { metric, buckets = [] }: Di const bucketValueColumn = getNextToAccessorColumn(table.columns, bucket.accessor); const bucketFormatter = getFormatService().deserialize(bucket.format); const name = bucketFormatter.convert(row[bucketColumn.id]); - const size = row[bucketValueColumn.id] as number; + const size = bucketValueColumn ? (row[bucketValueColumn.id] as number) : 0; names[name] = name; let slice = dataLevel.find((dataLevelSlice) => dataLevelSlice.name === name);