@@ -164,14 +164,20 @@ public void testGetNextForFuzzyRuleForward() {
164164 new byte [] { 1 , 0 , 2 , 0 , 1 }, // current
165165 new byte [] { 1 , 1 , 0 , 2 }); // expected next
166166
167- assertNext (false , new byte [] { 1 , 0 , 1 }, new byte [] { -1 , 0 , -1 },
168- new byte [] { 1 , (byte ) 128 , 2 , 0 , 1 }, new byte [] { 1 , (byte ) 129 , 1 });
167+ assertNext (false , new byte [] { 1 , 0 , 1 }, // fuzzy row
168+ new byte [] { -1 , 0 , -1 }, // mask
169+ new byte [] { 1 , (byte ) 128 , 2 , 0 , 1 }, // current
170+ new byte [] { 1 , (byte ) 129 , 1 }); // expected next
169171
170- assertNext (false , new byte [] { 0 , 1 , 0 , 1 }, new byte [] { 0 , -1 , 0 , -1 },
171- new byte [] { 5 , 1 , 0 , 1 }, new byte [] { 5 , 1 , 1 , 1 });
172+ assertNext (false , new byte [] { 0 , 1 , 0 , 1 }, // fuzzy row
173+ new byte [] { 0 , -1 , 0 , -1 }, // mask
174+ new byte [] { 5 , 1 , 0 , 1 }, // current
175+ new byte [] { 5 , 1 , 1 , 1 }); // expected next
172176
173- assertNext (false , new byte [] { 0 , 1 , 0 , 1 }, new byte [] { 0 , -1 , 0 , -1 },
174- new byte [] { 5 , 1 , 0 , 1 , 1 }, new byte [] { 5 , 1 , 0 , 1 , 2 });
177+ assertNext (false , new byte [] { 0 , 1 , 0 , 1 }, // fuzzy row
178+ new byte [] { 0 , -1 , 0 , -1 }, // mask
179+ new byte [] { 5 , 1 , 0 , 1 , 1 }, // current
180+ new byte [] { 5 , 1 , 0 , 1 , 2 }); // expected next
175181
176182 assertNext (false , new byte [] { 0 , 1 , 0 , 0 }, // fuzzy row
177183 new byte [] { 0 , -1 , 0 , 0 }, // mask
@@ -188,23 +194,35 @@ public void testGetNextForFuzzyRuleForward() {
188194 new byte [] { 5 , 1 , (byte ) 255 , 0 }, // current
189195 new byte [] { 5 , 1 , (byte ) 255 , 1 }); // expected next
190196
191- assertNext (false , new byte [] { 5 , 1 , 1 , 0 }, new byte [] { -1 , -1 , 0 , 0 },
192- new byte [] { 5 , 1 , (byte ) 255 , 1 }, new byte [] { 5 , 1 , (byte ) 255 , 2 });
197+ assertNext (false , new byte [] { 5 , 1 , 1 , 0 }, // fuzzy row
198+ new byte [] { -1 , -1 , 0 , 0 }, // mask
199+ new byte [] { 5 , 1 , (byte ) 255 , 1 }, // current
200+ new byte [] { 5 , 1 , (byte ) 255 , 2 }); // expected next
193201
194- assertNext (false , new byte [] { 1 , 1 , 1 , 1 }, new byte [] { -1 , -1 , 0 , 0 },
195- new byte [] { 1 , 1 , 2 , 2 }, new byte [] { 1 , 1 , 2 , 3 });
202+ assertNext (false , new byte [] { 1 , 1 , 1 , 1 }, // fuzzy row
203+ new byte [] { -1 , -1 , 0 , 0 }, // mask
204+ new byte [] { 1 , 1 , 2 , 2 }, // current
205+ new byte [] { 1 , 1 , 2 , 3 }); // expected next
196206
197- assertNext (false , new byte [] { 1 , 1 , 1 , 1 }, new byte [] { -1 , -1 , 0 , 0 },
198- new byte [] { 1 , 1 , 3 , 2 }, new byte [] { 1 , 1 , 3 , 3 });
207+ assertNext (false , new byte [] { 1 , 1 , 1 , 1 }, // fuzzy row
208+ new byte [] { -1 , -1 , 0 , 0 }, // mask
209+ new byte [] { 1 , 1 , 3 , 2 }, // current
210+ new byte [] { 1 , 1 , 3 , 3 }); // expected next
199211
200- assertNext (false , new byte [] { 1 , 1 , 1 , 1 }, new byte [] { 0 , 0 , 0 , 0 },
201- new byte [] { 1 , 1 , 2 , 3 }, new byte [] { 1 , 1 , 2 , 4 });
212+ assertNext (false , new byte [] { 1 , 1 , 1 , 1 }, // fuzzy row
213+ new byte [] { 0 , 0 , 0 , 0 }, // mask
214+ new byte [] { 1 , 1 , 2 , 3 }, // current
215+ new byte [] { 1 , 1 , 2 , 4 }); // expected next
202216
203- assertNext (false , new byte [] { 1 , 1 , 1 , 1 }, new byte [] { 0 , 0 , 0 , 0 },
204- new byte [] { 1 , 1 , 3 , 2 }, new byte [] { 1 , 1 , 3 , 3 });
217+ assertNext (false , new byte [] { 1 , 1 , 1 , 1 }, // fuzzy row
218+ new byte [] { 0 , 0 , 0 , 0 }, // mask
219+ new byte [] { 1 , 1 , 3 , 2 }, // current
220+ new byte [] { 1 , 1 , 3 , 3 }); // expected next
205221
206- assertNext (false , new byte [] { 1 , 1 , 0 , 0 }, new byte [] { -1 , -1 , 0 , 0 },
207- new byte [] { 0 , 1 , 3 , 2 }, new byte [] { 1 , 1 });
222+ assertNext (false , new byte [] { 1 , 1 , 0 , 0 }, // fuzzy row
223+ new byte [] { -1 , -1 , 0 , 0 }, // mask
224+ new byte [] { 0 , 1 , 3 , 2 }, // current
225+ new byte [] { 1 , 1 }); // expected next
208226
209227 // No next for this one
210228 Assert .assertNull (FuzzyRowFilter .getNextForFuzzyRule (new byte [] { 2 , 3 , 1 , 1 , 1 }, // row to
@@ -221,94 +239,100 @@ public void testGetNextForFuzzyRuleForward() {
221239
222240 @ Test
223241 public void testGetNextForFuzzyRuleReverse () {
242+ // In these reverse cases for the next row key the last non-max byte should be increased
243+ // to make sure that the proper row is selected next by the scanner.
244+ // For example:
245+ // fuzzy row: 0,1,2
246+ // mask: 0,-1,-1
247+ // current: 1,2,1,0,1
248+ // next would be: 1,1,2
249+ // this has to be increased to 1,1,3 to make sure that the proper row is selected next.
224250 assertNext (true , new byte [] { 0 , 1 , 2 }, // fuzzy row
225251 new byte [] { 0 , -1 , -1 }, // mask
226252 new byte [] { 1 , 2 , 1 , 0 , 1 }, // current
227- // TODO: should be {1, 1, 3} ?
228- new byte [] { 1 , 1 , 2 , (byte ) 0xFF , (byte ) 0xFF }); // expected next
253+ new byte [] { 1 , 1 , 3 }); // expected next
229254
230255 assertNext (true , new byte [] { 0 , 1 , 0 , 2 , 0 }, // fuzzy row
231256 new byte [] { 0 , -1 , 0 , -1 , 0 }, // mask
232257 new byte [] { 1 , 2 , 1 , 3 , 1 }, // current
233- // TODO: should be {1, 1, 1, 3} ?
234- new byte [] { 1 , 1 , 0 , 2 , 0 }); // expected next
258+ new byte [] { 1 , 1 , (byte ) 255 , 3 }); // expected next
235259
236- assertNext (true , new byte [] { 1 , 0 , 1 }, new byte [] { - 1 , 0 , - 1 },
237- new byte [] { 1 , ( byte ) 128 , 2 , 0 , 1 },
238- // TODO: should be { 1, (byte) 128, 2} ?
239- new byte [] { 1 , (byte ) 128 , 1 , ( byte ) 0xFF , ( byte ) 0xFF });
260+ assertNext (true , new byte [] { 1 , 0 , 1 }, // fuzzy row
261+ new byte [] { - 1 , 0 , - 1 }, // mask
262+ new byte [] { 1 , (byte ) 128 , 2 , 0 , 1 }, // current
263+ new byte [] { 1 , (byte ) 128 , 2 }); // expected next
240264
241- assertNext (true , new byte [] { 0 , 1 , 0 , 1 }, new byte [] { 0 , - 1 , 0 , - 1 },
242- new byte [] { 5 , 1 , 0 , 2 , 1 },
243- // TODO: should be { 5, 1, 0, 2} ?
244- new byte [] { 5 , 1 , 0 , 1 , ( byte ) 0xFF });
265+ assertNext (true , new byte [] { 0 , 1 , 0 , 1 }, // fuzzy row
266+ new byte [] { 0 , - 1 , 0 , - 1 }, // mask
267+ new byte [] { 5 , 1 , 0 , 2 , 1 }, // current
268+ new byte [] { 5 , 1 , 0 , 2 }); // expected next
245269
246270 assertNext (true , new byte [] { 0 , 1 , 0 , 0 }, // fuzzy row
247271 new byte [] { 0 , -1 , 0 , 0 }, // mask
248272 new byte [] { 5 , 1 , (byte ) 255 , 1 }, // current
249- new byte [] { 5 , 1 , (byte ) 255 , 0 }); // expected next
273+ new byte [] { 5 , 1 , (byte ) 255 , 1 }); // expected next
250274
251275 assertNext (true , new byte [] { 0 , 1 , 0 , 1 }, // fuzzy row
252276 new byte [] { 0 , -1 , 0 , -1 }, // mask
253277 new byte [] { 5 , 1 , 0 , 1 }, // current
254- new byte [] { 4 , 1 , (byte ) 255 , 1 }); // expected next
278+ new byte [] { 4 , 1 , (byte ) 255 , 2 }); // expected next
255279
256280 assertNext (true , new byte [] { 0 , 1 , 0 , 1 }, // fuzzy row
257281 new byte [] { 0 , -1 , 0 , -1 }, // mask
258282 new byte [] { 5 , 1 , (byte ) 255 , 0 }, // current
259- new byte [] { 5 , 1 , (byte ) 254 , 1 }); // expected next
283+ new byte [] { 5 , 1 , (byte ) 254 , 2 }); // expected next
260284
261- assertNext (true , new byte [] { 1 , 1 , 0 , 0 }, new byte [] { - 1 , - 1 , 0 , 0 },
262- new byte [] { 2 , 1 , 3 , 2 },
263- // TODO: should be { 1, 0} ?
264- new byte [] { 1 , 1 , 0 , 0 });
285+ assertNext (true , new byte [] { 1 , 1 , 0 , 0 }, // fuzzy row
286+ new byte [] { - 1 , - 1 , 0 , 0 }, // mask
287+ new byte [] { 2 , 1 , 3 , 2 }, // current
288+ new byte [] { 1 , 2 }); // expected next
265289
266290 assertNext (true , new byte [] { 1 , 0 , 1 }, // fuzzy row
267291 new byte [] { -1 , 0 , -1 }, // mask
268292 new byte [] { 2 , 3 , 1 , 1 , 1 }, // row to check
269- // TODO: should be {1, (byte) 0xFF, 2} ?
270- new byte [] { 1 , 0 , 1 , (byte ) 0xFF , (byte ) 0xFF });
271-
272- assertNext (true , new byte [] { 1 , 1 , 0 , 3 }, new byte [] { -1 , -1 , 0 , -1 },
273- new byte [] { 1 , (byte ) 245 , 1 , 3 , 0 },
274- // TODO: should be {1, 1, (byte) 255, 4} ?
275- new byte [] { 1 , 1 , 0 , 3 , (byte ) 0xFF });
276-
277- assertNext (true , new byte [] { 1 , 2 , 0 , 3 }, new byte [] { -1 , -1 , 0 , -1 },
278- new byte [] { 1 , 3 , 1 , 3 , 0 },
279- // TODO: should be 1, 2, (byte) 255, 4 ?
280- new byte [] { 1 , 2 , 0 , 3 , (byte ) 0xFF });
281-
282- assertNext (true , new byte [] { 1 , 2 , 0 , 3 }, new byte [] { -1 , -1 , 0 , -1 },
283- new byte [] { 2 , 1 , 1 , 1 , 0 },
284- // TODO: should be {1, 2, (byte) 255, 4} ?
285- new byte [] { 1 , 2 , 0 , 3 , (byte ) 0xFF });
286-
287- assertNext (true ,
288- // TODO: should be null?
289- new byte [] { 1 , 0 , 1 }, new byte [] { -1 , 0 , -1 }, new byte [] { 1 , (byte ) 128 , 2 },
290- new byte [] { 1 , (byte ) 128 , 1 });
291-
292- assertNext (true ,
293- // TODO: should be null?
294- new byte [] { 0 , 1 , 0 , 1 }, new byte [] { 0 , -1 , 0 , -1 }, new byte [] { 5 , 1 , 0 , 2 },
295- new byte [] { 5 , 1 , 0 , 1 });
296-
297- assertNext (true ,
298- // TODO: should be null?
299- new byte [] { 5 , 1 , 1 , 0 }, new byte [] { -1 , -1 , 0 , 0 }, new byte [] { 5 , 1 , (byte ) 0xFF , 1 },
300- new byte [] { 5 , 1 , (byte ) 0xFF , 0 });
301-
302- assertNext (true ,
303- // TODO: should be null?
304- new byte [] { 1 , 1 , 1 , 1 }, new byte [] { -1 , -1 , 0 , 0 }, new byte [] { 1 , 1 , 2 , 2 },
305- new byte [] { 1 , 1 , 2 , 1 });
306-
307- assertNext (true ,
308- // TODO: should be null?
309- new byte [] { 1 , 1 , 1 , 1 }, new byte [] { 0 , 0 , 0 , 0 }, new byte [] { 1 , 1 , 2 , 3 },
310- new byte [] { 1 , 1 , 2 , 2 });
293+ new byte [] { 1 , (byte ) 255 , 2 }); // expected next
294+
295+ assertNext (true , new byte [] { 1 , 1 , 0 , 3 }, // fuzzy row
296+ new byte [] { -1 , -1 , 0 , -1 }, // mask
297+ new byte [] { 1 , (byte ) 245 , 1 , 3 , 0 }, // row to check
298+ new byte [] { 1 , 1 , (byte ) 255 , 4 }); // expected next
299+
300+ assertNext (true , new byte [] { 1 , 2 , 0 , 3 }, // fuzzy row
301+ new byte [] { -1 , -1 , 0 , -1 }, // mask
302+ new byte [] { 1 , 3 , 1 , 3 , 0 }, // row to check
303+ new byte [] { 1 , 2 , (byte ) 255 , 4 }); // expected next
304+
305+ assertNext (true , new byte [] { 1 , 2 , 0 , 3 }, // fuzzy row
306+ new byte [] { -1 , -1 , 0 , -1 }, // mask
307+ new byte [] { 2 , 1 , 1 , 1 , 0 }, // row to check
308+ new byte [] { 1 , 2 , (byte ) 255 , 4 }); // expected next
309+
310+ assertNext (true , new byte [] { 1 , 0 , 1 }, // fuzzy row
311+ new byte [] { -1 , 0 , -1 }, // mask
312+ new byte [] { 1 , (byte ) 128 , 2 }, // row to check
313+ new byte [] { 1 , (byte ) 128 , 2 }); // expected next
314+
315+ assertNext (true , new byte [] { 0 , 1 , 0 , 1 }, // fuzzy row
316+ new byte [] { 0 , -1 , 0 , -1 }, // mask
317+ new byte [] { 5 , 1 , 0 , 2 }, // row to check
318+ new byte [] { 5 , 1 , 0 , 2 }); // expected next
319+
320+ assertNext (true , new byte [] { 5 , 1 , 1 , 0 }, // fuzzy row
321+ new byte [] { -1 , -1 , 0 , 0 }, // mask
322+ new byte [] { 5 , 1 , (byte ) 0xFF , 1 }, // row to check
323+ new byte [] { 5 , 1 , (byte ) 0xFF , 1 }); // expected next
324+
325+ assertNext (true , new byte [] { 1 , 1 , 1 , 1 }, // fuzzy row
326+ new byte [] { -1 , -1 , 0 , 0 }, // mask
327+ new byte [] { 1 , 1 , 2 , 2 }, // row to check
328+ new byte [] { 1 , 1 , 2 , 2 }); // expected next
329+
330+ assertNext (true , new byte [] { 1 , 1 , 1 , 1 }, // fuzzy row
331+ new byte [] { 0 , 0 , 0 , 0 }, // mask
332+ new byte [] { 1 , 1 , 2 , 3 }, // row to check
333+ new byte [] { 1 , 1 , 2 , 3 }); // expected next
311334
335+ // no before cell than current which satisfies the fuzzy row -> null
312336 Assert .assertNull (FuzzyRowFilter .getNextForFuzzyRule (true , new byte [] { 1 , 1 , 1 , 3 , 0 },
313337 new byte [] { 1 , 2 , 0 , 3 }, new byte [] { -1 , -1 , 0 , -1 }));
314338 }
0 commit comments