DataTransformService
Мотивация
Когда надо выбрать много данных один раз и потом немного доагрегировать в разных плоскостях и пофильтровать, например для графиков или дашбордах данных из bigquery.
Пример использования: https://samples-demo.devision.io/page?p=4959&a=35 (opens in a new tab)
Принципиально все достаточно просто - у вас есть DataResult и вы хотите его перегруппировать. Для этого сперва получаем данные, например sql запросом в скрипте res, а потом в отдельном meta/js скрипте делаем вызов DataTransformService.pivot с необходимыми параметрами.
<script type="meta/sql" db-alias="meta_samples" id="res" entity-id="2629" label="Исходные данные. Можно не выводить на интерфейс, тут просто для понимания исходных данных" order="10">
SELECT
...
json_build_object(
'pager', json_build_object('total', count(*) over()),
'headers', json_build_array(
...
)
) as table_props_field
FROM "public"."employee"
</script>
<script type="meta/js" id="res_rows_cols" span="6" label="Rows and Cols" order="20">
function main(pvm, DataTransformService) {
return DataTransformService.pivot(pvm.data.res, {
rows: ["isActive"],
cols: ["first_name"],
metrics: [
{expression: "salary"},
],
dimensionFilterClauses: [
{
operator: "AND",
filters: [
{
dimensionName: "name",
operator: "IN_LIST",
expressions: ["Юрий Гагарин", "Дмитрий Медведев", "Дмитрий Менделеев"]
}
]
}
]
});
}
</script>
PivotConfig
{
// то, что группируется по строкам
"rows": ["name"],
// группировка по колонкам. (Не обязательно)
"cols": ["isActive"],
// ограничение по строкам после группировки (Не обязательно). По умолчанию 0 - не заадано
"limit": 10,
// Можно группировать существующие поля и описывать расчетные
// За основу взято https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet#Metric
"metrics": [
{"expression": "salary"},
{"expression": "bigDecimal"},
{"expression": "[metric:salary] / 10", "alias": "new_salary"},
{"expression": "[metric:salary] * [metric:salary] * [metric:organizationId]", "alias": "multi_mul"},
],
// Сортировка (Не обязательно)
// Идет после группировки
"orderBys": [
{"fieldName": "salary", "sortOrder": "DESC"}
],
// ограничение по строкам после группировки (Не обязательно). По умолчанию false
"includeEmptyRows": false,
"dimensionFilterClauses": [
{
// Обязательно. Пока поддерживается только AND
"operator": "AND",
"filters": [
{
// Делает условие обратным (Не обязательно)
// По умолчанию - false
"not": false,
// поле для фильров
"dimensionName": "name",
// Поддерживаются операторы IS_NULL, EXACT, PARTIAL, IN_LIST, BEGINS_WITH, ENDS_WITH
// за основу взят https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet#Operator
// По умолчанию EXACT
"operator": "IN_LIST",
// Строки и регулярные выражения для сопоставления.
// В целях сравнения используется только первое значение списка (кроме случаев, когда применяется оператор IN_LIST).
// Если применяется оператор IN_LIST, фильтрация параметров выполняется по всему списку фильтров, согласно описанию оператора IN_LIST.
// Для IS_NULL передавать не обязательно
"expresions": ["Юрий Гагарин", "Дмитрий Медведев", "Дмитрий Менделеев"]
}
]
}
]
}