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.FlagsService2;
|
||||
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.PhoneFidMapService;
|
||||
import ru.nbch.credit_tracker.service.signal.UserPackageService;
|
||||
|
|
@ -44,7 +44,7 @@ public class SignalService {
|
|||
private final HitsService hitsService;
|
||||
private final UserPackageService userPackageService;
|
||||
private final PhoneFidMapService phoneFidMapService;
|
||||
private final PhoneService phoneService;
|
||||
private final PhoneService2 phoneService;
|
||||
private final FlagsService2 flagsService;
|
||||
private final PersonService personService;
|
||||
private final StaxXmlProcessor staxXmlProcessor;
|
||||
|
|
@ -55,7 +55,7 @@ public class SignalService {
|
|||
HitsService hitsService,
|
||||
UserPackageService userPackageService,
|
||||
PhoneFidMapService phoneFidMapService,
|
||||
PhoneService phoneService,
|
||||
PhoneService2 phoneService,
|
||||
FlagsService2 flagsService,
|
||||
PersonService personService,
|
||||
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