execution uploading optimization
This commit is contained in:
parent
fc8d235fce
commit
4bf2c45c69
5 changed files with 99 additions and 89 deletions
|
|
@ -0,0 +1,15 @@
|
|||
package ru.spcex.clearing.service.execution;
|
||||
|
||||
import java.time.Instant;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||
|
||||
public record ExecUploadCashInfo(Long id, Instant createDt) {
|
||||
|
||||
public static ExecUploadCashInfo cash(Long id, Instant createDt) {
|
||||
return new ExecUploadCashInfo(id, createDt);
|
||||
}
|
||||
|
||||
public static ExecUploadCashInfo cash(ExecutionCommon exec) {
|
||||
return new ExecUploadCashInfo(exec.getId(), exec.getCreated());
|
||||
}
|
||||
}
|
||||
|
|
@ -6,10 +6,8 @@ import java.time.LocalDate;
|
|||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import org.apache.kafka.clients.producer.Producer;
|
||||
import org.slf4j.Logger;
|
||||
|
|
@ -66,7 +64,7 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
|
|||
private final Function<STrades, IValidator> stradesValidator;
|
||||
private final KafkaSender kafkaSender;
|
||||
private static final DateTimeFormatter contractFormatter = DateTimeFormatter.ofPattern("ddMMyy");
|
||||
private final Set<ExecUploadKey> cash = new HashSet<>();
|
||||
private final Map<ExecUploadKey, ExecUploadCashInfo> cash = new HashMap<>();
|
||||
|
||||
|
||||
|
||||
|
|
@ -106,14 +104,16 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
|
|||
// }
|
||||
|
||||
public void processNewTS(Long fromId) {
|
||||
if (fromId == null) {
|
||||
boolean cleanLoad = fromId == null;
|
||||
if (cleanLoad) {
|
||||
cash.clear();
|
||||
initExecCash();
|
||||
}
|
||||
LocalDate today = LocalDate.now();
|
||||
log.debug("Start check new S_TRADE at {}, fromId={}", today, fromId);
|
||||
//выбираем STrades на сегодня с правильным section
|
||||
Collection<STrades> sTrades;
|
||||
if (fromId == null) {
|
||||
if (cleanLoad) {
|
||||
sTrades = sTradeImdg.getCollectionObjectsByFieldValues(Map.of(
|
||||
"tradeDate", LocalDate.now(),
|
||||
"section", Section.CURR.getKey()
|
||||
|
|
@ -135,30 +135,20 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
|
|||
}
|
||||
|
||||
//убираем уже добавленные в ExecutionCurrency
|
||||
sTrades.removeIf(sTrd -> {
|
||||
Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation());
|
||||
if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) {
|
||||
log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation());
|
||||
return true;
|
||||
}
|
||||
// MoneyFlowSide excDepSide = sTrdSide == Side.BUY ? MoneyFlowSide.BUY : MoneyFlowSide.SELL;
|
||||
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
|
||||
sTrd.getTradeNum(),
|
||||
sTrdSide.getKey());
|
||||
if (fromId != null) {
|
||||
return cash.contains(excKey);
|
||||
} else {
|
||||
ExecutionCurrency exec = executionCurrencyImdg.getFirstObjectByFieldValues(
|
||||
Map.of("tradingDate", sTrd.getTradeDate(),
|
||||
"exchangeExecutionId", sTrd.getTradeNum(),
|
||||
"side", sTrdSide.getKey()));
|
||||
if (exec != null) {
|
||||
cash.add(excKey);
|
||||
if (!cleanLoad) {
|
||||
sTrades.removeIf(sTrd -> {
|
||||
Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation());
|
||||
if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) {
|
||||
log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
// MoneyFlowSide excDepSide = sTrdSide == Side.BUY ? MoneyFlowSide.BUY : MoneyFlowSide.SELL;
|
||||
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
|
||||
sTrd.getTradeNum(),
|
||||
sTrdSide.getKey());
|
||||
return cash.containsKey(excKey);
|
||||
});
|
||||
}
|
||||
log.info("{} strades left after already-added filtering", sTrades.size());
|
||||
|
||||
Map<Long, ExecutionCurrency> execsToInsert = new HashMap<>();
|
||||
|
|
@ -175,9 +165,17 @@ public class ExecutionCurrencyComponent implements IExecutionUploadComponent {
|
|||
ExecutionCurrency newEC;
|
||||
try {
|
||||
newEC = createExecutionCurrency(sTrd, validator);
|
||||
newEC.setId(idGen.nextId());
|
||||
ExecUploadKey execKey = ExecUploadKey.cash(newEC);
|
||||
ExecUploadCashInfo storedId;
|
||||
if (!cleanLoad || (storedId = cash.get(execKey)) == null) {
|
||||
newEC.setId(idGen.nextId());
|
||||
cash.put(execKey, ExecUploadCashInfo.cash(newEC));
|
||||
} else {
|
||||
newEC.setId(storedId.id());
|
||||
newEC.setUpdated(newEC.getCreated());
|
||||
newEC.setCreated(storedId.createDt());
|
||||
}
|
||||
execsToInsert.put(newEC.getId(), newEC);
|
||||
cash.add(ExecUploadKey.cash(newEC));
|
||||
//executionCurrencyImdg.insert(newEC);
|
||||
sendNotification(newEC);
|
||||
log.debug("New executionCurrency.id={} was created.", newEC.getId());
|
||||
|
|
|
|||
|
|
@ -6,10 +6,8 @@ import java.time.LocalDate;
|
|||
import java.time.format.DateTimeFormatter;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import org.apache.kafka.clients.producer.Producer;
|
||||
import org.slf4j.Logger;
|
||||
|
|
@ -69,7 +67,7 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
|
|||
private final IMessageResolver msgResolver;
|
||||
private final Function<STrades, IValidator> stradesValidator;
|
||||
private final KafkaSender kafkaSender;
|
||||
private final Set<ExecUploadKey> cash = new HashSet<>();
|
||||
private final Map<ExecUploadKey, ExecUploadCashInfo> cash = new HashMap<>();
|
||||
private static final DateTimeFormatter contractFormatter = DateTimeFormatter.ofPattern("ddMMyy");
|
||||
|
||||
|
||||
|
|
@ -105,13 +103,15 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
|
|||
}
|
||||
|
||||
public void processNewTS(Long fromId) {
|
||||
if (fromId == null) {
|
||||
boolean cleanLoad = fromId == null;
|
||||
if (cleanLoad) {
|
||||
cash.clear();
|
||||
initExecCash();
|
||||
}
|
||||
log.debug("Start check new S_TRADE after {}, fromId={}", tradingDay, fromId);
|
||||
//выбираем STrades на сегодня с правильным section
|
||||
Collection<STrades> sTrades;
|
||||
if (fromId == null) {
|
||||
if (cleanLoad) {
|
||||
sTrades = sTradeImdg.getCollectionObjectsByFieldValues(Map.of(
|
||||
"tradeDate", LocalDate.now(),
|
||||
"section", Section.MKR.getKey()
|
||||
|
|
@ -133,30 +133,20 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
|
|||
}
|
||||
|
||||
//убираем уже добавленные в ExecutionDeposit
|
||||
sTrades.removeIf(sTrd -> {
|
||||
Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation());
|
||||
if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) {
|
||||
log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation());
|
||||
return true;
|
||||
}
|
||||
MoneyFlowSide excDepSide = sTrdSide.equals(Side.BUY) ? MoneyFlowSide.BUY : MoneyFlowSide.SELL;
|
||||
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
|
||||
sTrd.getTradeNum(),
|
||||
excDepSide.getKey());
|
||||
if (fromId != null) {
|
||||
return cash.contains(excKey);
|
||||
} else {
|
||||
ExecutionDeposit exec = executionDepositImdg.getFirstObjectByFieldValues(
|
||||
Map.of("tradingDate", sTrd.getTradeDate(),
|
||||
"exchangeExecutionId", sTrd.getTradeNum(),
|
||||
"side", excDepSide.getKey()));
|
||||
if (exec != null) {
|
||||
cash.add(excKey);
|
||||
if (!cleanLoad) {
|
||||
sTrades.removeIf(sTrd -> {
|
||||
Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation());
|
||||
if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) {
|
||||
log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
MoneyFlowSide excDepSide = sTrdSide.equals(Side.BUY) ? MoneyFlowSide.BUY : MoneyFlowSide.SELL;
|
||||
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
|
||||
sTrd.getTradeNum(),
|
||||
excDepSide.getKey());
|
||||
return cash.containsKey(excKey);
|
||||
});
|
||||
}
|
||||
log.info("{} strades left after already-added filtering", sTrades.size());
|
||||
|
||||
Map<Long, ExecutionDeposit> execsToInsert = new HashMap<>();
|
||||
|
|
@ -173,8 +163,16 @@ public class ExecutionDepositComponent implements IExecutionUploadComponent {
|
|||
ExecutionDeposit newED;
|
||||
try {
|
||||
newED = createExecutionDeposit(sTrd, validator);
|
||||
newED.setId(idGen.nextId());
|
||||
cash.add(ExecUploadKey.cash(newED));
|
||||
ExecUploadKey execKey = ExecUploadKey.cash(newED);
|
||||
ExecUploadCashInfo storedId;
|
||||
if (!cleanLoad || (storedId = cash.get(execKey)) == null) {
|
||||
newED.setId(idGen.nextId());
|
||||
cash.put(execKey, ExecUploadCashInfo.cash(newED));
|
||||
} else {
|
||||
newED.setId(storedId.id());
|
||||
newED.setUpdated(newED.getCreated());
|
||||
newED.setCreated(storedId.createDt());
|
||||
}
|
||||
execsToInsert.put(newED.getId(), newED);
|
||||
//executionDepositImdg.insert(newED);
|
||||
sendNotification(newED);
|
||||
|
|
|
|||
|
|
@ -6,10 +6,8 @@ import java.time.Instant;
|
|||
import java.time.LocalDate;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.Map;
|
||||
import java.util.Optional;
|
||||
import java.util.Set;
|
||||
import java.util.function.Function;
|
||||
import org.apache.kafka.clients.producer.Producer;
|
||||
import org.slf4j.Logger;
|
||||
|
|
@ -84,7 +82,7 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
|
|||
private final KafkaSender kafkaSender;
|
||||
private final NotificationSender notifications;
|
||||
private final boolean valuation;
|
||||
private final Set<ExecUploadKey> cash = new HashSet<>();
|
||||
private final Map<ExecUploadKey, ExecUploadCashInfo> cash = new HashMap<>();
|
||||
|
||||
|
||||
@Autowired
|
||||
|
|
@ -124,13 +122,15 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
|
|||
}
|
||||
|
||||
public void processNewTS(Long fromId) {
|
||||
if (fromId == null) {
|
||||
boolean cleanLoad = fromId == null;
|
||||
if (cleanLoad) {
|
||||
cash.clear();
|
||||
initExecCash();
|
||||
}
|
||||
log.debug("Start check new S_TRADE after {}, fromId={}", tradingDay, fromId);
|
||||
//выбираем STrades на сегодня с правильным section
|
||||
Collection<STrades> sTrades;
|
||||
if (fromId == null) {
|
||||
if (cleanLoad) {
|
||||
sTrades = sTradeImdg.getCollectionObjectsByFieldValues(Map.of(
|
||||
"tradeDate", LocalDate.now(),
|
||||
"section", Section.FOND.getKey()
|
||||
|
|
@ -152,28 +152,20 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
|
|||
}
|
||||
|
||||
//убираем уже добавленные в ExecutionDeposit
|
||||
sTrades.removeIf(sTrd -> {
|
||||
Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation());
|
||||
if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) {
|
||||
log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation());
|
||||
return true;
|
||||
}
|
||||
Side excDepSide = sTrdSide.equals(Side.BUY) ? Side.BUY : Side.SELL;
|
||||
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(), sTrd.getTradeNum(), excDepSide.getKey());
|
||||
if (fromId != null) {
|
||||
return cash.contains(excKey);
|
||||
} else {
|
||||
ExecutionFond exec = executionFondImdg.getFirstObjectByFieldValues(
|
||||
Map.of("tradingDate", sTrd.getTradeDate(),
|
||||
"exchangeExecutionId", sTrd.getTradeNum(),
|
||||
"side", excDepSide.getKey()));
|
||||
if (exec != null) {
|
||||
cash.add(excKey);
|
||||
if (!cleanLoad) {
|
||||
sTrades.removeIf(sTrd -> {
|
||||
Side sTrdSide = IEnumKey.getEnumByKey(Side.class, sTrd.getOperation());
|
||||
if (sTrdSide == null || !(sTrdSide.equals(Side.BUY) || sTrdSide.equals(Side.SELL))) {
|
||||
log.warn("cannot parse strade.tradeNum={} strade.operation {}", sTrd.getTradeNum(), sTrd.getOperation());
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
});
|
||||
Side excDepSide = sTrdSide.equals(Side.BUY) ? Side.BUY : Side.SELL;
|
||||
ExecUploadKey excKey = ExecUploadKey.cash(sTrd.getTradeDate(),
|
||||
sTrd.getTradeNum(),
|
||||
excDepSide.getKey());
|
||||
return cash.containsKey(excKey);
|
||||
});
|
||||
}
|
||||
log.info("{} strades left after already-added filtering", sTrades.size());
|
||||
|
||||
Map<Long, ExecutionFond> execsToInsert = new HashMap<>();
|
||||
|
|
@ -190,8 +182,16 @@ public class ExecutionFondComponent implements IExecutionUploadComponent {
|
|||
ExecutionFond newED;
|
||||
try {
|
||||
newED = createExecutionFond(sTrd, validator);
|
||||
newED.setId(idGen.nextId());
|
||||
cash.add(ExecUploadKey.cash(newED));
|
||||
ExecUploadKey execKey = ExecUploadKey.cash(newED);
|
||||
ExecUploadCashInfo storedId;
|
||||
if (!cleanLoad || (storedId = cash.get(execKey)) == null) {
|
||||
newED.setId(idGen.nextId());
|
||||
cash.put(execKey, ExecUploadCashInfo.cash(newED));
|
||||
} else {
|
||||
newED.setId(storedId.id());
|
||||
newED.setUpdated(newED.getCreated());
|
||||
newED.setCreated(storedId.createDt());
|
||||
}
|
||||
execsToInsert.put(newED.getId(), newED);
|
||||
//executionFondImdg.insert(newED);
|
||||
sendNotification(newED);
|
||||
|
|
|
|||
|
|
@ -2,20 +2,19 @@ package ru.spcex.clearing.service.execution;
|
|||
|
||||
import java.time.LocalDate;
|
||||
import java.util.Collection;
|
||||
import java.util.Set;
|
||||
import java.util.Map;
|
||||
import ru.clearing.classes.statics.data.execution.ExecutionCommon;
|
||||
import ru.spcex.platform.imdg.api.Imdg;
|
||||
import ru.spcex.platform.imdg.api.predicate.ImdgPredicateBuilder;
|
||||
|
||||
public class ExecutionUploadCashUtil {
|
||||
public static <T extends ExecutionCommon>
|
||||
void loadExecutions(Imdg<T> executionImdg, Set<ExecUploadKey> cash) {
|
||||
void loadExecutions(Imdg<T> executionImdg, Map<ExecUploadKey, ExecUploadCashInfo> cash) {
|
||||
LocalDate today = LocalDate.now();
|
||||
ImdgPredicateBuilder pb = executionImdg.predicateBuilder();
|
||||
Collection<T> execs = executionImdg.getCollectionObjectsByPredicate(
|
||||
pb.equals("tradingDate", today)
|
||||
);
|
||||
execs.forEach(e -> cash.add(ExecUploadKey.cash(e)));
|
||||
execs.forEach(e -> cash.put(ExecUploadKey.cash(e), ExecUploadCashInfo.cash(e)));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue