Использование LPE в кубе
В кубе можно использовать выражение${filters}
. Оно используется для вставки пользовательских фильтров из управляющего дэша или onClickDataPoint
в тело запроса.
Чтобы перечисленные ниже функции отрабатывали в кубе, нужно в конфиг куба вставить выражение is_template: 1
.
Функция filters()
Синтаксис:
<...>
where ${filters()}
Это выражение подставляет в куб условия, пришедшие из запроса дэша.
Запрос дэша в Luxms BI представляет собой JSON объект следующего формата:
{
"with":"pokaz22.pokaz22",
"columns":["test","name","sum(v_main):smv"],
"filters":{
"test":["=","Доктора наук+Профессор"],
"name":["=","Женщины","Мужчины"]
}
}
В поле columns
перечисляются measures и dimensions, запрашиваемые дэшем. Поле filters
содержит объект, где ключами являются наименования dimensions, а их значениями - массивы. В этих массивах первым элементом идёт знак сравнения, а последующими - перечень значений.
На основе приведённого выше JSON объекта выражение ${filters()}
составит следующий запрос:
SELECT
sum(v_main) as smv,
degree as test,
name as name
FROM
(
<куб>
WHERE degree = 'Доктора наук+Профессор'
AND name in ('Женщины','Мужчины')
) as pokaz22
Обратите внимание, что в случае, когда в фильтрах размерности выбрано несколько значений, автоматически используется условие in
.
Вы можете увидеть получившийся запрос, добавив параметр ?meta
к ссылке запроса дэша, скопированного в виде cURL.
Параметры функции filters()
В качестве параметров этой функции могут перечисляться названия одного или нескольких полей.
Необходимо использовать названия полей из куба, а не из источника
Синтаксис:
<запрос>
WHERE ${filters([column1, column2, ...])}
Перечисление полей определяет, какие именно фильтры передаются в куб. Написав ${filters(name, test)}
, мы получим результат, аналогичный тому, что описан выше.
Приведём пример с JSON объектом, описанным выше:
Фрагмент куба:
<...>
WHERE ${filters(name)}
Запрос:
SELECT
sum(v_main) as smv,
degree as test,
name as name
FROM
(
<куб>
WHERE name in ('Женщины','Мужчины')
) as pokaz22
Функция except()
Синтаксис:
<запрос>
WHERE ${filters(except(<column1> [, column2, ...]))}
Данная функция в качестве параметров принимает одно или несколько ID полей в кубе. Перечисленные поля исключаются из перечня подставляемых в запрос.
То есть, если в случае испольования функции filters()
мы рассчитываем, что в запрос подставятся только выбранные значения, то функция except()
исключит из запроса все перечисленные в ней значения.
Указание алиаса таблицы
В случае, если в SQL запросе то или иное поле встречается в нескольких таблицах, то в функции filters() может потребоваться указать алиас конкретной таблицы. Или, может быть название размерности, по которой выполняется фильтрация, не совпадает с именем поля в таблице. Указать требуемое название таблицы и поля можно в следующей нотации:
${filters("column1":("table1"."fieldname1"))}
Или, если требуется указать и имя схемы, то следующим образом:
${filters("column1":("public"."table1"."fieldname1"))}
Фукнция filter() с аргументом get_in()
Здесь используется функция filter() (не filters() что описана выше)
Функция get_in() описана здесь. С помощью нее можно получать данные о текущем пользователе LuxmsBI и прокинуть в SQL-запрос куба:
SELECT name, id
FROM "test"."test"
WHERE ${filter(site_ident=get_in(user,site_role_ident))}
После указания данного условия в кубе, в случае входа в систему под юзером с ролью Super итоговый запрос будет выглядеть следующим образом:
SELECT "name" as name, "id" as id
FROM (
select "name" as name, "id" as id from "test"."test"
where site_ident = Super
) AS test
В случае необходимости оборачивания в кавычки значения необходимо также использовать функцию ql()
SELECT name, id
FROM "test"."test"
WHERE ${filter(site_ident=ql(get_in(user,site_role_ident)))}
Итоговый запрос будет выглядеть следующим образом:
SELECT "name" as name, "id" as id
FROM (
select "name" as name, "id" as id from "test"."test"
where site_ident = 'Super'
) AS test
Функцию get_in() можно также использовать и для генерации столбца в кубе:
select ${filter(ql(get_in('user','site_role_ident')))} as role ,* from table
При выполнении данного запроса в кубе будет также добавлен столбец role с сайтовой ролью пользователя.
Если ключ, указанный в get_in будет не найден, то в результат вернется undefined. Во избежание непредвиденного поведения необходимо использовать конструкцию case/when.
Пример:
select
case
when ${filter(ql(get_in(user, sys_config, param)))} != ''
and ${filter(ql(get_in(user, sys_config, param)))} != 'undefined'
then ${filter(ql(get_in(user, sys_config, param)))}
else NULL
end as column_1,
*
from table