package mil.nga.giat.geowave.core.store.flatten; import java.util.Arrays; import java.util.BitSet; import java.util.Collections; import java.util.List; import java.util.TreeSet; import org.apache.commons.lang3.tuple.ImmutablePair; import org.apache.commons.lang3.tuple.Pair; import org.junit.Assert; import org.junit.Test; import mil.nga.giat.geowave.core.store.base.DataStoreEntryInfo.FieldInfo; import mil.nga.giat.geowave.core.store.data.PersistentValue; import mil.nga.giat.geowave.core.store.flatten.BitmaskUtils; import mil.nga.giat.geowave.core.store.flatten.BitmaskedFieldInfoComparator; public class BitmaskUtilsTest { final static BitSet zeroth = new BitSet(); final static BitSet first = new BitSet(); final static BitSet second = new BitSet(); final static BitSet third = new BitSet(); final static BitSet fourth = new BitSet(); final static BitSet fifth = new BitSet(); final static BitSet sixth = new BitSet(); final static BitSet seventh = new BitSet(); final static BitSet eighth = new BitSet(); final static BitSet composite_0_1_2 = new BitSet(); // generate bitsets static { zeroth.set(0); first.set(1); second.set(2); third.set(3); fourth.set(4); fifth.set(5); sixth.set(6); seventh.set(7); eighth.set(8); composite_0_1_2.set(0); composite_0_1_2.set(1); composite_0_1_2.set(2); } @Test public void testGenerateBitSet() { Assert.assertTrue(Arrays.equals( zeroth.toByteArray(), BitmaskUtils.generateCompositeBitmask(0))); Assert.assertTrue(Arrays.equals( eighth.toByteArray(), BitmaskUtils.generateCompositeBitmask(8))); } @Test public void testByteSize() { // confirm bitmasks are of correct (minimal) byte length Assert.assertTrue(1 == zeroth.toByteArray().length); Assert.assertTrue(2 == eighth.toByteArray().length); } @Test public void testGetOrdinal() { List<Integer> positions = BitmaskUtils.getFieldPositions(zeroth.toByteArray()); Assert.assertTrue(0 == positions.get(0)); Assert.assertTrue(1 == positions.size()); positions = BitmaskUtils.getFieldPositions(first.toByteArray()); Assert.assertTrue(1 == positions.get(0)); Assert.assertTrue(1 == positions.size()); positions = BitmaskUtils.getFieldPositions(eighth.toByteArray()); Assert.assertTrue(8 == positions.get(0)); Assert.assertTrue(1 == positions.size()); } @Test public void testCompositeBitmask() { // generate composite bitmask for 3 bitmasks and ensure correctness final byte[] bitmask = BitmaskUtils.generateCompositeBitmask(new TreeSet<Integer>( Arrays.asList( 0, 1, 2))); Assert.assertTrue(BitSet.valueOf( bitmask).equals( composite_0_1_2)); } @Test public void testDecompositionOfComposite() { // decompose composite bitmask and ensure correctness final List<Integer> positions = BitmaskUtils.getFieldPositions(composite_0_1_2.toByteArray()); Assert.assertTrue(positions.size() == 3); Assert.assertTrue(0 == positions.get(0)); Assert.assertTrue(1 == positions.get(1)); Assert.assertTrue(2 == positions.get(2)); } @Test public void testCompositeSortOrder() { // generate meaningless fieldInfo to transform final FieldInfo<?> original = new FieldInfo<Object>( new PersistentValue<Object>( null, // will be overwritten by // BitmaskUtils.transformField() below null), // unused in this instance null, // unused in this instance null); // unused in this instance // clone original fieldInfo overwriting dataValue.id with bitmask final Pair<Integer, FieldInfo<?>> field0 = new ImmutablePair( 0, original); final Pair<Integer, FieldInfo<?>> field1 = new ImmutablePair( 1, original); final Pair<Integer, FieldInfo<?>> field2 = new ImmutablePair( 2, original); final Pair<Integer, FieldInfo<?>> field3 = new ImmutablePair( 3, original); final Pair<Integer, FieldInfo<?>> field4 = new ImmutablePair( 4, original); final Pair<Integer, FieldInfo<?>> field5 = new ImmutablePair( 5, original); final Pair<Integer, FieldInfo<?>> field6 = new ImmutablePair( 6, original); final Pair<Integer, FieldInfo<?>> field7 = new ImmutablePair( 7, original); final Pair<Integer, FieldInfo<?>> field8 = new ImmutablePair( 8, original); // construct list in wrong order final List<Pair<Integer, FieldInfo<?>>> fieldInfoList = Arrays.asList( field8, field7, field6, field5, field4, field3, field2, field1, field0); // sort in place and ensure list sorts correctly Collections.sort( fieldInfoList, new BitmaskedFieldInfoComparator()); Assert.assertTrue(field0.equals(fieldInfoList.get(0))); Assert.assertTrue(field1.equals(fieldInfoList.get(1))); Assert.assertTrue(field2.equals(fieldInfoList.get(2))); Assert.assertTrue(field3.equals(fieldInfoList.get(3))); Assert.assertTrue(field4.equals(fieldInfoList.get(4))); Assert.assertTrue(field5.equals(fieldInfoList.get(5))); Assert.assertTrue(field6.equals(fieldInfoList.get(6))); Assert.assertTrue(field7.equals(fieldInfoList.get(7))); Assert.assertTrue(field8.equals(fieldInfoList.get(8))); } }