Skip to content

Commit 7d04445

Browse files
committed
#269 Initial iterator performance enhancements and testing.
1 parent f23de09 commit 7d04445

File tree

1 file changed

+35
-14
lines changed

1 file changed

+35
-14
lines changed

src/main/java/org/lmdbjava/LmdbStream.java

Lines changed: 35 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ private static <T> LmdbSpliterator<T> createSpliterator(
5151
new LmdbRangeSpliterator<>(
5252
cursor,
5353
comparator,
54+
createEntryComparator(comparator),
5455
keyRange.getStart(),
5556
keyRange.getStop(),
5657
keyRange.isStartKeyInclusive(),
@@ -60,16 +61,19 @@ private static <T> LmdbSpliterator<T> createSpliterator(
6061
new LmdbRangeReversedSpliterator<>(
6162
cursor,
6263
comparator,
64+
createReversedEntryComparator(comparator),
6365
keyRange.getStart(),
6466
keyRange.getStop(),
6567
keyRange.isStartKeyInclusive(),
6668
keyRange.isStopKeyInclusive());
6769
}
6870
} else {
6971
if (keyRange.directionForward) {
70-
spliterator = new LmdbSpliterator<>(cursor, comparator);
72+
spliterator = new LmdbSpliterator<>(cursor, comparator, createEntryComparator(comparator));
7173
} else {
72-
spliterator = new LmdbReversedSpliterator<>(cursor, comparator);
74+
spliterator =
75+
new LmdbReversedSpliterator<>(
76+
cursor, comparator, createReversedEntryComparator(comparator));
7377
}
7478
}
7579
return spliterator;
@@ -80,13 +84,19 @@ private static class LmdbSpliterator<T> implements Spliterator<KeyVal<T>> {
8084
final Cursor<T> cursor;
8185
Boolean isFound;
8286
final KeyVal<T> entry = new KeyVal<>();
87+
final Comparator<T> comparator;
8388
final Comparator<KeyVal<T>> entryComparator;
8489

85-
private LmdbSpliterator(final Cursor<T> cursor, final Comparator<T> comparator) {
90+
private LmdbSpliterator(
91+
final Cursor<T> cursor,
92+
final Comparator<T> comparator,
93+
final Comparator<KeyVal<T>> entryComparator) {
8694
this.cursor = cursor;
87-
entryComparator = (o1, o2) -> comparator.compare(o1.key(), o2.key());
95+
this.comparator = comparator;
96+
this.entryComparator = entryComparator;
8897
}
8998

99+
@Override
90100
public final boolean tryAdvance(final Consumer<? super KeyVal<T>> action) {
91101
if (hasNext()) {
92102
action.accept(createEntry());
@@ -95,6 +105,7 @@ public final boolean tryAdvance(final Consumer<? super KeyVal<T>> action) {
95105
return false;
96106
}
97107

108+
@Override
98109
public final void forEachRemaining(final Consumer<? super KeyVal<T>> action) {
99110
while (hasNext()) {
100111
action.accept(createEntry());
@@ -138,14 +149,22 @@ public Comparator<? super KeyVal<T>> getComparator() {
138149
}
139150
}
140151

141-
private static class LmdbReversedSpliterator<T> extends LmdbSpliterator<T> {
152+
private static <T> Comparator<KeyVal<T>> createEntryComparator(final Comparator<T> comparator) {
153+
return (o1, o2) -> comparator.compare(o1.key(), o2.key());
154+
}
142155

143-
final Comparator<KeyVal<T>> entryComparator;
156+
private static <T> Comparator<KeyVal<T>> createReversedEntryComparator(
157+
final Comparator<T> comparator) {
158+
return (o1, o2) -> comparator.compare(o1.key(), o2.key());
159+
}
144160

145-
private LmdbReversedSpliterator(final Cursor<T> cursor, final Comparator<T> comparator) {
146-
super(cursor, comparator);
147-
// Create a reversed comparator.
148-
entryComparator = (o1, o2) -> comparator.compare(o2.key(), o1.key());
161+
private static class LmdbReversedSpliterator<T> extends LmdbSpliterator<T> {
162+
163+
private LmdbReversedSpliterator(
164+
final Cursor<T> cursor,
165+
final Comparator<T> comparator,
166+
final Comparator<KeyVal<T>> entryComparator) {
167+
super(cursor, comparator, entryComparator);
149168
}
150169

151170
@Override
@@ -175,11 +194,12 @@ private static class LmdbRangeSpliterator<T> extends LmdbSpliterator<T> {
175194
private LmdbRangeSpliterator(
176195
final Cursor<T> cursor,
177196
final Comparator<T> comparator,
197+
final Comparator<KeyVal<T>> entryComparator,
178198
final T start,
179199
final T stop,
180200
final boolean startInclusive,
181201
final boolean stopInclusive) {
182-
super(cursor, comparator);
202+
super(cursor, comparator, entryComparator);
183203
this.comparator = comparator;
184204
this.start = start;
185205
this.stop = stop;
@@ -227,11 +247,12 @@ private static class LmdbRangeReversedSpliterator<T> extends LmdbReversedSpliter
227247
private LmdbRangeReversedSpliterator(
228248
final Cursor<T> cursor,
229249
final Comparator<T> comparator,
250+
final Comparator<KeyVal<T>> entryComparator,
230251
final T start,
231252
final T stop,
232253
final boolean startInclusive,
233254
final boolean stopInclusive) {
234-
super(cursor, comparator);
255+
super(cursor, comparator, entryComparator);
235256
this.comparator = comparator;
236257
this.start = start;
237258
this.stop = stop;
@@ -298,7 +319,7 @@ private LmdbPrefixSpliterator(
298319
final Comparator<T> comparator,
299320
final BufferProxy<T> proxy,
300321
final T prefix) {
301-
super(cursor, comparator);
322+
super(cursor, comparator, createEntryComparator(comparator));
302323
this.proxy = proxy;
303324
this.prefix = prefix;
304325
}
@@ -330,7 +351,7 @@ private LmdbPrefixReversedSpliterator(
330351
final Comparator<T> comparator,
331352
final BufferProxy<T> proxy,
332353
final T prefix) {
333-
super(cursor, comparator);
354+
super(cursor, comparator, createReversedEntryComparator(comparator));
334355
this.proxy = proxy;
335356
this.prefix = prefix;
336357

0 commit comments

Comments
 (0)