From 792218d152b0fe7ae927d2e23bc333b4fef73f70 Mon Sep 17 00:00:00 2001 From: jpilimon Date: Wed, 2 Mar 2022 13:41:47 +0100 Subject: [PATCH] CQRS 4.5 - TransitAnalyzer - migracja danych --- .../cabs/config/Neo4jConfig.java | 7 ++- .../cabs/repository/TransitRepository.java | 2 + .../transitanalyzer/PopulateGraphService.java | 38 ++++++++++++ .../PopulateGraphServiceIntegrationTest.java | 61 +++++++++++++++++++ 4 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 src/main/java/io/legacyfighter/cabs/transitanalyzer/PopulateGraphService.java create mode 100644 src/test/java/io/legacyfighter/cabs/integration/PopulateGraphServiceIntegrationTest.java diff --git a/src/main/java/io/legacyfighter/cabs/config/Neo4jConfig.java b/src/main/java/io/legacyfighter/cabs/config/Neo4jConfig.java index 7c2a947..fd9c27d 100644 --- a/src/main/java/io/legacyfighter/cabs/config/Neo4jConfig.java +++ b/src/main/java/io/legacyfighter/cabs/config/Neo4jConfig.java @@ -1,6 +1,8 @@ package io.legacyfighter.cabs.config; +import io.legacyfighter.cabs.repository.TransitRepository; import io.legacyfighter.cabs.transitanalyzer.GraphTransitAnalyzer; +import io.legacyfighter.cabs.transitanalyzer.PopulateGraphService; import org.neo4j.graphdb.GraphDatabaseService; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; @@ -23,6 +25,9 @@ GraphDatabaseService notConnectedOnProdYet(String dbPath) { return null; } - + @Bean + PopulateGraphService populateGraphService(TransitRepository transitRepository, GraphTransitAnalyzer graphTransitAnalyzer) { + return new PopulateGraphService(transitRepository, graphTransitAnalyzer); + } } diff --git a/src/main/java/io/legacyfighter/cabs/repository/TransitRepository.java b/src/main/java/io/legacyfighter/cabs/repository/TransitRepository.java index ad3ca97..448441d 100644 --- a/src/main/java/io/legacyfighter/cabs/repository/TransitRepository.java +++ b/src/main/java/io/legacyfighter/cabs/repository/TransitRepository.java @@ -15,6 +15,8 @@ public interface TransitRepository extends JpaRepository { List findAllByClientAndFromAndStatusOrderByDateTimeDesc(Client client, Address from, Transit.Status status); + List findAllByStatus(Transit.Status status); + List findAllByClientAndFromAndPublishedAfterAndStatusOrderByDateTimeDesc(Client client, Address from, Instant when, Transit.Status status); List findByClient(Client client); diff --git a/src/main/java/io/legacyfighter/cabs/transitanalyzer/PopulateGraphService.java b/src/main/java/io/legacyfighter/cabs/transitanalyzer/PopulateGraphService.java new file mode 100644 index 0000000..b5e5867 --- /dev/null +++ b/src/main/java/io/legacyfighter/cabs/transitanalyzer/PopulateGraphService.java @@ -0,0 +1,38 @@ +package io.legacyfighter.cabs.transitanalyzer; + + +import io.legacyfighter.cabs.entity.Transit; +import io.legacyfighter.cabs.repository.TransitRepository; +import org.springframework.transaction.annotation.Transactional; + + +import static io.legacyfighter.cabs.entity.Transit.Status.COMPLETED; + +public class PopulateGraphService { + + private final TransitRepository transitRepository; + private final GraphTransitAnalyzer graphTransitAnalyzer; + + public PopulateGraphService(TransitRepository transitRepository, GraphTransitAnalyzer graphTransitAnalyzer) { + this.transitRepository = transitRepository; + this.graphTransitAnalyzer = graphTransitAnalyzer; + } + + @Transactional + public void populate() { + transitRepository + .findAllByStatus(COMPLETED) + .forEach(this::addToGraph); + } + + private void addToGraph(Transit transit) { + Long clientId = transit.getClient().getId(); + graphTransitAnalyzer.addTransitBetweenAddresses( + clientId, + transit.getId(), + transit.getFrom().getHash(), + transit.getTo().getHash(), + transit.getStarted(), + transit.getCompleteAt()); + } +} diff --git a/src/test/java/io/legacyfighter/cabs/integration/PopulateGraphServiceIntegrationTest.java b/src/test/java/io/legacyfighter/cabs/integration/PopulateGraphServiceIntegrationTest.java new file mode 100644 index 0000000..0d86f9f --- /dev/null +++ b/src/test/java/io/legacyfighter/cabs/integration/PopulateGraphServiceIntegrationTest.java @@ -0,0 +1,61 @@ +package io.legacyfighter.cabs.integration; + +import io.legacyfighter.cabs.common.Fixtures; +import io.legacyfighter.cabs.common.TestWithGraphDB; +import io.legacyfighter.cabs.entity.Address; +import io.legacyfighter.cabs.entity.Client; +import io.legacyfighter.cabs.entity.Driver; +import io.legacyfighter.cabs.repository.TransitRepository; +import io.legacyfighter.cabs.transitanalyzer.GraphTransitAnalyzer; +import io.legacyfighter.cabs.transitanalyzer.PopulateGraphService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +import static java.time.Instant.now; + +import static org.assertj.core.api.Assertions.assertThat; + +class PopulateGraphServiceIntegrationTest extends TestWithGraphDB { + + @Autowired + Fixtures fixtures; + + @Autowired + TransitRepository transitRepository; + + @Autowired + PopulateGraphService populateGraphService; + + @Autowired + GraphTransitAnalyzer analyzer; + + @Test + void canPopulateGraphWithDataFromRelationalDB() { + //given + Client client = fixtures.aClient(); + //and + Driver driver = fixtures.aDriver(); + //and + Address address1 = new Address("100_1", "1", "1", "1", 1); + Address address2 = new Address("100_2", "2", "2", "2", 2); + Address address3 = new Address("100_3", "3", "3", "3", 3); + Address address4 = new Address("100_4", "4", "4", "4", 3); + //and + fixtures.aRequestedAndCompletedTransit(10, now(), now(), client, driver, address1, address2); + fixtures.aRequestedAndCompletedTransit(10, now(), now(), client, driver, address2, address3); + fixtures.aRequestedAndCompletedTransit(10, now(), now(), client, driver, address3, address4); + + //when + populateGraphService.populate(); + + //then + List result = analyzer.analyze(client.getId(), address1.getHash()); + assertThat(result).containsExactly( + address1.getHash().longValue(), + address2.getHash().longValue(), + address3.getHash().longValue(), + address4.getHash().longValue()); + } +} \ No newline at end of file