diff --git a/libs/commcare b/libs/commcare index 908afa26d..75730b177 160000 --- a/libs/commcare +++ b/libs/commcare @@ -1 +1 @@ -Subproject commit 908afa26d38f3f60719339d49712f034792e1735 +Subproject commit 75730b1778d7125e23d7fee76c0b6afdaf2cd61d diff --git a/src/main/java/engine/FormplayerCaseInstanceTreeElement.java b/src/main/java/engine/FormplayerCaseInstanceTreeElement.java index 71d63f53c..faf3a30ad 100644 --- a/src/main/java/engine/FormplayerCaseInstanceTreeElement.java +++ b/src/main/java/engine/FormplayerCaseInstanceTreeElement.java @@ -3,6 +3,7 @@ import database.models.FormplayerCaseIndexTable; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.commcare.cases.query.handlers.LogicalValueIndexHandler; import org.commcare.modern.engine.cases.CaseIndexQuerySetTransform; import org.commcare.modern.engine.cases.query.CaseIndexPrefetchHandler; import sandbox.SqlHelper; @@ -58,6 +59,8 @@ protected void initBasicQueryHandlers(QueryPlanner queryPlanner) { CaseModelQuerySetMatcher matcher = new CaseModelQuerySetMatcher(multiplicityIdMapping); matcher.addQuerySetTransform(new CaseIndexQuerySetTransform(formplayerCaseIndexTable)); queryPlanner.addQueryHandler(new ModelQueryLookupHandler(matcher)); + + queryPlanner.addQueryHandler(new LogicalValueIndexHandler(this.getStorageIndexMap(), this.getStorage())); } @Override diff --git a/src/test/java/tests/CaseDbOptimizationsTest.java b/src/test/java/tests/CaseDbOptimizationsTest.java index 1cad082cd..37dad7bc7 100644 --- a/src/test/java/tests/CaseDbOptimizationsTest.java +++ b/src/test/java/tests/CaseDbOptimizationsTest.java @@ -1,6 +1,8 @@ package tests; import org.javarosa.core.model.condition.EvaluationContext; +import org.javarosa.core.model.trace.ReducingTraceReporter; +import org.javarosa.core.model.utils.InstrumentationUtils; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; @@ -38,14 +40,18 @@ public void testDbOptimizations() throws Exception { UserSqlSandbox sandbox = restoreFactoryMock.getSqlSandbox(); EvaluationContext ec = TestStorageUtils.getEvaluationContextWithoutSession(sandbox); ec.setDebugModeOn(); - evaluate("join(',',instance('casedb')/casedb/case[index/parent = 'test_case_parent']/@case_id)", "child_one,child_two,child_three", ec); - evaluate("join(',',instance('casedb')/casedb/case[index/parent = 'test_case_parent'][@case_id = 'child_two']/@case_id)", "child_two", ec); - evaluate("join(',',instance('casedb')/casedb/case[index/parent = 'test_case_parent'][@case_id != 'child_two']/@case_id)", "child_one,child_three", ec); - - evaluate("join(',',instance('casedb')/casedb/case[selected('test_case_parent', index/parent)]/@case_id)", "child_one,child_two,child_three", ec); - evaluate("join(',',instance('casedb')/casedb/case[selected('test_case_parent test_case_parent_2', index/parent)]/@case_id)", "child_one,child_two,child_three", ec); - evaluate("join(',',instance('casedb')/casedb/case[selected('test_case_parent_2 test_case_parent', index/parent)]/@case_id)", "child_one,child_two,child_three", ec); - evaluate("join(',',instance('casedb')/casedb/case[selected('test_case_parent_2 test_case_parent_3', index/parent)]/@case_id)", "", ec); - evaluate("join(',',instance('casedb')/casedb/case[selected('', index/parent)]/@case_id)", "", ec); + evaluate("sort(join(' ',instance('casedb')/casedb/case[index/parent = 'test_case_parent']/@case_id))", "child_one child_three child_two", ec); + evaluate("sort(join(',',instance('casedb')/casedb/case[index/parent = 'test_case_parent'][@case_id = 'child_two']/@case_id))", "child_two", ec); + evaluate("sort(join(' ',instance('casedb')/casedb/case[index/parent = 'test_case_parent'][@case_id != 'child_two']/@case_id))", "child_one child_three", ec); + + evaluate("sort(join(' ',instance('casedb')/casedb/case[selected('test_case_parent', index/parent)]/@case_id))", "child_one child_three child_two", ec); + evaluate("sort(join(' ',instance('casedb')/casedb/case[selected('test_case_parent test_case_parent_2', index/parent)]/@case_id))", "child_one child_three child_two", ec); + evaluate("sort(join(' ',instance('casedb')/casedb/case[selected('test_case_parent_2 test_case_parent', index/parent)]/@case_id))", "child_one child_three child_two", ec); + evaluate("join(' ',instance('casedb')/casedb/case[selected('test_case_parent_2 test_case_parent_3', index/parent)]/@case_id)", "", ec); + evaluate("join(' ',instance('casedb')/casedb/case[selected('', index/parent)]/@case_id)", "", ec); + + evaluate("sort(join(' ', instance('casedb')/casedb/case[@case_id='child_one' or @case_id='child_two']/case_name))", "One Two", ec); + + evaluate("sort(join(' ', instance('casedb')/casedb/case[@owner_id='test_user_id' and @external_id='three']/@case_id))", "child_three", ec); } } diff --git a/src/test/resources/restores/dbtests/case_test_db_optimizations.xml b/src/test/resources/restores/dbtests/case_test_db_optimizations.xml index 2b3bca16e..28bcab43e 100644 --- a/src/test/resources/restores/dbtests/case_test_db_optimizations.xml +++ b/src/test/resources/restores/dbtests/case_test_db_optimizations.xml @@ -20,9 +20,12 @@ user_id="test_user_id" xmlns="http://commcarehq.org/case/transaction/v2"> unit_test_child - Test Case + One test_user_id + + one + test_case_parent @@ -31,9 +34,12 @@ user_id="test_user_id" xmlns="http://commcarehq.org/case/transaction/v2"> unit_test_child - Test Case + Two test_user_id + + two + test_case_parent @@ -45,6 +51,9 @@ Test Case test_user_id + + three + test_case_parent