Skip to content
This repository has been archived by the owner on Mar 7, 2024. It is now read-only.

Commit

Permalink
Feat/show historical state (#10)
Browse files Browse the repository at this point in the history
* feat: slider + shortcuts + get members in time period

* feat: play button logic implemented

* feat: rebase issues fixed

* feat: slight improvements
  • Loading branch information
jobulcke authored Sep 21, 2023
1 parent 3649f37 commit cd24787
Show file tree
Hide file tree
Showing 17 changed files with 340 additions and 252 deletions.
3 changes: 2 additions & 1 deletion docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ services:
- SPRING_DATASOURCE_PASSWORD=test
- SPRING_JPA_PROPERTIES_HIBERNATE_DIALECT=org.hibernate.dialect.PostgreSQLDialect
- SPRING_JPA_HIBERNATE_DDLAUTO=update
- LDES_STREAMS_0_=https://data.vlaanderen.be/ns/mobiliteit#Mobiliteitshinder
- LDES_STREAMS_0_MEMBER_TYPE=https://data.vlaanderen.be/ns/mobiliteit#Mobiliteitshinder
- LDES_STREAMS_0_TIMESTAMP_PATH=http://www.w3.org/ns/prov#generatedAtTime
- GRAPHDB_URL=http://rdf4j-server:8080/rdf4j-server/repositories/
- GRAPHDB_REPOSITORYID=test
ports:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public interface MemberService {
void ingestMember(IngestedMemberDto ingestedMemberDto);

List<MemberDto> getMembersInRectangle(Geometry rectangleGeometry, LocalDateTime timestamp);
List<MemberDto> getMembersInRectangle(Geometry rectangleGeometry, LocalDateTime timestamp, String timePeriod);

MemberDto getMemberById(String memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
import org.springframework.stereotype.Service;
import org.wololo.jts2geojson.GeoJSONWriter;

import java.time.Duration;
import java.time.LocalDateTime;
import java.util.List;

Expand All @@ -36,8 +37,12 @@ public void ingestMember(IngestedMemberDto ingestedMemberDto) {
}

@Override
public List<MemberDto> getMembersInRectangle(Geometry rectangleGeometry, LocalDateTime timestamp) {
return repository.getMembersByGeometry(rectangleGeometry, timestamp).stream().map(memberGeometry -> new MemberDto(memberGeometry.getMemberId(), geoJSONWriter.write(memberGeometry.getGeometry()), memberGeometry.getTimestamp())).toList();
public List<MemberDto> getMembersInRectangle(Geometry rectangleGeometry, LocalDateTime timestamp, String timePeriod) {
var duration = Duration.parse(timePeriod).dividedBy(2);
return repository.getMembersByGeometry(rectangleGeometry, timestamp.minus(duration), timestamp.plus(duration))
.stream()
.map(memberGeometry -> new MemberDto(memberGeometry.getMemberId(), geoJSONWriter.write(memberGeometry.getGeometry()), memberGeometry.getTimestamp()))
.toList();
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,6 @@

public interface MemberRepository {
void saveMember(Member geometry);
List<Member> getMembersByGeometry(Geometry geometry, LocalDateTime timestamp);
List<Member> getMembersByGeometry(Geometry geometry, LocalDateTime startTime, LocalDateTime endTime);
Optional<Member> findByMemberId(String memberId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@

import java.time.LocalDateTime;

@Entity
@Entity(name = "member_entity")
public class MemberEntity {
@Id
private String memberId;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@

public interface MemberEntityJpaRepository extends JpaRepository<MemberEntity, String> {

@Query(value = "select l from MemberEntity l where intersects(l.geometry, :geometry) = true and l.timestamp = :timestamp")
List<MemberEntity> getMemberGeometryEntitiesCoveredByGeometry(@Param("geometry") Geometry geometry, @Param("timestamp") LocalDateTime timestamp);
@Query(value = "select l from member_entity l where intersects(l.geometry, :geometry) = true and l.timestamp >= :startTime and l.timestamp <= :endTime")
List<MemberEntity> getMemberGeometryEntitiesCoveredByGeometryInTimePeriod(@Param("geometry") Geometry geometry, @Param("startTime") LocalDateTime startTime, @Param("endTime") LocalDateTime endTime);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,9 +23,9 @@ public void saveMember(Member member) {
}

@Override
public List<Member> getMembersByGeometry(Geometry geometry, LocalDateTime timestamp) {
public List<Member> getMembersByGeometry(Geometry geometry, LocalDateTime startTime, LocalDateTime endTime) {
return memberGeometryJpaRepo
.getMemberGeometryEntitiesCoveredByGeometry(geometry, timestamp)
.getMemberGeometryEntitiesCoveredByGeometryInTimePeriod(geometry, startTime, endTime)
.stream()
.map(entity -> new Member(entity.getMemberId(), entity.getGeometry(), entity.getTimestamp()))
.toList();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,8 @@ public MemberDto retrieveLdesFragment(@PathVariable String memberId) {

@PostMapping(value = "/in-rectangle", consumes = {"application/json"})
@CrossOrigin(origins = "*", allowedHeaders = "*")
public List<MemberDto> getMembersInRectangle(@RequestBody MapBoundsDto mapBoundsDto, @RequestParam LocalDateTime timestamp) {
return service.getMembersInRectangle(mapBoundsDto.getGeometry(), timestamp);
public List<MemberDto> getMembersInRectangle(@RequestBody MapBoundsDto mapBoundsDto, @RequestParam LocalDateTime timestamp, @RequestParam(defaultValue = "PT1M") String timePeriod) {
return service.getMembersInRectangle(mapBoundsDto.getGeometry(), timestamp, timePeriod);
}

@PostMapping(value = "/members")
Expand Down
22 changes: 0 additions & 22 deletions spring-boot-backend/src/main/resources/application.yaml

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@

import java.io.IOException;
import java.nio.file.Path;
import java.time.Duration;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.util.ArrayList;
Expand All @@ -38,7 +39,11 @@

@ExtendWith(MockitoExtension.class)
class MemberServiceImplTest {
private static final String TIME_PERIOD = "PT5M";
private static final Duration duration = Duration.parse(TIME_PERIOD).dividedBy(2);
private static final LocalDateTime timestamp = ZonedDateTime.parse("2022-05-20T09:58:15.867Z").toLocalDateTime();
private static final LocalDateTime startTime = timestamp.minus(duration);
private static final LocalDateTime endTime = timestamp.plus(duration);
private static Geometry rectangle;

@Mock
Expand Down Expand Up @@ -67,22 +72,22 @@ class GetMembersInRectangle {
void when_GetMembersInRectangle_then_ReturnListOfMemberDtos() throws ParseException {
final GeoJSONReader geoJSONReader = new GeoJSONReader();
final List<Member> members = initMembers();
when(repository.getMembersByGeometry(rectangle, timestamp)).thenReturn(members);
when(repository.getMembersByGeometry(rectangle, startTime, endTime)).thenReturn(members);

final List<Member> retrievedMembers = service.getMembersInRectangle(rectangle, timestamp).stream()
final List<Member> retrievedMembers = service.getMembersInRectangle(rectangle, timestamp, TIME_PERIOD).stream()
.map(dto -> new Member(dto.getMemberId(), geoJSONReader.read(dto.getGeojsonGeometry()), dto.getTimestamp()))
.toList();
assertEquals(members, retrievedMembers);
verify(repository).getMembersByGeometry(rectangle, timestamp);
verify(repository).getMembersByGeometry(rectangle, startTime, endTime);
}

@Test
void when_GetMembersInRectangle_then_VerifyMemberIsInRectangle() throws ParseException {
final WKTReader wktReader = new WKTReader();
final GeoJSONReader geoJSONReader = new GeoJSONReader();
when(repository.getMembersByGeometry(rectangle, timestamp)).thenReturn(initMembers());
when(repository.getMembersByGeometry(rectangle, startTime, endTime)).thenReturn(initMembers());

List<Geometry> retrievedMembers = service.getMembersInRectangle(rectangle, timestamp).stream()
List<Geometry> retrievedMembers = service.getMembersInRectangle(rectangle, timestamp, TIME_PERIOD).stream()
.map(dto -> geoJSONReader.read(dto.getGeojsonGeometry()))
.toList();
Geometry outsidePoint = wktReader.read("POINT(6 6)");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@
class MemberRepositoryImplTest {
private static final String ID = "member-id";
private static final LocalDateTime timestamp = ZonedDateTime.parse("2022-05-20T09:58:15.867Z").toLocalDateTime();
private static final LocalDateTime startTime = ZonedDateTime.parse("2022-05-20T09:53:15.867Z").toLocalDateTime();
private static final LocalDateTime endTime = ZonedDateTime.parse("2022-05-20T10:03:15.867Z").toLocalDateTime();
private static Geometry point;
private static Geometry rectangle;
private MemberRepository repository;
Expand Down Expand Up @@ -82,20 +84,20 @@ void when_DbDoesContainMembers_then_ReturnMembersInRectangle() throws ParseExcep
.map(entity -> new Member(entity.getMemberId(), entity.getGeometry(), timestamp))
.toList();

when(jpaRepository.getMemberGeometryEntitiesCoveredByGeometry(rectangle, timestamp)).thenReturn(entities);
when(jpaRepository.getMemberGeometryEntitiesCoveredByGeometryInTimePeriod(rectangle, startTime, endTime)).thenReturn(entities);

assertEquals(members, repository.getMembersByGeometry(rectangle, timestamp));
assertEquals(members, repository.getMembersByGeometry(rectangle, startTime, endTime));

verify(jpaRepository).getMemberGeometryEntitiesCoveredByGeometry(rectangle, timestamp);
verify(jpaRepository).getMemberGeometryEntitiesCoveredByGeometryInTimePeriod(rectangle, startTime, endTime);
}

@Test
void when_DbContainsOnlyMembersOutsideRectangle_then_ReturnEmptyList() {
when(jpaRepository.getMemberGeometryEntitiesCoveredByGeometry(rectangle, timestamp)).thenReturn(List.of());
when(jpaRepository.getMemberGeometryEntitiesCoveredByGeometryInTimePeriod(rectangle, startTime, endTime)).thenReturn(List.of());

assertEquals(List.of(), repository.getMembersByGeometry(rectangle, timestamp));
assertEquals(List.of(), repository.getMembersByGeometry(rectangle, startTime, endTime));

verify(jpaRepository).getMemberGeometryEntitiesCoveredByGeometry(rectangle, timestamp);
verify(jpaRepository).getMemberGeometryEntitiesCoveredByGeometryInTimePeriod(rectangle, startTime, endTime);
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -92,21 +92,24 @@ void when_MemberGeometryIsNotPresent_then_StatusIs404() throws Exception {

@Test
void when_MapBoundariesArePosted_then_ReturnMemberGeometries() throws Exception {
final String timePeriod = "PT1M";
Geometry rectangle = new WKTReader().read("POLYGON((0 0, 0 5, 5 5, 5 0, 0 0))");
List<MemberDto> members = initMembers();
String json = "[" + members.stream()
.map(dto -> transformToJson(dto.getMemberId(), dto.getGeojsonGeometry(), dto.getTimestamp()))
.collect(Collectors.joining(", ")) + "]";

when(service.getMembersInRectangle(rectangle, timestamp)).thenReturn(members);
when(service.getMembersInRectangle(rectangle, timestamp, timePeriod)).thenReturn(members);

mockMvc.perform(post("/in-rectangle?timestamp=" + timestamp)
mockMvc.perform(post("/in-rectangle")
.param("timestamp", timestamp.toString())
.param("timePeriod", timePeriod)
.contentType(MediaType.APPLICATION_JSON)
.content(readDataFromFile("mapbounds/rectangle.json")))
.andExpect(content().json(json))
.andExpect(status().isOk());

verify(service).getMembersInRectangle(rectangle, timestamp);
verify(service).getMembersInRectangle(rectangle, timestamp, timePeriod);
}

@Nested
Expand Down
9 changes: 0 additions & 9 deletions vue-frontend/src/App.vue
Original file line number Diff line number Diff line change
@@ -1,26 +1,17 @@
<script setup>
import LeafletMap from './components/map/LeafletMap.vue'
import Slider from "@/components/slider/Slider.vue";
import {ref} from "vue";
const time = ref(new Date().getTime())
</script>

<template>

<main>

<div>
<!-- <div style="float:left; width: auto">-->
<!-- <KnowledgeGraph/>-->
<!-- </div>-->
<div>
<LeafletMap></LeafletMap>
</div>

<div class="slider-container">
<Slider :time="time"></Slider>
</div>
</div>

</main>
Expand Down
Loading

0 comments on commit cd24787

Please sign in to comment.