Перейти к основному содержимому

Функции 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 через API
      • columns: список столбцов;
      • 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