Used jdbcTemplate for finding fids
This commit is contained in:
parent
7a4695281e
commit
af824c7d07
3 changed files with 162 additions and 3 deletions
|
|
@ -18,7 +18,7 @@ import ru.nbch.credit_tracker.enums.Status;
|
||||||
import ru.nbch.credit_tracker.service.indic.FlagsService;
|
import ru.nbch.credit_tracker.service.indic.FlagsService;
|
||||||
import ru.nbch.credit_tracker.service.indic.FlagsService2;
|
import ru.nbch.credit_tracker.service.indic.FlagsService2;
|
||||||
import ru.nbch.credit_tracker.service.indic.PersonService;
|
import ru.nbch.credit_tracker.service.indic.PersonService;
|
||||||
import ru.nbch.credit_tracker.service.indic.PhoneService;
|
import ru.nbch.credit_tracker.service.indic.PhoneService2;
|
||||||
import ru.nbch.credit_tracker.service.signal.HitsService;
|
import ru.nbch.credit_tracker.service.signal.HitsService;
|
||||||
import ru.nbch.credit_tracker.service.signal.PhoneFidMapService;
|
import ru.nbch.credit_tracker.service.signal.PhoneFidMapService;
|
||||||
import ru.nbch.credit_tracker.service.signal.UserPackageService;
|
import ru.nbch.credit_tracker.service.signal.UserPackageService;
|
||||||
|
|
@ -44,7 +44,7 @@ public class SignalService {
|
||||||
private final HitsService hitsService;
|
private final HitsService hitsService;
|
||||||
private final UserPackageService userPackageService;
|
private final UserPackageService userPackageService;
|
||||||
private final PhoneFidMapService phoneFidMapService;
|
private final PhoneFidMapService phoneFidMapService;
|
||||||
private final PhoneService phoneService;
|
private final PhoneService2 phoneService;
|
||||||
private final FlagsService2 flagsService;
|
private final FlagsService2 flagsService;
|
||||||
private final PersonService personService;
|
private final PersonService personService;
|
||||||
private final StaxXmlProcessor staxXmlProcessor;
|
private final StaxXmlProcessor staxXmlProcessor;
|
||||||
|
|
@ -55,7 +55,7 @@ public class SignalService {
|
||||||
HitsService hitsService,
|
HitsService hitsService,
|
||||||
UserPackageService userPackageService,
|
UserPackageService userPackageService,
|
||||||
PhoneFidMapService phoneFidMapService,
|
PhoneFidMapService phoneFidMapService,
|
||||||
PhoneService phoneService,
|
PhoneService2 phoneService,
|
||||||
FlagsService2 flagsService,
|
FlagsService2 flagsService,
|
||||||
PersonService personService,
|
PersonService personService,
|
||||||
StaxXmlProcessor staxXmlProcessor) {
|
StaxXmlProcessor staxXmlProcessor) {
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,96 @@
|
||||||
|
package ru.nbch.credit_tracker.service.indic;
|
||||||
|
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import lombok.Setter;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.springframework.beans.factory.annotation.Qualifier;
|
||||||
|
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||||
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
|
@Service
|
||||||
|
public class PhoneService2 {
|
||||||
|
|
||||||
|
private static final String SELCT_FIDS = """
|
||||||
|
SELECT
|
||||||
|
pn.number,
|
||||||
|
pn.fid,
|
||||||
|
pn.file_since_dt
|
||||||
|
FROM PHONE_NORM pn
|
||||||
|
JOIN (SELECT DISTINCT fid FROM NAME) nf
|
||||||
|
ON nf.fid = pn.fid
|
||||||
|
WHERE number in (:phones)
|
||||||
|
ORDER BY
|
||||||
|
pn.number ASC,
|
||||||
|
pn.file_since_dt DESC,
|
||||||
|
pn.fid DESC
|
||||||
|
WITH UR
|
||||||
|
""";
|
||||||
|
|
||||||
|
private final NamedParameterJdbcTemplate jdbcTemplate;
|
||||||
|
|
||||||
|
public PhoneService2(@Qualifier("jdbcTemplateIndic") NamedParameterJdbcTemplate jdbcTemplate) {
|
||||||
|
this.jdbcTemplate = jdbcTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ищет фиды по номерам телефона
|
||||||
|
*
|
||||||
|
* @return Map: key - fid; value - {@link PhoneFidMap}
|
||||||
|
*/
|
||||||
|
public Map<Integer, PhoneFidMap> defineFidByPhone(List<PhoneFidMap> subjects) {
|
||||||
|
Map<Integer, PhoneFidMap> phoneFidMap = new HashMap<>();
|
||||||
|
|
||||||
|
List<String> phones = subjects.stream().
|
||||||
|
map(subject -> "9" + subject.getPhone())
|
||||||
|
.toList();
|
||||||
|
|
||||||
|
subjects.sort(
|
||||||
|
Comparator.comparing(
|
||||||
|
PhoneFidMap::getPhone,
|
||||||
|
Comparator.naturalOrder()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
MapSqlParameterSource params = new MapSqlParameterSource();
|
||||||
|
params.addValue("phones", phones);
|
||||||
|
|
||||||
|
List<FidsData> phonesByFid = jdbcTemplate.query(SELCT_FIDS, params, (rs, rowNum) ->
|
||||||
|
new FidsData(rs.getInt("fid"), rs.getString("number"), rs.getObject("file_since_dt", LocalDate.class))
|
||||||
|
);
|
||||||
|
|
||||||
|
log.debug("Start merging fids");
|
||||||
|
for (PhoneFidMap phoneFid : subjects) {
|
||||||
|
Iterator<FidsData> iterator = phonesByFid.iterator();
|
||||||
|
while (iterator.hasNext()) {
|
||||||
|
FidsData fidsData = iterator.next();
|
||||||
|
if (fidsData.getPhone().equals(9 + phoneFid.getPhone())) {
|
||||||
|
//fixme доступ по ссылке, страшно, придумать что-то еще
|
||||||
|
phoneFidMap.put(fidsData.getFid(), phoneFid);
|
||||||
|
iterator.remove();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
log.debug("End merging fids");
|
||||||
|
|
||||||
|
return phoneFidMap;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
@Setter
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public static class FidsData {
|
||||||
|
private Integer fid;
|
||||||
|
private String phone;
|
||||||
|
private LocalDate fileSinceDate;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,63 @@
|
||||||
|
package ru.nbch.credit_tracker.service;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Assertions;
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.junit.jupiter.api.extension.ExtendWith;
|
||||||
|
import org.mockito.Mock;
|
||||||
|
import org.mockito.junit.jupiter.MockitoExtension;
|
||||||
|
import org.springframework.jdbc.core.RowMapper;
|
||||||
|
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
|
||||||
|
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
|
||||||
|
import ru.nbch.credit_tracker.entities.dto.PhoneFidMap;
|
||||||
|
import ru.nbch.credit_tracker.service.indic.PhoneService2;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import static org.mockito.ArgumentMatchers.any;
|
||||||
|
import static org.mockito.ArgumentMatchers.anyString;
|
||||||
|
import static org.mockito.Mockito.when;
|
||||||
|
|
||||||
|
@ExtendWith(MockitoExtension.class)
|
||||||
|
public class PhoneService2Test {
|
||||||
|
|
||||||
|
@Mock
|
||||||
|
NamedParameterJdbcTemplate jdbcTemplate;
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void defineFidByPhoneTest() {
|
||||||
|
PhoneService2 phoneService = new PhoneService2(jdbcTemplate);
|
||||||
|
|
||||||
|
fidsDataWithEqualSinceDt.sort(byDbOrder);
|
||||||
|
when(jdbcTemplate.query(anyString(), any(MapSqlParameterSource.class), any(RowMapper.class))).thenReturn(fidsDataWithEqualSinceDt);
|
||||||
|
|
||||||
|
List<PhoneFidMap> phoneFidMap = new ArrayList<>();
|
||||||
|
phoneFidMap.add(PhoneFidMap.builder().phone("1111").build());
|
||||||
|
phoneFidMap.add(PhoneFidMap.builder().phone("1112").build());
|
||||||
|
phoneFidMap.add(PhoneFidMap.builder().phone("1113").build());
|
||||||
|
phoneFidMap.add(PhoneFidMap.builder().phone("1114").build());
|
||||||
|
|
||||||
|
Map<Integer, PhoneFidMap> res = phoneService.defineFidByPhone(phoneFidMap);
|
||||||
|
Assertions.assertEquals(3, res.size());
|
||||||
|
Assertions.assertEquals("1111", res.get(124).getPhone());
|
||||||
|
Assertions.assertEquals("1112", res.get(125).getPhone());
|
||||||
|
Assertions.assertEquals("1114", res.get(126).getPhone());
|
||||||
|
}
|
||||||
|
|
||||||
|
private final List<PhoneService2.FidsData> fidsDataWithEqualSinceDt = new ArrayList<>(
|
||||||
|
List.of(
|
||||||
|
new PhoneService2.FidsData(123, "91111", LocalDate.of(2025, 9, 10)),
|
||||||
|
new PhoneService2.FidsData(124, "91111", LocalDate.of(2025, 9, 10)),
|
||||||
|
new PhoneService2.FidsData(125, "91112", LocalDate.of(2024, 10, 10)),
|
||||||
|
new PhoneService2.FidsData(126, "91114", LocalDate.of(2024, 10, 11))
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Comparator<PhoneService2.FidsData> byDbOrder =
|
||||||
|
Comparator.comparing(PhoneService2.FidsData::getPhone, Comparator.nullsFirst(Comparator.naturalOrder())) // pn.number ASC
|
||||||
|
.thenComparing(PhoneService2.FidsData::getFileSinceDate, Comparator.nullsLast(Comparator.reverseOrder())) // file_since_dt DESC
|
||||||
|
.thenComparing(PhoneService2.FidsData::getFid, Comparator.reverseOrder());
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue