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, который необходимо удалить