Skip to content

Commit fa94cb7

Browse files
anidotnetclaude
andcommitted
feat!: remove the no-op distinct find option
BREAKING CHANGE: removed `FindOptions.withDistinct()` (both overloads), `FindOptions.distinct()` and `FindPlan.distinct`. The flag never affected the result set. A find never returns the same document twice, and the `or` sub-plan union in ReadOperations has always applied DistinctStream unconditionally - so FindOptimizer wrote the flag onto the FindPlan and nothing ever read it back. Callers passing `FindOptions.withDistinct()` can drop it with no change in results. `DistinctStream` itself is unchanged and still used for the `or` union. Also adds CollectionOrDuplicateTest, which pins the set-union behaviour of an `or` filter for the no-index, one-indexed-branch and all-indexed-branch cases. nitrite-java was already correct here; the same test found real duplicate defects in nitrite-rust and nitrite-flutter, and is added to keep the three implementations honest. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1 parent 0be1fd8 commit fa94cb7

21 files changed

Lines changed: 118 additions & 137 deletions

File tree

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
## Release 5.0.0 - Aug 7, 2026
2+
3+
### Breaking Changes
4+
5+
- Removed the `distinct` find option - `FindOptions.withDistinct()` (both overloads), `FindOptions.distinct()` and `FindPlan.distinct`. It had no effect on the result set. A find never returns the same document twice, and the `or` sub-plan union has always deduplicated unconditionally, so the flag was written by the planner and never read. Callers passing `FindOptions.withDistinct()` can drop it with no change in results.
6+
17
## Release 4.5.0 - Aug 7, 2026
28

39
### New Features

nitrite-bom/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>org.dizitart</groupId>
66
<artifactId>nitrite-java</artifactId>
7-
<version>4.5.0</version>
7+
<version>5.0.0</version>
88
</parent>
99

1010
<artifactId>nitrite-bom</artifactId>

nitrite-jackson-mapper/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>org.dizitart</groupId>
66
<artifactId>nitrite-java</artifactId>
7-
<version>4.5.0</version>
7+
<version>5.0.0</version>
88
</parent>
99

1010
<artifactId>nitrite-jackson-mapper</artifactId>

nitrite-mvstore-adapter/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>org.dizitart</groupId>
66
<artifactId>nitrite-java</artifactId>
7-
<version>4.5.0</version>
7+
<version>5.0.0</version>
88
</parent>
99

1010
<artifactId>nitrite-mvstore-adapter</artifactId>

nitrite-mvstore-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindByCompoundIndexTest.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import org.dizitart.no2.collection.Document;
2121
import org.dizitart.no2.collection.DocumentCursor;
22-
import org.dizitart.no2.collection.FindOptions;
2322
import org.dizitart.no2.collection.FindPlan;
2423
import org.dizitart.no2.common.SortOrder;
2524
import org.dizitart.no2.common.tuples.Pair;
@@ -83,7 +82,7 @@ public void testFindByOrFilterAndFilter() {
8382
where("firstName").eq("fn3"),
8483
where("lastName").eq("ln2")
8584
)
86-
), FindOptions.withDistinct()
85+
)
8786
);
8887

8988
assertEquals(2, cursor.size());
@@ -203,22 +202,6 @@ public void testFindByOrFilter() throws ParseException {
203202
FindPlan findPlan = cursor.getFindPlan();
204203
assertEquals(3, findPlan.getSubPlans().size());
205204
assertEquals(3, cursor.size());
206-
207-
// distinct
208-
cursor = collection.find(
209-
or(
210-
or(
211-
where("lastName").eq("ln2"),
212-
where("firstName").notEq("fn1")
213-
),
214-
where("birthDay").eq(simpleDateFormat.parse("2012-07-01T16:02:48.440Z")),
215-
where("firstName").notEq("fn1")
216-
), FindOptions.withDistinct()
217-
);
218-
219-
findPlan = cursor.getFindPlan();
220-
assertEquals(3, findPlan.getSubPlans().size());
221-
assertEquals(3, cursor.size());
222205
}
223206

224207
@Test

nitrite-native-tests/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
<parent>
88
<groupId>org.dizitart</groupId>
99
<artifactId>nitrite-java</artifactId>
10-
<version>4.5.0</version>
10+
<version>5.0.0</version>
1111
</parent>
1212

1313
<artifactId>nitrite-native-tests</artifactId>

nitrite-rocksdb-adapter/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>org.dizitart</groupId>
66
<artifactId>nitrite-java</artifactId>
7-
<version>4.5.0</version>
7+
<version>5.0.0</version>
88
</parent>
99

1010
<artifactId>nitrite-rocksdb-adapter</artifactId>

nitrite-rocksdb-adapter/src/test/java/org/dizitart/no2/integration/collection/CollectionFindByCompoundIndexTest.java

Lines changed: 1 addition & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919

2020
import org.dizitart.no2.collection.Document;
2121
import org.dizitart.no2.collection.DocumentCursor;
22-
import org.dizitart.no2.collection.FindOptions;
2322
import org.dizitart.no2.collection.FindPlan;
2423
import org.dizitart.no2.common.SortOrder;
2524
import org.dizitart.no2.common.tuples.Pair;
@@ -83,7 +82,7 @@ public void testFindByOrFilterAndFilter() {
8382
where("firstName").eq("fn3"),
8483
where("lastName").eq("ln2")
8584
)
86-
), FindOptions.withDistinct()
85+
)
8786
);
8887

8988
assertEquals(2, cursor.size());
@@ -203,22 +202,6 @@ public void testFindByOrFilter() throws ParseException {
203202
FindPlan findPlan = cursor.getFindPlan();
204203
assertEquals(3, findPlan.getSubPlans().size());
205204
assertEquals(3, cursor.size());
206-
207-
// distinct
208-
cursor = collection.find(
209-
or(
210-
or(
211-
where("lastName").eq("ln2"),
212-
where("firstName").notEq("fn1")
213-
),
214-
where("birthDay").eq(simpleDateFormat.parse("2012-07-01T16:02:48.440Z")),
215-
where("firstName").notEq("fn1")
216-
), FindOptions.withDistinct()
217-
);
218-
219-
findPlan = cursor.getFindPlan();
220-
assertEquals(3, findPlan.getSubPlans().size());
221-
assertEquals(3, cursor.size());
222205
}
223206

224207
@Test

nitrite-spatial/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>org.dizitart</groupId>
66
<artifactId>nitrite-java</artifactId>
7-
<version>4.5.0</version>
7+
<version>5.0.0</version>
88
</parent>
99

1010
<artifactId>nitrite-spatial</artifactId>

nitrite-support/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
<parent>
55
<groupId>org.dizitart</groupId>
66
<artifactId>nitrite-java</artifactId>
7-
<version>4.5.0</version>
7+
<version>5.0.0</version>
88
</parent>
99

1010
<artifactId>nitrite-support</artifactId>

0 commit comments

Comments
 (0)