В этой статье хотелось бы начать раскрытие больной для многих пользователей Apache Superset темы — фильтры по дате. Начнем с малого: как суперсет выбирает колонку даты; как выбрать желаемую колонку вместо той, которую он выбирает; каким образом это реализовано; какие баги породили этим решением; почему КОП не доведет до добра.

P.S. картинки лучше не нашел, поэтому держите некрасовского.

Сразу скажу — объяснений, что такое суперсет, дашборд, чарт и т.д. не будет.

Имеется: установленная версия 3.1.1. Да, я знаю, что уже есть аж 6. Но версии 3-4 на рынке встречается гораздо чаще, чем 6, и на это есть множество причин, на объяснение которых можно выделить еще несколько статей. Начиная, например, с того, почему новые версии штампуются с неадекватной частотой, и заканчивая тем, почему жадность рано или поздно (скорее рано) погубит мир.

Задача: сделать дашборд, добавить на него простейший чарт "таблица", построенный на датасете, в котором несколько колонок временнОго типа. Затем на готовом дашборде добавить фильтр по дате и научится выбирать желаемую колонку даты для фильтра, так как при создании фильтра возможности выбрать желаемую колонку даты НЕТ. Да, это даже звучит как бред, но фильтры по дате в суперсете во истину не для слабонервных.

Для простоты возьмем дефолтный при установке датасет messages, построим визуализацию типа "таблица", в которую включим все колонки с датой, которые в этом датасете есть.

Выделенное красным — колонки с датой. Суперсет автоматически ставит колонки с временнЫм типом в верх списка, вне зависимости от того, какая СУБД под капотом. Помимо выделенных колонок также добавим парочку других, таблица с одними лишь колонками даты режет глаз. И так, вот финальный вид чарта:

Далее закидываем его на дашборд и добавляем фильтр по дате:

Как видим, при создании фильтра действительно нельзя выбрать желаемую колонку даты. В нашем случае после сохранения и применения фильтра будет выбрана одна из трех колонок. Давайте посмотрим, какая, добавив следующее условие в фильтр:

Выберем last day. Нам не сильно важно, какое именно условие мы выберем. Важно, какую колонку выберет суперсет и почему. Применяем фильтр и смотрим на запрос, полетевший в БД:

Видим, что была выбрана колонка bot_profile__updated. Теперь давайте посмотрим, почему именно она. Взглянем на датасет:

Вот и ответ на вопрос — при создании датасета суперсет автоматически выбрал bot_profile__updated как дефолтную колонку даты (только лишь потому, что она первая лексикографически, все настолько тривиально). Конечно, первый и самый простой вариант — просто выбрать нужную колонку с датой в качестве дефолтной. Но, это рабочий способ только в том случае, если на этом датасете построен только один чарт (напоминаю, ну или ввожу в курс - на одном датасете можно построить сколько угодно чартов, и каждый чарт можно добавить на сколько угодно дашбордов, ограничений нет). А что делать, если на этом датасете много чартов? Тогда, если мы изменим дефолтн��ю колонку даты, то все другие дашборды, имеющие этот чарт, будут работать неправильно, ведь начнут фильтроваться по другой колонке даты! И более того, это не вызовет никакой ошибки. Мы просто незаметно для всех сломаем бизнес-логику других дашбордов. Так делать ни в коем (почти) случае нельзя. И более того - желтая плашка на скрине именно об это и предупреждает.

Конечно же, по-хорошему, нужно переделывать фильтр, давая пользователю самому выбирать желаемую колонку даты для фильтрации. Но, к сожалению, чаще всего разработчикам в этот момент на помощь приходит КОП (костыльно-ориентированное программирование), ну либо же дефолтный способ исправить проблему: добавь еще один уровень абстракции. Так и было сделано:

Да, эту проблему решили тем, что добавили фильтр типа Time column, который можно привязать к датасету. Далее он выдернет из датасета все колонки временнОго типа и на дашборде этот фильтр даст возможность самому выбрать, по какой колонке даты вы хотите фильтроваться:

Выбираем, например, ts:

Значение ts, выбранное в фильтре типа Time column, прокидывается во все фильтры с датой на дашборде.

Суммарно невозможность привязать фильтр по дате к конкретной колонке конкретного датасета и КОП с Time column открывают целый спектр багов, таких как: невозможность добавить два фильтра по дате на один датасет; невозможность добавить два фильтра по дате по разным колонкам на один дашборд; невозможность понять, а не сломал ли кто-нибудь добрую половину дашбордов, просто выбрав другую колонку даты по умолчанию в датасете и т.д.

И да, в 6 версии все то же самое (она не врет, проверено):

Вот чем опасен КОП - на дворе 2026, уже вышла 6 версия, MCP, темная тема и другие крутые никому не нужные фичи, а фильтры по дате как были абсолютно невменяемыми, так и остались. И исправлять это никто, конечно же, не будет.

P.S. Понимаю, что "дарённому коню в зубы не смотрят". Но, стоит сказать, что этого "коня" уже давно научились неплохо так доить. Поэтому оставлю ссылку, где коммитерам предлагали реализовать фичу за 2000$.

https://github.com/apache/superset/issues/32496#issuecomment-2697177813

Конечно же, большинство коммитеров монетизируют свой вклад в проект тем или иным способ. Также не стоит забывать про Preset и приколы с документацией, но это темы совсем другой статьи.

Мораль сей басни такова: КОП до добра не доведет. Ну а мы стали понимать суперсет немного лучше.

Ну а если хотите понимать суперсет еще лучше - добро пожаловать на курс автора статьи. По промокоду HABR_BEST предоставляется скидка 30% - Apache Superset: полный курс