Язык запросов META (METAQL)
METAQL - Это защищенный SQL для запросов к данным меты. Основан на синтаксисах Oracle + PostgreSQL. Призван дать хороший и безопасный API к данным таблиц или views ваших БД. Ниже приведены особенности реализации синтаксиса MetaQL и список разрешенных функций. Если для реализации нужной функциональности вам недостаточно разрешенного пула возможностей, обратитесь к разработчикам Платформы.
Особенности
SELECT * FROM ...
не поддерживается- Нельзя называть поля или алясы зарезарвированными именами: date
- Поддерживаются только SELECT запросы
- JOIN не поддерживаются
- Работает ограниченный набор функций, описанных ниже
- OR в условиях не поддерживается. Используется AND с отицанием или IN ( ... )
Функции
Функции агрегации:
- MIN, MAX, SUM, AGV
- COUNT(*), COUNT(DISTINCT поле)
- ARRAY_AGG
Функции преобразований:
- ROUND
- CONCAT
- NULLIF
- COALESCE
- TRIM
- LOWER
- UPPER
- CAST
Экранирование
Одинарная кавычка экранируется одинарной кавычкой. Например, еси вам нужно поискать все кампании, в названии которых есть одинарная кавычка, то вам необходимо выполнить такой запрос:
select id, remote_id, name, engine from adplatform.campaign where name like '%''%'
Ели нужно поискать клиента по точному совпадению, то принцип будет такой же:
select id, name from adplatform.client where name = 'Тестовый '' проект'
Как сделать таблицу доступной через METAQL API ?
Выполните следующие действия:
1) Добавьте новую Сущность для своей таблицы (если нужно)
Обязательно укажите alias. Alias должен быть указан в формате lower_camel_case. Добавить можно здесь: https://samples-demo.devision.io/page?p=62&a=1 (opens in a new tab)
Опционально укажите metaql_where Это поле отвечает за безусловную фильтрацию данных при любом запросе к METAQL. Например для статистики хорошо фильтровать по доступным клиентам:
#table.client_id in (select client_id from get_user_clients(${env.userId?number}) )
'#table' - это плейсхолдер metaql таблицы. он будет заменен на реальное имы при компиляции запроса
2) Заполните поля Сущности
Обязательно укажите alias. Alias должен быть указан в формате lower_camel_case.
Использование
LEGO
MetaQL можно использовать в lego формах для того, чтобы не делать отдельные script
Например это активно используется в тикетной системе, где из-за высокого уровня абстракции нет возможности хардкодить отдельные script-ы для получения данных
Обратите внимание, что доступна фильтрация metaql по depends ("env.sp.org_id" из примера). Пример тут: https://samples-demo.devision.io/page?p=4528&a=35 (opens in a new tab)
var elems = [
// ...
{
id:"epl_list",
span: 4,
label: "Сотрудники",
depends:["org_id"],
refPvmData: {id:"$metaql", sp:{"dbQuery": {
command:" \
SELECT id, name, salary \
FROM meta_samples.employee \
WHERE organization_id = :env.sp.org_id \
ORDER BY name DESC \
"
}}},
},
{
id:"epls_graph2",
label: "Стата",
name:"me-chart",
attrs: {"type":["line", "table"], "nativeOptions":{"vAxis":{"logScale":true}} },
refPvmData: {id:"$metaql", sp:{"dbQuery": {
command:" \
SELECT \
stat_date, \
SUM(impressions) as impressions, \
SUM(clicks) as clicks, \
SUM(cost) as cost \
FROM adplatform.campaign_stats_report \
WHERE client_id = 15759 \
AND stat_date BETWEEN '2017-03-01' AND '2017-04-01' \
GROUP BY stat_date \
ORDER BY stat_date \
"
}}},
},
// ...
]
SDK
Запрос к статистике
SELECT
engine as platform,
campaign_remote_id,
SUM(impressions) as impressions,
SUM(clicks) as clicks,
ROUND(SUM(cost), 3) as cost
FROM adplatform.campaign_stats_report
WHERE stat_date BETWEEN '2017-02-01' AND '2017-03-31'
AND engine = 'banner'
AND client_id IN (1, 2)
GROUP BY platform, campaign_remote_id
ORDER BY platform, campaign_remote_id
Запрос к шардированным данным системы Garpun
SELECT match_type, count(id) as cnt
FROM garpun_storage.keyword#{account_id}
group by match_type
Получение изменившихся клиентов
SELECT id, name, modification_time
FROM adplatform.client
WHERE modification_time > '2020-03-31T12:21:46+0300'