/** * Copyright (C) 2014-2016 LinkedIn Corp. (pinot-core@linkedin.com) * * 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. */ package com.linkedin.pinot.core.predicate; import com.linkedin.pinot.common.data.FieldSpec; import com.linkedin.pinot.core.common.predicate.EqPredicate; import com.linkedin.pinot.core.common.predicate.NEqPredicate; import com.linkedin.pinot.core.operator.filter.predicate.EqualsPredicateEvaluatorFactory; import com.linkedin.pinot.core.operator.filter.predicate.NotEqualsPredicateEvaluatorFactory; import com.linkedin.pinot.core.operator.filter.predicate.PredicateEvaluator; import java.util.Collections; import java.util.Random; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.RandomStringUtils; import org.testng.Assert; import org.testng.annotations.BeforeClass; import org.testng.annotations.Test; /** * Unit test for no-dictionary based Eq and NEq predicate evaluators. */ public class NoDictionaryEqualsPredicateEvaluatorsTest { private static final String COLUMN_NAME = "column"; private static final int NUM_MULTI_VALUES = 100; private static final int MAX_STRING_LENGTH = 100; private Random _random; @BeforeClass public void setup() { _random = new Random(); } @Test public void testIntPredicateEvaluators() { int intValue = _random.nextInt(); EqPredicate eqPredicate = new EqPredicate(COLUMN_NAME, Collections.singletonList(Integer.toString(intValue))); PredicateEvaluator eqPredicateEvaluator = EqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(eqPredicate, FieldSpec.DataType.INT); NEqPredicate neqPredicate = new NEqPredicate(COLUMN_NAME, Collections.singletonList(Integer.toString(intValue))); PredicateEvaluator neqPredicateEvaluator = NotEqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(neqPredicate, FieldSpec.DataType.INT); Assert.assertTrue(eqPredicateEvaluator.apply(intValue)); Assert.assertFalse(neqPredicateEvaluator.apply(intValue)); int[] randomInts = new int[NUM_MULTI_VALUES]; PredicateEvaluatorTestUtils.fillRandom(randomInts); randomInts[_random.nextInt(randomInts.length)] = intValue; Assert.assertTrue(eqPredicateEvaluator.apply(randomInts)); Assert.assertFalse(neqPredicateEvaluator.apply(randomInts)); for (int i = 0; i < 100; i++) { int random = _random.nextInt(); Assert.assertEquals(eqPredicateEvaluator.apply(random), (random == intValue)); Assert.assertEquals(neqPredicateEvaluator.apply(random), (random != intValue)); PredicateEvaluatorTestUtils.fillRandom(randomInts); Assert.assertEquals(eqPredicateEvaluator.apply(randomInts), ArrayUtils.contains(randomInts, intValue)); Assert.assertEquals(neqPredicateEvaluator.apply(randomInts), !ArrayUtils.contains(randomInts, intValue)); } } @Test public void testLongPredicateEvaluators() { long longValue = _random.nextLong(); EqPredicate eqPredicate = new EqPredicate(COLUMN_NAME, Collections.singletonList(Long.toString(longValue))); PredicateEvaluator eqPredicateEvaluator = EqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(eqPredicate, FieldSpec.DataType.LONG); NEqPredicate neqPredicate = new NEqPredicate(COLUMN_NAME, Collections.singletonList(Long.toString(longValue))); PredicateEvaluator neqPredicateEvaluator = NotEqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(neqPredicate, FieldSpec.DataType.LONG); Assert.assertTrue(eqPredicateEvaluator.apply(longValue)); Assert.assertFalse(neqPredicateEvaluator.apply(longValue)); long[] randomLongs = new long[NUM_MULTI_VALUES]; PredicateEvaluatorTestUtils.fillRandom(randomLongs); randomLongs[_random.nextInt(randomLongs.length)] = longValue; Assert.assertTrue(eqPredicateEvaluator.apply(randomLongs)); Assert.assertFalse(neqPredicateEvaluator.apply(randomLongs)); for (int i = 0; i < 100; i++) { long random = _random.nextLong(); Assert.assertEquals(eqPredicateEvaluator.apply(random), (random == longValue)); Assert.assertEquals(neqPredicateEvaluator.apply(random), (random != longValue)); PredicateEvaluatorTestUtils.fillRandom(randomLongs); Assert.assertEquals(eqPredicateEvaluator.apply(randomLongs), ArrayUtils.contains(randomLongs, longValue)); Assert.assertEquals(neqPredicateEvaluator.apply(randomLongs), !ArrayUtils.contains(randomLongs, longValue)); } } @Test public void testFloatPredicateEvaluators() { // FLOAT data type float floatValue = _random.nextFloat(); EqPredicate eqPredicate = new EqPredicate(COLUMN_NAME, Collections.singletonList(Float.toString(floatValue))); PredicateEvaluator eqPredicateEvaluator = EqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(eqPredicate, FieldSpec.DataType.FLOAT); NEqPredicate neqPredicate = new NEqPredicate(COLUMN_NAME, Collections.singletonList(Float.toString(floatValue))); PredicateEvaluator neqPredicateEvaluator = NotEqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(neqPredicate, FieldSpec.DataType.FLOAT); Assert.assertTrue(eqPredicateEvaluator.apply(floatValue)); Assert.assertFalse(neqPredicateEvaluator.apply(floatValue)); float[] randomFloats = new float[NUM_MULTI_VALUES]; PredicateEvaluatorTestUtils.fillRandom(randomFloats); randomFloats[_random.nextInt(randomFloats.length)] = floatValue; Assert.assertTrue(eqPredicateEvaluator.apply(randomFloats)); Assert.assertFalse(neqPredicateEvaluator.apply(randomFloats)); for (int i = 0; i < 100; i++) { float random = _random.nextFloat(); Assert.assertEquals(eqPredicateEvaluator.apply(random), (random == floatValue)); Assert.assertEquals(neqPredicateEvaluator.apply(random), (random != floatValue)); PredicateEvaluatorTestUtils.fillRandom(randomFloats); Assert.assertEquals(eqPredicateEvaluator.apply(randomFloats), ArrayUtils.contains(randomFloats, floatValue)); Assert.assertEquals(neqPredicateEvaluator.apply(randomFloats), !ArrayUtils.contains(randomFloats, floatValue)); } } @Test public void testDoublePredicateEvaluators() { double doubleValue = _random.nextDouble(); EqPredicate eqPredicate = new EqPredicate(COLUMN_NAME, Collections.singletonList(Double.toString(doubleValue))); PredicateEvaluator eqPredicateEvaluator = EqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(eqPredicate, FieldSpec.DataType.DOUBLE); NEqPredicate neqPredicate = new NEqPredicate(COLUMN_NAME, Collections.singletonList(Double.toString(doubleValue))); PredicateEvaluator neqPredicateEvaluator = NotEqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(neqPredicate, FieldSpec.DataType.DOUBLE); Assert.assertTrue(eqPredicateEvaluator.apply(doubleValue)); Assert.assertFalse(neqPredicateEvaluator.apply(doubleValue)); double[] randomDoubles = new double[NUM_MULTI_VALUES]; PredicateEvaluatorTestUtils.fillRandom(randomDoubles); randomDoubles[_random.nextInt(randomDoubles.length)] = doubleValue; Assert.assertTrue(eqPredicateEvaluator.apply(randomDoubles)); Assert.assertFalse(neqPredicateEvaluator.apply(randomDoubles)); for (int i = 0; i < 100; i++) { double random = _random.nextDouble(); Assert.assertEquals(eqPredicateEvaluator.apply(random), (random == doubleValue)); Assert.assertEquals(neqPredicateEvaluator.apply(random), (random != doubleValue)); PredicateEvaluatorTestUtils.fillRandom(randomDoubles); Assert.assertEquals(eqPredicateEvaluator.apply(randomDoubles), ArrayUtils.contains(randomDoubles, doubleValue)); Assert.assertEquals(neqPredicateEvaluator.apply(randomDoubles), !ArrayUtils.contains(randomDoubles, doubleValue)); } } @Test public void testStringPredicateEvaluators() { String stringValue = RandomStringUtils.random(MAX_STRING_LENGTH); EqPredicate eqPredicate = new EqPredicate(COLUMN_NAME, Collections.singletonList(stringValue)); PredicateEvaluator eqPredicateEvaluator = EqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(eqPredicate, FieldSpec.DataType.STRING); NEqPredicate neqPredicate = new NEqPredicate(COLUMN_NAME, Collections.singletonList(stringValue)); PredicateEvaluator neqPredicateEvaluator = NotEqualsPredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(neqPredicate, FieldSpec.DataType.STRING); Assert.assertTrue(eqPredicateEvaluator.apply(stringValue)); Assert.assertFalse(neqPredicateEvaluator.apply(stringValue)); String[] randomStrings = new String[NUM_MULTI_VALUES]; PredicateEvaluatorTestUtils.fillRandom(randomStrings, MAX_STRING_LENGTH); randomStrings[_random.nextInt(randomStrings.length)] = stringValue; Assert.assertTrue(eqPredicateEvaluator.apply(randomStrings)); Assert.assertFalse(neqPredicateEvaluator.apply(randomStrings)); for (int i = 0; i < 100; i++) { String random = RandomStringUtils.random(MAX_STRING_LENGTH); Assert.assertEquals(eqPredicateEvaluator.apply(random), (random.equals(stringValue))); Assert.assertEquals(neqPredicateEvaluator.apply(random), (!random.equals(stringValue))); PredicateEvaluatorTestUtils.fillRandom(randomStrings, MAX_STRING_LENGTH); Assert.assertEquals(eqPredicateEvaluator.apply(randomStrings), ArrayUtils.contains(randomStrings, stringValue)); Assert.assertEquals(neqPredicateEvaluator.apply(randomStrings), !ArrayUtils.contains(randomStrings, stringValue)); } } }