com.linkedin.pinot.core.predicate.NoDictionaryEqualsPredicateEvaluatorsTest.java Source code

Java tutorial

Introduction

Here is the source code for com.linkedin.pinot.core.predicate.NoDictionaryEqualsPredicateEvaluatorsTest.java

Source

/**
 * 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));
        }
    }
}