/*
* 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.accumulo.core.iterators.user;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.SortedMap;
import java.util.TreeMap;
import org.apache.accumulo.core.client.IteratorSetting;
import org.apache.accumulo.core.data.ByteSequence;
import org.apache.accumulo.core.data.Key;
import org.apache.accumulo.core.data.Range;
import org.apache.accumulo.core.data.Value;
import org.apache.accumulo.core.iterators.DefaultIteratorEnvironment;
import org.apache.accumulo.core.iterators.IteratorEnvironment;
import org.apache.accumulo.core.iterators.SortedMapIterator;
import org.apache.hadoop.io.Text;
import org.junit.Before;
import org.junit.Test;
public class ColumnSliceFilterTest {
private static final Collection<ByteSequence> EMPTY_COL_FAMS = new ArrayList<>();
private static final SortedMap<Key,Value> TEST_DATA = new TreeMap<>();
private static final Key KEY_1 = newKeyValue(TEST_DATA, "boo1", "yup", "20080201", "dog");
private static final Key KEY_2 = newKeyValue(TEST_DATA, "boo1", "yap", "20080202", "cat");
private static final Key KEY_3 = newKeyValue(TEST_DATA, "boo2", "yap", "20080203", "hamster");
private static final Key KEY_4 = newKeyValue(TEST_DATA, "boo2", "yop", "20080204", "lion");
private static final Key KEY_5 = newKeyValue(TEST_DATA, "boo2", "yup", "20080206", "tiger");
private static final Key KEY_6 = newKeyValue(TEST_DATA, "boo2", "yip", "20080203", "tiger");
private IteratorEnvironment iteratorEnvironment;
private ColumnSliceFilter columnSliceFilter = new ColumnSliceFilter();
private IteratorSetting is;
private static Key newKeyValue(SortedMap<Key,Value> tm, String row, String cf, String cq, String val) {
Key k = newKey(row, cf, cq);
tm.put(k, new Value(val.getBytes()));
return k;
}
private static Key newKey(String row, String cf, String cq) {
return new Key(new Text(row), new Text(cf), new Text(cq));
}
@Before
public void setUp() throws Exception {
columnSliceFilter.describeOptions();
iteratorEnvironment = new DefaultIteratorEnvironment();
is = new IteratorSetting(1, ColumnSliceFilter.class);
}
@Test
public void testBasic() throws IOException {
ColumnSliceFilter.setSlice(is, "20080202", "20080204");
assertTrue(columnSliceFilter.validateOptions(is.getOptions()));
columnSliceFilter.init(new SortedMapIterator(TEST_DATA), is.getOptions(), iteratorEnvironment);
columnSliceFilter.seek(new Range(), EMPTY_COL_FAMS, true);
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_2));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_3));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_6));
columnSliceFilter.next();
assertFalse(columnSliceFilter.hasTop());
}
@Test
public void testBothInclusive() throws IOException {
ColumnSliceFilter.setSlice(is, "20080202", true, "20080204", true);
columnSliceFilter.validateOptions(is.getOptions());
columnSliceFilter.init(new SortedMapIterator(TEST_DATA), is.getOptions(), iteratorEnvironment);
columnSliceFilter.seek(new Range(), EMPTY_COL_FAMS, false);
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_2));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_3));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_6));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_4));
columnSliceFilter.next();
assertFalse(columnSliceFilter.hasTop());
}
@Test
public void testBothExclusive() throws IOException {
ColumnSliceFilter.setSlice(is, "20080202", false, "20080204", false);
columnSliceFilter.validateOptions(is.getOptions());
columnSliceFilter.init(new SortedMapIterator(TEST_DATA), is.getOptions(), iteratorEnvironment);
columnSliceFilter.seek(new Range(), EMPTY_COL_FAMS, false);
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_3));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_6));
columnSliceFilter.next();
assertFalse(columnSliceFilter.hasTop());
}
@Test
public void testStartExclusiveEndInclusive() throws IOException {
ColumnSliceFilter.setSlice(is, "20080202", false, "20080204", true);
columnSliceFilter.validateOptions(is.getOptions());
columnSliceFilter.init(new SortedMapIterator(TEST_DATA), is.getOptions(), iteratorEnvironment);
columnSliceFilter.seek(new Range(), EMPTY_COL_FAMS, false);
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_3));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_6));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_4));
columnSliceFilter.next();
assertFalse(columnSliceFilter.hasTop());
}
@Test
public void testNullStart() throws IOException {
ColumnSliceFilter.setSlice(is, null, "20080204");
columnSliceFilter.validateOptions(is.getOptions());
columnSliceFilter.init(new SortedMapIterator(TEST_DATA), is.getOptions(), iteratorEnvironment);
columnSliceFilter.seek(new Range(), EMPTY_COL_FAMS, false);
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_2));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_1));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_3));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_6));
columnSliceFilter.next();
assertFalse(columnSliceFilter.hasTop());
}
@Test
public void testNullEnd() throws IOException {
ColumnSliceFilter.setSlice(is, "20080202", null);
columnSliceFilter.validateOptions(is.getOptions());
columnSliceFilter.init(new SortedMapIterator(TEST_DATA), is.getOptions(), iteratorEnvironment);
columnSliceFilter.seek(new Range(), EMPTY_COL_FAMS, false);
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_2));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_3));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_6));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_4));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_5));
columnSliceFilter.next();
assertFalse(columnSliceFilter.hasTop());
}
@Test
public void testBothNull() throws IOException {
ColumnSliceFilter.setSlice(is, null, null);
columnSliceFilter.validateOptions(is.getOptions());
columnSliceFilter.init(new SortedMapIterator(TEST_DATA), is.getOptions(), iteratorEnvironment);
columnSliceFilter.seek(new Range(), EMPTY_COL_FAMS, false);
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_2));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_1));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_3));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_6));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_4));
columnSliceFilter.next();
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_5));
columnSliceFilter.next();
assertFalse(columnSliceFilter.hasTop());
}
@Test
public void testStartAfterEnd() throws IOException {
try {
ColumnSliceFilter.setSlice(is, "20080204", "20080202");
fail("IllegalArgumentException expected but not thrown");
} catch (IllegalArgumentException expectedException) {
// Exception successfully thrown
}
}
@Test
public void testStartEqualToEndStartInclusiveEndExclusive() throws IOException {
try {
ColumnSliceFilter.setSlice(is, "20080202", "20080202");
fail("IllegalArgumentException expected but not thrown");
} catch (IllegalArgumentException expectedException) {
// Exception successfully thrown
}
}
@Test
public void testStartEqualToEndStartExclusiveEndInclusive() throws IOException {
try {
ColumnSliceFilter.setSlice(is, "20080202", false, "20080202", true);
fail("IllegalArgumentException expected but not thrown");
} catch (IllegalArgumentException expectedException) {
// Exception successfully thrown
}
}
@Test
public void testStartEqualToEndBothInclusive() throws IOException {
ColumnSliceFilter.setSlice(is, "20080202", true, "20080202", true);
columnSliceFilter.validateOptions(is.getOptions());
columnSliceFilter.init(new SortedMapIterator(TEST_DATA), is.getOptions(), iteratorEnvironment);
columnSliceFilter.seek(new Range(), EMPTY_COL_FAMS, false);
assertTrue(columnSliceFilter.hasTop());
assertTrue(columnSliceFilter.getTopKey().equals(KEY_2));
columnSliceFilter.next();
assertFalse(columnSliceFilter.hasTop());
}
}