diff --git a/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/NitriteTest.java b/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/NitriteTest.java index a8b272fcf..ed1f4fbb0 100644 --- a/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/NitriteTest.java +++ b/nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/NitriteTest.java @@ -66,6 +66,7 @@ import static org.dizitart.no2.common.util.Iterables.listOf; import static org.dizitart.no2.filters.Filter.ALL; import static org.dizitart.no2.filters.Filter.and; +import static org.dizitart.no2.filters.Filter.or; import static org.dizitart.no2.filters.FluentFilter.where; import static org.dizitart.no2.integration.TestUtil.deleteDb; import static org.dizitart.no2.integration.TestUtil.getRandomTempDbFile; @@ -236,6 +237,43 @@ public void testReopen() throws ParseException { assertEquals(prevRepoSize + 1, repoSizeNow); } + @Test + public void testLogicalIdSearchForLegacyStringIds() { + String stringBackedId = "1840817122658033664"; + long longBackedId = 2041406700293308416L; + + NitriteCollection testCollection = db.getCollection("legacy-id-test"); + testCollection.insert( + createDocument("_id", stringBackedId).put("tag", "string-id"), + createDocument("_id", longBackedId).put("tag", "long-id")); + db.commit(); + db.close(); + + db = TestUtil.createDb(fileName, "test-user", "test-password"); + testCollection = db.getCollection("legacy-id-test"); + + Document directResult = testCollection.find(where("_id").eq(Long.parseLong(stringBackedId))).firstOrNull(); + assertNotNull(directResult); + assertEquals(Long.parseLong(stringBackedId), directResult.getId().getIdValue()); + + Set orIds = new HashSet<>(); + for (Document document : testCollection.find(or( + where("_id").eq(longBackedId), + where("_id").eq(Long.parseLong(stringBackedId)))).toList()) { + orIds.add(document.getId().getIdValue()); + } + + assertTrue(orIds.contains(longBackedId)); + assertTrue(orIds.contains(Long.parseLong(stringBackedId))); + + Document andResult = testCollection.find(and( + where("_id").eq(Long.parseLong(stringBackedId)), + where("tag").eq("string-id"))).firstOrNull(); + + assertNotNull(andResult); + assertEquals(Long.parseLong(stringBackedId), andResult.getId().getIdValue()); + } + @Test public void testClose() { NitriteCollection testCollection = db.getCollection("test"); diff --git a/nitrite/src/main/java/org/dizitart/no2/collection/operation/FindOptimizer.java b/nitrite/src/main/java/org/dizitart/no2/collection/operation/FindOptimizer.java index 935cc69e3..c0c1d25c1 100644 --- a/nitrite/src/main/java/org/dizitart/no2/collection/operation/FindOptimizer.java +++ b/nitrite/src/main/java/org/dizitart/no2/collection/operation/FindOptimizer.java @@ -100,7 +100,7 @@ private FindPlan createOrPlan(Collection indexDescriptors, List // check if all sub plan have index support for (FindPlan plan : findPlan.getSubPlans()) { - if (plan.getIndexDescriptor() == null) { + if (plan.getIndexDescriptor() == null && plan.getByIdFilter() == null) { // if one of the sub plan doesn't have any index support // then it can not be optimized, instead the // original filter should be set as coll-scan filter