/*
* 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.spi.type.Type;
import com.facebook.presto.type.ArrayType;
import com.facebook.presto.type.RowType;
import org.testng.annotations.Test;
import java.util.List;
import java.util.Optional;
import java.util.stream.IntStream;
import static com.facebook.presto.operator.scalar.ZipFunction.MAX_ARITY;
import static com.facebook.presto.operator.scalar.ZipFunction.MIN_ARITY;
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 java.lang.String.format;
import static java.lang.String.join;
import static java.util.Arrays.asList;
import static java.util.stream.Collectors.toList;
public class TestZipFunction
extends AbstractTestFunctions
{
@Test
public void testSameLength()
throws Exception
{
assertFunction("zip(ARRAY[1, 2], ARRAY['a', 'b'])",
zipReturnType(INTEGER, createVarcharType(1)),
list(list(1, "a"), list(2, "b")));
assertFunction("zip(ARRAY[1, 2], ARRAY['a', CAST('b' AS VARCHAR)])",
zipReturnType(INTEGER, VARCHAR),
list(list(1, "a"), list(2, "b")));
assertFunction("zip(ARRAY[1, 2, 3, 4], ARRAY['a', 'b', 'c', 'd'])",
zipReturnType(INTEGER, createVarcharType(1)),
list(list(1, "a"), list(2, "b"), list(3, "c"), list(4, "d")));
assertFunction("zip(ARRAY[1, 2], ARRAY['a', 'b'], ARRAY['c', 'd'])",
zipReturnType(INTEGER, createVarcharType(1), createVarcharType(1)),
list(list(1, "a", "c"), list(2, "b", "d")));
assertFunction("zip(ARRAY[1, 2], ARRAY['a', 'b'], ARRAY['c', 'd'], ARRAY['e', 'f'])",
zipReturnType(INTEGER, createVarcharType(1), createVarcharType(1), createVarcharType(1)),
list(list(1, "a", "c", "e"), list(2, "b", "d", "f")));
assertFunction("zip(ARRAY[], ARRAY[])",
zipReturnType(UNKNOWN, UNKNOWN),
list());
assertFunction("zip(ARRAY[], ARRAY[], ARRAY[])",
zipReturnType(UNKNOWN, UNKNOWN, UNKNOWN),
list());
assertFunction("zip(ARRAY[], ARRAY[], ARRAY[], ARRAY[])",
zipReturnType(UNKNOWN, UNKNOWN, UNKNOWN, UNKNOWN),
list());
assertFunction("zip(ARRAY[NULL], ARRAY[NULL])",
zipReturnType(UNKNOWN, UNKNOWN),
list(list(null, null)));
assertFunction("zip(ARRAY[ARRAY[1, 1], ARRAY[1, 2]], ARRAY[ARRAY[2, 1], ARRAY[2, 2]])",
zipReturnType(new ArrayType(INTEGER), new ArrayType(INTEGER)),
list(list(list(1, 1), list(2, 1)), list(list(1, 2), list(2, 2))));
}
@Test
public void testDifferentLength()
throws Exception
{
assertFunction("zip(ARRAY[1], ARRAY['a', 'b'])",
zipReturnType(INTEGER, createVarcharType(1)),
list(list(1, "a"), list(null, "b")));
assertFunction("zip(ARRAY[NULL, 2], ARRAY['a'])",
zipReturnType(INTEGER, createVarcharType(1)),
list(list(null, "a"), list(2, null)));
assertFunction("zip(ARRAY[], ARRAY[1], ARRAY[1, 2], ARRAY[1, 2, 3])",
zipReturnType(UNKNOWN, INTEGER, INTEGER, INTEGER),
list(list(null, 1, 1, 1), list(null, null, 2, 2), list(null, null, null, 3)));
assertFunction("zip(ARRAY[], ARRAY[NULL], ARRAY[NULL, NULL])",
zipReturnType(UNKNOWN, UNKNOWN, UNKNOWN),
list(list(null, null, null), list(null, null, null)));
}
@Test
public void testWithNull()
throws Exception
{
assertFunction("zip(CAST(NULL AS ARRAY(UNKNOWN)), ARRAY[], ARRAY[1])",
zipReturnType(UNKNOWN, UNKNOWN, INTEGER),
null);
}
@Test
public void testAllArities()
throws Exception
{
for (int arity = MIN_ARITY; arity <= MAX_ARITY; arity++) {
String[] arguments = IntStream.rangeClosed(1, arity)
.mapToObj(index -> "ARRAY[" + index + "]")
.toArray(String[]::new);
Type[] types = IntStream.rangeClosed(1, arity)
.mapToObj(index -> INTEGER)
.toArray(Type[]::new);
assertFunction(
format("zip(%s)", join(", ", list(arguments))),
zipReturnType(types),
list(IntStream.rangeClosed(1, arity).boxed().collect(toList())));
}
}
private static Type zipReturnType(Type... types)
{
return new ArrayType(new RowType(list(types), Optional.empty()));
}
@SafeVarargs
private static <T> List<T> list(T... a)
{
return asList(a);
}
}