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