META
DataTransformService

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": ["Юрий Гагарин", "Дмитрий Медведев", "Дмитрий Менделеев"]
        }
      ]
    }
  ]
}