Функции lpe
Функции lpe
Иногда возникает необходимость вычислить какое-либо выражение и результат вычисления использовать при построении SQL запроса. В этом случае возникают неоднозначности, так как функции sum()
, min()
, count()
и многие другие имеют реализацию и в LPE и в SQL. Чтобы разрешить эту неопределённость, используйте функцию lpe()
, которая вычисляет свой аргумент в контексте LPE и возвращает результат вычисления.
Например, выражение в шаблоне SQL 2+2
не будет вычислено, но будет передано в SQL “как есть”. Но выражение lpe(2+2)
будет вычислено и в SQL попадёт значение 4
.
lpe(expr)
Функция lpe
вычисляет свой аргумент expr
в контексте LPE. Это позволяет выполнить вычисления до генерации SQL запроса и подставлять вычисленные значения в нужное место в SQL запрос.
Пример:
lpe(rand())
При каждом запросе будет вычислятся новое случайное значение, и оно будет подставлено в SQL.
Функция lpe
появилась в luxmsbi-pg 9.3.4
ql(arg)
Функция ql
экранирует свой аргумент как текстовое значение SQL, то есть берёт значение в одинарные кавычки. Одинарные кавычки внутри аргумента arg
экранируются по правилам SQL, то есть удваиваются.
Пример:
// переменная a ссылается на строку quote'me
ql(a) // 'quote''me'
col1 = ql(a) // col1 = 'quote''me'
ensureThat(expr)
Функция ensureThat
выполняет выражение expr
без автоматической подстановки имени столбца в выражении expr
.
Функция ensureThat
будет полезна для использования в фильтрах для дэшей (на клиенте) и в выражениях для значения по-умолчанию для размерностей (defaultValue). В остальных случаях функция не делает никакой дополнительной работы и применять её не имеет смысла.
Функция ensureThat
появилась в версии luxmsbi-pg 9.4.1
Пример:
//Вариант выбора дат по-умолчанию за неделю от доступной максимальной даты
// Данный пример будет работать только если в кубе не используются SQL-шаблоны
{
defaultValue: 'lpe:ensureThat(dt <= total(max(dt)) and dt >= dateShift(total(max(dt)), -7, d)',
}
get_in(key, p0, … pn)
Функция get_in
возвращает различные значения, доступные в момент запроса. Аргумент key
задаёт имя объекта, в котором через остальные аргументы можно найти значение. Аргументы p0, . . . pn указывают на имена ключей или индексы массива, которые помогают перемещаться по сложной структуре JSON.
Начиная с версии 9.2.12 доступны следующие ключи key
:
user
: объект с информацией о текущем пользователе Luxms BI:id
: id пользователя (int)username
: логин пользователя (text)email
: email полльзователя (text)sys_config
: JSON объект с информацией из IAM систем (json)
Начиная с версии 9.4.3 доступны следующие ключи key
:
user
: объект с информацией о текущем пользователе Luxms BI:name
: (text) имя и/или фамилия пользователя;phone
: (text);lang
: (text);config
: (json);access_level
: (text);license_role_ident
: (text);site_role_ident
: (text);_password_valid_till
: (text);groups
: список объектов, каждый элемент содержит ключи:ident
: (text) идентификатор группы;title
: (text) название группы.
Например, чтобы обратиться к возрасту John, равному 30, в такой структуре:
{
"user": {
"sys_config": {
"employees": [
{ "name": "John", "age": 30 },
{ "name": "Jane", "age": 25 }
]
}
}
Нужно написать:
get_in('user', 'sys_config', 'employees', 1, 'age')
Узнать, какие параметры доступны для обращения через get_in, можно в источнике luxmsbi в схеме adm
в таблице users
.
Начиная с версии 9.3.5 доступны следующие ключи key
:
koob
query
: объект с информацией о запросе клиента Luxms BI через APIcolumns
: список столбцов;filters
: хэш фильтров;sort
: список сортировок;with
: имя куба.
Начиная с версии 10.1.0 доступны следующие ключи key
:
koob
access_filters
(json) информация о RLS фильтрах;access_filters_format
(text) Может принимать 2 значения:json
- значит в полеaccess_filters
данные в формате объекта JSON{}
. Этот формат совпадает с форматом фильтров, доступных черезget_in('koob', 'query', 'filters')
;lpe
- значит в полеaccess_filters
данные в формате LPE (JSON-список[]
).
Примеры:
Предположим, что Luxms BI имеет такую информацию о пользователе:
{
"id": 123,
"username": "user123",
"email": "user@luxms.bi",
"sys_config": {
"ext_domain": "customer.local",
"ext_groups": ["g1", "g2", "g3"],
"customval": "key1;key2;key3"
},
"groups": [
{
"ident": "GRP1",
"title": "Группа 1"
},
{
"ident": "G2",
"title": "Группа 2"
}
]
}
get_in('user', 'sys_config', 'ext_domain') // возвращает текст customer.local
Если вы хотите дополнительно обработать значения, возвращаемые get_in, перед отправкой их в SQL, используйте функцию lpe()
, чтобы стали доступны функци обработки строк, математические операторы и т.д.
column = ANY( lpe(get_in('user', 'sys_config', 'customval').split(';').map(ql) ))
/* получится column = ANY('key1','key2','key3') */
Предположим, что koob запрос (объект koob.query
) имеет такую структуру:
{
"with": "mssql.orders_full_ytd",
"columns": [
"productname",
"count(quantity):q"
],
"filters": {
"productname": [
"=",
"Детская одежда",
"Женская обувь"
]
},
"limit": 128,
"sort": [
"+productname"
]
}
Также предположим, что в столбце productname
хранятся имена товаров через запятую. Тогда мы могли бы написать вот такое выражение для фильтров:
lpe( let( [foo, get_in(koob,'query','filters','productname')],
str( if(foo.0 = '!=' and foo.count() > 1 , 'not ' , ''),
match(productname, foo.slice(1).join('|').ql() ))))
Так как в lpe нет функции match
, то она не будет выполняться в LPE, а перейдёт в SQL запрос. Функции slice
, join
, ql
, count
, if
, get_in
, let
выполнятся в LPE.
let(names, expr)
Функция let
выполняет выражение expr
, при этом выражению expr
доступны переменные, объявленные в списке names
.
Примеры:
let([a,2], a+a) // 4
Если нужно объявить несколько переменных, то каждое объявление делается в отдельном списке:
let([[a,2],[b,8]], a+b) // 10
Функция let
появилась в версии luxmsbi-pg 9.3.4