Сегодня разберемся, что такое кросс-фильтрация в Apache Superset и какую неожиданную опасность она может нести.
Помимо классических фильтров, позволяющих пользователю вводить/выбирать нужные значения, существуют также и кросс-фильтры. Они позволяют связывать виджеты на дашборде без использования фильтров. Проще взглянуть на пример классического для Apache Superset дашборда COVID Vaccine Dashboard:

В данном примере пользователь нажал (и вот как правило случайно) на ячейку пирога, и у бар-чарта автоматически перестроился график.
Механизм очень простой:
пользователь нажал на ячейку
суперсет запомнил, что пользователь выделил, на уровне датасета. Проще представить, что он перевел это в классический SQL-фильтр. В данном случае это WHERE stage_of_development in ('2. Phase II or Combined I/II')
затем во всех виджетах на дашборде (на конкретном листе, в данном случае он один) он пытается этот фильтр применить. Для этого он лезет в датасет каждого виджета и, если в нем есть колонка stage_of_development, добавляет условие WHERE stage_of_development in ('2. Phase II or Combined I/II'). Работает это именно по имени колонки.
Вот, что добавилось в формирование датасета, который перестроился после действий пользователя:

Да, он привез кучу всего, но на самом деле это просто копипаст логики из чарта пирога, один в один.
Полезный ли это механизм? Ну, наверно да, ведь он позволяет не делать 100500 фильтров, а вот так просто на чистом UI реализовать фильтрацию. Но это несет в себе и недостатки.
Пользователь просто не знает про этот механизм
Представьте, что вы делали дашборд для человека, который далек от IT. И уж тем более от приколов суперсета. Ну, например, для ГД. Весьма занятого человека с кучей встреч, миллионом задач, диким стрессом и высочайшим уровнем ответственности. Одним словом — этому человеку абсолютно индифферентно (синоним подберете) на какую-то там суперсетовскую кросс-фильтрацию. Да и на того, кто этот дашборд делал. Ему просто срочно нужен отчет для важной встречи.
И вот в момент изучения цифр дашборда ГД, не зная про кросс-фильтры, нечаянно жамкнул на ячейку пирога. Все чарты, у которых в датасете есть колонка stage_of_development, перестроились. Откуда не знающему человеку знать, что произошло? Так и должно быть? А если он просто жамкнул и даже не заметил, что что-то произошло, ведь не всегда все чарты умещаются в экран?
Да, далеко за примером ходить не нужно, просто пролистаем ниже этот дашборд и взглянем на то, что нужно увидеть пользователю для того, чтобы понять, что к виджету применены какие-то фильтры:


Пользователь явно будет огорчен, ведь даже текст мелким шрифтом на последнем листе ипотечного договора более читабелен, чем это.
Но постойте, а откуда там циферка 2? Мы же жамкнули всего один раз на ячейку пирога?
Количество кросс-фильтров не ограничено
Это был небольшой спойлер ко второй проблеме — количество кросс-фильтров не ограничено ничем и никак. Можно тыкнуть - можно и фильтр прокинуть. И даже если на этот виджет ты уже "тыкал", то при "тыке" на другой виджет с него пробросится фильтр на тот виджет, на который ты уже тыкал!

Да, все работает именно так, как на картинке. Без лишних слов, идем чинить проблему
Сброс всех кросс-фильтров
Представьте, что в процессе аналитики/истерики пользователь натыкал на дашборде несколько кросс-фильтров. Как их все найти? Неужели лазать по всем чартам и искать с куклой-вуду где там и что натыкано? — нет, к счастью.

Хорошая новость в том, что все кросс-фильтры собраны там же, где и обычные фильтры. Плохая же новость в том, что нет кнопки "удалить все" (хотя в последних версиях мб и завезли, не проверял). В общем, удаляем все, что тут есть, и продолжаем работать с дашбордом.
Отключаем кросс-фильтрацию
Если же хочется избежать этих невзгод вообще, то можно отключить кросс-фильтрацию.
Способ 1: радикальный. Отключаем кросс-фильтрацию в принципе как опцию. Для этого в конфиг в переменную FEATURE_FLAGS вносим запись "DASHBOARD_CROSS_FILTERS": True
Способ 2: умеренный. Отключаем кросс-фильтрацию для конкретного дашборда. Делается в том же меню, где и сброс кросс-фильтров (убираем галочку, и кросс-фильтрация отключается):

Заключение:
Сегодня мы познакомились со включенной по умолчанию и, казалось бы, полезной и безобидной функцией кросс-фильтров в Apache Superset. Но, если применить фантазию и щепотку любопытства, то окажется, что она может принести много вреда.
Конечно же, это далеко не единственный "казус". Если хотите знать Apache Superset без сюрпризов - добро пожаловать на курс автора статьи.
