/** * 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.RangePredicate; import com.linkedin.pinot.core.operator.filter.predicate.PredicateEvaluator; import com.linkedin.pinot.core.operator.filter.predicate.RangePredicateEvaluatorFactory; import java.util.Collections; import org.testng.Assert; import org.testng.annotations.Test; /** * Unit test for no-dictionary based range predicate evaluators. */ public class NoDictionaryRangePredicateEvaluatorTest { private static final String COLUMN_NAME = "column"; @Test public void testIntPredicateEvaluator() { PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", FieldSpec.DataType.INT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply(i), (i >= -10 && i <= 10)); } predicateEvaluator = buildRangePredicate("(-10\t\t10]", FieldSpec.DataType.INT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply(i), (i > -10 && i <= 10)); } predicateEvaluator = buildRangePredicate("(-10\t\t10)", FieldSpec.DataType.INT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply(i), (i > -10 && i < 10)); } predicateEvaluator = buildRangePredicate("(*\t\t10]", FieldSpec.DataType.INT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply(i), (i <= 10)); } predicateEvaluator = buildRangePredicate("(*\t\t10)", FieldSpec.DataType.INT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply(i), (i < 10)); } predicateEvaluator = buildRangePredicate("[10\t\t*]", FieldSpec.DataType.INT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply(i), (i >= 10)); } predicateEvaluator = buildRangePredicate("(10\t\t*)", FieldSpec.DataType.INT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply(i), (i > 10)); } predicateEvaluator = buildRangePredicate("(*\t\t*)", FieldSpec.DataType.INT); for (int i = -20; i < 20; i++) { Assert.assertTrue(predicateEvaluator.apply(i)); } } @Test public void testLongPredicateEvaluator() { PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", FieldSpec.DataType.LONG); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((long) i), (i >= -10 && i <= 10)); } predicateEvaluator = buildRangePredicate("(-10\t\t10]", FieldSpec.DataType.LONG); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((long) i), (i > -10 && i <= 10)); } predicateEvaluator = buildRangePredicate("(-10\t\t10)", FieldSpec.DataType.LONG); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((long) i), (i > -10 && i < 10)); } predicateEvaluator = buildRangePredicate("(*\t\t10]", FieldSpec.DataType.LONG); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((long) i), (i <= 10)); } predicateEvaluator = buildRangePredicate("(*\t\t10)", FieldSpec.DataType.LONG); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((long) i), (i < 10)); } predicateEvaluator = buildRangePredicate("[10\t\t*)", FieldSpec.DataType.LONG); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((long) i), (i >= 10)); } predicateEvaluator = buildRangePredicate("(10\t\t*)", FieldSpec.DataType.LONG); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((long) i), (i > 10)); } predicateEvaluator = buildRangePredicate("(*\t\t*)", FieldSpec.DataType.LONG); for (int i = -20; i < 20; i++) { Assert.assertTrue(predicateEvaluator.apply((long) i)); } } @Test public void testFloatPredicateEvaluator() { PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i >= -10 && i <= 10)); } predicateEvaluator = buildRangePredicate("(-10\t\t10]", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i > -10 && i <= 10)); } predicateEvaluator = buildRangePredicate("(-10\t\t10)", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i > -10 && i < 10)); } predicateEvaluator = buildRangePredicate("(*\t\t10]", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i <= 10), "Value: " + i); } predicateEvaluator = buildRangePredicate("(*\t\t10)", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i < 10)); } predicateEvaluator = buildRangePredicate("[10\t\t*)", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i >= 10), "Value: " + i); } predicateEvaluator = buildRangePredicate("(10\t\t*)", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i > 10)); } predicateEvaluator = buildRangePredicate("(*\t\t*)", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertTrue(predicateEvaluator.apply((float) i)); } } @Test public void testDoublePredicateEvaluator() { PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", FieldSpec.DataType.DOUBLE); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((double) i), (i >= -10 && i <= 10)); } predicateEvaluator = buildRangePredicate("(-10\t\t10]", FieldSpec.DataType.DOUBLE); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((double) i), (i > -10 && i <= 10)); } predicateEvaluator = buildRangePredicate("(-10\t\t10)", FieldSpec.DataType.DOUBLE); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((double) i), (i > -10 && i < 10)); } predicateEvaluator = buildRangePredicate("(*\t\t10]", FieldSpec.DataType.DOUBLE); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((double) i), (i <= 10), "Value: " + i); } predicateEvaluator = buildRangePredicate("(*\t\t10)", FieldSpec.DataType.DOUBLE); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((double) i), (i < 10)); } predicateEvaluator = buildRangePredicate("[10\t\t*)", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i >= 10), "Value: " + i); } predicateEvaluator = buildRangePredicate("(10\t\t*)", FieldSpec.DataType.FLOAT); for (int i = -20; i < 20; i++) { Assert.assertEquals(predicateEvaluator.apply((float) i), (i > 10)); } predicateEvaluator = buildRangePredicate("(*\t\t*)", FieldSpec.DataType.DOUBLE); for (int i = -20; i < 20; i++) { Assert.assertTrue(predicateEvaluator.apply((double) i)); } } @Test public void testStringPredicateEvaluator() { PredicateEvaluator predicateEvaluator = buildRangePredicate("[-10\t\t10]", FieldSpec.DataType.STRING); for (int i = -20; i < 20; i++) { String value = Integer.toString(i); Assert.assertEquals(predicateEvaluator.apply(value), (value.compareTo("-10") >= 0 && value.compareTo("10") <= 0)); } predicateEvaluator = buildRangePredicate("(-10\t\t10]", FieldSpec.DataType.STRING); for (int i = -20; i < 20; i++) { String value = Integer.toString(i); Assert.assertEquals(predicateEvaluator.apply(value), (value.compareTo("-10") > 0 && value.compareTo("10") <= 0)); } predicateEvaluator = buildRangePredicate("(-10\t\t10)", FieldSpec.DataType.STRING); for (int i = -20; i < 20; i++) { String value = Integer.toString(i); Assert.assertEquals(predicateEvaluator.apply(value), (value.compareTo("-10") > 0 && value.compareTo("10") < 0)); } predicateEvaluator = buildRangePredicate("(*\t\t10]", FieldSpec.DataType.STRING); for (int i = -20; i < 20; i++) { String value = Integer.toString(i); Assert.assertEquals(predicateEvaluator.apply(value), (value.compareTo("10") <= 0)); } predicateEvaluator = buildRangePredicate("(*\t\t10)", FieldSpec.DataType.STRING); for (int i = -20; i < 20; i++) { String value = Integer.toString(i); Assert.assertEquals(predicateEvaluator.apply(value), (value.compareTo("10") < 0)); } predicateEvaluator = buildRangePredicate("[10\t\t*)", FieldSpec.DataType.STRING); for (int i = -20; i < 20; i++) { String value = Integer.toString(i); Assert.assertEquals(predicateEvaluator.apply(value), (value.compareTo("10") >= 0)); } predicateEvaluator = buildRangePredicate("(10\t\t*)", FieldSpec.DataType.STRING); for (int i = -20; i < 20; i++) { String value = Integer.toString(i); Assert.assertEquals(predicateEvaluator.apply(value), (value.compareTo("10") > 0)); } predicateEvaluator = buildRangePredicate("(*\t\t*)", FieldSpec.DataType.STRING); for (int i = -20; i < 20; i++) { Assert.assertTrue(predicateEvaluator.apply(Integer.toString(i))); } } private PredicateEvaluator buildRangePredicate(String rangeString, FieldSpec.DataType dataType) { RangePredicate predicate = new RangePredicate(COLUMN_NAME, Collections.singletonList(rangeString)); return RangePredicateEvaluatorFactory.newNoDictionaryBasedEvaluator(predicate, dataType); } }