use of com.hazelcast.sql.impl.exec.scan.index.IndexRangeFilter in project hazelcast by hazelcast.
the class IndexIterationPointer method createFromIndexFilterInt.
private static void createFromIndexFilterInt(IndexFilter indexFilter, boolean descending, ExpressionEvalContext evalContext, List<IndexIterationPointer> result) {
if (indexFilter == null) {
result.add(create(null, true, null, true, descending, null));
}
if (indexFilter instanceof IndexRangeFilter) {
IndexRangeFilter rangeFilter = (IndexRangeFilter) indexFilter;
Comparable<?> from = null;
if (rangeFilter.getFrom() != null) {
Comparable<?> fromValue = rangeFilter.getFrom().getValue(evalContext);
// produces UNKNOWN result.
if (fromValue == null) {
return;
}
from = fromValue;
}
Comparable<?> to = null;
if (rangeFilter.getTo() != null) {
Comparable<?> toValue = rangeFilter.getTo().getValue(evalContext);
// Same comment above for expressions like a < NULL.
if (toValue == null) {
return;
}
to = toValue;
}
result.add(create(from, rangeFilter.isFromInclusive(), to, rangeFilter.isToInclusive(), descending, null));
} else if (indexFilter instanceof IndexEqualsFilter) {
IndexEqualsFilter equalsFilter = (IndexEqualsFilter) indexFilter;
Comparable<?> value = equalsFilter.getComparable(evalContext);
result.add(create(value, true, value, true, descending, null));
} else if (indexFilter instanceof IndexInFilter) {
IndexInFilter inFilter = (IndexInFilter) indexFilter;
for (IndexFilter filter : inFilter.getFilters()) {
createFromIndexFilterInt(filter, descending, evalContext, result);
}
}
}
use of com.hazelcast.sql.impl.exec.scan.index.IndexRangeFilter in project hazelcast by hazelcast.
the class SqlDataSerializerHook method createFactory.
@SuppressWarnings("unchecked")
@Override
public DataSerializableFactory createFactory() {
ConstructorFunction<Integer, IdentifiedDataSerializable>[] constructors = new ConstructorFunction[LEN];
constructors[QUERY_DATA_TYPE] = arg -> new QueryDataType();
constructors[QUERY_ID] = arg -> new QueryId();
constructors[ROW_HEAP] = arg -> new HeapRow();
constructors[ROW_EMPTY] = arg -> EmptyRow.INSTANCE;
constructors[LAZY_TARGET] = arg -> new LazyTarget();
constructors[INDEX_FILTER_VALUE] = arg -> new IndexFilterValue();
constructors[INDEX_FILTER_EQUALS] = arg -> new IndexEqualsFilter();
constructors[INDEX_FILTER_RANGE] = arg -> new IndexRangeFilter();
constructors[INDEX_FILTER_IN] = arg -> new IndexInFilter();
constructors[EXPRESSION_COLUMN] = arg -> new ColumnExpression<>();
constructors[EXPRESSION_IS_NULL] = arg -> new IsNullPredicate();
constructors[TARGET_DESCRIPTOR_GENERIC] = arg -> GenericQueryTargetDescriptor.DEFAULT;
constructors[QUERY_PATH] = arg -> new QueryPath();
constructors[EXPRESSION_CONSTANT] = arg -> new ConstantExpression<>();
constructors[EXPRESSION_PARAMETER] = arg -> new ParameterExpression<>();
constructors[EXPRESSION_CAST] = arg -> new CastExpression<>();
constructors[EXPRESSION_DIVIDE] = arg -> new DivideFunction<>();
constructors[EXPRESSION_MINUS] = arg -> new MinusFunction<>();
constructors[EXPRESSION_MULTIPLY] = arg -> new MultiplyFunction<>();
constructors[EXPRESSION_PLUS] = arg -> new PlusFunction<>();
constructors[EXPRESSION_UNARY_MINUS] = arg -> new UnaryMinusFunction<>();
constructors[EXPRESSION_AND] = arg -> new AndPredicate();
constructors[EXPRESSION_OR] = arg -> new OrPredicate();
constructors[EXPRESSION_NOT] = arg -> new NotPredicate();
constructors[EXPRESSION_COMPARISON] = arg -> new ComparisonPredicate();
constructors[EXPRESSION_IS_TRUE] = arg -> new IsTruePredicate();
constructors[EXPRESSION_IS_NOT_TRUE] = arg -> new IsNotTruePredicate();
constructors[EXPRESSION_IS_FALSE] = arg -> new IsFalsePredicate();
constructors[EXPRESSION_IS_NOT_FALSE] = arg -> new IsNotFalsePredicate();
constructors[EXPRESSION_IS_NOT_NULL] = arg -> new IsNotNullPredicate();
constructors[EXPRESSION_ABS] = arg -> new AbsFunction<>();
constructors[EXPRESSION_SIGN] = arg -> new SignFunction<>();
constructors[EXPRESSION_RAND] = arg -> new RandFunction();
constructors[EXPRESSION_DOUBLE] = arg -> new DoubleFunction();
constructors[EXPRESSION_FLOOR_CEIL] = arg -> new FloorCeilFunction<>();
constructors[EXPRESSION_ROUND_TRUNCATE] = arg -> new RoundTruncateFunction<>();
constructors[INTERVAL_YEAR_MONTH] = arg -> new SqlYearMonthInterval();
constructors[INTERVAL_DAY_SECOND] = arg -> new SqlDaySecondInterval();
constructors[EXPRESSION_ASCII] = arg -> new AsciiFunction();
constructors[EXPRESSION_CHAR_LENGTH] = arg -> new CharLengthFunction();
constructors[EXPRESSION_INITCAP] = arg -> new InitcapFunction();
constructors[EXPRESSION_LOWER] = arg -> new LowerFunction();
constructors[EXPRESSION_UPPER] = arg -> new UpperFunction();
constructors[EXPRESSION_CONCAT] = arg -> new ConcatFunction();
constructors[EXPRESSION_LIKE] = arg -> new LikeFunction();
constructors[EXPRESSION_SUBSTRING] = arg -> new SubstringFunction();
constructors[EXPRESSION_TRIM] = arg -> new TrimFunction();
constructors[EXPRESSION_REPLACE] = arg -> new ReplaceFunction();
constructors[EXPRESSION_POSITION] = arg -> new PositionFunction();
constructors[EXPRESSION_REMAINDER] = arg -> new RemainderFunction<>();
constructors[EXPRESSION_CONCAT_WS] = arg -> new ConcatWSFunction();
constructors[EXPRESSION_CASE] = arg -> new CaseExpression<>();
constructors[EXPRESSION_EXTRACT] = arg -> new ExtractFunction();
constructors[EXPRESSION_DOUBLE_DOUBLE] = arg -> new DoubleBiFunction();
constructors[EXPRESSION_TO_TIMESTAMP_TZ] = arg -> new ToTimestampTzFunction();
constructors[EXPRESSION_TO_EPOCH_MILLIS] = arg -> new ToEpochMillisFunction();
constructors[MAPPING] = arg -> new Mapping();
constructors[MAPPING_FIELD] = arg -> new MappingField();
constructors[EXPRESSION_SEARCHABLE] = arg -> new SearchableExpression<>();
constructors[EXPRESSION_SEARCH] = arg -> new SearchPredicate();
constructors[VIEW] = arg -> new View();
return new ArrayDataSerializableFactory(constructors);
}
use of com.hazelcast.sql.impl.exec.scan.index.IndexRangeFilter in project hazelcast by hazelcast.
the class IndexRangeFilterIteratorTest method testIterator_simple_between.
@Test
public void testIterator_simple_between() {
HazelcastInstance instance = factory.newHazelcastInstance(getConfig());
IMap<Integer, Value> map = instance.getMap(MAP_NAME);
map.addIndex(new IndexConfig().setName(INDEX_NAME).setType(SORTED).addAttribute("value1"));
InternalIndex index = getIndex(instance);
ExpressionEvalContext evalContext = createExpressionEvalContext();
// Check missing value.
map.put(0, new Value(0));
map.put(1, new Value(10));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), true).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), true).getEntries(index, descendingDirection, evalContext));
// Check left bound
map.put(2, new Value(1));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), false).getEntries(index, descendingDirection, evalContext), 2);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), true).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2);
map.put(3, new Value(1));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), false).getEntries(index, descendingDirection, evalContext), 2, 3);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), true).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2, 3);
map.remove(2);
map.remove(3);
// Check right bound
map.put(2, new Value(5));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2);
map.put(3, new Value(5));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2, 3);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2, 3);
map.remove(2);
map.remove(3);
// Check middle
map.put(2, new Value(3));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), false).getEntries(index, descendingDirection, evalContext), 2);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), false).getEntries(index, descendingDirection, evalContext), 2);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2);
map.put(3, new Value(3));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), false).getEntries(index, descendingDirection, evalContext), 2, 3);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), false).getEntries(index, descendingDirection, evalContext), 2, 3);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2, 3);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2, 3);
map.remove(2);
map.remove(3);
// Check combined
map.put(2, new Value(1));
map.put(3, new Value(1));
map.put(4, new Value(3));
map.put(5, new Value(3));
map.put(6, new Value(5));
map.put(7, new Value(5));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), false).getEntries(index, descendingDirection, evalContext), 4, 5);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), false).getEntries(index, descendingDirection, evalContext), 2, 3, 4, 5);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(5), true).getEntries(index, descendingDirection, evalContext), 4, 5, 6, 7);
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), true, intValue(5), true).getEntries(index, descendingDirection, evalContext), 2, 3, 4, 5, 6, 7);
// Check null value.
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(null, false), false, intValue(5), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(1), false, intValue(null, false), false).getEntries(index, descendingDirection, evalContext));
checkIterator(SORTED, descendingDirection, new IndexRangeFilter(intValue(null, false), false, intValue(null, false), false).getEntries(index, descendingDirection, evalContext));
}
use of com.hazelcast.sql.impl.exec.scan.index.IndexRangeFilter in project hazelcast by hazelcast.
the class MapIndexScanPTest method test_whenBothFiltersAndSpecificProjectionExists_sorted.
@Test
public void test_whenBothFiltersAndSpecificProjectionExists_sorted() {
List<JetSqlRow> expected = new ArrayList<>();
for (int i = count; i > 0; i--) {
map.put(i, new Person("value-" + i, i));
if (i > count / 2) {
if (i % 2 == 1) {
expected.add(jetRow((count - i + 1), "value-" + (count - i + 1), (count - i + 1)));
}
}
}
IndexConfig indexConfig = new IndexConfig(IndexType.SORTED, "age").setName(randomName());
map.addIndex(indexConfig);
Expression<Boolean> remainingFilter = new FunctionalPredicateExpression(row -> {
int value = row.get(0);
return value % 2 == 0;
});
IndexFilter filter = new IndexRangeFilter(intValue(0), true, intValue(count / 2), true);
MapIndexScanMetadata metadata = metadata(indexConfig.getName(), filter, remainingFilter, 0, false);
TestSupport.verifyProcessor(adaptSupplier(MapIndexScanP.readMapIndexSupplier(metadata))).hazelcastInstance(instance()).jobConfig(new JobConfig().setArgument(SQL_ARGUMENTS_KEY_NAME, emptyList())).outputChecker(LENIENT_SAME_ITEMS_IN_ORDER).disableSnapshots().disableProgressAssertion().expectOutput(expected);
}
use of com.hazelcast.sql.impl.exec.scan.index.IndexRangeFilter in project hazelcast by hazelcast.
the class MapIndexScanPTest method test_whenFilterAndSpecificProjectionExists_sorted.
@Test
public void test_whenFilterAndSpecificProjectionExists_sorted() {
List<JetSqlRow> expected = new ArrayList<>();
for (int i = count; i > 0; i--) {
map.put(i, new Person("value-" + i, i));
if (i > count / 2) {
expected.add(jetRow((count - i + 1), "value-" + (count - i + 1), (count - i + 1)));
}
}
IndexConfig indexConfig = new IndexConfig(IndexType.SORTED, "age").setName(randomName());
map.addIndex(indexConfig);
IndexFilter filter = new IndexRangeFilter(intValue(0), true, intValue(count / 2), true);
MapIndexScanMetadata metadata = metadata(indexConfig.getName(), filter, 0, false);
TestSupport.verifyProcessor(adaptSupplier(MapIndexScanP.readMapIndexSupplier(metadata))).hazelcastInstance(instance()).jobConfig(new JobConfig().setArgument(SQL_ARGUMENTS_KEY_NAME, emptyList())).outputChecker(LENIENT_SAME_ITEMS_IN_ORDER).disableSnapshots().disableProgressAssertion().expectOutput(expected);
}
Aggregations