@@ -121,6 +121,17 @@ public enum KeyRangeType {
121121 * be 2 and 4. With a passed key of 8, the returned keys would be 2, 4 and 6.
122122 */
123123 FORWARD_LESS_THAN (true , false , true ),
124+ /**
125+ * Iterate forward between the passed keys but not equal to either of them.
126+ *
127+ * <p>
128+ * The "start" and "stop" values are both required.
129+ *
130+ * <p>
131+ * In our example and with a passed search range of 3 - 7, the returned keys
132+ * would be 4 and 6. With a range of 2 - 8, the key would be 4 and 6.
133+ */
134+ FORWARD_OPEN (true , true , true ),
124135 /**
125136 * Start on the last key and iterate backward until no keys remain.
126137 *
@@ -192,7 +203,19 @@ public enum KeyRangeType {
192203 * In our example and with a passed search key of 5, the returned keys would
193204 * be 8 and 6. With a passed key of 2, the returned keys would be 8, 6 and 4
194205 */
195- BACKWARD_LESS_THAN (false , false , true );
206+ BACKWARD_LESS_THAN (false , false , true ),
207+ /**
208+ * Iterate backward between the passed keys, but do not return the passed
209+ * keys.
210+ *
211+ * <p>
212+ * The "start" and "stop" values are both required.
213+ *
214+ * <p>
215+ * In our example and with a passed search range of 7 - 2, the returned keys
216+ * would be 6 and 4. With a range of 8 - 1, the keys would be 6, 4 and 2.
217+ */
218+ BACKWARD_OPEN (false , true , true );
196219
197220 private final boolean directionForward ;
198221 private final boolean startKeyRequired ;
@@ -256,6 +279,8 @@ CursorOp initialOp() {
256279 return GET_START_KEY ;
257280 case FORWARD_LESS_THAN :
258281 return FIRST ;
282+ case FORWARD_OPEN :
283+ return GET_START_KEY ;
259284 case BACKWARD_ALL :
260285 return LAST ;
261286 case BACKWARD_AT_LEAST :
@@ -268,6 +293,8 @@ CursorOp initialOp() {
268293 return GET_START_KEY ;
269294 case BACKWARD_LESS_THAN :
270295 return LAST ;
296+ case BACKWARD_OPEN :
297+ return GET_START_KEY ;
271298 default :
272299 throw new IllegalStateException ("Invalid type" );
273300 }
@@ -304,6 +331,11 @@ <T, C extends Comparator<T>> IteratorOp iteratorOp(final T start, final T stop,
304331 return c .compare (buffer , start ) == 0 ? CALL_NEXT_OP : RELEASE ;
305332 case FORWARD_LESS_THAN :
306333 return c .compare (buffer , stop ) >= 0 ? TERMINATE : RELEASE ;
334+ case FORWARD_OPEN :
335+ if (c .compare (buffer , start ) == 0 ) {
336+ return CALL_NEXT_OP ;
337+ }
338+ return c .compare (buffer , stop ) >= 0 ? TERMINATE : RELEASE ;
307339 case BACKWARD_ALL :
308340 return RELEASE ;
309341 case BACKWARD_AT_LEAST :
@@ -319,6 +351,11 @@ <T, C extends Comparator<T>> IteratorOp iteratorOp(final T start, final T stop,
319351 return c .compare (buffer , start ) >= 0 ? CALL_NEXT_OP : RELEASE ;
320352 case BACKWARD_LESS_THAN :
321353 return c .compare (buffer , stop ) > 0 ? RELEASE : TERMINATE ;
354+ case BACKWARD_OPEN :
355+ if (c .compare (buffer , start ) >= 0 ) {
356+ return CALL_NEXT_OP ; // rewind
357+ }
358+ return c .compare (buffer , stop ) > 0 ? RELEASE : TERMINATE ;
322359 default :
323360 throw new IllegalStateException ("Invalid type" );
324361 }
0 commit comments