ECOS Data
ecos-data - это библиотека, которая позволяет добавлять новые Records DAO, записи которых будут храниться в БД. Библиотека на основе атрибутов в ECOS типе автоматически создает таблицы и предоставляет базовые операции над записями:
Создание новых записей;
Получение атрибутов у записей по их ID;
Поиск записей с использованием языка предикатов;
Поддерживаемые БД:
Тип |
Версия |
PostgreSQL |
9.4+ |
Хранение данных в ecos-model
В ECOS по умолчанию для типов предусмотрено хранение в микросервисе ecos-model. Для этого достаточно на форме типа выбрать тип источника данных «ECOS Model». Микросервис ecos-model для всех подобных типов автоматически создаст RecordsDAO с идентификатором (sourceId), который формируется по следующим правилам:
Берем id типа и меняем camelCase на kebab-case;
Переводим id в нижний регистр;
Заменяем все специальные символы на
-
;Убираем все задублировавшиеся символы
-
заменяя их на одинарные (т.е.--
заменяем на-
);Если длина полученного id получилась больше 42х символов, то берем первые 34 символа из id, добавляем
-
плюс контрольная сумма оставшихся символов в идентификаторе;Убираем символ
-
в начале идентификатора и в конце если он там есть
Примеры:
camelCaseTest -> camel-case-test
kebab-case-id -> kebab-case-id
a----b- -> a-b
$$$-abc-$$$ -> abc
При создании типа с sourceId, который конфликтует с существующими будет показана ошибка. Чтобы проверить список зарегистрированных sourceId можно выполнить следующий скрипт в консоли браузера:
await Citeck.Records.query({sourceId: 'emodel/src', query: {}, language:'predicate'}, '?localId')
Создание нового RecordsDAO в своем микросервисе
Для создания нового RecordsDAO в своем микросервисе нужно добавить следующую Spring конфигурацию
Java:
import kotlin.Unit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import ru.citeck.ecos.data.sql.domain.DbDomainConfig;
import ru.citeck.ecos.data.sql.domain.DbDomainFactory;
import ru.citeck.ecos.data.sql.dto.DbTableRef;
import ru.citeck.ecos.data.sql.records.DbRecordsDaoConfig;
import ru.citeck.ecos.data.sql.service.DbDataServiceConfig;
import ru.citeck.ecos.model.lib.type.service.utils.TypeUtils;
import ru.citeck.ecos.records2.RecordRef;
import ru.citeck.ecos.records3.record.dao.RecordsDao;
@Configuration
public class CustomRecordsDaoConfig {
private DbDomainFactory dbDomainFactory;
@Bean
public RecordsDao customRecordsDao() {
RecordRef typeRef = TypeUtils.getTypeRef("ecos-type-id");
return dbDomainFactory.create(
DbDomainConfig.create()
.withRecordsDao(
DbRecordsDaoConfig.create(b -> {
b.withId("records-dao-id");
b.withTypeRef(typeRef);
return Unit.INSTANCE;
})
)
.withDataService(
DbDataServiceConfig.create(b -> {
b.withAuthEnabled(false);
b.withTableRef(new DbTableRef("schema_name", "table_name"));
b.withStoreTableMeta(true);
return Unit.INSTANCE;
})
)
.build()
).build();
}
@Autowired
public void setDbDomainFactory(DbDomainFactory dbDomainFactory) {
this.dbDomainFactory = dbDomainFactory;
}
}
Kotlin:
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import ru.citeck.ecos.data.sql.domain.DbDomainConfig
import ru.citeck.ecos.data.sql.domain.DbDomainFactory
import ru.citeck.ecos.data.sql.dto.DbTableRef
import ru.citeck.ecos.data.sql.records.DbRecordsDaoConfig
import ru.citeck.ecos.data.sql.service.DbDataServiceConfig
import ru.citeck.ecos.model.lib.type.service.utils.TypeUtils
import ru.citeck.ecos.records3.record.dao.RecordsDao
@Configuration
class CustomRecordsDaoConfig(
private val dbDomainFactory: DbDomainFactory
) {
@Bean
fun customRecordsDao(): RecordsDao {
val typeRef = TypeUtils.getTypeRef("ecos-type-id")
val recordsDao = dbDomainFactory.create(
DbDomainConfig.create()
.withRecordsDao(
DbRecordsDaoConfig.create {
withId("records-dao-id")
withTypeRef(typeRef)
}
)
.withDataService(
DbDataServiceConfig.create {
withAuthEnabled(false)
withTableRef(DbTableRef("schema_name", "table_name"))
withStoreTableMeta(true)
}
)
.build()
).build()
return recordsDao
}
}