From 2a81e33b78459d8b0310af75d85980d854c1586d Mon Sep 17 00:00:00 2001 From: akulikov Date: Thu, 7 Dec 2023 17:27:56 +0300 Subject: [PATCH] http://jira.mfd.msk:8088/browse/CLS-599 --- .../imdg/base/TemplateEventMapStore.java | 8 +- .../RegistryHistoryMapStore.java | 151 +++++++++++++++++- 2 files changed, 148 insertions(+), 11 deletions(-) diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateEventMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateEventMapStore.java index 38d2dad01..cac56099d 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateEventMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/base/TemplateEventMapStore.java @@ -18,22 +18,22 @@ public abstract class TemplateEventMapStore loadAllKeys() { + public Iterable loadAllKeys() { return Collections.emptyList(); } @Override - public final T load(Long id) { + public T load(Long id) { return null; } @Override - public final Collection load(Collection keys) { + public Collection load(Collection keys) { return Collections.emptyList(); } @Override - public final Map loadAll(Collection keys) { + public Map loadAll(Collection keys) { return Collections.emptyMap(); } diff --git a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java index 09fbd3d8f..260686e24 100644 --- a/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java +++ b/clearing-parent/imdg/src/main/java/ru/spcex/clearing/imdg/businessevent/RegistryHistoryMapStore.java @@ -1,5 +1,6 @@ package ru.spcex.clearing.imdg.businessevent; +import org.springframework.dao.support.DataAccessUtils; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.stereotype.Component; import ru.clearing.classes.statics.data.registry.Registry; @@ -8,6 +9,11 @@ import ru.spcex.clearing.imdg.IMDGDistributedNames; import ru.spcex.clearing.imdg.base.TemplateEventMapStore; import ru.spcex.platform.utils.time.TimeUtil; +import java.math.BigDecimal; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.*; + @Component public class RegistryHistoryMapStore extends TemplateEventMapStore { @@ -15,23 +21,154 @@ public class RegistryHistoryMapStore extends TemplateEventMapStore loadAllKeys() { + return defaultLoadAllKeysOnTodayByField("EVENT_TIME", true); + } + + @Override + public RegistryHistory load(Long id) { + if (!isLoadable(id)) return null; + Collection rows; + List list = Collections.singletonList(id); + try { + rows = load(list); + } catch (Throwable e) { // one retry + rows = load(list); + } + RegistryHistory obj = DataAccessUtils.singleResult(rows); + if (obj != null && isLoadable(obj)) + return obj; + else + return null; + } + + @Override + public Map loadAll(Collection keys) { + log.debug("loadAll from " + getTableName() + " " + keys.size() + " keys"); + Map result = new HashMap<>(); + long start = System.currentTimeMillis(); + + // загрузить данные по ключам частями, чтобы не выйти за ограничения базы по кол-ву элементов в in clause + List keysSubList = new ArrayList<>(MAX_IN_CLAUSE_SIZE); + for (Iterator iterator = keys.iterator(); iterator.hasNext(); ) { + Long key = iterator.next(); + keysSubList.add(key); + if (keysSubList.size() == MAX_IN_CLAUSE_SIZE || !iterator.hasNext()) { + Collection rows = load(keysSubList); + for (RegistryHistory row : rows) { + result.put(row.getId(), row); + } + keysSubList.clear(); + } + } + + log.debug("loadAll from " + getTableName() + " " + keys.size() + " keys done in " + (System.currentTimeMillis() - start) + "ms"); + + return result; + } + + @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)); + } + + protected RegistryHistory objectReader(ResultSet resultSet) throws SQLException { + RegistryHistory registryHistory = new RegistryHistory(); + Registry object = new Registry(); + + registryHistory.setId(resultSet.getObject("ID", Long.class)); + registryHistory.setEventTime(getInstantFromTimestamp(resultSet, "EVENT_TIME")); + registryHistory.setUserId(resultSet.getObject("EVENT_USER_ID", Long.class)); + registryHistory.setEventType(resultSet.getObject("EVENT_TYPE", String.class)); + + object.setCreated(getInstantFromTimestamp(resultSet, "CREATED_AT")); + object.setUpdated(getInstantFromTimestamp(resultSet, "UPDATED_AT")); + + object.setId(resultSet.getObject("REGISTRY_ID", Long.class)); + object.setCompanyId(resultSet.getObject("COMPANY_ID", Long.class)); + object.setTradingCode(resultSet.getObject("TRADING_CODE", String.class)); + object.setClearingCode(resultSet.getObject("CLEARING_CODE", String.class)); + object.setShortName(resultSet.getObject("SHORT_NAME", String.class)); + object.setFullName(resultSet.getObject("FULL_NAME", String.class)); + object.setAccountId(resultSet.getObject("ACCOUNT_ID", Long.class)); + + object.setAccountType(resultSet.getObject("ACCOUNT_TYPE", String.class)); + object.setAccount(resultSet.getObject("ACCOUNT", String.class)); + object.setRegistryDesignation(resultSet.getObject("REGISTRY_DESIGNATION", String.class)); + object.setRegistryInstrumentType(resultSet.getObject("REGISTRY_INSTRUMENT_TYPE", String.class)); + object.setRegistryCapacity(resultSet.getObject("REGISTRY_CAPACITY", String.class)); + + object.setRegistryUnit(resultSet.getObject("REGISTRY_UNIT", String.class)); + object.setRegistryCode(resultSet.getObject("REGISTRY_CODE", String.class)); + object.setTradingClearingRegistryId(resultSet.getObject("TRADING_CLEARING_REGISTRY_ID", Long.class)); + object.setTradingClearingRegistry(resultSet.getObject("TRADING_CLEARING_REGISTRY", String.class)); + + object.setRegistryStatus(resultSet.getObject("REGISTRY_STATUS", String.class)); + object.setSecurityId(resultSet.getObject("SECURITY_ID", Long.class)); + object.setSecuritySymbol(resultSet.getObject("SECURITY_SYMBOL", String.class)); + object.setBalance(resultSet.getObject("BALANCE", BigDecimal.class)); + object.setOpenBalance(resultSet.getObject("OPEN_BALANCE", BigDecimal.class)); + object.setCloseBalance(resultSet.getObject("CLOSE_BALANCE", BigDecimal.class)); + + object.setCredit(resultSet.getObject("CREDIT", BigDecimal.class)); + object.setDebit(resultSet.getObject("DEBIT", BigDecimal.class)); + object.setSettledCredit(resultSet.getObject("SETTLED_CREDIT", BigDecimal.class)); + object.setSettledDebit(resultSet.getObject("SETTLED_DEBIT", BigDecimal.class)); + object.setCheckBalance(resultSet.getObject("CHECK_BALANCE", BigDecimal.class)); + object.setDiffBalance(resultSet.getObject("DIFF_BALANCE", BigDecimal.class)); + object.setPlanBalance(resultSet.getObject("PLAN_BALANCE", BigDecimal.class)); + + object.setBalanceDimension(resultSet.getObject("BALANCE_DIMENSION", String.class)); + object.setSettlementDate(getLocalDateFromSqlDate(resultSet, "SETTLEMENT_DATE")); + object.setSettlementCode(resultSet.getObject("SETTLEMENT_CODE", String.class)); + object.setTradingDate(getLocalDateFromSqlDate(resultSet, "TRADING_DATE")); + object.setClearingDate(getLocalDateFromSqlDate(resultSet, "CLEARING_DATE")); + object.setRefundDate(getLocalDateFromSqlDate(resultSet, "REFUND_DATE")); + + object.setValueDate(getLocalDateFromSqlDate(resultSet, "VALUE_DATE")); + object.setPrice(resultSet.getObject("PRICE", BigDecimal.class)); + object.setContract(resultSet.getObject("CONTRACT", String.class)); + object.setCounterPartyId(resultSet.getObject("COUNTER_PARTY_ID", Long.class)); + object.setComment(resultSet.getObject("COMMENT", String.class)); + object.setParentId(resultSet.getObject("PARENT_ID", Long.class)); + object.setGroupId(resultSet.getObject("GROUP_ID", Long.class)); + object.setSessionId(resultSet.getObject("SESSION_ID", Long.class)); + + object.setSessionType(resultSet.getObject("SESSION_TYPE", String.class)); + object.setPaymentId(resultSet.getObject("PAYMENT_ID", Long.class)); + + registryHistory.setObject(object); + return registryHistory; + } + @Override public Object[] objectToField(RegistryHistory historyLog) { Registry object = historyLog.getObject();