/** * diqube: Distributed Query Base. * * Copyright (C) 2015 Bastian Gloeckle * * This file is part of diqube. * * diqube is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. */ package org.diqube.data.types.lng.compression; import java.util.Arrays; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.LongStream; import org.diqube.data.types.lng.array.BitEfficientLongArray; import org.diqube.data.types.lng.array.CompressedLongArray; import org.diqube.data.types.lng.dict.ArrayCompressedLongDictionary; import org.diqube.data.types.lng.dict.ConstantLongDictionary; import org.diqube.util.Pair; import org.testng.Assert; import org.testng.annotations.BeforeMethod; import org.testng.annotations.Test; import com.google.common.collect.HashBiMap; import com.google.common.collect.Lists; /** * Tests {@link ArrayCompressedLongDictionary}. * * @author Bastian Gloeckle */ public class ArrayCompressedLongDictionaryTest { private static final long ID_VALUE_DELTA = 1000L; private static final long MAX_ID = 1000; private ArrayCompressedLongDictionary dict; @BeforeMethod public void before() { CompressedLongArray<?> array = new BitEfficientLongArray(LongStream.range(ID_VALUE_DELTA, ID_VALUE_DELTA + MAX_ID + 1).toArray(), true); dict = new ArrayCompressedLongDictionary(array); } @Test public void firstEntry() { Assert.assertEquals((long) dict.decompressValue(0L), 0L + ID_VALUE_DELTA); Assert.assertEquals(dict.findIdOfValue(0L + ID_VALUE_DELTA), 0L); } @Test public void lastEntry() { Assert.assertEquals((long) dict.decompressValue(MAX_ID), MAX_ID + ID_VALUE_DELTA); Assert.assertEquals(dict.findIdOfValue(MAX_ID + ID_VALUE_DELTA), MAX_ID); } @Test public void middleEntry() { long id = MAX_ID / 2; long value = id + ID_VALUE_DELTA; Assert.assertEquals((long) dict.decompressValue(id), value); Assert.assertEquals(dict.findIdOfValue(value), id); } @Test public void twoThridsEntry() { long id = (MAX_ID * 2) / 3; long value = id + ID_VALUE_DELTA; Assert.assertEquals((long) dict.decompressValue(id), value); Assert.assertEquals(dict.findIdOfValue(value), id); } @Test(expectedExceptions = IllegalArgumentException.class) public void decompressInvalid() { dict.decompressValue(MAX_ID + 1); } @Test public void containsAnyValueTest() { Assert.assertTrue(dict.containsAnyValue(new Long[] { ID_VALUE_DELTA })); Assert.assertFalse(dict.containsAnyValue(new Long[] { 1L })); Assert.assertFalse(dict.containsAnyValue(new Long[] { ID_VALUE_DELTA + MAX_ID + 1 })); Assert.assertTrue(dict.containsAnyValue(new Long[] { ID_VALUE_DELTA + MAX_ID })); } @Test public void decompressMultipleValues() { Long[] ids = new Long[] { 0L, 1L, MAX_ID, MAX_ID - 1 }; Long[] decompressedValues = dict.decompressValues(ids); for (int i = 0; i < ids.length; i++) Assert.assertEquals(decompressedValues[i], Long.valueOf(ids[i] + ID_VALUE_DELTA), "Value for ID " + ids[i] + " is wrong"); } @Test public void idsOfMulipleValues() { Long[] values = new Long[] { ID_VALUE_DELTA, ID_VALUE_DELTA + 1, ID_VALUE_DELTA + MAX_ID - 1, ID_VALUE_DELTA + MAX_ID }; Long[] ids = dict.findIdsOfValues(values); Long[] expectedIds = { 0L, 1L, MAX_ID - 1, MAX_ID }; Assert.assertEquals(ids, expectedIds); } @Test public void ltEq1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> ltEq = dict1.findLtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, -1L); // array1[0] <= array2[i] for i>=0 Assert.assertEquals(ltEq, expected); } @Test public void ltEq2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 6 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> ltEq = dict1.findLtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, -1L); // array1[0] <= array2[i] for i>=0 expected.put(1L, -4L); // array1[1] <= array2[i] for i>=3 Assert.assertEquals(ltEq, expected); } @Test public void ltEq3Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> ltEq = dict1.findLtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, -1L); // array1[0] <= array2[i] for i>=0 expected.put(1L, 3L); // array1[1] == array2[3], therefore array1[1] < array2[i] for i > 3 Assert.assertEquals(ltEq, expected); } @Test public void ltEq4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 0, 1, 2, 3, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> ltEq = dict1.findLtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, 1L); // array1[0] == array2[1], therefore array1[0] < array2[i] for i > 1 expected.put(1L, 4L); // array1[1] == array2[4], therefore array1[1] < array2[i] for i > 4 Assert.assertEquals(ltEq, expected); } @Test public void ltEq5Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 5, 6 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 4 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> ltEq = dict1.findLtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); // empty,as all elements in array1 > all elements in array2 Assert.assertEquals(ltEq, expected); } @Test public void ltEq6Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 5, 6 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 4, 7 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> ltEq = dict1.findLtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, -5L); // array1[0] <= array2[i] for i>=4 expected.put(1L, -5L); // array1[1] <= array2[i] for i>=4 Assert.assertEquals(ltEq, expected); } @Test public void ltEq7Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 1 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 2, 3, 4 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> ltEq = dict1.findLtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, -1L); // array1[0] <= array2[i] for i>=0 expected.put(1L, -1L); // array1[1] <= array2[i] for i>=0 Assert.assertEquals(ltEq, expected); } @Test public void ltEqValue1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> ltEq = dict1.findIdsOfValuesLtEq(4L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L })); Assert.assertEquals(ltEq, expected); Assert.assertTrue(dict1.containsAnyValueLtEq(4L)); } @Test public void ltEqValue2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> ltEq = dict1.findIdsOfValuesLtEq(5L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L, 1L })); Assert.assertEquals(ltEq, expected); Assert.assertTrue(dict1.containsAnyValueLtEq(5L)); } @Test public void ltEqValue3Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> ltEq = dict1.findIdsOfValuesLtEq(0L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] {})); Assert.assertEquals(ltEq, expected); Assert.assertFalse(dict1.containsAnyValueLtEq(0L)); } @Test public void ltEqValue4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> ltEq = dict1.findIdsOfValuesLtEq(1L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L })); Assert.assertEquals(ltEq, expected); Assert.assertTrue(dict1.containsAnyValueLtEq(1L)); } @Test public void ltValue1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> lt = dict1.findIdsOfValuesLt(4L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L })); Assert.assertEquals(lt, expected); Assert.assertTrue(dict1.containsAnyValueLt(4L)); } @Test public void ltValue2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> lt = dict1.findIdsOfValuesLt(5L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L })); Assert.assertEquals(lt, expected); Assert.assertTrue(dict1.containsAnyValueLt(5L)); } @Test public void ltValue3Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> lt = dict1.findIdsOfValuesLt(0L); // THEN Set<Long> expected = new HashSet<>(); Assert.assertEquals(lt, expected); Assert.assertFalse(dict1.containsAnyValueLt(0L)); } @Test public void ltValue4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> lt = dict1.findIdsOfValuesLt(1L); // THEN Set<Long> expected = new HashSet<>(); Assert.assertEquals(lt, expected); Assert.assertFalse(dict1.containsAnyValueLt(1L)); } @Test public void ltValue5Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> lt = dict1.findIdsOfValuesLt(6L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L, 1L })); Assert.assertEquals(lt, expected); Assert.assertTrue(dict1.containsAnyValueLt(6L)); } @Test public void gtEq1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> grEq = dict1.findGtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(1L, -3L); // array1[1] >= array2[i] for i<=2 Assert.assertEquals(grEq, expected); } @Test public void gtEq2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 6 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> grEq = dict1.findGtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(1L, -3L); // array1[1] >= array2[i] for i<=2 Assert.assertEquals(grEq, expected); } @Test public void gtEq3Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> grEq = dict1.findGtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(1L, 3L); // array1[1] == array2[3], therefore array1[1] > array2[i] for i<3 Assert.assertEquals(grEq, expected); } @Test public void gtEq4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 0, 1, 2, 3, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> grEq = dict1.findGtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, 1L); // array1[0] == array2[1], therefore array1[1] > array2[i] for i<1 expected.put(1L, 4L); // array1[1] == array2[4], therefore array1[1] > array2[i] for i<4 Assert.assertEquals(grEq, expected); } @Test public void gtEq5Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 5, 6 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 4 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> grEq = dict1.findGtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, -4L); // array1[0] <= array2[i] for i<3 expected.put(1L, -4L); // array1[1] <= array2[i] for i<3 Assert.assertEquals(grEq, expected); } @Test public void gtEq6Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 5, 6 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 4, 7 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> grEq = dict1.findGtEqIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, -4L); // array1[0] <= array2[i] for i<3 expected.put(1L, -4L); // array1[1] <= array2[i] for i<3 Assert.assertEquals(grEq, expected); } @Test public void eq1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 1, 2, 3, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> eq = dict1.findEqualIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(1L, 3L); Assert.assertEquals(eq, expected); expected = HashBiMap.create(expected).inverse(); Assert.assertEquals(dict2.findEqualIds(dict1), expected); } @Test public void eq2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 0, 1, 3, 7 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> eq = dict1.findEqualIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, 1L); Assert.assertEquals(eq, expected); expected = HashBiMap.create(expected).inverse(); Assert.assertEquals(dict2.findEqualIds(dict1), expected); } @Test public void eq3Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 0, 1, 5, 7 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> eq = dict1.findEqualIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, 1L); expected.put(1L, 2L); Assert.assertEquals(eq, expected); expected = HashBiMap.create(expected).inverse(); Assert.assertEquals(dict2.findEqualIds(dict1), expected); } @Test public void eq4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5, 8 }, true); CompressedLongArray<?> array2 = new BitEfficientLongArray(new long[] { 0, 1, 5, 7 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); ArrayCompressedLongDictionary dict2 = new ArrayCompressedLongDictionary(array2); // WHEN Map<Long, Long> eq = dict1.findEqualIds(dict2); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, 1L); expected.put(1L, 2L); Assert.assertEquals(eq, expected); expected = HashBiMap.create(expected).inverse(); Assert.assertEquals(dict2.findEqualIds(dict1), expected); } @Test public void gtEqValue1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gtEq = dict1.findIdsOfValuesGtEq(4L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 1L })); Assert.assertEquals(gtEq, expected); Assert.assertTrue(dict1.containsAnyValueGtEq(4L)); } @Test public void gtEqValue2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gtEq = dict1.findIdsOfValuesGtEq(5L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 1L })); Assert.assertEquals(gtEq, expected); Assert.assertTrue(dict1.containsAnyValueGtEq(5L)); } @Test public void gtEqValue3Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gtEq = dict1.findIdsOfValuesGtEq(0L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L, 1L })); Assert.assertEquals(gtEq, expected); Assert.assertTrue(dict1.containsAnyValueGtEq(0L)); } @Test public void gtEqValue4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gtEq = dict1.findIdsOfValuesGtEq(1L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L, 1L })); Assert.assertEquals(gtEq, expected); Assert.assertTrue(dict1.containsAnyValueGtEq(1L)); } @Test public void gtEqValue5Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gtEq = dict1.findIdsOfValuesGtEq(6L); // THEN Set<Long> expected = new HashSet<>(); Assert.assertEquals(gtEq, expected); Assert.assertFalse(dict1.containsAnyValueGtEq(6L)); } @Test public void gtValue1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gt = dict1.findIdsOfValuesGt(4L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 1L })); Assert.assertEquals(gt, expected); Assert.assertTrue(dict1.containsAnyValueGt(4L)); } @Test public void gtValue2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 0, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gt = dict1.findIdsOfValuesGt(5L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] {})); Assert.assertEquals(gt, expected); Assert.assertFalse(dict1.containsAnyValueGt(5L)); } @Test public void gtValue3Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gt = dict1.findIdsOfValuesGt(0L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 0L, 1L })); Assert.assertEquals(gt, expected); Assert.assertTrue(dict1.containsAnyValueGt(0L)); } @Test public void gtValue4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gt = dict1.findIdsOfValuesGt(1L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] { 1L })); Assert.assertEquals(gt, expected); Assert.assertTrue(dict1.containsAnyValueGt(1L)); } @Test public void gtValue5Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Set<Long> gt = dict1.findIdsOfValuesGt(6L); // THEN Set<Long> expected = new HashSet<>(Arrays.asList(new Long[] {})); Assert.assertEquals(gt, expected); Assert.assertFalse(dict1.containsAnyValueGt(6L)); } @Test public void idGtEq1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findGtEqIdOfValue(5L); // THEN Assert.assertEquals((long) id, 1L); } @Test public void idGtEq2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findGtEqIdOfValue(6L); // THEN Assert.assertNull(id); } @Test public void idGtEq4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findGtEqIdOfValue(4L); // THEN Assert.assertEquals((long) id, -(1 + 1)); } @Test public void idGtEq5Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findGtEqIdOfValue(2L); // THEN Assert.assertEquals((long) id, -(1 + 1)); } @Test public void idGtEq6Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findGtEqIdOfValue(0L); // THEN Assert.assertEquals((long) id, -(0 + 1)); } @Test public void idGtEq7Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findGtEqIdOfValue(1L); // THEN Assert.assertEquals((long) id, 0L); } @Test public void idLtEq1Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findLtEqIdOfValue(5L); // THEN Assert.assertEquals((long) id, 1L); } @Test public void idLtEq2Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findLtEqIdOfValue(0L); // THEN Assert.assertNull(id); } @Test public void idLtEq4Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findLtEqIdOfValue(4L); // THEN Assert.assertEquals((long) id, -(0 + 1)); } @Test public void idLtEq5Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findLtEqIdOfValue(2L); // THEN Assert.assertEquals((long) id, -(0 + 1)); } @Test public void idLtEq6Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findLtEqIdOfValue(6L); // THEN Assert.assertEquals((long) id, -(1 + 1)); } @Test public void idLtEq7Test() { // GIVEN CompressedLongArray<?> array1 = new BitEfficientLongArray(new long[] { 1, 5 }, true); ArrayCompressedLongDictionary dict1 = new ArrayCompressedLongDictionary(array1); // WHEN Long id = dict1.findLtEqIdOfValue(1L); // THEN Assert.assertEquals((long) id, 0L); } @Test public void ltEqToConstantDictTest() { // GIVEN CompressedLongArray<?> array = new BitEfficientLongArray(new long[] { 0, 3 }, true); ArrayCompressedLongDictionary compressedDict = new ArrayCompressedLongDictionary(array); ConstantLongDictionary constantDict = new ConstantLongDictionary(2); // WHEN Map<Long, Long> ltEq = compressedDict.findLtEqIds(constantDict); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(0L, -1L); Assert.assertEquals(expected, ltEq); // WHEN THEN ltEq = constantDict.findLtEqIds(compressedDict); expected = new HashMap<>(); expected.put(0L, -2L); Assert.assertEquals(expected, ltEq); } @Test public void gtEqToConstantDictTest() { // GIVEN CompressedLongArray<?> array = new BitEfficientLongArray(new long[] { 0, 3 }, true); ArrayCompressedLongDictionary compressedDict = new ArrayCompressedLongDictionary(array); ConstantLongDictionary constantDict = new ConstantLongDictionary(2); // WHEN Map<Long, Long> gtEq = compressedDict.findGtEqIds(constantDict); // THEN Map<Long, Long> expected = new HashMap<>(); expected.put(1L, -1L); Assert.assertEquals(expected, gtEq); // WHEN THEN gtEq = constantDict.findGtEqIds(compressedDict); expected = new HashMap<>(); expected.put(0L, -1L); Assert.assertEquals(expected, gtEq); } @Test public void iteratorTest() { List<Pair<Long, Long>> expected = LongStream.range(0L, MAX_ID + 1).mapToObj(l -> new Pair<>(l, l + ID_VALUE_DELTA)).collect(Collectors.toList()); Assert.assertEquals(Lists.newArrayList(dict.iterator()), expected, "Expected that iterator returns correct values."); } }