From b796b906427ac28967ecbc8a245534822f1f33d1 Mon Sep 17 00:00:00 2001 From: Clayton Sims Date: Tue, 26 May 2020 17:40:17 -0400 Subject: [PATCH 1/2] Integrate logical or optimization and tests --- libs/commcare | 2 +- .../FormplayerCaseInstanceTreeElement.java | 3 +++ .../java/tests/CaseDbOptimizationsTest.java | 26 ++++++++++++------- .../dbtests/case_test_db_optimizations.xml | 4 +-- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/libs/commcare b/libs/commcare index 908afa26d..e0d975743 160000 --- a/libs/commcare +++ b/libs/commcare @@ -1 +1 @@ -Subproject commit 908afa26d38f3f60719339d49712f034792e1735 +Subproject commit e0d97574328bcf514ff3e0a95ff00071914a782a 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..7f9e0b8a4 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,20 @@ 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); + + ReducingTraceReporter reporter = new ReducingTraceReporter(false); + ec.setDebugModeOn(reporter); + + evaluate("sort(join(' ', instance('casedb')/casedb/case[@case_id='child_one' or @case_id='child_two']/case_name))", "One Two", ec); + InstrumentationUtils.printAndClearTraces(reporter,"Test Path"); } } 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..bc4bf5bbd 100644 --- a/src/test/resources/restores/dbtests/case_test_db_optimizations.xml +++ b/src/test/resources/restores/dbtests/case_test_db_optimizations.xml @@ -20,7 +20,7 @@ user_id="test_user_id" xmlns="http://commcarehq.org/case/transaction/v2"> unit_test_child - Test Case + One test_user_id @@ -31,7 +31,7 @@ user_id="test_user_id" xmlns="http://commcarehq.org/case/transaction/v2"> unit_test_child - Test Case + Two test_user_id From ec6321e8dfcc136ed5cac0bd3563d9e006d4f1e6 Mon Sep 17 00:00:00 2001 From: Clayton Sims Date: Tue, 26 May 2020 18:06:18 -0400 Subject: [PATCH 2/2] Tests and cleanup --- libs/commcare | 2 +- src/test/java/tests/CaseDbOptimizationsTest.java | 6 ++---- .../restores/dbtests/case_test_db_optimizations.xml | 9 +++++++++ 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/libs/commcare b/libs/commcare index e0d975743..75730b177 160000 --- a/libs/commcare +++ b/libs/commcare @@ -1 +1 @@ -Subproject commit e0d97574328bcf514ff3e0a95ff00071914a782a +Subproject commit 75730b1778d7125e23d7fee76c0b6afdaf2cd61d diff --git a/src/test/java/tests/CaseDbOptimizationsTest.java b/src/test/java/tests/CaseDbOptimizationsTest.java index 7f9e0b8a4..37dad7bc7 100644 --- a/src/test/java/tests/CaseDbOptimizationsTest.java +++ b/src/test/java/tests/CaseDbOptimizationsTest.java @@ -50,10 +50,8 @@ public void testDbOptimizations() throws Exception { 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); - ReducingTraceReporter reporter = new ReducingTraceReporter(false); - ec.setDebugModeOn(reporter); - evaluate("sort(join(' ', instance('casedb')/casedb/case[@case_id='child_one' or @case_id='child_two']/case_name))", "One Two", ec); - InstrumentationUtils.printAndClearTraces(reporter,"Test Path"); + + 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 bc4bf5bbd..28bcab43e 100644 --- a/src/test/resources/restores/dbtests/case_test_db_optimizations.xml +++ b/src/test/resources/restores/dbtests/case_test_db_optimizations.xml @@ -23,6 +23,9 @@ One test_user_id + + one + test_case_parent @@ -34,6 +37,9 @@ Two test_user_id + + two + test_case_parent @@ -45,6 +51,9 @@ Test Case test_user_id + + three + test_case_parent