if (columnCell == null) { resetCell(cell); if (ignoreCount) { return ScanQueryMatcher.MatchCode.INCLUDE; return checkVersion(type, timestamp); if (sameAsPreviousTSAndType(timestamp, type)) { return ScanQueryMatcher.MatchCode.SKIP; return checkVersion(type, timestamp); resetTSAndType(); resetCell(cell); if (ignoreCount) { return ScanQueryMatcher.MatchCode.INCLUDE; return checkVersion(type, timestamp);
/** * Check whether this version should be retained. There are 4 variables considered: If this * version is past max versions -> skip it If this kv has expired or was deleted, check min * versions to decide whther to skip it or not. Increase the version counter unless this is a * delete */ private MatchCode checkVersion(byte type, long timestamp) { if (!PrivateCellUtil.isDelete(type)) { currentCount++; } if (currentCount > maxVersions) { return ScanQueryMatcher.MatchCode.SEEK_NEXT_COL; // skip to next col } // keep the KV if required by minversions or it is not expired, yet if (currentCount <= minVersions || !isExpired(timestamp)) { setTSAndType(timestamp, type); return ScanQueryMatcher.MatchCode.INCLUDE; } else { return MatchCode.SEEK_NEXT_COL; } }
@Test public void testCheckColumnOk() throws IOException { ScanWildcardColumnTracker tracker = new ScanWildcardColumnTracker( 0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR); // Create list of qualifiers List<byte[]> qualifiers = new ArrayList<>(4); qualifiers.add(Bytes.toBytes("qualifier1")); qualifiers.add(Bytes.toBytes("qualifier2")); qualifiers.add(Bytes.toBytes("qualifier3")); qualifiers.add(Bytes.toBytes("qualifier4")); // Setting up expected result List<MatchCode> expected = new ArrayList<>(4); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); List<ScanQueryMatcher.MatchCode> actual = new ArrayList<>(qualifiers.size()); for (byte[] qualifier : qualifiers) { ScanQueryMatcher.MatchCode mc = ScanQueryMatcher.checkColumn(tracker, qualifier, 0, qualifier.length, 1, KeyValue.Type.Put.getCode(), false); actual.add(mc); } // Compare actual with expected for (int i = 0; i < expected.size(); i++) { assertEquals(expected.get(i), actual.get(i)); } }
@Override public void reset() { columnCell = null; resetTSAndType(); }
@Override public boolean isDone(long timestamp) { return minVersions <= 0 && isExpired(timestamp); } }
@Test public void testCheckColumnEnforceVersions() throws IOException { ScanWildcardColumnTracker tracker = new ScanWildcardColumnTracker( 0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR); // Create list of qualifiers List<byte[]> qualifiers = new ArrayList<>(4); qualifiers.add(Bytes.toBytes("qualifier1")); qualifiers.add(Bytes.toBytes("qualifier1")); qualifiers.add(Bytes.toBytes("qualifier1")); qualifiers.add(Bytes.toBytes("qualifier2")); // Setting up expected result List<ScanQueryMatcher.MatchCode> expected = new ArrayList<>(4); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_COL); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); List<MatchCode> actual = new ArrayList<>(qualifiers.size()); long timestamp = 0; for (byte[] qualifier : qualifiers) { MatchCode mc = ScanQueryMatcher.checkColumn(tracker, qualifier, 0, qualifier.length, ++timestamp, KeyValue.Type.Put.getCode(), false); actual.add(mc); } // Compare actual with expected for (int i = 0; i < expected.size(); i++) { assertEquals(expected.get(i), actual.get(i)); } }
@Test public void DisabledTestCheckColumnWrongOrder() { ScanWildcardColumnTracker tracker = new ScanWildcardColumnTracker( 0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR); // Create list of qualifiers List<byte[]> qualifiers = new ArrayList<>(2); qualifiers.add(Bytes.toBytes("qualifier2")); qualifiers.add(Bytes.toBytes("qualifier1")); try { for (byte[] qualifier : qualifiers) { ScanQueryMatcher.checkColumn(tracker, qualifier, 0, qualifier.length, 1, KeyValue.Type.Put.getCode(), false); } fail(); } catch (IOException e) { // expected } } }
columnTracker = (NewVersionBehaviorTracker) deleteTracker; } else if (columns == null || columns.size() == 0) { columnTracker = new ScanWildcardColumnTracker(scanInfo.getMinVersions(), maxVersionToCheck, oldestUnexpiredTS, scanInfo.getComparator()); } else {
@Test public void testCheckColumnOk() throws IOException { ScanWildcardColumnTracker tracker = new ScanWildcardColumnTracker( 0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR); // Create list of qualifiers List<byte[]> qualifiers = new ArrayList<>(4); qualifiers.add(Bytes.toBytes("qualifier1")); qualifiers.add(Bytes.toBytes("qualifier2")); qualifiers.add(Bytes.toBytes("qualifier3")); qualifiers.add(Bytes.toBytes("qualifier4")); // Setting up expected result List<MatchCode> expected = new ArrayList<>(4); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); List<ScanQueryMatcher.MatchCode> actual = new ArrayList<>(qualifiers.size()); for (byte[] qualifier : qualifiers) { ScanQueryMatcher.MatchCode mc = ScanQueryMatcher.checkColumn(tracker, qualifier, 0, qualifier.length, 1, KeyValue.Type.Put.getCode(), false); actual.add(mc); } // Compare actual with expected for (int i = 0; i < expected.size(); i++) { assertEquals(expected.get(i), actual.get(i)); } }
@Test public void testCheckColumnEnforceVersions() throws IOException { ScanWildcardColumnTracker tracker = new ScanWildcardColumnTracker( 0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR); // Create list of qualifiers List<byte[]> qualifiers = new ArrayList<>(4); qualifiers.add(Bytes.toBytes("qualifier1")); qualifiers.add(Bytes.toBytes("qualifier1")); qualifiers.add(Bytes.toBytes("qualifier1")); qualifiers.add(Bytes.toBytes("qualifier2")); // Setting up expected result List<ScanQueryMatcher.MatchCode> expected = new ArrayList<>(4); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); expected.add(ScanQueryMatcher.MatchCode.SEEK_NEXT_COL); expected.add(ScanQueryMatcher.MatchCode.INCLUDE); List<MatchCode> actual = new ArrayList<>(qualifiers.size()); long timestamp = 0; for (byte[] qualifier : qualifiers) { MatchCode mc = ScanQueryMatcher.checkColumn(tracker, qualifier, 0, qualifier.length, ++timestamp, KeyValue.Type.Put.getCode(), false); actual.add(mc); } // Compare actual with expected for (int i = 0; i < expected.size(); i++) { assertEquals(expected.get(i), actual.get(i)); } }
@Test public void DisabledTestCheckColumnWrongOrder() { ScanWildcardColumnTracker tracker = new ScanWildcardColumnTracker( 0, VERSIONS, Long.MIN_VALUE, CellComparatorImpl.COMPARATOR); // Create list of qualifiers List<byte[]> qualifiers = new ArrayList<>(2); qualifiers.add(Bytes.toBytes("qualifier2")); qualifiers.add(Bytes.toBytes("qualifier1")); try { for (byte[] qualifier : qualifiers) { ScanQueryMatcher.checkColumn(tracker, qualifier, 0, qualifier.length, 1, KeyValue.Type.Put.getCode(), false); } fail(); } catch (IOException e) { // expected } } }