Axes-selector и setKoobFilters

Есть treemap, у которого установлен axes-selector, выглядит так:

Хочу добавить setKoobFilters для интерактивности. С точки зрения пользователя будет логично, если дэшборд будет фильтроваться по клику на квадратик. В данном случае фильтрация будет зависеть от выбранной оси в axes-selector, а в setKoobFilters уловия прописываются статически.

Есть ли какой-то способ подставлять значение текущей оси из axes-selector в условие setKoobFilters?

Если при смене оси у вас будут меняться факты - в setKoobFilters нужно описать оба состояния и тогда, опять же, при клике на тот или иной факт фильтрация применится ровно по тому факту, по которому произошел клик

Упрощенно, конфиг дэша выглядит так:

{
  dataSource: {
    koob: 'cube',
    xAxes: [
      'dim1',
      'dim2',
      'dim3',
    ],
    xAxis: 'dim1',
    yAxis: 'measures',
    filters: {
      dim1: true,
      dim2: true,
      dim3: true,
    },
    measures: [
      'sum(x):sum_x',
    ],
    dimensions: [
      'dim1',
      'dim2',
      'dim3',
    ],
  },
  view_class: 'axes-selector/11I.treemap',
  onClickDataPoint: "lpe:setKoobFilters('cube', 'dim1', ['=', dim1])",
}

С помощью axes-selector я выбираю то, что будет отображаться по оси X и ожидаю, что по значению оси X будет происходить фильтрация дэшборда.
В данном случае, если я выберу dim2 или dim3, то onClickDataPoint как работало по dim1, так и будет.

Есть ли какой-то способ, который будет подставлять/фильтровать dim2 в onClickDataPoint, если на axes-selector выбран dim2 и dim3 в случае с dim3?

В таком случае вам нужно использовать конструкцию следующего толка:

  onClickDataPoint: "lpe:if(get(x,'id')=dim1,setKoobFilters('cube', 'dim1', ['=', dim1]),null);if(get(x,'id')=dim2,setKoobFilters('cube', 'dim2', ['=', dim2]),null)",

Что здесь и как устроено:

  • if - конструкция, которая будет работать так: если на оси Х есть нужный элемент - проставим его в фильтр, если нет - ничего не попадет в фильтры
  • get(x, ‘id’)=dim1 - функция, которая будет проверять, что именно у вас есть на выбранной оси
  • с помощью “;” вы будете отделять ваши функции фильтрации

Пример из существующего на нашем стенде дэша:

{
  frame: {
    h: 3,
    w: 6,
    x: 0,
    y: 4,
  },
  dataSource: {
    koob: 'BeerDataSource.beerKoob',
    style: {},
    xAxes: [
      'category',
      'package',
    ],
    xAxis: 'category;package',
    yAxis: 'measures',
    measures: [
      'sum(abv):среднее',
      'sum(abv):min_abv',
    ],
    dimensions: [
      'category',
      'package',
    ],
  },
  onClickDataPoint: "lpe:if(get(x,'id')=package,setKoobFilters('BeerDataSource.beerKoob', 'package', ['=', package]),null);if(get(x,'id')=category,setKoobFilters('BeerDataSource.beerKoob', 'category', ['=', category]),null)",
  view_class: 'axes-selector/1II.bar',
  title: 'Axes-selector',
}

Большое спасибо за развёрнутый ответ с примером!
Попробовал воспроизвести - всё работает как ожидалось.
.
.
Есть ещё один treemap, чуть посложнее:

{
  dataSource: {
    koob: 'cube',
    xAxes: [
      'dim4;dim1',
      'dim4;dim2',
      'dim4;dim3',
    ],
    xAxis: 'dim4;dim1',
    yAxis: 'measures',
    filters: {
      dim1: true,
      dim2: true,
      dim3: true,
      dim4: true,
    },
    measures: [
      'sum(x):sum_x',
    ],
    dimensions: [
      'dim1',
      'dim2',
      'dim3',
      'dim4',
    ],
  },
  view_class: 'axes-selector/11I.treemap',

}

.
.
Выглядит так:

Логика дэша в том, что значения dim1, dim2, dim3 просматриваются в разрезе dim4.
Здесь у меня задача та же: при просмотре значений dim1, dim2, dim3 при клике на плитку со значением должно происходить событие фильтрации дэшборда по dim1, dim2, dim3 соответственно.
.
.
Попробовал так:

 onClickDataPoint: "lpe:if(get(x,'id')=dim1,setKoobFilters('cube', 'dim1', ['=', dim1]),null)",

При клике по значению dim1 ничего не происходит, при клике по группирующей шапке dim4 ничего не происходит.
.
.
Попробовал так:

 onClickDataPoint: "lpe:if(get(x,'id')=dim4,setKoobFilters('cube', 'dim1', ['=', dim1]),null)",

При клике по значению dim1 ничего не происходит, при клике по группирующей шапке dim4 происходит такая подстановка в where запроса:

WHERE ("dim1" = 'dim1')

.
.
Подскажите, как в случае с двумя измерениями на оси X описать выражение для onClickDataPoint?

В таком случае количество if увеличится и вам нужно будет передавать в него dim-ы по индексу

Пример из живого дэша:

{
  frame: {
    h: 3,
    w: 6,
    x: 0,
    y: 4,
  },
  dataSource: {
    koob: 'BeerDataSource.beerKoob',
    style: {},
    xAxes: [
      'category',
      'package;quantity',
    ],
    xAxis: 'category;package',
    yAxis: 'measures',
    measures: [
      'sum(abv):среднее',
      'sum(abv):min_abv',
    ],
    dimensions: [
      'category',
      'package',
      'quantity',
    ],
  },
  onClickDataPoint: "lpe:if(get(x,'ids').get(0)=package, setKoobFilters('BeerDataSource.beerKoob', 'package', ['=', package]),null);if(get(x,'ids').get(1)=quantity, setKoobFilters('BeerDataSource.beerKoob', 'quantity', ['=', quantity]),null);if(get(x,'id')=category,setKoobFilters('BeerDataSource.beerKoob', 'category', ['=', category]),null)",
  view_class: 'axes-selector/1II.bar',
  title: 'Axes-selector',
}

Обратите внимание на различие с предыдущей конструкцией: появилось обращение

if(get(x,'ids').get(0)=package,

В чем его суть:

  • 'ids' подразумевает, что есть несколько айдишек, представленных в виде массива, поэтому нужно повторное использование функции get

  • .get(0)=package означает, что вы сравниваете первый элемент массива с ожидаемым dim, порядок обозначен у вас в xAxes в примере это : 'package;quantity', , на этом отличия конструкций заканчиваются

То есть в целом, неважно, сколько измерений вы поставите на ось - для каждого из этих вариантов потребуется прописать свой if который будет обрабатывать именно этот вариант построения дэша

Огромное спасибо за быстрый и информативный ответ!
Модифицировал свой дэш по вашей инструкции - работает как описано.