diff --git a/clearing-parent/backend-api/src/main/resources/meta.xml b/clearing-parent/backend-api/src/main/resources/meta.xml index 8b59e7323..55f60361c 100644 --- a/clearing-parent/backend-api/src/main/resources/meta.xml +++ b/clearing-parent/backend-api/src/main/resources/meta.xml @@ -206,7 +206,7 @@ - + @@ -303,7 +303,7 @@ - + diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/KeyRate.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/KeyRate.java new file mode 100644 index 000000000..fa0891ef5 --- /dev/null +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/KeyRate.java @@ -0,0 +1,59 @@ +package ru.clearing.classes.StaticData.Misc; + +import ru.spcex.platform.classes.base.SpcexObjectBase; + +import java.math.BigDecimal; +import java.time.Instant; + +/** + * Ключевая ставка ЦБ + * + * DB table: KEY_RATE + **/ +public class KeyRate extends SpcexObjectBase { + private BigDecimal rate; + private Instant startDate; + private Instant endDate; + private String document; + private String workflowStatus; + + public BigDecimal getRate() { + return rate; + } + + public void setRate(BigDecimal rate) { + this.rate = rate; + } + + public Instant getStartDate() { + return startDate; + } + + public void setStartDate(Instant startDate) { + this.startDate = startDate; + } + + public Instant getEndDate() { + return endDate; + } + + public void setEndDate(Instant endDate) { + this.endDate = endDate; + } + + public String getDocument() { + return document; + } + + public void setDocument(String document) { + this.document = document; + } + + public String getWorkflowStatus() { + return workflowStatus; + } + + public void setWorkflowStatus(String workflowStatus) { + this.workflowStatus = workflowStatus; + } +} diff --git a/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/MoneyMarketSecurity.java b/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/MoneyMarketSecurity.java new file mode 100644 index 000000000..40f57035e --- /dev/null +++ b/clearing-parent/classes/src/main/java/ru/clearing/classes/StaticData/Misc/MoneyMarketSecurity.java @@ -0,0 +1,95 @@ +package ru.clearing.classes.StaticData.Misc; + +import ru.spcex.platform.classes.base.SpcexObjectBase; + +import java.math.BigDecimal; +import java.time.Instant; + +/** + * Инструменты Денежного рынка + *

+ * DB table: MONEY_MARKET_SECURITY + **/ +public class MoneyMarketSecurity extends SpcexObjectBase { + private Long securityId;// (linked to security) + private String description; + private Instant startDate; + private Instant endDate; + private BigDecimal nominalValue; + private Long nominalCurrency; // (linked to currencyCode) + private String instrumentType; // (linked to instrumentType) + private String fullName; + private String securitySymbol; + + public Long getSecurityId() { + return securityId; + } + + public void setSecurityId(Long securityId) { + this.securityId = securityId; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public Instant getStartDate() { + return startDate; + } + + public void setStartDate(Instant startDate) { + this.startDate = startDate; + } + + public Instant getEndDate() { + return endDate; + } + + public void setEndDate(Instant endDate) { + this.endDate = endDate; + } + + public BigDecimal getNominalValue() { + return nominalValue; + } + + public void setNominalValue(BigDecimal nominalValue) { + this.nominalValue = nominalValue; + } + + public Long getNominalCurrency() { + return nominalCurrency; + } + + public void setNominalCurrency(Long nominalCurrency) { + this.nominalCurrency = nominalCurrency; + } + + public String getInstrumentType() { + return instrumentType; + } + + public void setInstrumentType(String instrumentType) { + this.instrumentType = instrumentType; + } + + public String getFullName() { + return fullName; + } + + public void setFullName(String fullName) { + this.fullName = fullName; + } + + public String getSecuritySymbol() { + return securitySymbol; + } + + public void setSecuritySymbol(String securitySymbol) { + this.securitySymbol = securitySymbol; + } +} diff --git a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql index a8c367c0b..b6acee77f 100644 --- a/clearing-parent/db-scripts/src/main/resources/db/DDL.sql +++ b/clearing-parent/db-scripts/src/main/resources/db/DDL.sql @@ -549,7 +549,7 @@ COMMENT ON COLUMN RELATION_UPDATE.SERVICE_PRODUCT_ID IS 'Идентификат COMMENT ON COLUMN RELATION_UPDATE.COMMENT IS 'Текст причины'; -- bankAccount - Банковские счета -CREATE TABLE IF NOT EXISTS BANK_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), _сORRESPONDENT_ACCOUNT varchar(255)); +CREATE TABLE IF NOT EXISTS BANK_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), CORRESPONDENT_ACCOUNT varchar(255)); COMMENT ON TABLE BANK_ACCOUNT IS 'Банковские счета'; COMMENT ON COLUMN BANK_ACCOUNT.ID IS 'Идентификатор записи'; @@ -576,11 +576,11 @@ COMMENT ON COLUMN BANK_ACCOUNT.TAXPAYER_IDENTIFICATION_NUMBER IS 'Идентиф COMMENT ON COLUMN BANK_ACCOUNT.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки'; -COMMENT ON COLUMN BANK_ACCOUNT._сORRESPONDENT_ACCOUNT IS 'Корреспондентский счет'; +COMMENT ON COLUMN BANK_ACCOUNT.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет'; -- Update log of bankAccount - Банковские счета -CREATE TABLE IF NOT EXISTS BANK_ACCOUNT_UPDATE(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), _сORRESPONDENT_ACCOUNT varchar(255)); +CREATE TABLE IF NOT EXISTS BANK_ACCOUNT_UPDATE(BANK_ACCOUNT_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, ACCOUNT_ID bigint, BANK_IDENTIFICATION_CODE varchar(255), BANK_NAME varchar(255), CORRESPONDENT_ACCOUNT_NAME varchar(255), CURRENCY char(4), DESTINATION varchar(255), IBAN varchar(255), INTERNATIONAL_TRANSFER_SIGN char(4), SWIFT_CODE varchar(255), TAXPAYER_IDENTIFICATION_NUMBER varchar(255), TAX_REGISTRATION_REASON_CODE varchar(255), CORRESPONDENT_ACCOUNT varchar(255)); COMMENT ON TABLE BANK_ACCOUNT_UPDATE IS 'Журнал изменений таблицы bankAccount'; COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.BANK_ACCOUNT_ID IS 'Идентификатор записи в таблице BANK_ACCOUNT'; COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.EVENT_TIME IS 'Дата и время изменения'; @@ -610,7 +610,7 @@ COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.TAXPAYER_IDENTIFICATION_NUMBER IS 'Иде COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.TAX_REGISTRATION_REASON_CODE IS 'Код причины постановки'; -COMMENT ON COLUMN BANK_ACCOUNT_UPDATE._сORRESPONDENT_ACCOUNT IS 'Корреспондентский счет'; +COMMENT ON COLUMN BANK_ACCOUNT_UPDATE.CORRESPONDENT_ACCOUNT IS 'Корреспондентский счет'; -- clearingAccount - Клиринговые счета CREATE TABLE IF NOT EXISTS CLEARING_ACCOUNT(ID bigint PRIMARY KEY, ACCOUNT_ID bigint, CASH_ACCOUNT_ID bigint, DEPO_ACCOUNT_ID bigint, SETTLEMENT_CODE varchar(255)); @@ -753,7 +753,7 @@ COMMENT ON COLUMN CURRENCY_UPDATE.COUNTRY_CODE IS 'Идентификатор к COMMENT ON COLUMN CURRENCY_UPDATE.CURRENCY_CODE IS 'Идентификатор кода валюты (linked to currencyCode)'; -- moneyMarketSecurity - Инструменты Денежного рынка -CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY(ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), ID numeric(72,2) PRIMARY KEY); +CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY(ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255)); COMMENT ON TABLE MONEY_MARKET_SECURITY IS 'Инструменты Денежного рынка'; COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Идентификатор записи'; @@ -776,8 +776,6 @@ COMMENT ON COLUMN MONEY_MARKET_SECURITY.FULL_NAME IS 'Полное наимен COMMENT ON COLUMN MONEY_MARKET_SECURITY.SECURITY_SYMBOL IS 'Код инструмента'; -COMMENT ON COLUMN MONEY_MARKET_SECURITY.ID IS 'Размер лота (linked to listing)'; - -- Update log of moneyMarketSecurity - Инструменты Денежного рынка CREATE TABLE IF NOT EXISTS MONEY_MARKET_SECURITY_UPDATE(MONEY_MARKET_SECURITY_ID BIGINT NOT NULL, EVENT_TIME timestamp, EVENT_USER_ID BIGINT, ID bigint PRIMARY KEY, SECURITY_ID bigint, DESCRIPTION varchar(255), START_DATE date, END_DATE date, NOMINAL_VALUE numeric(72,2), NOMINAL_CURRENCY bigint, INSTRUMENT_TYPE char(4), FULL_NAME varchar(255), SECURITY_SYMBOL varchar(255), ID numeric(72,2) PRIMARY KEY); diff --git a/clearing-parent/imdg/pom.xml b/clearing-parent/imdg/pom.xml index f465c5845..b3bd2cfea 100644 --- a/clearing-parent/imdg/pom.xml +++ b/clearing-parent/imdg/pom.xml @@ -69,6 +69,12 @@ platform-imdg-api-hazelcast-impl + + + org.testng + testng + test + jar/${project.artifactId} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java new file mode 100644 index 000000000..23eefe7b5 --- /dev/null +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/AutoconfiguredMap.java @@ -0,0 +1,7 @@ +package ru.spcex.clearing.imdg.base; + +public interface AutoconfiguredMap { + String getMapName(); + + String[] getIndexingField(); +} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateMapStore.java new file mode 100644 index 000000000..34120e399 --- /dev/null +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateMapStore.java @@ -0,0 +1,89 @@ +package ru.spcex.clearing.imdg.base; + +import org.springframework.jdbc.core.JdbcTemplate; +import ru.spcex.clearing.imdg.utils.DbUtilsHelper; +import ru.spcex.platform.classes.base.SpcexObjectBase; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + +/** + * MapStore для шаблонных бизнес-объектов + * @Component + */ +public abstract class TemplateMapStore extends ObjectBaseMapStore implements AutoconfiguredMap { + + protected final int validateSize = getFields().length; + + protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id"); + + public TemplateMapStore(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + } + +// @Override +// public String getTableName() { +// return "COMPANY_ROLE_SET"; +// } +// +// @Override +// public String[] getFields() { +// return new String[]{"id", "roleid", "companyid"}; +// } + +// //todo TradingDay флаг +// protected boolean useTradingDay() { +// return false; +// } + + /** + * + * @return IMDGDistributedNames.* + */ + public abstract String getMapName(); + + /** + * Список индексируемых полей, для быстрого поиска + * @return + */ + public String[] getIndexingField() { + return null; + } + + /** + * Десериализатор + * @param resultSet + * @return + */ + protected abstract T objectReader(ResultSet resultSet) throws SQLException; + + @Override + public Collection load(Collection keys) { + Map> paramMap = Collections.singletonMap("ids", keys); + return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap, + (resultSet, i) -> objectReader(resultSet)); + } + + /** + * Сериализатор + * @param resultSet + * @return Object[] args + */ + protected abstract Object[] objectToField(T resultSet); + + @Override + public void store(Map map) { + List batchArgs = new ArrayList<>(); + for (Map.Entry entry : map.entrySet()) { + T obj = entry.getValue(); + Object[] args = objectToField(obj); + if (args.length != validateSize) { + throw new IllegalArgumentException("objectToField return " + args.length + " arguments, but expected " + validateSize); + } + batchArgs.add(args); + } + batchInsertUpdate(insertStatement, batchArgs); + } + +} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateUpdateMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateUpdateMapStore.java new file mode 100644 index 000000000..c809cbf32 --- /dev/null +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateUpdateMapStore.java @@ -0,0 +1,87 @@ +package ru.spcex.clearing.imdg.base; + +import org.springframework.jdbc.core.JdbcTemplate; +import ru.clearing.classes.objects.BusinessEvent; +import ru.clearing.classes.objects.BusinessObject; +import ru.spcex.clearing.imdg.utils.DbUtilsHelper; +import ru.spcex.clearing.imdg.utils.TimeUtil; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +//@Component +public abstract class TemplateUpdateMapStore> extends BusinessEventMapStore { + + protected final int validateSize = getFields().length; + protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id"); + + public TemplateUpdateMapStore(JdbcTemplate jdbcTemplate) { + super(jdbcTemplate); + } + +// @Override +// public String getTableName() { +// return "COMPANY_UPDATE"; +// } +// +// @Override +// public String[] getFields() { +// return new String[]{ +// "id", "event_time", "event_user_id", +// "company_id", "created_at", "updated_at", "status", "clearing_code", "exchange_code" +// }; +// } + + /** + * Сериализатор + * @param object + * @return Object[] args + */ + protected abstract Object[] objectToField(T object); + + protected Object[] objectToField(TU updateObject, T object) { + ArrayList lst=new ArrayList<>(); + lst.add(updateObject.getId()); + lst.add(TimeUtil.fromInstant(updateObject.getEventTime())); + lst.add(updateObject.getUserId()); + lst.addAll(Arrays.asList(objectToField(object))); + //todo order? +// new Object[]{ +// companyUpdate, +// , +// companyUpdate.getUserId(), +// new Object[]{ +// companyUpdate.getId(), +// TimeUtil.fromInstant(companyUpdate.getEventTime()), +// companyUpdate.getUserId(), +// +// company.getId(), // company_id +// TimeUtil.fromInstant(company.getCreated()), +// TimeUtil.fromInstant(company.getUpdated()), +// company.getStatusId(), +// company.getClearingCode(), +// company.getExchangeCode() +// }; + return lst.toArray(); + } + + @Override + public void store(Map map) { + List batchArgs = new ArrayList<>(); + + for (Map.Entry entry : map.entrySet()) { + TU updateContainer = entry.getValue(); + T obj = updateContainer.getObject(); + + Object[] args = objectToField(updateContainer, obj); + if (args.length != validateSize) { + throw new IllegalArgumentException("objectToField return " + args.length + " arguments, but expected " + validateSize); + } + batchArgs.add(args); + } + batchInsertUpdate(insertStatement, batchArgs); + } + +} diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java index 83ac8391d..61ba1d890 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/HazelcastConfiguration.java @@ -7,6 +7,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import java.util.List; + @Configuration public class HazelcastConfiguration { @@ -55,13 +57,19 @@ public class HazelcastConfiguration { config.addMapConfig(poolMapConfigs.map_OrganizationTypeDictionary()); config.addMapConfig(poolMapConfigs.map_WorkflowStatusDictionary()); - config.addMapConfig(poolMapConfigs.map_CompanyRoleSet()); +// config.addMapConfig(poolMapConfigs.map_CompanyRoleSet()); todo протестировать автоконфигуратор конфигурации мапсторов config.addMapConfig(poolMapConfigs.map_CompanySymbols()); config.addMapConfig(poolMapConfigs.map_ProfileDocument()); config.addMapConfig(poolMapConfigs.map_Contact()); config.addMapConfig(poolMapConfigs.map_Company()); // config.addMapConfig(poolMapConfigs.map_CompanyUpdate()); + // Автоподключение мап + List autoMapCfg = poolMapConfigs.autoconfiguratorOfMapstorages(); + for (MapConfig cfg: autoMapCfg) { + config.addMapConfig(cfg); + } + return config; } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java index 159dc2b56..37f6b2c53 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/config/PoolMapConfigs.java @@ -2,8 +2,13 @@ package ru.spcex.clearing.imdg.config; import com.hazelcast.config.*; import com.hazelcast.core.MapLoader; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Configuration; +import ru.spcex.clearing.imdg.base.TemplateMapStore; import ru.spcex.clearing.imdg.businessevent.CompanyUpdateMapStore; import ru.spcex.clearing.imdg.businessobject.CompanyMapStore; import ru.spcex.clearing.imdg.dictionary.*; @@ -13,8 +18,14 @@ import ru.spcex.clearing.imdg.object.ContactMapStore; import ru.spcex.clearing.imdg.object.ProfileDocumentMapStore; import ru.spcex.clearing.imdg.utils.IMDGDistributedNames; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashSet; +import java.util.List; + @Configuration public class PoolMapConfigs { + private Logger log = LoggerFactory.getLogger(getClass()); private ConfigurationRootElement configRoot = DfaConfig.get().getRoot(); @@ -127,12 +138,43 @@ public class PoolMapConfigs { - @Autowired - private CompanyRoleSetMapStore companyRoleSetMapStore; +// @Autowired todo эксперимент с мапстором, см. ниже autoconfiguratorOfMapstorage. +// private CompanyRoleSetMapStore companyRoleSetMapStore; +// +// public MapConfig map_CompanyRoleSet() { +// return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanyRoleSet, companyRoleSetMapStore) +// .addMapIndexConfig(makeMapIndexConfig("companyId")); +// } - public MapConfig map_CompanyRoleSet() { - return makeDefaultMapConfig(IMDGDistributedNames.Map_CompanyRoleSet, companyRoleSetMapStore) - .addMapIndexConfig(makeMapIndexConfig("companyId")); + @Autowired + private List> listOfAutopluginStores; + + // @Qualifier("AutoconfiguredMapStore") + public List autoconfiguratorOfMapstorages() { + List out = new ArrayList<>(); + HashSet existMapStores = new HashSet<>(); + for (TemplateMapStore mapStore : listOfAutopluginStores) { + log.debug("Link mapstore {} to map {}", mapStore.toString(), mapStore.getMapName()); + if (StringUtils.isEmpty(mapStore.getMapName())) { + throw new IllegalArgumentException("MapStore " + mapStore + " has empty mapName"); + } + if (existMapStores.contains(mapStore.getMapName())) { + throw new IllegalArgumentException("MapStore " + mapStore + " has wrong mapName=\"" + mapStore.getMapName() + "\" is duplicated"); + } + existMapStores.add(mapStore.getMapName()); // IMDGDistributedNames + MapConfig mapCfg = makeDefaultMapConfig(mapStore.getMapName(), mapStore); + if (mapStore.getIndexingField() != null && mapStore.getIndexingField().length > 0) { + if (log.isTraceEnabled()) { + log.trace("Create indexing filed on {}: {}", mapStore.getMapName(), Arrays.toString(mapStore.getIndexingField())); + } + for (String indexName : mapStore.getIndexingField()) { + mapCfg.addMapIndexConfig(makeMapIndexConfig(indexName)); + } + } + out.add(mapCfg); + } + log.debug("Configured {} mapStore's", out.size()); + return out; } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/CompanyRoleSetMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/CompanyRoleSetMapStore.java index 2fa1c286b..a5cddd8a2 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/CompanyRoleSetMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/object/CompanyRoleSetMapStore.java @@ -4,12 +4,16 @@ import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import ru.clearing.classes.StaticData.Company.CompanyRoleSet; import ru.spcex.clearing.imdg.base.ObjectBaseMapStore; +import ru.spcex.clearing.imdg.base.TemplateMapStore; import ru.spcex.clearing.imdg.utils.DbUtilsHelper; +import ru.spcex.clearing.imdg.utils.IMDGDistributedNames; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.*; @Component -public class CompanyRoleSetMapStore extends ObjectBaseMapStore { +public class CompanyRoleSetMapStore extends TemplateMapStore { public CompanyRoleSetMapStore(JdbcTemplate jdbcTemplate) { super(jdbcTemplate); @@ -20,41 +24,39 @@ public class CompanyRoleSetMapStore extends ObjectBaseMapStore { return "COMPANY_ROLE_SET"; } + @Override + public String getMapName() { + return IMDGDistributedNames.Map_CompanyRoleSet; + } + + @Override + public String[] getIndexingField() { + return new String[]{};// список индексируемых полей + } + // IMDGDistributedNames.Map_CompanyRoleSet + @Override public String[] getFields() { return new String[]{"id", "roleid", "companyid"}; } - protected final String insertStatement = DbUtilsHelper.createUpdateOrInsert(getTableName(), getFields(), "id"); - @Override - public Collection load(Collection keys) { - Map> paramMap = Collections.singletonMap("ids", keys); - return namedParameterJdbcTemplate.query("select * from " + getTableName() + " where id in (:ids)", paramMap, - (resultSet, i) -> { - CompanyRoleSet companyRoleSet = new CompanyRoleSet(); - companyRoleSet.setId(resultSet.getObject("id", Long.class)); - companyRoleSet.setRoleId(resultSet.getObject("roleid", Long.class)); - companyRoleSet.setCompanyId(resultSet.getObject("companyid", Long.class)); - return companyRoleSet; - }); + protected CompanyRoleSet objectReader(ResultSet resultSet) throws SQLException { + CompanyRoleSet companyRoleSet = new CompanyRoleSet(); + companyRoleSet.setId(resultSet.getObject("id", Long.class)); + companyRoleSet.setRoleId(resultSet.getObject("roleid", Long.class)); + companyRoleSet.setCompanyId(resultSet.getObject("companyid", Long.class)); + return companyRoleSet; } @Override - public void store(Map map) { - List batchArgs = new ArrayList<>(); - - for (Map.Entry entry : map.entrySet()) { - CompanyRoleSet partnerList = entry.getValue(); - - Object[] args = new Object[]{ - partnerList.getId(), - partnerList.getRoleId(), - partnerList.getCompanyId(), - }; - batchArgs.add(args); - } - batchInsertUpdate(insertStatement, batchArgs); + protected Object[] objectToField(CompanyRoleSet partnerList) { + Object[] args = new Object[]{ + partnerList.getId(), + partnerList.getRoleId(), + partnerList.getCompanyId(), + }; + return args; } } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/utils/IMDGDistributedNames.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/utils/IMDGDistributedNames.java index a132554ec..42da77c3b 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/utils/IMDGDistributedNames.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/utils/IMDGDistributedNames.java @@ -25,6 +25,8 @@ public final class IMDGDistributedNames { public static final String Map_OrganizationTypeDictionary = "Map_OrganizationTypeDictionary"; public static final String Map_WorkflowStatusDictionary = "Map_WorkflowStatusDictionary"; + public static final String Map_KeyRate = "Map_KeyRate"; + public static final String Map_MoneyMarketSecurity = "Map_MoneyMarketSecurity"; public static final String MAP_SEQUENCE_NAME = "MAP_SEQUENCE_NAME"; // todo вынести idGenerator отдельно и завернуть в метод, чтобы не напрямую обращаться. } diff --git a/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/utils/DbUtilsHelperTest.java b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/utils/DbUtilsHelperTest.java new file mode 100644 index 000000000..1d3c23bb6 --- /dev/null +++ b/clearing-parent/imdg/src/test/java/ru/spcex/clearing/imdg/utils/DbUtilsHelperTest.java @@ -0,0 +1,15 @@ +package ru.spcex.clearing.imdg.utils; + +import static org.testng.Assert.*; + +public class DbUtilsHelperTest { + + @org.testng.annotations.Test + public void testCreateUpdateOrInsert() { + String sql = DbUtilsHelper.createUpdateOrInsert("ENERGY", + new String[]{"id", "power", "circle", "of", "fantasy", "prime"}, "id"); + assertEquals(sql, + "INSERT INTO ENERGY (\"ID\", \"POWER\", \"CIRCLE\", \"OF\", \"FANTASY\", \"PRIME\") values (?, ?, ?, ?, ?, ?) ON CONFLICT (ID) DO UPDATE SET \"POWER\"=EXCLUDED.\"POWER\", \"CIRCLE\"=EXCLUDED.\"CIRCLE\", \"OF\"=EXCLUDED.\"OF\", \"FANTASY\"=EXCLUDED.\"FANTASY\", \"PRIME\"=EXCLUDED.\"PRIME\"" + ); + } +} \ No newline at end of file diff --git a/pom.xml b/pom.xml index bef2f8875..65d895c46 100644 --- a/pom.xml +++ b/pom.xml @@ -127,6 +127,14 @@ spring-kafka 2.8.1 + + + + org.testng + testng + 7.5 + test +