From f95b547a81980fb5d282c56108cb5c461704e424 Mon Sep 17 00:00:00 2001 From: Mikhail Trofimov Date: Thu, 2 Oct 2025 17:19:08 +0300 Subject: [PATCH] Fix mereger function, moved it to PhoneService; Use previous logic for PhoneService2 --- .../service/indic/PhoneService.java | 98 ++++++++++++++----- .../service/indic/PhoneService2.java | 17 ++-- .../service/PhoneServiceTest.java | 25 ++--- 3 files changed, 96 insertions(+), 44 deletions(-) diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService.java index 7cd8a87..26787b5 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService.java @@ -5,56 +5,106 @@ 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 ru.nbch.credit_tracker.mapper.indic.PhoneMapper; import java.time.LocalDate; -import java.util.*; +import java.util.Comparator; +import java.util.HashMap; +import java.util.List; +import java.util.Map; @Slf4j @Service public class PhoneService { - private final PhoneMapper mapper; + 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 + """; - public PhoneService(PhoneMapper mapper) { - this.mapper = mapper; + private final NamedParameterJdbcTemplate jdbcTemplate; + + public PhoneService(@Qualifier("jdbcTemplateIndic") NamedParameterJdbcTemplate jdbcTemplate) { + this.jdbcTemplate = jdbcTemplate; } /** * Ищет фиды по номерам телефона + * * @return Map: key - fid; value - {@link PhoneFidMap} */ public Map defineFidByPhone(List subjects) { - Map phoneFidMap = new HashMap<>(); List phones = subjects.stream(). - map(subject -> "9" + subject.getPhone()) - .toList(); + map(subject -> "9" + subject.getPhone()) + .toList(); subjects.sort( - Comparator.comparing( - PhoneFidMap::getPhone, - Comparator.naturalOrder() - ) + Comparator.comparing( + PhoneFidMap::getPhone, + Comparator.naturalOrder() + ) + ); + + MapSqlParameterSource params = new MapSqlParameterSource(); + params.addValue("phones", phones); + + List phonesByFid = jdbcTemplate.query(SELCT_FIDS, params, (rs, rowNum) -> + new FidsData(rs.getInt("fid"), Long.parseLong(rs.getString("number")), rs.getObject("file_since_dt", LocalDate.class)) ); - //отсортированный список по NUMBER, FID и FILE_SINCE_DT - List phonesByFid = mapper.findFids(phones); log.debug("Start merging fids"); - for (PhoneFidMap phoneFid : subjects) { - Iterator 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(); + Map phoneFidMap = merger(subjects, phonesByFid); + log.debug("End merging fids"); + + return phoneFidMap; + } + + private Map merger(List subjects, List phonesByFid) { + Map phoneFidMap = new HashMap<>(); + + if (phonesByFid.isEmpty()) { + return phoneFidMap; + } + + int index = 0; + for (PhoneFidMap subject : subjects) { + Long normalizedPhone = Long.parseLong("9" + subject.getPhone()); + + while (index < phonesByFid.size()) { + FidsData currentFidData = phonesByFid.get(index); + + if (currentFidData.getPhone() < normalizedPhone) { + index++; + continue; + } + + if (currentFidData.getPhone().equals(normalizedPhone)) { + phoneFidMap.put(currentFidData.getFid(), subject); + index++; break; } + + break; + } + if (index >= phonesByFid.size()) { + break; } } - log.debug("End merging fids"); return phoneFidMap; } @@ -65,7 +115,7 @@ public class PhoneService { @NoArgsConstructor public static class FidsData { private Integer fid; - private String phone; + private Long phone; private LocalDate fileSinceDate; } } diff --git a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java index 96cc145..aebc4e5 100644 --- a/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java +++ b/src/main/java/ru/nbch/credit_tracker/service/indic/PhoneService2.java @@ -75,15 +75,14 @@ public class PhoneService2 { } log.debug("Start merging fids"); -// for (PhoneFidMap phoneFid : subjects) { -// String phone = "9" + phoneFid.getPhone(); -// Integer fid = phoneToFidsMap.get(phone); -// if (fid != null) { -// phoneFidMap.put(fid, phoneFid); -// phoneToFidsMap.remove(phone); -// } -// } - phoneFidMap = merger(subjects, phonesByFid); + for (PhoneFidMap phoneFid : subjects) { + String phone = "9" + phoneFid.getPhone(); + Integer fid = phoneToFidsMap.get(phone); + if (fid != null) { + phoneFidMap.put(fid, phoneFid); + phoneToFidsMap.remove(phone); + } + } log.debug("End merging fids"); return phoneFidMap; diff --git a/src/test/java/ru/nbch/credit_tracker/service/PhoneServiceTest.java b/src/test/java/ru/nbch/credit_tracker/service/PhoneServiceTest.java index dabbddb..303c41d 100644 --- a/src/test/java/ru/nbch/credit_tracker/service/PhoneServiceTest.java +++ b/src/test/java/ru/nbch/credit_tracker/service/PhoneServiceTest.java @@ -4,10 +4,11 @@ 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.Mockito; 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.mapper.indic.PhoneMapper; import ru.nbch.credit_tracker.service.indic.PhoneService; import java.time.LocalDate; @@ -16,20 +17,22 @@ 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 PhoneServiceTest { @Mock - PhoneMapper phoneMapper; + NamedParameterJdbcTemplate jdbcTemplate; @Test public void defineFidByPhoneTest() { - PhoneService phoneService = new PhoneService(phoneMapper); + PhoneService phoneService = new PhoneService(jdbcTemplate); fidsDataWithEqualSinceDt.sort(byDbOrder); - when(phoneMapper.findFids(Mockito.anyList())).thenReturn(fidsDataWithEqualSinceDt); + when(jdbcTemplate.query(anyString(), any(MapSqlParameterSource.class), any(RowMapper.class))).thenReturn(fidsDataWithEqualSinceDt); List phoneFidMap = new ArrayList<>(); phoneFidMap.add(PhoneFidMap.builder().phone("1111").build()); @@ -48,12 +51,12 @@ public class PhoneServiceTest { private final List fidsDataWithEqualSinceDt = new ArrayList<>( List.of( - new PhoneService.FidsData(123, "91111", LocalDate.of(2025, 9, 10)), - new PhoneService.FidsData(124, "91111", LocalDate.of(2025, 9, 10)), - new PhoneService.FidsData(125, "91112", LocalDate.of(2024, 10, 10)), - new PhoneService.FidsData(126, "91114", LocalDate.of(2024, 10, 11)), - new PhoneService.FidsData(127, "91115", LocalDate.of(2025, 9, 11)), - new PhoneService.FidsData(128, "91115", LocalDate.of(2025, 9, 10)) + new PhoneService.FidsData(123, 91111L, LocalDate.of(2025, 9, 10)), + new PhoneService.FidsData(124, 91111L, LocalDate.of(2025, 9, 10)), + new PhoneService.FidsData(125, 91112L, LocalDate.of(2024, 10, 10)), + new PhoneService.FidsData(126, 91114L, LocalDate.of(2024, 10, 11)), + new PhoneService.FidsData(127, 91115L, LocalDate.of(2025, 9, 11)), + new PhoneService.FidsData(128, 91115L, LocalDate.of(2025, 9, 10)) ) );