package org.openmrs.module.reporting.evaluation.service; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.openmrs.Encounter; import org.openmrs.Person; import org.openmrs.api.context.Context; import org.openmrs.api.db.hibernate.DbSessionFactory; import org.openmrs.module.reporting.common.TestUtil; import org.openmrs.module.reporting.evaluation.EvaluationContext; import org.openmrs.module.reporting.evaluation.querybuilder.HqlQueryBuilder; import org.openmrs.test.BaseModuleContextSensitiveTest; import org.springframework.beans.factory.annotation.Autowired; import java.util.ArrayList; import java.util.List; import java.util.Map; public class EvaluationServiceTest extends BaseModuleContextSensitiveTest { protected static final String XML_DATASET_PATH = "org/openmrs/module/reporting/include/"; protected static final String XML_REPORT_TEST_DATASET = "ReportTestDataset"; @Autowired DbSessionFactory sessionFactory; @Autowired EvaluationService evaluationService; @Before public void setup() throws Exception { executeDataSet(XML_DATASET_PATH + new TestUtil().getTestDatasetFilename(XML_REPORT_TEST_DATASET)); } @Test public void evaluateToList_shouldEvaluateAQueryToAMultiValueList() throws Exception { HqlQueryBuilder queryBuilder = new HqlQueryBuilder(); queryBuilder.select("personId", "gender").from(Person.class).whereInAny("personId", 2, 7).orderAsc("personId"); List<Object[]> l = evaluationService.evaluateToList(queryBuilder, new EvaluationContext()); Assert.assertEquals(2, l.get(0)[0]); Assert.assertEquals(7, l.get(1)[0]); Assert.assertEquals("M", l.get(0)[1]); Assert.assertEquals("F", l.get(1)[1]); Assert.assertEquals(2, l.size()); } @Test public void evaluateToList_shouldEvaluateAQueryToASingleValueList() throws Exception { HqlQueryBuilder queryBuilder = new HqlQueryBuilder(); queryBuilder.select("gender").from(Person.class).whereInAny("personId", 2, 7).orderAsc("personId"); List<String> genders = evaluationService.evaluateToList(queryBuilder, String.class, new EvaluationContext()); Assert.assertEquals("M", genders.get(0)); Assert.assertEquals("F", genders.get(1)); Assert.assertEquals(2, genders.size()); } @Test(expected = IllegalArgumentException.class) public void evaluateToList_shouldThrowAnExceptionWithIncorrectNumberOfColumns() { HqlQueryBuilder queryBuilder = new HqlQueryBuilder(); queryBuilder.select("personId", "gender").from(Person.class).whereInAny("personId", 2, 7).orderAsc("personId"); evaluationService.evaluateToList(queryBuilder, String.class, new EvaluationContext()); } @Test public void evaluateToMap_shouldEvaluateAQueryToAMap() throws Exception { HqlQueryBuilder queryBuilder = new HqlQueryBuilder(); queryBuilder.select("personId", "gender").from(Person.class).whereInAny("personId", 2, 7).orderAsc("personId"); Map<Integer, String> m = evaluationService.evaluateToMap(queryBuilder, Integer.class, String.class, new EvaluationContext()); Assert.assertEquals(m.get(2), "M"); Assert.assertEquals(m.get(7), "F"); } @Test(expected = IllegalArgumentException.class) public void evaluateToMap_shouldThrowAnExceptionWithIncorrectNumberOfColumns() { HqlQueryBuilder queryBuilder = new HqlQueryBuilder(); queryBuilder.select("personId", "gender", "birthdate").from(Person.class).whereInAny("personId", 2, 7).orderAsc("personId"); evaluationService.evaluateToMap(queryBuilder, Integer.class, String.class, new EvaluationContext()); } @Test public void listResults_shouldNotStackOverflowOnLargeInClauses() throws Exception { List<Integer> bigIdSet = new ArrayList<Integer>(); for (int i=1; i<= 100000; i++) { bigIdSet.add(i); } HqlQueryBuilder hql = new HqlQueryBuilder(); hql.select("e.encounterDatetime").from(Encounter.class, "e").whereIdIn("e.patient.patientId", bigIdSet); Context.getService(EvaluationService.class).evaluateToList(hql, new EvaluationContext()); } }