blob: b62bb8e53d2c216876707a6c49c278f0b74f991a [file] [log] [blame]
/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.hadoop.hbase.filter;
import static org.junit.Assert.assertTrue;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.TreeSet;
import org.apache.hadoop.hbase.CompareOperator;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.filter.MultiRowRangeFilter.RowRange;
import org.apache.hadoop.hbase.testclassification.FilterTests;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Pair;
import org.junit.ClassRule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
@Category({FilterTests.class, MediumTests.class})
public class TestFilterSerialization {
@ClassRule
public static final HBaseClassTestRule CLASS_RULE =
HBaseClassTestRule.forClass(TestFilterSerialization.class);
@Test
public void testColumnCountGetFilter() throws Exception {
ColumnCountGetFilter columnCountGetFilter = new ColumnCountGetFilter(1);
assertTrue(columnCountGetFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(columnCountGetFilter))));
}
@Test
public void testColumnPaginationFilter() throws Exception {
ColumnPaginationFilter columnPaginationFilter = new ColumnPaginationFilter(1,7);
assertTrue(columnPaginationFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(columnPaginationFilter))));
}
@Test
public void testColumnPrefixFilter() throws Exception {
// empty string
ColumnPrefixFilter columnPrefixFilter = new ColumnPrefixFilter(Bytes.toBytes(""));
assertTrue(columnPrefixFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(columnPrefixFilter))));
// non-empty string
columnPrefixFilter = new ColumnPrefixFilter(Bytes.toBytes(""));
assertTrue(columnPrefixFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(columnPrefixFilter))));
}
@Test
public void testColumnRangeFilter() throws Exception {
// null columns
ColumnRangeFilter columnRangeFilter = new ColumnRangeFilter(null, true, null, false);
assertTrue(columnRangeFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(columnRangeFilter))));
// non-null columns
columnRangeFilter = new ColumnRangeFilter(Bytes.toBytes("a"), false, Bytes.toBytes("b"), true);
assertTrue(columnRangeFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(columnRangeFilter))));
}
@Test
public void testDependentColumnFilter() throws Exception {
// null column qualifier/family
DependentColumnFilter dependentColumnFilter = new DependentColumnFilter(null, null);
assertTrue(dependentColumnFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(dependentColumnFilter))));
// non-null column qualifier/family
dependentColumnFilter = new DependentColumnFilter(Bytes.toBytes("family"),
Bytes.toBytes("qual"), true, CompareOperator.GREATER_OR_EQUAL,
new BitComparator(Bytes.toBytes("bitComparator"), BitComparator.BitwiseOp.OR));
assertTrue(dependentColumnFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(dependentColumnFilter))));
}
@Test
public void testFamilyFilter() throws Exception {
FamilyFilter familyFilter = new FamilyFilter(CompareOperator.EQUAL,
new BinaryPrefixComparator(Bytes.toBytes("testValueOne")));
assertTrue(familyFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(familyFilter))));
}
@Test
public void testFilterList() throws Exception {
// empty filter list
FilterList filterList = new FilterList(new LinkedList<>());
assertTrue(filterList.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(filterList))));
// non-empty filter list
LinkedList<Filter> list = new LinkedList<>();
list.add(new ColumnCountGetFilter(1));
list.add(new RowFilter(CompareOperator.EQUAL,
new SubstringComparator("testFilterList")));
assertTrue(filterList.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(filterList))));
}
@Test
public void testFilterWrapper() throws Exception {
FilterWrapper filterWrapper =
new FilterWrapper(
new ColumnRangeFilter(Bytes.toBytes("e"), false, Bytes.toBytes("f"), true));
assertTrue(filterWrapper.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(filterWrapper))));
}
@SuppressWarnings("deprecation")
@Test
public void testFirstKeyValueMatchingQualifiersFilter() throws Exception {
// empty qualifiers set
TreeSet<byte []> set = new TreeSet<>(Bytes.BYTES_COMPARATOR);
FirstKeyValueMatchingQualifiersFilter firstKeyValueMatchingQualifiersFilter =
new FirstKeyValueMatchingQualifiersFilter(set);
assertTrue(firstKeyValueMatchingQualifiersFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(firstKeyValueMatchingQualifiersFilter))));
// non-empty qualifiers set
set.add(Bytes.toBytes("col0"));
set.add(Bytes.toBytes("col1"));
firstKeyValueMatchingQualifiersFilter =
new FirstKeyValueMatchingQualifiersFilter(set);
assertTrue(firstKeyValueMatchingQualifiersFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(firstKeyValueMatchingQualifiersFilter))));
}
@Test
public void testFirstKeyOnlyFilter() throws Exception {
FirstKeyOnlyFilter firstKeyOnlyFilter = new FirstKeyOnlyFilter();
assertTrue(firstKeyOnlyFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(firstKeyOnlyFilter))));
}
@Test
public void testFuzzyRowFilter() throws Exception {
LinkedList<Pair<byte[], byte[]>> fuzzyList = new LinkedList<>();
fuzzyList.add(new Pair<>(Bytes.toBytes("999"),new byte[] {0, 0, 1}));
fuzzyList.add(new Pair<>(Bytes.toBytes("abcd"),new byte[] {1, 0, 1, 1}));
FuzzyRowFilter fuzzyRowFilter = new FuzzyRowFilter(fuzzyList);
assertTrue(fuzzyRowFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(fuzzyRowFilter))));
}
@Test
public void testInclusiveStopFilter() throws Exception {
// InclusveStopFilter with null stopRowKey
InclusiveStopFilter inclusiveStopFilter = new InclusiveStopFilter(null);
assertTrue(inclusiveStopFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(inclusiveStopFilter))));
// InclusveStopFilter with non-null stopRowKey
inclusiveStopFilter = new InclusiveStopFilter(Bytes.toBytes("inclusiveStopFilter"));
assertTrue(inclusiveStopFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(inclusiveStopFilter))));
}
@Test
public void testKeyOnlyFilter() throws Exception {
// KeyOnlyFilter with lenAsVal
KeyOnlyFilter keyOnlyFilter = new KeyOnlyFilter(true);
assertTrue(keyOnlyFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(keyOnlyFilter))));
// KeyOnlyFilter without lenAsVal
keyOnlyFilter = new KeyOnlyFilter();
assertTrue(keyOnlyFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(keyOnlyFilter))));
}
@Test
public void testMultipleColumnPrefixFilter() throws Exception {
// empty array
byte [][] prefixes = null;
MultipleColumnPrefixFilter multipleColumnPrefixFilter =
new MultipleColumnPrefixFilter(prefixes);
assertTrue(multipleColumnPrefixFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(multipleColumnPrefixFilter))));
// non-empty array
prefixes = new byte[2][];
prefixes[0] = Bytes.toBytes("a");
prefixes[1] = Bytes.toBytes("");
multipleColumnPrefixFilter = new MultipleColumnPrefixFilter(prefixes);
assertTrue(multipleColumnPrefixFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(multipleColumnPrefixFilter))));
}
@Test
public void testPageFilter() throws Exception {
PageFilter pageFilter = new PageFilter(6);
assertTrue(pageFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(pageFilter))));
}
@Test
public void testPrefixFilter() throws Exception {
// null prefix
PrefixFilter prefixFilter = new PrefixFilter(null);
assertTrue(prefixFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(prefixFilter))));
// non-null prefix
prefixFilter = new PrefixFilter(Bytes.toBytes("abc"));
assertTrue(prefixFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(prefixFilter))));
}
@Test
public void testQualifierFilter() throws Exception {
QualifierFilter qualifierFilter = new QualifierFilter(CompareOperator.EQUAL,
new NullComparator());
assertTrue(qualifierFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(qualifierFilter))));
}
@Test
public void testRandomRowFilter() throws Exception {
RandomRowFilter randomRowFilter = new RandomRowFilter((float)0.1);
assertTrue(randomRowFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(randomRowFilter))));
}
@Test
public void testRowFilter() throws Exception {
RowFilter rowFilter = new RowFilter(CompareOperator.EQUAL,
new SubstringComparator("testRowFilter"));
assertTrue(rowFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(rowFilter))));
}
@Test
public void testSingleColumnValueExcludeFilter() throws Exception {
// null family/column SingleColumnValueExcludeFilter
SingleColumnValueExcludeFilter singleColumnValueExcludeFilter =
new SingleColumnValueExcludeFilter(null, null,
CompareOperator.GREATER_OR_EQUAL, Bytes.toBytes("value"));
assertTrue(singleColumnValueExcludeFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(singleColumnValueExcludeFilter))));
// non-null family/column SingleColumnValueFilter
singleColumnValueExcludeFilter =
new SingleColumnValueExcludeFilter(Bytes.toBytes("fam"), Bytes.toBytes("qual"),
CompareOperator.LESS_OR_EQUAL, new NullComparator(), false, false);
assertTrue(singleColumnValueExcludeFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(singleColumnValueExcludeFilter))));
}
@Test
public void testSingleColumnValueFilter() throws Exception {
// null family/column SingleColumnValueFilter
SingleColumnValueFilter singleColumnValueFilter =
new SingleColumnValueFilter(null, null,
CompareOperator.LESS, Bytes.toBytes("value"));
assertTrue(singleColumnValueFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(singleColumnValueFilter))));
// non-null family/column SingleColumnValueFilter
singleColumnValueFilter =
new SingleColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"),
CompareOperator.NOT_EQUAL, new NullComparator(), true, true);
assertTrue(singleColumnValueFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(singleColumnValueFilter))));
}
@Test
public void testSkipFilter() throws Exception {
SkipFilter skipFilter = new SkipFilter(new PageFilter(6));
assertTrue(skipFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(skipFilter))));
}
@Test
public void testTimestampsFilter() throws Exception {
// Empty timestamp list
TimestampsFilter timestampsFilter = new TimestampsFilter(new LinkedList<>());
assertTrue(timestampsFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(timestampsFilter))));
// Non-empty timestamp list
LinkedList<Long> list = new LinkedList<>();
list.add(System.currentTimeMillis());
list.add(System.currentTimeMillis());
timestampsFilter = new TimestampsFilter(list);
assertTrue(timestampsFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(timestampsFilter))));
}
@Test
public void testValueFilter() throws Exception {
ValueFilter valueFilter = new ValueFilter(CompareOperator.NO_OP,
new BinaryComparator(Bytes.toBytes("testValueOne")));
assertTrue(valueFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(valueFilter))));
}
@Test
public void testWhileMatchFilter() throws Exception {
WhileMatchFilter whileMatchFilter =
new WhileMatchFilter(
new ColumnRangeFilter(Bytes.toBytes("c"), false, Bytes.toBytes("d"), true));
assertTrue(whileMatchFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(whileMatchFilter))));
}
@Test
public void testMultiRowRangeFilter() throws Exception {
List<RowRange> ranges = new ArrayList<>();
ranges.add(new RowRange(Bytes.toBytes(30), true, Bytes.toBytes(40), false));
ranges.add(new RowRange(Bytes.toBytes(10), true, Bytes.toBytes(20), false));
ranges.add(new RowRange(Bytes.toBytes(60), true, Bytes.toBytes(70), false));
MultiRowRangeFilter multiRowRangeFilter =
new MultiRowRangeFilter(ranges);
assertTrue(multiRowRangeFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(multiRowRangeFilter))));
}
@Test
public void testColumnValueFilter() throws Exception {
ColumnValueFilter columnValueFilter =
new ColumnValueFilter(Bytes.toBytes("family"), Bytes.toBytes("qualifier"),
CompareOperator.EQUAL, Bytes.toBytes("value"));
assertTrue(columnValueFilter.areSerializedFieldsEqual(
ProtobufUtil.toFilter(ProtobufUtil.toFilter(columnValueFilter))));
}
}