/* * 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.facebook.presto.operator.scalar; import com.facebook.presto.type.ArrayType; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import org.testng.annotations.Test; import java.util.HashMap; import java.util.Map; import static com.facebook.presto.spi.type.BigintType.BIGINT; import static com.facebook.presto.spi.type.BooleanType.BOOLEAN; import static com.facebook.presto.spi.type.DoubleType.DOUBLE; import static com.facebook.presto.spi.type.IntegerType.INTEGER; import static com.facebook.presto.spi.type.VarcharType.VARCHAR; import static com.facebook.presto.spi.type.VarcharType.createVarcharType; import static com.facebook.presto.type.UnknownType.UNKNOWN; import static com.facebook.presto.util.StructuralTestUtil.mapType; public class TestMapFilterFunction extends AbstractTestFunctions { @Test public void testEmpty() throws Exception { assertFunction("map_filter(map(ARRAY[], ARRAY[]), (k, v) -> true)", mapType(UNKNOWN, UNKNOWN), ImmutableMap.of()); assertFunction("map_filter(map(ARRAY[], ARRAY[]), (k, v) -> false)", mapType(UNKNOWN, UNKNOWN), ImmutableMap.of()); assertFunction("map_filter(map(ARRAY[], ARRAY[]), (k, v) -> CAST (NULL AS BOOLEAN))", mapType(UNKNOWN, UNKNOWN), ImmutableMap.of()); assertFunction("map_filter(CAST (map(ARRAY[], ARRAY[]) AS MAP(BIGINT,VARCHAR)), (k, v) -> true)", mapType(BIGINT, VARCHAR), ImmutableMap.of()); } @Test public void testNull() throws Exception { Map<Integer, Void> oneToNullMap = new HashMap<>(); oneToNullMap.put(1, null); assertFunction("map_filter(map(ARRAY[1], ARRAY [NULL]), (k, v) -> v IS NULL)", mapType(INTEGER, UNKNOWN), oneToNullMap); assertFunction("map_filter(map(ARRAY[1], ARRAY [NULL]), (k, v) -> v IS NOT NULL)", mapType(INTEGER, UNKNOWN), ImmutableMap.of()); assertFunction("map_filter(map(ARRAY[1], ARRAY [CAST (NULL AS INTEGER)]), (k, v) -> v IS NULL)", mapType(INTEGER, INTEGER), oneToNullMap); Map<Integer, Void> sequenceToNullMap = new HashMap<>(); sequenceToNullMap.put(1, null); sequenceToNullMap.put(2, null); sequenceToNullMap.put(3, null); assertFunction("map_filter(map(ARRAY[1, 2, 3], ARRAY [NULL, NULL, NULL]), (k, v) -> v IS NULL)", mapType(INTEGER, UNKNOWN), sequenceToNullMap); assertFunction("map_filter(map(ARRAY[1, 2, 3], ARRAY [NULL, NULL, NULL]), (k, v) -> v IS NOT NULL)", mapType(INTEGER, UNKNOWN), ImmutableMap.of()); } @Test public void testBasic() throws Exception { assertFunction( "map_filter(map(ARRAY [5, 6, 7, 8], ARRAY [5, 6, 6, 5]), (x, y) -> x <= 6 OR y = 5)", mapType(INTEGER, INTEGER), ImmutableMap.of(5, 5, 6, 6, 8, 5)); assertFunction( "map_filter(map(ARRAY [5 + RANDOM(1), 6, 7, 8], ARRAY [5, 6, 6, 5]), (x, y) -> x <= 6 OR y = 5)", mapType(INTEGER, INTEGER), ImmutableMap.of(5, 5, 6, 6, 8, 5)); assertFunction( "map_filter(map(ARRAY ['a', 'b', 'c', 'd'], ARRAY [1, 2, NULL, 4]), (k, v) -> v IS NOT NULL)", mapType(createVarcharType(1), INTEGER), ImmutableMap.of("a", 1, "b", 2, "d", 4)); assertFunction( "map_filter(map(ARRAY ['a', 'b', 'c'], ARRAY [TRUE, FALSE, NULL]), (k, v) -> v)", mapType(createVarcharType(1), BOOLEAN), ImmutableMap.of("a", true)); } @Test public void testTypeCombinations() throws Exception { assertFunction( "map_filter(map(ARRAY [25, 26, 27], ARRAY [25, 26, 27]), (k, v) -> k = 25 OR v = 27)", mapType(INTEGER, INTEGER), ImmutableMap.of(25, 25, 27, 27)); assertFunction( "map_filter(map(ARRAY [25, 26, 27], ARRAY [25.5, 26.5, 27.5]), (k, v) -> k = 25 OR v = 27.5)", mapType(INTEGER, DOUBLE), ImmutableMap.of(25, 25.5, 27, 27.5)); assertFunction( "map_filter(map(ARRAY [25, 26, 27], ARRAY [false, null, true]), (k, v) -> k = 25 OR v)", mapType(INTEGER, BOOLEAN), ImmutableMap.of(25, false, 27, true)); assertFunction( "map_filter(map(ARRAY [25, 26, 27], ARRAY ['abc', 'def', 'xyz']), (k, v) -> k = 25 OR v = 'xyz')", mapType(INTEGER, createVarcharType(3)), ImmutableMap.of(25, "abc", 27, "xyz")); assertFunction( "map_filter(map(ARRAY [25, 26, 27], ARRAY [ARRAY ['a', 'b'], ARRAY ['a', 'c'], ARRAY ['a', 'b', 'c']]), (k, v) -> k = 25 OR cardinality(v) = 3)", mapType(INTEGER, new ArrayType(createVarcharType(1))), ImmutableMap.of(25, ImmutableList.of("a", "b"), 27, ImmutableList.of("a", "b", "c"))); assertFunction( "map_filter(map(ARRAY [25.5, 26.5, 27.5], ARRAY [25, 26, 27]), (k, v) -> k = 25.5 OR v = 27)", mapType(DOUBLE, INTEGER), ImmutableMap.of(25.5, 25, 27.5, 27)); assertFunction( "map_filter(map(ARRAY [25.5, 26.5, 27.5], ARRAY [25.5, 26.5, 27.5]), (k, v) -> k = 25.5 OR v = 27.5)", mapType(DOUBLE, DOUBLE), ImmutableMap.of(25.5, 25.5, 27.5, 27.5)); assertFunction( "map_filter(map(ARRAY [25.5, 26.5, 27.5], ARRAY [false, null, true]), (k, v) -> k = 25.5 OR v)", mapType(DOUBLE, BOOLEAN), ImmutableMap.of(25.5, false, 27.5, true)); assertFunction( "map_filter(map(ARRAY [25.5, 26.5, 27.5], ARRAY ['abc', 'def', 'xyz']), (k, v) -> k = 25.5 OR v = 'xyz')", mapType(DOUBLE, createVarcharType(3)), ImmutableMap.of(25.5, "abc", 27.5, "xyz")); assertFunction( "map_filter(map(ARRAY [25.5, 26.5, 27.5], ARRAY [ARRAY ['a', 'b'], ARRAY ['a', 'c'], ARRAY ['a', 'b', 'c']]), (k, v) -> k = 25.5 OR cardinality(v) = 3)", mapType(DOUBLE, new ArrayType(createVarcharType(1))), ImmutableMap.of(25.5, ImmutableList.of("a", "b"), 27.5, ImmutableList.of("a", "b", "c"))); assertFunction( "map_filter(map(ARRAY [true, false], ARRAY [25, 26]), (k, v) -> k AND v = 25)", mapType(BOOLEAN, INTEGER), ImmutableMap.of(true, 25)); assertFunction( "map_filter(map(ARRAY [false, true], ARRAY [25.5, 26.5]), (k, v) -> k OR v > 100)", mapType(BOOLEAN, DOUBLE), ImmutableMap.of(true, 26.5)); Map<Boolean, Boolean> falseToNullMap = new HashMap<>(); falseToNullMap.put(false, null); assertFunction( "map_filter(map(ARRAY [true, false], ARRAY [false, null]), (k, v) -> NOT k OR v)", mapType(BOOLEAN, BOOLEAN), falseToNullMap); assertFunction( "map_filter(map(ARRAY [false, true], ARRAY ['abc', 'def']), (k, v) -> NOT k AND v = 'abc')", mapType(BOOLEAN, createVarcharType(3)), ImmutableMap.of(false, "abc")); assertFunction( "map_filter(map(ARRAY [true, false], ARRAY [ARRAY ['a', 'b'], ARRAY ['a', 'b', 'c']]), (k, v) -> k OR cardinality(v) = 3)", mapType(BOOLEAN, new ArrayType(createVarcharType(1))), ImmutableMap.of(true, ImmutableList.of("a", "b"), false, ImmutableList.of("a", "b", "c"))); assertFunction( "map_filter(map(ARRAY ['s0', 's1', 's2'], ARRAY [25, 26, 27]), (k, v) -> k = 's0' OR v = 27)", mapType(createVarcharType(2), INTEGER), ImmutableMap.of("s0", 25, "s2", 27)); assertFunction( "map_filter(map(ARRAY ['s0', 's1', 's2'], ARRAY [25.5, 26.5, 27.5]), (k, v) -> k = 's0' OR v = 27.5)", mapType(createVarcharType(2), DOUBLE), ImmutableMap.of("s0", 25.5, "s2", 27.5)); assertFunction( "map_filter(map(ARRAY ['s0', 's1', 's2'], ARRAY [false, null, true]), (k, v) -> k = 's0' OR v)", mapType(createVarcharType(2), BOOLEAN), ImmutableMap.of("s0", false, "s2", true)); assertFunction( "map_filter(map(ARRAY ['s0', 's1', 's2'], ARRAY ['abc', 'def', 'xyz']), (k, v) -> k = 's0' OR v = 'xyz')", mapType(createVarcharType(2), createVarcharType(3)), ImmutableMap.of("s0", "abc", "s2", "xyz")); assertFunction( "map_filter(map(ARRAY ['s0', 's1', 's2'], ARRAY [ARRAY ['a', 'b'], ARRAY ['a', 'c'], ARRAY ['a', 'b', 'c']]), (k, v) -> k = 's0' OR cardinality(v) = 3)", mapType(createVarcharType(2), new ArrayType(createVarcharType(1))), ImmutableMap.of("s0", ImmutableList.of("a", "b"), "s2", ImmutableList.of("a", "b", "c"))); assertFunction( "map_filter(map(ARRAY [ARRAY [1, 2], ARRAY [3, 4], ARRAY []], ARRAY [25, 26, 27]), (k, v) -> k = ARRAY [1, 2] OR v = 27)", mapType(new ArrayType(INTEGER), INTEGER), ImmutableMap.of(ImmutableList.of(1, 2), 25, ImmutableList.of(), 27)); assertFunction( "map_filter(map(ARRAY [ARRAY [1, 2], ARRAY [3, 4], ARRAY []], ARRAY [25.5, 26.5, 27.5]), (k, v) -> k = ARRAY [1, 2] OR v = 27.5)", mapType(new ArrayType(INTEGER), DOUBLE), ImmutableMap.of(ImmutableList.of(1, 2), 25.5, ImmutableList.of(), 27.5)); assertFunction( "map_filter(map(ARRAY [ARRAY [1, 2], ARRAY [3, 4], ARRAY []], ARRAY [false, null, true]), (k, v) -> k = ARRAY [1, 2] OR v)", mapType(new ArrayType(INTEGER), BOOLEAN), ImmutableMap.of(ImmutableList.of(1, 2), false, ImmutableList.of(), true)); assertFunction( "map_filter(map(ARRAY [ARRAY [1, 2], ARRAY [3, 4], ARRAY []], ARRAY ['abc', 'def', 'xyz']), (k, v) -> k = ARRAY [1, 2] OR v = 'xyz')", mapType(new ArrayType(INTEGER), createVarcharType(3)), ImmutableMap.of(ImmutableList.of(1, 2), "abc", ImmutableList.of(), "xyz")); assertFunction( "map_filter(map(ARRAY [ARRAY [1, 2], ARRAY [3, 4], ARRAY []], ARRAY [ARRAY ['a', 'b'], ARRAY ['a', 'b', 'c'], ARRAY ['a', 'c']]), (k, v) -> cardinality(k) = 0 OR cardinality(v) = 3)", mapType(new ArrayType(INTEGER), new ArrayType(createVarcharType(1))), ImmutableMap.of(ImmutableList.of(3, 4), ImmutableList.of("a", "b", "c"), ImmutableList.of(), ImmutableList.of("a", "c"))); } }