diff --git src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java index 45eb477..9a7f770 100644 --- src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java +++ src/main/java/org/apache/hadoop/hbase/filter/NullComparator.java @@ -38,6 +38,6 @@ public class NullComparator extends WritableByteArrayComparable { @Override public int compareTo(byte[] value, int offset, int length) { - throw new UnsupportedOperationException(); + return compareTo(value); } } diff --git src/test/java/org/apache/hadoop/hbase/filter/TestNullComparator.java src/test/java/org/apache/hadoop/hbase/filter/TestNullComparator.java new file mode 100644 index 0000000..62639b8 --- /dev/null +++ src/test/java/org/apache/hadoop/hbase/filter/TestNullComparator.java @@ -0,0 +1,73 @@ +/** + * + * Licensed 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. + * under the License. + */ + +package org.apache.hadoop.hbase.filter; + +import org.apache.hadoop.hbase.SmallTests; +import org.junit.Assert; +import org.junit.Test; +import org.junit.experimental.categories.Category; + +@Category(SmallTests.class) +public class TestNullComparator { + + @Test + public void testNullValue() + { + // given + byte[] value = null; + NullComparator comparator = new NullComparator(); + + // when + int comp1 = comparator.compareTo(value); + int comp2 = comparator.compareTo(value, 5, 15); + + // then + Assert.assertEquals(0, comp1); + Assert.assertEquals(0, comp2); + } + + @Test + public void testNonNullValue() { + // given + byte[] value = new byte[] { 0, 1, 2, 3, 4, 5 }; + NullComparator comparator = new NullComparator(); + + // when + int comp1 = comparator.compareTo(value); + int comp2 = comparator.compareTo(value, 1, 3); + + // then + Assert.assertEquals(1, comp1); + Assert.assertEquals(1, comp2); + } + + @Test + public void testEmptyValue() { + // given + byte[] value = new byte[] { 0 }; + NullComparator comparator = new NullComparator(); + + // when + int comp1 = comparator.compareTo(value); + int comp2 = comparator.compareTo(value, 1, 3); + + // then + Assert.assertEquals(1, comp1); + Assert.assertEquals(1, comp2); + } + +} diff --git src/test/java/org/apache/hadoop/hbase/filter/TestSingleColumnValueFilter.java src/test/java/org/apache/hadoop/hbase/filter/TestSingleColumnValueFilter.java index 2a0751c..fca32a7 100644 --- src/test/java/org/apache/hadoop/hbase/filter/TestSingleColumnValueFilter.java +++ src/test/java/org/apache/hadoop/hbase/filter/TestSingleColumnValueFilter.java @@ -52,6 +52,7 @@ public class TestSingleColumnValueFilter extends TestCase { private static final String QUICK_REGEX = ".+quick.+"; Filter basicFilter; + Filter nullFilter; Filter substrFilter; Filter regexFilter; @@ -59,6 +60,7 @@ public class TestSingleColumnValueFilter extends TestCase { protected void setUp() throws Exception { super.setUp(); basicFilter = basicFilterNew(); + nullFilter = nullFilterNew(); substrFilter = substrFilterNew(); regexFilter = regexFilterNew(); } @@ -68,6 +70,11 @@ public class TestSingleColumnValueFilter extends TestCase { CompareOp.GREATER_OR_EQUAL, VAL_2); } + private Filter nullFilterNew() { + return new SingleColumnValueFilter(COLUMN_FAMILY, COLUMN_QUALIFIER, CompareOp.NOT_EQUAL, + new NullComparator()); + } + private Filter substrFilterNew() { return new SingleColumnValueFilter(COLUMN_FAMILY, COLUMN_QUALIFIER, CompareOp.EQUAL, @@ -105,6 +112,17 @@ public class TestSingleColumnValueFilter extends TestCase { assertFalse("basicFilterNotNull", filter.filterRow()); } + private void nullFilterTests(Filter filter) throws Exception { + ((SingleColumnValueFilter) filter).setFilterIfMissing(true); + KeyValue kv = new KeyValue(ROW, COLUMN_FAMILY, COLUMN_QUALIFIER, FULLSTRING_1); + assertTrue("null1", filter.filterKeyValue(kv) == Filter.ReturnCode.INCLUDE); + assertFalse("null1FilterRow", filter.filterRow()); + filter.reset(); + kv = new KeyValue(ROW, COLUMN_FAMILY, Bytes.toBytes("qual2"), FULLSTRING_2); + assertTrue("null2", filter.filterKeyValue(kv) == Filter.ReturnCode.INCLUDE); + assertTrue("null2FilterRow", filter.filterRow()); + } + private void substrFilterTests(Filter filter) throws Exception { KeyValue kv = new KeyValue(ROW, COLUMN_FAMILY, COLUMN_QUALIFIER, @@ -154,7 +172,8 @@ public class TestSingleColumnValueFilter extends TestCase { * @throws Exception */ public void testStop() throws Exception { - basicFilterTests((SingleColumnValueFilter)basicFilter); + basicFilterTests((SingleColumnValueFilter) basicFilter); + nullFilterTests(nullFilter); substrFilterTests(substrFilter); regexFilterTests(regexFilter); } @@ -166,6 +185,8 @@ public class TestSingleColumnValueFilter extends TestCase { public void testSerialization() throws Exception { Filter newFilter = serializationTest(basicFilter); basicFilterTests((SingleColumnValueFilter)newFilter); + newFilter = serializationTest(nullFilter); + nullFilterTests(newFilter); newFilter = serializationTest(substrFilter); substrFilterTests(newFilter); newFilter = serializationTest(regexFilter);