META

Язык запросов META (METAQL)

METAQL - Это защищенный SQL для запросов к данным меты. Основан на синтаксисах Oracle + PostgreSQL. Призван дать хороший и безопасный API к данным таблиц или views ваших БД.

Особенности

  • SELECT * FROM ... не поддерживается
  • Нельзя называть поля или алясы зарезарвированными именами: date
  • Добавлен оператор ILIKE для регистронезависимного сравнения строк
  • Поддерживаются только SELECT запросы
  • JOIN не поддерживаются
  • Работает ограниченный набор функций, описанных ниже
  • OR в условиях не поддерживается. Используется AND с отицанием или IN ( … )

Функции

Работают функции агрегации:

  • MIN, MAX, SUM, AGV
  • COUNT(*), COUNT(DISTINCT поле)
  • ARRAY_AGG

Функции преобразований:

  • ROUND
  • CONCAT
  • NULLIF
  • COALESCE

Экранирование

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

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

Опционально укажите 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

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'