Работа со слоями

Возможности изменения слоя

Изменить слой с UI возможно только при импорте модели.

Также можно изменить слой при отправке REST запроса POST v1/dg/meta/asset-types или PUT v1/dg/meta/asset-types/{id}, заполнив при этом поле tags следующим образом:

Пример поля tags с указанием нужного слоя:

   "tags": [
   {
       "name": "layer"
       "value": "logical"  // В случае, если актив принадлежит к логическому слою,
       "value": "business" // В случае, если актив принадлежит к концептуальному слою
   }
]

При попытке добавить актив к физическому слою будет получена ошибка.

Фильтрация и агрегация результатов

Добавлена поддержка фильтрации и агрегации по слоям в поисковом запросе. Фильтрация осуществляется посредством добавления formField'ов. Возможна фильтрация как по одному слою, так и по нескольким.

formFields для фильтрации:

"formFields": [
{
  "name": "$layer",                             // Имя поля слоя актива
  "type": "STRING",
  "searchType": "EXACT",
  "inverted": false,
  "value": "logical"                            // Имя слоя
},
{
  "name": "$layer",
  "type": "STRING",
  "searchType": "EXACT",
  "inverted": false,
  "value": "business"
}
]

Для агрегации результатов по слоям необходимо добавить следующий фрагмент в поисковый запрос:

Агрегация результатов по слоям актива:

"aggregations": [
{
  "aggregationType": "term",                        // Тип агрегации
  "aggregationName": "term_layer_aggregation",      // Название агрегации
  "path": "$layer",                                 // Имя агрегируемого поля
  "minCount": 1,
  "size": 100000
}
]

Пример запроса и ожидаемого ответа:

Пример запроса с фильтрацией и агрегацией:

   {
   "payload": {
       "org.unidata.mdm.rest.v2.dq.data": {
           "setNames": [],
           "ruleNames": [],
           "functionNames": [],
           "message": null,
           "severity": null,
           "category": null,
           "totalScore": 0,
           "matchAll": false,
           "negate": false
       },
       "org.unidata.dg.rest.v1.data": {
           "drafts": false,
           "countOnly": false,
           "totalCount": true,
           "returnFields": [
               "$etalon_id",
               "$display_name",
               "$type_name",
               "$type_display_name",
               "$data_status"
           ],
           "searchFields": [
               "$etalon_id",
               "$display_name",
               "$external_keys",
               "$ownership.username"
           ],
           "entity": "",
           "text": "",
           "searchDataType": "ASSET",
           "returnAllFields": false,
           "searchAllFields": false,
           "hierarchical": false,
           "supplementary": [],
           "formFields": [
               {
                   "inverted": false,
                   "name":"$layer",
                   "searchType":"EXACT",
                   "type":"String",
                   "value":"logical"
               },
               {
                   "inverted": false,
                   "name":"$layer",
                   "searchType":"EXACT",
                   "type":"String",
                   "value":"business"
               }
           ],
           "fetchAll": false,
           "aggregations": [
               {
                   "aggregationType": "term",
                   "aggregationName": "term_layer_aggreagation",
                   "path": "$layer",
                   "minCount": 1,
                   "size": 100000
               }
           ],
           "page": 1,
           "count": 10,
           "sortFields": [
               {
                   "field": "$popularity",
                   "order": "DESC",
                   "type": "STRING"
               },
               {
                   "field": "$created_at",
                   "order": "DESC",
                   "type": "DATE"
               }
           ]
       }
   }
}

Пример ответа:

   {
   "details": {
       "info": [],
       "warning": [],
       "error": []
   },
   "payload": {
       "org.unidata.dg.rest.v1.data": {
           "fields": [
               "$deleted",
               "$layer",
               "$data_status",
               "$type_display_name",
               "$type_name",
               "$display_name",
               "$etalon_id"
           ],
           "hits": [
               {
                   "id": "20222c97-d3fa-11ef-ad85-3bb2d2d6d24e",
                   "score": 1.0,
                   "status": null,
                   "preview": [
                       ...
                       ,
                       {
                           "field": "$layer",
                           "fieldDisplayName": null,
                           "fieldValueType": null,
                           "values": [
                               "logical"
                           ],
                           "extendedValues": [
                               {
                                   "value": "logical",
                                   "displayValue": null,
                                   "linkedEtalonId": null,
                                   "linkedTypeName": null
                               }
                           ],
                           "complexValues": null
                       }
                       ...
                   ],
                   "source": null
               },
               {
                   "id": "1b503221-d3fa-11ef-ad85-3bb2d2d6d24e",
                   "score": 1.0,
                   "status": null,
                   "preview": [
                       ...
                       {
                           "field": "$layer",
                           "fieldDisplayName": null,
                           "fieldValueType": null,
                           "values": [
                               "logical"
                           ],
                           "extendedValues": [
                               {
                                   "value": "logical",
                                   "displayValue": null,
                                   "linkedEtalonId": null,
                                   "linkedTypeName": null
                               }
                           ],
                           "complexValues": null
                       }
                       ...
                   ],
                   "source": null
               }
           ],
           "totalCount": 2,
           "totalCountLimit": 200000,
           "hasRecords": false,
           "maxScore": 0.9326271,
           "aggregations": [
               {
                   "aggregationName": "term_layer_aggreagation",
                   "aggregationType": "TERM",
                   "documentsCount": 2,
                   "countMap": {
                       "logical": 2            // имя слоя : количество параметров
                   }
               }
           ]
       }
   }
}

Есть возможность агрегации записей с отсутствующим значением. В агрегации search запроса необходимо добавить поле missing. Значение этого поля - имя, в которое будут собираться агрегируемые значения.

Агрегация с учетом отсутствующего значения:

  "aggregations": [
  {
    "aggregationType": "term",                        // Тип агрегации
    "aggregationName": "term_layer_aggregation",      // Название агрегации
    "path": "$layer",                                 // Имя агрегируемого поля
    "minCount": 1,
    "size": 100000,
    "missing": "no_value"                             // Имя поля, в котором будет статистика по записям, у которых отсутствует агрегируемое поле
  }
]

Ответ search запроса с отсутствующей агрегацией:

   {
 "details": {
   "info": [],
   "warning": [],
   "error": []
 },
 "payload": {
   "org.unidata.dg.rest.v1.data": {
     "fields": [
       ...
     ],
     "hits": [
       ...
     ],
     "totalCount": 12,
     "totalCountLimit": 200000,
     "hasRecords": false,
     "maxScore": 0,
     "aggregations": [
       {
         "aggregationName": "term_layer_aggregation",
         "aggregationType": "TERM",
         "documentsCount": 12,
         "countMap": {
           "physical": 2,
           "logical": 5,
           "no_value": 5
         }
       }
     ]
   }
 }
}