RecordsService (Java)

RecordsService - сервис для работы с абстрактными записями, источником которых может быть любой DAO.

Существует четыре операции, которые можно проделывать над записями:

1. Поиск записей

Методы: query, queryOne

Для поиска записей всегда передается RecordsQuery, который содержит параметры поиска. Помимо самого простого метода для поиска с одним параметром RecordsQuery так же есть варианты с объединенным поиском и запросом атрибутов.

recordsService.queryOne(
  RecordsQuery.create()
          .withSourceId("emodel/person")
        .withLanguage(PredicateService.LANGUAGE_PREDICATE)
        .withQuery(Predicates.and(
                Predicates.eq("city", "Tomsk"),
                Predicates.eq("organization", "Citeck")))
        .withConsistency(Consistency.EVENTUAL)
        .addSort(new SortBy("_created", true))
        .build());
recordsService.query(RecordsQuery.create()
        .withSourceId("edi/edi-inbound-main-document")
        .withLanguage(PredicateService.LANGUAGE_PREDICATE)
        .withQuery(Predicates.and(
                Predicates.eq("type", "emodel/type@testip-inboundPackage"),
                Predicates.eq("testip:isNeedSendToVim", true),
                Predicates.not(
                        Predicates.eq("testip:isAlreadySentToVim", true)
                )
        ))
        .withConsistency(Consistency.EVENTUAL)
        .build());
  • .withLanguage – указываем язык запроса;

  • .withQuery – сам запрос;

  • .withConsistency – Consistency (Согласованность). Возможные варианты: EVENTUAL, TRANSACTIONAL, DEFAULT, TRANSACTIONAL_IF_POSSIBLE

  • .addSort – указываем по какому полю нужна сортировка

  • .build() – сборка запроса

На выходе:

  • при query получаем RecsQueryRes<RecordRef>

  • при queryOne получаем RecordRef

2. Получение атрибутов записи

Методы: getAtt, getAtts

recordsService.getAtt(documentRef, "eint:ediProviderType?str").asText();
  • documentRef – record, к которому обращаемся

  • «eint:ediProviderType?str» – параметр, который хотим получить

List<ObjPropertyClass> list = recordsService.getAtt(documentRef, "objProperty[]?json").asList(ObjPropertyClass.class);
RecordAtts recordAtts = recordsService.getAtts(RecordRef.valueOf(nodeRef.toString()),
      Collections.singletonMap("assocId", name + "[]?id"));

Существует два уровня абстрации для получения атрибутов:

DTO Class > Attributes

  • DTO Class - класс, который используется для генерации списка аттрибутов для формирования схемы и запроса атрибутов из DAO.

После получения всех данных из DAO идет создание инстансов переданного DTO класса и наполнение его данными с помощью библиотеки jackson; Список аттрибутов формируется либо из названий полей, либо можно добавить аннотацию AttName для указания атрибута вручную.

  • Attributes - аттрибуты записи в чистом виде. Есть варианты с одним атрибутом, списком атрибутов или набором ключ->значение (Map)

3. Мутация (изменение или создание) записи

Каждый DAO решает сам создавать или редактировать полученную запись. Если в DAO приходит запись с пустым идентификатором, то это команда к созданию новой записи.

Изменение записи

RecordAtts recordAtts = new RecordAtts();
recordAtts.setId(recordRef);
recordAtts.setAtt("testdl:isOutboundPackageSyncNeeded", false);
recordsService.mutate(recordAtts);

Для обновления записи необходимо указывать .setId() записи которой необходимо изменить.

Создание записи

RecordAtts recordAtts = new RecordAtts();
recordAtts.setAtt(RecordConstants.ATT_TYPE, "emodel/type@testdl-routeTemplateItem");
recordAtts.setAtt(RecordConstants.ATT_PARENT, "eproc/routeTemplate@c897a06d-e1b5-4564-9966-762124399dfd");
recordAtts.setAtt(RecordConstants.ATT_PARENT_ATT, "routes");
recordsService.mutate(recordAtts);

При создании новой записи параметр setId() не указывается.

Если при мутации указать атрибут:

__disableAudit=true

(константа DbRecordsControlAtts.DISABLE_AUDIT), то поля:

_creator
_created
_modifier
_modified

заполняться автоматически не будут. Если эти поля установить вручную, то в БД попадут именно они.

Для creator и modifier допустимо указывать как username так и полный ref пользователя.

Атрибут

__disableAudit

допустимо проставлять только в контексте системы (runAsSystem)

4. Удаление записи

recordsService.delete(routeTemplate);
  • RecordRef routeTemplate – record, который необходимо удалить