Skip to content

Commit

Permalink
Review Refactors 3
Browse files Browse the repository at this point in the history
  • Loading branch information
MontaltoNick committed Feb 26, 2024
1 parent 75e3e90 commit 1fa82e2
Show file tree
Hide file tree
Showing 7 changed files with 215 additions and 85 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,11 @@
import org.springframework.web.server.ResponseStatusException;

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.stream.Collectors;

Expand Down Expand Up @@ -402,93 +407,145 @@ private List<MetricData> getPeriodMetricData(String category, String task, List<
.collect(Collectors.toList());
}

@GetMapping("/size/{tenantId}")
public PatientMeasureReportSizeSummary getPatientMeasureReportSizeSummary(
@GetMapping("/size/PatientMeasureReport/{tenantId}")
public DataSizeSummary getPatientMeasureReportSizeSummary(
@PathVariable String tenantId,
@RequestParam(name = "patientId", required = false) String patientId,
@RequestParam(name = "reportId", required = false) String reportId,
@RequestParam(name = "measureId", required = false) String measureId) {
@RequestParam(name = "measureId", required = false) String measureId,
@RequestParam(name = "patientMeasureReportId", required = false) String patientMeasureReportId) {

var tenantService = TenantService.create(sharedService, tenantId);

var reportSizes = tenantService.getPatientMeasureReportSize(patientId, reportId, measureId);
var dataSizes = tenantService.getPatientMeasureReportSize(patientId, reportId, measureId, patientMeasureReportId);

var summary = new PatientMeasureReportSizeSummary();
var summary = new DataSizeSummary();
double sum = 0.0;
var measureCountMap = summary.getCountReportSizeByMeasureId();
var reportCountMap = summary.getCountReportSizeByReportId();
var patientCountMap = summary.getCountReportSizeByPatientId();
var dataCountMap = summary.getCountDataType();
var dataAverageMap = summary.getAverageDataSize();

var averageReportSizeByMeasureId = summary.getAverageReportSizeByMeasureId();
var averageReportSizeByReportId = summary.getAverageReportSizeByReportId();
var averageReportSizeByPatientId= summary.getAverageReportSizeByPatientId();
var reportKey = "ReportId";
var measureKey = "Measure";
var pidKey = "PatientId";

for(var r : reportSizes)
dataCountMap.put(reportKey, new HashMap<>());
dataCountMap.put(measureKey, new HashMap<>());
dataCountMap.put(pidKey, new HashMap<>());

dataAverageMap.put(reportKey, new HashMap<>());
dataAverageMap.put(measureKey, new HashMap<>());
dataAverageMap.put(pidKey, new HashMap<>());

double min = 0, max = 0;
for(var r : dataSizes)
{
var mId = r.getMeasureId();
var pId = r.getPatientId();
var rId = r.getReportId();

sum += r.getSizeKb();
var sizeKb = r.getSizeKb();
sum += sizeKb;

measureCountMap.merge(mId, 1, (count, value) -> count + value);
averageReportSizeByMeasureId.merge(mId, r.getSizeKb(), (size, value) -> size + value);
if(min > sizeKb || min == 0)
min = sizeKb;

reportCountMap.merge(rId, 1, (count, value) -> count + value);
averageReportSizeByReportId.merge(rId, r.getSizeKb(), (size, value) -> size + value);
if(max < sizeKb)
max = sizeKb;

patientCountMap.merge(pId, 1, (count, value) -> count + value);
averageReportSizeByPatientId.merge(pId, r.getSizeKb(), (size, value) -> size + value);
dataCountMap.get(reportKey).merge(rId, 1, (count, value) -> count + value);
dataCountMap.get(measureKey).merge(mId, 1, (count, value) -> count + value);
dataCountMap.get(pidKey).merge(pId, 1, (count, value) -> count + value);

dataAverageMap.get(reportKey).merge(rId, r.getSizeKb(), (size, value) -> size + value);
dataAverageMap.get(measureKey).merge(mId, r.getSizeKb(), (size, value) -> size + value);
dataAverageMap.get(pidKey).merge(pId, r.getSizeKb(), (size, value) -> size + value);
}

summary.setTotalSize(sum);
summary.setReports(reportSizes);
summary.setReportCount(reportSizes.size());
summary.setAverageReportSize(sum/reportSizes.size());
summary.setData(Collections.singletonList(dataSizes));
summary.setCount(dataSizes.size());
summary.setAverageSize(sum/dataSizes.size());
summary.setMinSize(min);
summary.setMaxSize(max);

averageReportSizeByMeasureId.replaceAll((key, value) -> value/measureCountMap.get(key));
averageReportSizeByReportId.replaceAll((key, value) -> value/reportCountMap.get(key));
averageReportSizeByPatientId.replaceAll((key, value) -> value/patientCountMap.get(key));
dataAverageMap.get(reportKey).replaceAll((key, value) -> value/dataCountMap.get(reportKey).get(key));
dataAverageMap.get(measureKey).replaceAll((key, value) -> value/dataCountMap.get(measureKey).get(key));
dataAverageMap.get(pidKey).replaceAll((key, value) -> value/dataCountMap.get(pidKey).get(key));

return summary;
}

@GetMapping("/size/{tenantId}/{patientMeasureReportId}")
public PatientMeasureReportSizeSummary getPatientMeasureReportSizeSummaryById(
@GetMapping("/size/PatientData/{tenantId}")
public DataSizeSummary getPatientDataSizeSummary(
@PathVariable String tenantId,
@PathVariable String patientMeasureReportId) {
@RequestParam(name = "patientId", required = false) String patientId,
@RequestParam(name = "resourceType", required = false) String resourceType,
@RequestParam(name = "startDate", required = false) String startDate,
@RequestParam(name = "endDate", required = false) String endDate
) {

var tenantService = TenantService.create(sharedService, tenantId);

var reportSize = tenantService.getPatientMeasureReportSizeById(patientMeasureReportId);
LocalDateTime zdtStart = null, zdtEnd = null;
if(startDate != null && endDate != null)
{
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss").withZone(ZoneOffset.UTC);
zdtStart = LocalDateTime.parse(startDate, formatter);
zdtEnd = LocalDateTime.parse(endDate, formatter);
}

var summary = new PatientMeasureReportSizeSummary();
var dataSize = tenantService.getPatientDataReportSize(patientId, resourceType, zdtStart, zdtEnd);

var measureCountMap = summary.getCountReportSizeByMeasureId();
var reportCountMap = summary.getCountReportSizeByReportId();
var patientCountMap = summary.getCountReportSizeByPatientId();
var summary = new DataSizeSummary();
summary.setStartDate(zdtStart);
summary.setEndDate(zdtEnd);
double sum = 0.0;
var dataCountMap = summary.getCountDataType();
var dataAverageMap = summary.getAverageDataSize();

var averageReportSizeByMeasureId = summary.getAverageReportSizeByMeasureId();
var averageReportSizeByReportId = summary.getAverageReportSizeByReportId();
var averageReportSizeByPatientId= summary.getAverageReportSizeByPatientId();
var rtKey = "ResourceType";
var pidKey = "PatientId";

var mId = reportSize.getMeasureId();
var pId = reportSize.getPatientId();
var rId = reportSize.getReportId();
dataCountMap.put(rtKey, new HashMap<>());
dataCountMap.put(pidKey, new HashMap<>());

measureCountMap.merge(mId, 1, (count, value) -> count + value);
averageReportSizeByMeasureId.merge(mId, reportSize.getSizeKb(), (size, value) -> size + value);
dataAverageMap.put(rtKey, new HashMap<>());
dataAverageMap.put(pidKey, new HashMap<>());

reportCountMap.merge(rId, 1, (count, value) -> count + value);
averageReportSizeByReportId.merge(rId, reportSize.getSizeKb(), (size, value) -> size + value);
double min = 0, max = 0;
for(var r : dataSize)
{
var resourceKey = r.getResourceType();
var patientKey = r.getPatientId();

patientCountMap.merge(pId, 1, (count, value) -> count + value);
averageReportSizeByPatientId.merge(pId, reportSize.getSizeKb(), (size, value) -> size + value);
if(patientKey == null || resourceKey == null)
continue;

summary.setTotalSize(reportSize.getSizeKb());
summary.setReports(List.of(reportSize));
summary.setReportCount(1);
summary.setAverageReportSize(reportSize.getSizeKb());
var sizeKb = r.getSizeKb();
sum += sizeKb;

if(min > sizeKb || min == 0)
min = sizeKb;

if(max < sizeKb)
max = sizeKb;

dataCountMap.get(rtKey).merge(resourceKey, 1, (count, value) -> count + value);
dataCountMap.get(pidKey).merge(patientKey, 1, (count, value) -> count + value);

dataAverageMap.get(rtKey).merge(resourceKey, r.getSizeKb(), (size, value) -> size + value);
dataAverageMap.get(pidKey).merge(patientKey, r.getSizeKb(), (size, value) -> size + value);
}

summary.setTotalSize(sum);
summary.setData(Collections.singletonList(dataSize));
summary.setCount(dataSize.size());
summary.setAverageSize(sum/dataSize.size());
summary.setMinSize(min);
summary.setMaxSize(max);

dataAverageMap.get(rtKey).replaceAll((key, value) -> value/dataCountMap.get(rtKey).get(key));
dataAverageMap.get(pidKey).replaceAll((key, value) -> value/dataCountMap.get(pidKey).get(key));

return summary;
}
Expand Down
16 changes: 11 additions & 5 deletions core/src/main/java/com/lantanagroup/link/db/TenantService.java
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.Collectors;
Expand Down Expand Up @@ -235,13 +236,18 @@ public List<PatientMeasureReport> getPatientMeasureReports(String reportId) {
public List<PatientMeasureReport> getPatientMeasureReports(String reportId, String measureId) {
return this.patientMeasureReports.findByReportIdAndMeasureId(reportId, measureId);
}

public PatientMeasureReportSize getPatientMeasureReportSizeById(String id) {
return patientMeasureReports.GetMeasureReportSizeById(id);
public List<PatientMeasureReportSize> getPatientMeasureReportSize(String patientId, String reportId, String measureId, String patientMeasureReportId) {
if(patientMeasureReportId != null && !patientMeasureReportId.isEmpty()) {
var reportSize = patientMeasureReports.GetMeasureReportSizeById(patientMeasureReportId);
return List.of(reportSize);
}
else {
return patientMeasureReports.GetMeasureReportSize(patientId, reportId, measureId);
}
}

public List<PatientMeasureReportSize> getPatientMeasureReportSize(String patientId, String reportId, String measureId) {
return patientMeasureReports.GetMeasureReportSize(patientId, reportId, measureId);
public List<PatientDataSize> getPatientDataReportSize(String patientId, String resourceType, LocalDateTime startDate, LocalDateTime endDate) {
return patientDatas.GetPatientDataResourceSizeInDateRange(patientId, resourceType, startDate, endDate);
}

public void savePatientMeasureReport(PatientMeasureReport patientMeasureReport) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.lantanagroup.link.db.mappers;

import com.lantanagroup.link.db.model.PatientDataSize;

import java.sql.ResultSet;
import java.sql.SQLException;

public class PatientDataSizeMapper extends BaseMapper<PatientDataSize> {
@Override
protected PatientDataSize doToModel(ResultSet resultSet) throws SQLException {
Row row = new Row(resultSet);
var model = new PatientDataSize();
model.setResourceType(row.getString("resourceType"));
model.setPatientId(row.getString("patientId"));
model.setSizeKb(row.getDouble("sizeKb"));

return model;
}

@Override
protected Parameters doToParameters(PatientDataSize model) {
Parameters parameters = new Parameters();
parameters.addString("reportId", model.getResourceType());
parameters.addString("patientId", model.getPatientId());
parameters.addValue("sizeKb", model.getSizeKb());
return parameters;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.lantanagroup.link.db.model;

import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class PatientDataSize {
private String patientId;
private String resourceType;
private double SizeKb;
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package com.lantanagroup.link.db.repositories;

import com.lantanagroup.link.db.mappers.PatientDataMapper;
import com.lantanagroup.link.db.mappers.PatientDataSizeMapper;
import com.lantanagroup.link.db.model.PatientData;
import com.lantanagroup.link.db.model.PatientDataSize;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
Expand All @@ -11,15 +13,13 @@
import org.springframework.transaction.support.TransactionTemplate;

import javax.sql.DataSource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.time.LocalDateTime;
import java.util.*;

public class PatientDataRepository {
private static final Logger logger = LoggerFactory.getLogger(PatientDataRepository.class);
private static final PatientDataMapper mapper = new PatientDataMapper();

private static final PatientDataSizeMapper sizeMapper = new PatientDataSizeMapper();
private final TransactionTemplate txTemplate;
private final NamedParameterJdbcTemplate jdbc;

Expand All @@ -44,6 +44,35 @@ public List<PatientData> findByReportIdAndPatientId(String reportId, String pati
return jdbc.query(sql, parameters, mapper);
}

public List<PatientDataSize> GetPatientDataResourceSize(String patientId, String resourceType) {
String sql = "SELECT pmr.patientId, pmr.resourceType, CAST(SUM(DATALENGTH(pmr.resource)) as FLOAT)/1024.0 as sizeKb FROM dbo.patientData AS pmr WHERE (:resourceType = '' OR resourceType = :resourceType) AND (:patientId = '' OR patientId = :patientId) GROUP BY pmr.patientId, pmr.resourceType";

if(resourceType == null) resourceType = "";
if(patientId == null) patientId = "";

HashMap<String, String> parameters = new HashMap();
parameters.put("resourceType", resourceType);
parameters.put("patientId", patientId);


return jdbc.query(sql, parameters, sizeMapper);
}

public List<PatientDataSize> GetPatientDataResourceSizeInDateRange(String patientId, String resourceType, LocalDateTime startDate, LocalDateTime endDate) {
String sql = "SELECT pmr.patientId, pmr.resourceType, CAST(SUM(DATALENGTH(pmr.resource)) as FLOAT)/1024.0 as sizeKb FROM dbo.patientData AS pmr WHERE (:resourceType = '' OR resourceType = :resourceType) AND (:patientId = '' OR patientId = :patientId) AND (:startDate IS NULL OR pmr.retrieved BETWEEN :startDate AND :endDate) GROUP BY pmr.patientId, pmr.resourceType";

if(resourceType == null) resourceType = "";
if(patientId == null) patientId = "";

HashMap<String, Object> parameters = new HashMap<>();
parameters.put("resourceType", resourceType);
parameters.put("patientId", patientId);
parameters.put("startDate", startDate);
parameters.put("endDate", endDate);

return jdbc.query(sql, parameters, sizeMapper);
}

public void saveAll(String reportId, List<PatientData> models) {
String sql = "INSERT INTO dbo.patientData (id, dataTraceId, patientId, resourceType, resourceId, resource, retrieved) " +
"SELECT :id, :dataTraceId, :patientId, :resourceType, :resourceId, :resource, :retrieved " +
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.lantanagroup.link.model;

import lombok.Getter;
import lombok.Setter;

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

@Getter
@Setter
public class DataSizeSummary {
private List<Object> Data;
private double TotalSize;
private int Count;
private double AverageSize;
private double MinSize;
private double MaxSize;
private LocalDateTime startDate;
private LocalDateTime endDate;

private HashMap<String, HashMap<String,Integer>> CountDataType = new HashMap<>();
private HashMap<String, HashMap<String, Double>> AverageDataSize = new HashMap<>();
}

This file was deleted.

0 comments on commit 1fa82e2

Please sign in to comment.