Skip to content

Commit

Permalink
Merge pull request #8 from usdot-jpo-ode/intersection-selection
Browse files Browse the repository at this point in the history
Intersection selection
  • Loading branch information
John-Wiens authored Jun 9, 2023
2 parents 4a37ad6 + 22e0618 commit cea9b53
Show file tree
Hide file tree
Showing 10 changed files with 209 additions and 109 deletions.
2 changes: 1 addition & 1 deletion jpo-conflictmonitor
Submodule jpo-conflictmonitor updated from 64c521 to 79c1b5
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@

package us.dot.its.jpo.ode.api.accessors.events.SignalGroupAlignmentEvent;
package us.dot.its.jpo.ode.api.accessors.events.SignalGroupAlignmentEvent;

import java.util.List;
import java.util.List;

import org.springframework.data.mongodb.core.query.Query;
import us.dot.its.jpo.conflictmonitor.monitor.models.events.SignalGroupAlignmentEvent;
import org.springframework.data.mongodb.core.query.Query;
import us.dot.its.jpo.conflictmonitor.monitor.models.events.SignalGroupAlignmentEvent;
import us.dot.its.jpo.ode.api.models.IDCount;

public interface SignalGroupAlignmentEventRepository{
Query getQuery(Integer intersectionID, Long startTime, Long endTime, boolean latest);
public interface SignalGroupAlignmentEventRepository {
Query getQuery(Integer intersectionID, Long startTime, Long endTime, boolean latest);

long getQueryResultCount(Query query);

List<SignalGroupAlignmentEvent> find(Query query);
}
long getQueryResultCount(Query query);

List<IDCount> getSignalGroupAlignmentEventsByDay(int intersectionID, Long startTime, Long endTime);

List<SignalGroupAlignmentEvent> find(Query query);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@

package us.dot.its.jpo.ode.api.accessors.events.SignalGroupAlignmentEvent;

import java.time.Instant;
import java.util.Date;
import java.util.List;

Expand All @@ -12,6 +13,13 @@
import us.dot.its.jpo.conflictmonitor.monitor.models.events.SignalGroupAlignmentEvent;
import org.springframework.data.domain.Sort;

import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.ArithmeticOperators;
import org.springframework.data.mongodb.core.aggregation.ConvertOperators;
import org.springframework.data.mongodb.core.aggregation.DateOperators;
import us.dot.its.jpo.ode.api.models.IDCount;

@Component
public class SignalGroupAlignmentEventRepositoryImpl implements SignalGroupAlignmentEventRepository {

Expand Down Expand Up @@ -50,4 +58,29 @@ public List<SignalGroupAlignmentEvent> find(Query query) {
return mongoTemplate.find(query, SignalGroupAlignmentEvent.class, "CmSignalGroupAlignmentEvents");
}

public List<IDCount> getSignalGroupAlignmentEventsByDay(int intersectionID, Long startTime, Long endTime){
if (startTime == null) {
startTime = 0L;
}
if (endTime == null) {
endTime = Instant.now().toEpochMilli();
}

Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(Criteria.where("intersectionID").is(intersectionID)),
Aggregation.match(Criteria.where("timestamp").gte(startTime).lte(endTime)),
Aggregation.project("timestamp"),
Aggregation.project()
.and(ConvertOperators.ToDate.toDate("$timestamp")).as("date"),
Aggregation.project()
.and(DateOperators.DateToString.dateOf("date").toString("%Y-%m-%d")).as("dateStr"),
Aggregation.group("dateStr").count().as("count")
);

AggregationResults<IDCount> result = mongoTemplate.aggregate(aggregation, "CmLaneDirectionOfTravelEvent", IDCount.class);
List<IDCount> results = result.getMappedResults();

return results;
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
import org.springframework.data.mongodb.core.query.Query;

import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap;
import us.dot.its.jpo.ode.api.IntersectionReferenceData;
import us.dot.its.jpo.ode.api.models.IDCount;
import us.dot.its.jpo.ode.api.models.IntersectionReferenceData;

public interface ProcessedMapRepository{
Query getQuery(Integer intersectionID, Long startTime, Long endTime,boolean latest);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
import org.springframework.stereotype.Component;

import us.dot.its.jpo.geojsonconverter.pojos.geojson.map.ProcessedMap;
import us.dot.its.jpo.ode.api.IntersectionReferenceData;
import us.dot.its.jpo.ode.api.models.IDCount;
import us.dot.its.jpo.ode.api.models.IntersectionReferenceData;

@Component
public class ProcessedMapRepositoryImpl implements ProcessedMapRepository {
Expand Down Expand Up @@ -62,7 +62,10 @@ public List<ProcessedMap> findProcessedMaps(Query query) {
public List<IntersectionReferenceData> getIntersectionIDs() {
GroupOperation groupOperator = Aggregation.group("properties.intersectionId", "properties.originIp")
.first("properties.intersectionId").as("intersectionID")
.first("properties.originIp").as("rsuIP");
.first("properties.originIp").as("rsuIP")
.first("properties.refPoint.latitude").as("latitude")
.first("properties.refPoint.longitude").as("longitude");


Aggregation aggregation = Aggregation.newAggregation(groupOperator);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,9 @@
import us.dot.its.jpo.ode.api.accessors.events.SignalStateEvent.SignalStateEventRepository;
import us.dot.its.jpo.ode.api.accessors.events.SignalStateStopEvent.SignalStateStopEventRepository;
import us.dot.its.jpo.ode.api.accessors.events.TimeChangeDetailsEvent.TimeChangeDetailsEventRepository;
import us.dot.its.jpo.ode.api.models.IDCount;
import us.dot.its.jpo.ode.mockdata.MockEventGenerator;
import us.dot.its.jpo.ode.mockdata.MockIDCountGenerator;

@RestController
public class EventController {
Expand Down Expand Up @@ -131,6 +133,22 @@ public ResponseEntity<List<ConnectionOfTravelEvent>> findConnectionOfTravelEvent
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/connection_of_travel/daily_counts", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
public ResponseEntity<List<IDCount>> getDailyConnectionOfTravelEventCounts(
@RequestParam(name = "intersection_id", required = true) Integer intersectionID,
@RequestParam(name = "start_time_utc_millis", required = true) Long startTime,
@RequestParam(name = "end_time_utc_millis", required = true) Long endTime,
@RequestParam(name = "test", required = false, defaultValue = "false") boolean testData) {

if (testData) {
return ResponseEntity.ok(MockIDCountGenerator.getDateIDCounts());
} else {
return ResponseEntity.ok(connectionOfTravelEventRepo.getConnectionOfTravelEventsByDay(intersectionID, startTime, endTime));
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/lane_direction_of_travel", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
Expand Down Expand Up @@ -158,6 +176,22 @@ public ResponseEntity<List<LaneDirectionOfTravelEvent>> findLaneDirectionOfTrave
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/lane_direction_of_travel/daily_counts", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
public ResponseEntity<List<IDCount>> getDailyLaneDirectionOfTravelEventCounts(
@RequestParam(name = "intersection_id", required = true) Integer intersectionID,
@RequestParam(name = "start_time_utc_millis", required = true) Long startTime,
@RequestParam(name = "end_time_utc_millis", required = true) Long endTime,
@RequestParam(name = "test", required = false, defaultValue = "false") boolean testData) {

if (testData) {
return ResponseEntity.ok(MockIDCountGenerator.getDateIDCounts());
} else {
return ResponseEntity.ok(laneDirectionOfTravelEventRepo.getLaneDirectionOfTravelEventsByDay(intersectionID, startTime, endTime));
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/signal_group_alignment", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
Expand Down Expand Up @@ -185,6 +219,22 @@ public ResponseEntity<List<SignalGroupAlignmentEvent>> findSignalGroupAlignmentE
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/signal_group_alignment/daily_counts", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
public ResponseEntity<List<IDCount>> getDailySignalGroupAlignmentEventCounts(
@RequestParam(name = "intersection_id", required = true) Integer intersectionID,
@RequestParam(name = "start_time_utc_millis", required = true) Long startTime,
@RequestParam(name = "end_time_utc_millis", required = true) Long endTime,
@RequestParam(name = "test", required = false, defaultValue = "false") boolean testData) {

if (testData) {
return ResponseEntity.ok(MockIDCountGenerator.getDateIDCounts());
} else {
return ResponseEntity.ok(signalGroupAlignmentEventRepo.getSignalGroupAlignmentEventsByDay(intersectionID, startTime, endTime));
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/signal_state_conflict", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
Expand Down Expand Up @@ -212,6 +262,22 @@ public ResponseEntity<List<SignalStateConflictEvent>> findSignalStateConflictEve
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/signal_state_conflict/daily_counts", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
public ResponseEntity<List<IDCount>> getDailySignalStateConflictEventCounts(
@RequestParam(name = "intersection_id", required = true) Integer intersectionID,
@RequestParam(name = "start_time_utc_millis", required = true) Long startTime,
@RequestParam(name = "end_time_utc_millis", required = true) Long endTime,
@RequestParam(name = "test", required = false, defaultValue = "false") boolean testData) {

if (testData) {
return ResponseEntity.ok(MockIDCountGenerator.getDateIDCounts());
} else {
return ResponseEntity.ok(signalStateConflictEventRepo.getSignalStateConflictEventsByDay(intersectionID, startTime, endTime));
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/signal_state", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
Expand Down Expand Up @@ -239,6 +305,24 @@ public ResponseEntity<List<SignalStateEvent>> findSignalStateEvent(
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/signal_state/daily_counts", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
public ResponseEntity<List<IDCount>> getDailySignalStateEventCounts(
@RequestParam(name = "intersection_id", required = true) Integer intersectionID,
@RequestParam(name = "start_time_utc_millis", required = true) Long startTime,
@RequestParam(name = "end_time_utc_millis", required = true) Long endTime,
@RequestParam(name = "test", required = false, defaultValue = "false") boolean testData) {

if (testData) {
return ResponseEntity.ok(MockIDCountGenerator.getDateIDCounts());
} else {
return ResponseEntity.ok(signalStateEventRepo.getSignalStateEventsByDay(intersectionID, startTime, endTime));
}
}



@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/signal_state_stop", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
Expand Down Expand Up @@ -266,6 +350,22 @@ public ResponseEntity<List<SignalStateStopEvent>> findSignalStateStopEvent(
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/signal_state_stop/daily_counts", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
public ResponseEntity<List<IDCount>> getDailySignalStateStopEventCounts(
@RequestParam(name = "intersection_id", required = true) Integer intersectionID,
@RequestParam(name = "start_time_utc_millis", required = true) Long startTime,
@RequestParam(name = "end_time_utc_millis", required = true) Long endTime,
@RequestParam(name = "test", required = false, defaultValue = "false") boolean testData) {

if (testData) {
return ResponseEntity.ok(MockIDCountGenerator.getDateIDCounts());
} else {
return ResponseEntity.ok(signalStateStopEventRepo.getSignalStateStopEventsByDay(intersectionID, startTime, endTime));
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/time_change_details", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
Expand All @@ -292,4 +392,20 @@ public ResponseEntity<List<TimeChangeDetailsEvent>> findTimeChangeDetailsEvent(
}
}
}

@CrossOrigin(origins = "http://localhost:3000")
@RequestMapping(value = "/events/time_change_details/daily_counts", method = RequestMethod.GET, produces = "application/json")
@PreAuthorize("hasRole('USER') || hasRole('ADMIN')")
public ResponseEntity<List<IDCount>> getTimeChangeDetailsEventCounts(
@RequestParam(name = "intersection_id", required = true) Integer intersectionID,
@RequestParam(name = "start_time_utc_millis", required = true) Long startTime,
@RequestParam(name = "end_time_utc_millis", required = true) Long endTime,
@RequestParam(name = "test", required = false, defaultValue = "false") boolean testData) {

if (testData) {
return ResponseEntity.ok(MockIDCountGenerator.getDateIDCounts());
} else {
return ResponseEntity.ok(timeChangeDetailsEventRepo.getTimeChangeDetailsEventsPerDay(intersectionID, startTime, endTime));
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import us.dot.its.jpo.ode.api.IntersectionReferenceData;
import us.dot.its.jpo.ode.api.accessors.map.ProcessedMapRepository;
import us.dot.its.jpo.ode.api.models.IntersectionReferenceData;

@RestController
public class IntersectionController {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,97 +186,4 @@ public byte[] generateReport(

return stream.toByteArray();
}

@Bean
public void test(){
System.out.println("Generating Test PDF");

int intersectionID = 12109;
long startTime = 1683504000000L;
// long startTime = 1678233600000L;
long endTime = Instant.now().toEpochMilli();



List<IDCount> laneDirectionOfTravelEventCounts = laneDirectionOfTravelEventRepo.getLaneDirectionOfTravelEventsByDay(intersectionID, startTime, endTime);
List<IDCount> laneDirectionOfTravelMedianDistanceDistribution = laneDirectionOfTravelEventRepo.getMedianDistanceByFoot(intersectionID, startTime, endTime);
List<IDCount> laneDirectionOfTravelMedianHeadingDistribution = laneDirectionOfTravelEventRepo.getMedianDistanceByDegree(intersectionID, startTime, endTime);
List<LaneDirectionOfTravelAssessment> laneDirectionOfTravelAssessmentCount = laneDirectionOfTravelAssessmentRepo.getLaneDirectionOfTravelOverTime(intersectionID, startTime, endTime);


List<IDCount> connectionOfTravelEventCounts = connectionOfTravelEventRepo.getConnectionOfTravelEventsByDay(intersectionID, startTime, endTime);
List<LaneConnectionCount> laneConnectionCounts = connectionOfTravelEventRepo.getConnectionOfTravelEventsByConnection(intersectionID, startTime, endTime);


List<IDCount> signalstateEventCounts = signalStateEventRepo.getSignalStateEventsByDay(intersectionID, startTime, endTime);

List<IDCount> signalStateStopEventCounts = signalStateStopEventRepo.getSignalStateStopEventsByDay(intersectionID, startTime, endTime);

List<IDCount> signalStateConflictEventCounts = signalStateConflictEventRepo.getSignalStateConflictEventsByDay(intersectionID, startTime, endTime);

List<IDCount> timeChangeDetailsEventCounts= timeChangeDetailsEventRepo.getTimeChangeDetailsEventsPerDay(intersectionID, startTime, endTime);

List<IDCount> mapCounts = processedMapRepo.getMapBroadcastRates(intersectionID, startTime, endTime);
List<IDCount> spatCounts = processedSpatRepo.getSpatBroadcastRates(intersectionID, startTime, endTime);




try {

ReportBuilder builder = new ReportBuilder(new FileOutputStream("test.pdf"));
List<String> dateStrings = builder.getDayStringsInRange(startTime, endTime);
builder.addTitlePage("Conflict Monitor Report", startTime, endTime);

// Add Lane Direction of Travel Information
builder.addTitle("Lane Direction of Travel");
builder.addLaneDirectionOfTravelEvent(DailyData.fromIDCountDays(laneDirectionOfTravelEventCounts, dateStrings));
builder.addLaneDirectionOfTravelMedianDistanceDistribution(ChartData.fromIDCountList(laneDirectionOfTravelMedianDistanceDistribution));
builder.addLaneDirectionOfTravelMedianHeadingDistribution(ChartData.fromIDCountList(laneDirectionOfTravelMedianHeadingDistribution));
builder.addDistanceFromCenterlineOverTime(laneDirectionOfTravelAssessmentCount);
builder.addHeadingOverTime(laneDirectionOfTravelAssessmentCount);
builder.addPageBreak();

// Add Lane Connection of Travel Information
builder.addTitle("Connection of Travel");
builder.addConnectionOfTravelEvent(DailyData.fromIDCountDays(connectionOfTravelEventCounts, dateStrings));
builder.addLaneConnectionOfTravelMap(laneConnectionCounts);
builder.addPageBreak();

// Add Signal State Events
builder.addTitle("Signal State Events");
builder.addSignalStateEvents(DailyData.fromIDCountDays(signalstateEventCounts, dateStrings));
builder.addSignalStateStopEvents(DailyData.fromIDCountDays(signalStateStopEventCounts, dateStrings));
builder.addSignalStateConflictEvent(DailyData.fromIDCountDays(signalStateConflictEventCounts, dateStrings));
builder.addPageBreak();

// Add Time Change Details
builder.addSpatTimeChangeDetailsEvent(DailyData.fromIDCountDays(timeChangeDetailsEventCounts, dateStrings));
builder.addPageBreak();


builder.addTitle("Map");
builder.addMapBroadcastRate(mapCounts);
builder.addPageBreak();

builder.addTitle("SPaT");
builder.addSpatBroadcastRate(spatCounts);
builder.addPageBreak();

// List<Long> secondStrings = builder.getSecondsStringInRange(startTime, endTime);


builder.write();


} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("Test PDF Generation Complete");

// String templateString = ReportBuilder.parseThymeleafTemplate();
// ReportBuilder.generatePdfFromHtml(templateString);

}
}
Loading

0 comments on commit cea9b53

Please sign in to comment.