-
Notifications
You must be signed in to change notification settings - Fork 196
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
8 changed files
with
316 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
182 changes: 182 additions & 0 deletions
182
src/main/java/org/openelisglobal/testcalculated/action/util/TestCalculatedUtil.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,182 @@ | ||
package org.openelisglobal.testcalculated.action.util; | ||
|
||
import java.util.ArrayList; | ||
import java.util.Date; | ||
import java.util.HashMap; | ||
import java.util.HashSet; | ||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Set; | ||
import org.openelisglobal.analysis.valueholder.Analysis; | ||
import org.openelisglobal.common.util.DateUtil; | ||
import org.openelisglobal.result.action.util.ResultSet; | ||
import org.openelisglobal.result.service.ResultService; | ||
import org.openelisglobal.result.valueholder.Result; | ||
import org.openelisglobal.spring.util.SpringContext; | ||
import org.openelisglobal.test.service.TestService; | ||
import org.openelisglobal.test.valueholder.Test; | ||
import org.openelisglobal.testcalculated.service.ResultCalculationService; | ||
import org.openelisglobal.testcalculated.service.TestCalculationService; | ||
import org.openelisglobal.testcalculated.valueholder.Calculation; | ||
import org.openelisglobal.testcalculated.valueholder.Operation; | ||
import org.openelisglobal.testcalculated.valueholder.ResultCalculation; | ||
import org.openelisglobal.testresult.service.TestResultService; | ||
import org.springframework.context.annotation.DependsOn; | ||
import org.springframework.stereotype.Service; | ||
|
||
@Service | ||
@DependsOn({ "springContext" }) | ||
public class TestCalculatedUtil { | ||
|
||
private TestResultService testResultService = SpringContext.getBean(TestResultService.class); | ||
|
||
private ResultCalculationService resultcalculationService = SpringContext.getBean(ResultCalculationService.class); | ||
|
||
private TestCalculationService calculationService = SpringContext.getBean(TestCalculationService.class); | ||
|
||
private TestService testService = SpringContext.getBean(TestService.class); | ||
|
||
private ResultService resultService = SpringContext.getBean(ResultService.class); | ||
|
||
public List<Analysis> addNewTestsToDBForCalculatedTests(List<ResultSet> resultSetList, String sysUserId) | ||
throws IllegalStateException { | ||
|
||
for (ResultSet resultSet : resultSetList) { | ||
List<Calculation> calculations = calculationService.getAll(); | ||
for (Calculation calculation : calculations) { | ||
if (!calculation.getActive()) { | ||
break; | ||
} | ||
List<ResultCalculation> resultCalculations = resultcalculationService | ||
.getResultCalculationByPatientAndCalculation(resultSet.patient, calculation); | ||
if (resultCalculations.isEmpty()) { | ||
Boolean createResultCalculation = false; | ||
for (Operation oper : calculation.getOperations()) { | ||
if (oper.getType().equals(Operation.OperationType.TEST_RESULT)) { | ||
if (Integer.valueOf(oper.getValue()) | ||
.equals(Integer.valueOf(resultSet.result.getTestResult().getTest().getId()))) { | ||
createResultCalculation = true; | ||
break; | ||
} | ||
} | ||
} | ||
if (createResultCalculation) { | ||
ResultCalculation calc = new ResultCalculation(); | ||
calc.setCalculation(calculation); | ||
calc.setPatient(resultSet.patient); | ||
Set<Test> tests = new HashSet<>(); | ||
calculation.getOperations().forEach(oper -> { | ||
if (oper.getType().equals(Operation.OperationType.TEST_RESULT)) { | ||
Test test = testService.getActiveTestById(Integer.valueOf(oper.getValue())); | ||
tests.add(test); | ||
} | ||
}); | ||
calc.setTest(tests); | ||
Map<Integer, Integer> map = new HashMap<>(); | ||
tests.forEach(test -> { | ||
map.put(Integer.valueOf(test.getId()), null); | ||
}); | ||
// insert innitail result value | ||
map.put(Integer.valueOf(resultSet.result.getTestResult().getTest().getId()), | ||
Integer.valueOf(resultSet.result.getId())); | ||
calc.setTestResultMap(map); | ||
System.out.println(calc.getTestResultMap()); | ||
resultcalculationService.insert(calc); | ||
} | ||
|
||
} else { | ||
for (ResultCalculation resultCalculation : resultCalculations) { | ||
resultCalculation.getTestResultMap().put( | ||
Integer.valueOf(resultSet.result.getTestResult().getTest().getId()), | ||
Integer.valueOf(resultSet.result.getId())); | ||
resultcalculationService.update(resultCalculation); | ||
} | ||
} | ||
} | ||
List<ResultCalculation> resultCalculations = resultcalculationService | ||
.getResultCalculationByPatientAndTest(resultSet.patient, resultSet.result.getTestResult().getTest()); | ||
|
||
if (!resultCalculations.isEmpty()) { | ||
for (ResultCalculation resultCalculation : resultCalculations) { | ||
Boolean missingParams = false; | ||
for (Map.Entry<Integer, Integer> entry : resultCalculation.getTestResultMap().entrySet()) { | ||
Integer key = entry.getKey(); | ||
Integer value = entry.getValue(); | ||
if (entry.getValue() == null) { | ||
missingParams = true; | ||
} | ||
} | ||
if (!missingParams) { | ||
Calculation calculation = resultCalculation.getCalculation(); | ||
|
||
StringBuffer function = new StringBuffer(); | ||
calculation.getOperations().forEach(operation -> { | ||
switch (operation.getType()) { | ||
case TEST_RESULT: | ||
addNumericOperation(operation ,resultCalculation ,function ,Operation.OperationType.TEST_RESULT.toString()); | ||
break; | ||
case INTEGER: | ||
function.append(Integer.valueOf(operation.getValue())).append(" "); | ||
break; | ||
case MATH_FUNCTION: | ||
if (operation.getValue().equals(Operation.IN_NORMAL_RANGE.toLowerCase())) { | ||
int order = operation.getOrder(); | ||
Operation prevOperation = calculation.getOperations().get(order - 1); | ||
addNumericOperation(prevOperation ,resultCalculation ,function ,"IN_NORMAL_RANGE"); | ||
|
||
} else if (operation.getValue().equals(Operation.OUTSIDE_NORMAL_RANGE.toString())) { | ||
int order = operation.getOrder(); | ||
Operation prevOperation = calculation.getOperations().get(order - 1); | ||
addNumericOperation(prevOperation ,resultCalculation ,function , "OUTSIDE_NORMAL_RANGE"); | ||
} else { | ||
function.append(operation.getValue()).append(" "); | ||
} | ||
break; | ||
case PATIENT_ATTRIBUTE: | ||
if (operation.getValue().equals(Operation.PatientAttribute.AGE.toString())) { | ||
int age = DateUtil.getAgeInYears( | ||
new Date(resultSet.patient.getBirthDate().getTime()), new Date()); | ||
function.append(age); | ||
} | ||
break; | ||
|
||
} | ||
}); | ||
System.out.println(function); | ||
} else { | ||
} | ||
} | ||
} | ||
} | ||
|
||
return null; | ||
} | ||
|
||
private void addNumericOperation(Operation operation, ResultCalculation resultCalculation, StringBuffer function, | ||
String inputType) { | ||
Test test = testService.getActiveTestById(Integer.valueOf(operation.getValue())); | ||
if (test != null) { | ||
Integer resultId = resultCalculation.getTestResultMap().get(Integer.valueOf(test.getId())); | ||
Result result = resultService.get(resultId.toString()); | ||
if (result != null) { | ||
if (result.getResultType().equals("N")) { | ||
switch (inputType) { | ||
case "TEST_RESULT": | ||
function.append(result.getValue()).append(" "); | ||
break; | ||
case "IN_NORMAL_RANGE": | ||
function.append(" >= ").append(result.getMinNormal()).append(" && ").append(result.getValue()) | ||
.append(" <= ").append(result.getMaxNormal()).append(" "); | ||
break; | ||
case "OUTSIDE_NORMAL_RANGE": | ||
function.append(" <= ").append(result.getMinNormal()).append(" || ").append(result.getValue()) | ||
.append(" >= ").append(result.getMaxNormal()).append(" "); | ||
break; | ||
} | ||
} | ||
} | ||
} | ||
|
||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
13 changes: 12 additions & 1 deletion
13
src/main/java/org/openelisglobal/testcalculated/dao/ResultCalculationDAO.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,19 @@ | ||
package org.openelisglobal.testcalculated.dao; | ||
|
||
import java.util.List; | ||
|
||
import org.openelisglobal.common.dao.BaseDAO; | ||
import org.openelisglobal.common.exception.LIMSRuntimeException; | ||
import org.openelisglobal.patient.valueholder.Patient; | ||
import org.openelisglobal.test.valueholder.Test; | ||
import org.openelisglobal.testcalculated.valueholder.Calculation; | ||
import org.openelisglobal.testcalculated.valueholder.ResultCalculation; | ||
|
||
public interface ResultCalculationDAO extends BaseDAO<ResultCalculation, Integer>{ | ||
|
||
|
||
List<ResultCalculation> getResultCalculationByPatientAndTest(Patient patient , Test test) throws LIMSRuntimeException; | ||
|
||
List<ResultCalculation> getResultCalculationByTest(Test test) throws LIMSRuntimeException; | ||
|
||
List<ResultCalculation> getResultCalculationByPatientAndCalculation(Patient patient , Calculation calculation) throws LIMSRuntimeException; | ||
} |
73 changes: 70 additions & 3 deletions
73
src/main/java/org/openelisglobal/testcalculated/daoimpl/ResultCalculationDAOImpl.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,18 +1,85 @@ | ||
package org.openelisglobal.testcalculated.daoimpl; | ||
|
||
import java.util.Collections; | ||
import java.util.List; | ||
|
||
import javax.transaction.Transactional; | ||
|
||
import org.hibernate.Session; | ||
import org.hibernate.query.Query; | ||
import org.openelisglobal.common.daoimpl.BaseDAOImpl; | ||
import org.openelisglobal.patient.valueholder.Patient; | ||
import org.openelisglobal.test.valueholder.Test; | ||
import org.openelisglobal.testcalculated.dao.ResultCalculationDAO; | ||
import org.openelisglobal.testcalculated.valueholder.Calculation; | ||
import org.openelisglobal.testcalculated.valueholder.ResultCalculation; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Component | ||
@Transactional | ||
public class ResultCalculationDAOImpl extends BaseDAOImpl<ResultCalculation, Integer> implements ResultCalculationDAO{ | ||
|
||
public class ResultCalculationDAOImpl extends BaseDAOImpl<ResultCalculation, Integer> implements ResultCalculationDAO { | ||
public ResultCalculationDAOImpl() { | ||
super(ResultCalculation.class); | ||
super(ResultCalculation.class); | ||
} | ||
|
||
@Override | ||
public List<ResultCalculation> getResultCalculationByPatientAndTest(Patient patient, Test test) { | ||
try { | ||
|
||
String sql = "from ResultCalculation r WHERE r.patient.id = :patientId AND :test IN ELEMENTS(r.test)"; | ||
Query<ResultCalculation> query = entityManager.unwrap(Session.class).createQuery(sql, ResultCalculation.class); | ||
query.setParameter("patientId", Integer.parseInt(patient.getId())); | ||
query.setParameter("test", test); | ||
|
||
List<ResultCalculation> results = query.list(); | ||
if (results.size() > 0) { | ||
return results; | ||
} | ||
} | ||
catch (RuntimeException e) { | ||
handleException(e, "getResultCalculationByPatientAndTest"); | ||
} | ||
return Collections.emptyList(); | ||
} | ||
|
||
@Override | ||
public List<ResultCalculation> getResultCalculationByTest(Test test) { | ||
try { | ||
|
||
String sql = "from ResultCalculation r JOIN r.test t WHERE t.id = :testId"; | ||
Query<ResultCalculation> query = entityManager.unwrap(Session.class).createQuery(sql, ResultCalculation.class); | ||
query.setParameter("testId", Integer.parseInt(test.getId())); | ||
|
||
List<ResultCalculation> results = query.list(); | ||
if (results.size() > 0) { | ||
return results; | ||
} | ||
} | ||
catch (RuntimeException e) { | ||
handleException(e, "getResultCalculationByPatientAndTest"); | ||
} | ||
return Collections.emptyList(); | ||
} | ||
|
||
@Override | ||
public List<ResultCalculation> getResultCalculationByPatientAndCalculation(Patient patient, Calculation calculation) { | ||
try { | ||
|
||
String sql = "from ResultCalculation r WHERE r.patient.id = :patientId AND r.calculation.id = :calculationId"; | ||
Query<ResultCalculation> query = entityManager.unwrap(Session.class).createQuery(sql, ResultCalculation.class); | ||
query.setParameter("patientId", Integer.parseInt(patient.getId())); | ||
query.setParameter("calculationId", calculation.getId()); | ||
|
||
List<ResultCalculation> results = query.list(); | ||
if (results.size() > 0) { | ||
return results; | ||
} | ||
} | ||
catch (RuntimeException e) { | ||
handleException(e, "getResultCalculationByPatientAndCalculation"); | ||
} | ||
return Collections.emptyList(); | ||
} | ||
|
||
} |
11 changes: 11 additions & 0 deletions
11
src/main/java/org/openelisglobal/testcalculated/service/ResultCalculationService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,8 +1,19 @@ | ||
package org.openelisglobal.testcalculated.service; | ||
|
||
import java.util.List; | ||
|
||
import org.openelisglobal.common.service.BaseObjectService; | ||
import org.openelisglobal.patient.valueholder.Patient; | ||
import org.openelisglobal.test.valueholder.Test; | ||
import org.openelisglobal.testcalculated.valueholder.Calculation; | ||
import org.openelisglobal.testcalculated.valueholder.ResultCalculation; | ||
|
||
public interface ResultCalculationService extends BaseObjectService<ResultCalculation , Integer>{ | ||
|
||
List<ResultCalculation> getResultCalculationByPatientAndTest(Patient patient , Test test); | ||
|
||
List<ResultCalculation> getResultCalculationByTest(Test test); | ||
|
||
List<ResultCalculation> getResultCalculationByPatientAndCalculation(Patient patient , Calculation calculation); | ||
|
||
} |
Oops, something went wrong.