Bugfix: takes property set into account when collecting comparable reports.

This commit is contained in:
Jan 2025-10-19 19:55:19 +02:00
parent 67fc5607e3
commit 0c88c5ed0f
4 changed files with 40 additions and 40 deletions

View file

@ -73,12 +73,12 @@ public class CalculationJobRepository {
}
@Transactional
public Optional<CalculationJob> getCalculationJobWithJobStateValid(Integer periodId, Integer nodeId, Integer materialId) {
public Optional<CalculationJob> getCalculationJobWithJobStateValid(Integer periodId, Integer setId, Integer nodeId, Integer materialId) {
/* there should only be one job per period id, node id and material id combination */
String query = "SELECT * FROM calculation_job AS cj INNER JOIN premise AS p ON cj.premise_id = p.id WHERE job_state = 'VALID' AND validity_period_id = ? AND p.supplier_node_id = ? AND material_id = ? ORDER BY cj.calculation_date DESC LIMIT 1";
String query = "SELECT * FROM calculation_job AS cj INNER JOIN premise AS p ON cj.premise_id = p.id WHERE job_state = 'VALID' AND validity_period_id = ? AND property_set_id = ? AND p.supplier_node_id = ? AND material_id = ? ORDER BY cj.calculation_date DESC LIMIT 1";
var job = jdbcTemplate.query(query, new CalculationJobMapper(), periodId, nodeId, materialId);
var job = jdbcTemplate.query(query, new CalculationJobMapper(), periodId, setId, nodeId, materialId);
if(job.isEmpty())
return Optional.empty();
@ -87,12 +87,12 @@ public class CalculationJobRepository {
}
@Transactional
public Optional<CalculationJob> getCalculationJobWithJobStateValidUserNodeId(Integer periodId, Integer userNodeId, Integer materialId) {
public Optional<CalculationJob> getCalculationJobWithJobStateValidUserNodeId(Integer periodId, Integer setId, Integer userNodeId, Integer materialId) {
/* there should only be one job per period id, node id and material id combination */
String query = "SELECT * FROM calculation_job AS cj INNER JOIN premise AS p ON cj.premise_id = p.id WHERE job_state = 'VALID' AND validity_period_id = ? AND p.user_supplier_node_id = ? AND material_id = ? ORDER BY cj.calculation_date DESC LIMIT 1";
String query = "SELECT * FROM calculation_job AS cj INNER JOIN premise AS p ON cj.premise_id = p.id WHERE job_state = 'VALID' AND validity_period_id = ? AND property_set_id = ? AND p.user_supplier_node_id = ? AND material_id = ? ORDER BY cj.calculation_date DESC LIMIT 1";
var job = jdbcTemplate.query(query, new CalculationJobMapper(), periodId, userNodeId, materialId);
var job = jdbcTemplate.query(query, new CalculationJobMapper(), periodId, setId, userNodeId, materialId);
if(job.isEmpty())
return Optional.empty();

View file

@ -228,7 +228,7 @@ public class ValidityPeriodRepository {
}
@Transactional
public Optional<ValidityPeriod> getValidPeriodForReportingByMaterialId(Integer materialId, List<Integer> nodeIds, List<Integer> userNodeIds) {
public Optional<ValidityTuple> getValidPeriodForReportingByMaterialId(Integer materialId, List<Integer> nodeIds, List<Integer> userNodeIds) {
// Check if both lists are empty
if ((nodeIds == null || nodeIds.isEmpty()) && (userNodeIds == null || userNodeIds.isEmpty())) {
@ -257,12 +257,9 @@ public class ValidityPeriodRepository {
}
String validityPeriodSql = """
SELECT vp.*
FROM validity_period vp
INNER JOIN (
SELECT
cj.validity_period_id,
COUNT(DISTINCT COALESCE(p.supplier_node_id, p.user_supplier_node_id)) as node_count
cj.property_set_id
FROM
premise p
INNER JOIN
@ -273,12 +270,12 @@ public class ValidityPeriodRepository {
+ whereClause + """
GROUP BY
cj.validity_period_id
cj.validity_period_id,
cj.property_set_id
HAVING
COUNT(DISTINCT COALESCE(p.supplier_node_id, p.user_supplier_node_id)) = ?
) matching_periods ON vp.id = matching_periods.validity_period_id
ORDER BY
vp.start_date DESC
(SELECT start_date FROM validity_period WHERE id = cj.validity_period_id) DESC
LIMIT 1
""";
@ -299,13 +296,15 @@ public class ValidityPeriodRepository {
params[paramIndex] = totalNodeCount;
var periods = jdbcTemplate.query(validityPeriodSql, new ValidityPeriodMapper(), params);
var tuples = jdbcTemplate.query(validityPeriodSql,
(rs, cnt) -> new ValidityTuple(rs.getInt("validity_period_id"), rs.getInt("property_set_id")),
params);
if (periods.isEmpty()) {
if (tuples.isEmpty()) {
return Optional.empty();
}
return Optional.of(periods.getFirst());
return Optional.of(tuples.getFirst());
}
@Transactional

View file

@ -50,15 +50,16 @@ public class ReportingService {
}
public List<ReportDTO> getReport(Integer materialId, List<Integer> nodeIds, List<Integer> userNodeIds) {
var period = validityPeriodRepository.getValidPeriodForReportingByMaterialId(materialId, nodeIds, userNodeIds);
var tuple = validityPeriodRepository.getValidPeriodForReportingByMaterialId(materialId, nodeIds, userNodeIds);
if (period.isEmpty())
if (tuple.isEmpty())
throw new IllegalArgumentException("No valid period found");
var periodId = period.get().getId();
var periodId = tuple.get().periodId();
var setId = tuple.get().propertySetId();
var jobs = new ArrayList<>(nodeIds.stream().map(nodeId -> calculationJobRepository.getCalculationJobWithJobStateValid(periodId, nodeId, materialId)).filter(Optional::isPresent).map(Optional::get).toList());
jobs.addAll(userNodeIds.stream().map(nodeId -> calculationJobRepository.getCalculationJobWithJobStateValidUserNodeId(periodId,nodeId ,materialId)).filter(Optional::isPresent).map(Optional::get).toList());
var jobs = new ArrayList<>(nodeIds.stream().map(nodeId -> calculationJobRepository.getCalculationJobWithJobStateValid(periodId, setId, nodeId, materialId)).filter(Optional::isPresent).map(Optional::get).toList());
jobs.addAll(userNodeIds.stream().map(nodeId -> calculationJobRepository.getCalculationJobWithJobStateValidUserNodeId(periodId, setId,nodeId ,materialId)).filter(Optional::isPresent).map(Optional::get).toList());
return jobs.stream().map(reportTransformer::toReportDTO).toList();
}