blob: fea560b9a10a422447be591339554c64270bb09d [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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 org.apache.drill.metastore.iceberg.transform;
import org.apache.drill.metastore.MetastoreColumn;
import org.apache.drill.metastore.expressions.FilterExpression;
import org.apache.drill.metastore.iceberg.IcebergBaseTest;
import org.apache.drill.metastore.metadata.MetadataType;
import com.google.common.collect.Sets;
import org.apache.iceberg.expressions.Expression;
import org.apache.iceberg.expressions.Expressions;
import org.junit.BeforeClass;
import org.junit.Test;
import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;
import static org.junit.Assert.assertEquals;
public class TestFilterTransformer extends IcebergBaseTest {
private static FilterTransformer transformer;
@BeforeClass
public static void init() {
transformer = new FilterTransformer();
}
@Test
public void testToFilterNull() {
Expression expected = Expressions.alwaysTrue();
Expression actual = transformer.transform((FilterExpression) null);
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterEqual() {
Expression expected = Expressions.equal(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1);
Expression actual = transformer.transform(FilterExpression.equal(MetastoreColumn.ROW_GROUP_INDEX, 1));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterNotEqual() {
Expression expected = Expressions.notEqual(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1);
Expression actual = transformer.transform(FilterExpression.notEqual(MetastoreColumn.ROW_GROUP_INDEX, 1));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterLessThan() {
Expression expected = Expressions.lessThan(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1);
Expression actual = transformer.transform(FilterExpression.lessThan(MetastoreColumn.ROW_GROUP_INDEX, 1));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterLessThanOrEqual() {
Expression expected = Expressions.lessThanOrEqual(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1);
Expression actual = transformer.transform(FilterExpression.lessThanOrEqual(MetastoreColumn.ROW_GROUP_INDEX, 1));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterGreaterThan() {
Expression expected = Expressions.greaterThan(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1);
Expression actual = transformer.transform(FilterExpression.greaterThan(MetastoreColumn.ROW_GROUP_INDEX, 1));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterGreaterThanOrEqual() {
Expression expected = Expressions.greaterThanOrEqual(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1);
Expression actual = transformer.transform(FilterExpression.greaterThanOrEqual(MetastoreColumn.ROW_GROUP_INDEX, 1));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterIn() {
Expression expected = Expressions.in(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1, 2);
Expression actual = transformer.transform(FilterExpression.in(MetastoreColumn.ROW_GROUP_INDEX, 1, 2));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterNotIn() {
Expression expected = Expressions.notIn(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1, 2);
Expression actual = transformer.transform(FilterExpression.notIn(MetastoreColumn.ROW_GROUP_INDEX, 1, 2));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterIsNull() {
Expression expected = Expressions.isNull(MetastoreColumn.ROW_GROUP_INDEX.columnName());
Expression actual = transformer.transform(FilterExpression.isNull(MetastoreColumn.ROW_GROUP_INDEX));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterIsNotNull() {
Expression expected = Expressions.notNull(MetastoreColumn.ROW_GROUP_INDEX.columnName());
Expression actual = transformer.transform(FilterExpression.isNotNull(MetastoreColumn.ROW_GROUP_INDEX));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterNot() {
Expression expected = Expressions.not(Expressions.equal(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1));
Expression actual = transformer.transform(FilterExpression.not(FilterExpression.equal(MetastoreColumn.ROW_GROUP_INDEX, 1)));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterAnd() {
Expression expected = Expressions.and(
Expressions.equal(MetastoreColumn.STORAGE_PLUGIN.columnName(), "dfs"),
Expressions.equal(MetastoreColumn.WORKSPACE.columnName(), "tmp"),
Expressions.equal(MetastoreColumn.TABLE_NAME.columnName(), "nation"),
Expressions.equal(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 4));
Expression actual = transformer.transform(FilterExpression.and(
FilterExpression.equal(MetastoreColumn.STORAGE_PLUGIN, "dfs"),
FilterExpression.equal(MetastoreColumn.WORKSPACE, "tmp"),
FilterExpression.equal(MetastoreColumn.TABLE_NAME, "nation"),
FilterExpression.equal(MetastoreColumn.ROW_GROUP_INDEX, 4)));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterOr() {
Expression expected = Expressions.or(
Expressions.equal(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1),
Expressions.equal(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 2));
Expression actual = transformer.transform(
FilterExpression.or(
FilterExpression.equal(MetastoreColumn.ROW_GROUP_INDEX, 1),
FilterExpression.equal(MetastoreColumn.ROW_GROUP_INDEX, 2)));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterUnsupported() {
thrown.expect(UnsupportedOperationException.class);
transformer.transform(new FilterExpression() {
@Override
public Operator operator() {
return null;
}
@Override
public <T> T accept(Visitor<T> visitor) {
return visitor.visit(this);
}
});
}
@Test
public void testToFilterConditionsNull() {
assertEquals(Expressions.alwaysTrue().toString(), transformer.transform((Map<MetastoreColumn, Object>) null).toString());
}
@Test
public void testToFilterConditionsEmpty() {
assertEquals(Expressions.alwaysTrue().toString(), transformer.transform(Collections.emptyMap()).toString());
}
@Test
public void testToFilterConditionsOne() {
Map<MetastoreColumn, Object> conditions = new LinkedHashMap<>();
conditions.put(MetastoreColumn.ROW_GROUP_INDEX, 1);
assertEquals(Expressions.equal(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 1).toString(), transformer.transform(conditions).toString());
}
@Test
public void testToFilterConditionsTwo() {
Map<MetastoreColumn, Object> conditions = new LinkedHashMap<>();
conditions.put(MetastoreColumn.STORAGE_PLUGIN, "dfs");
conditions.put(MetastoreColumn.WORKSPACE, "tmp");
Expression expected = Expressions.and(
Expressions.equal(MetastoreColumn.STORAGE_PLUGIN.columnName(), "dfs"),
Expressions.equal(MetastoreColumn.WORKSPACE.columnName(), "tmp"));
assertEquals(expected.toString(), transformer.transform(conditions).toString());
}
@Test
public void testToFilterConditionsFour() {
Map<MetastoreColumn, Object> conditions = new LinkedHashMap<>();
conditions.put(MetastoreColumn.STORAGE_PLUGIN, "dfs");
conditions.put(MetastoreColumn.WORKSPACE, "tmp");
conditions.put(MetastoreColumn.TABLE_NAME, "nation");
conditions.put(MetastoreColumn.ROW_GROUP_INDEX, 4);
Expression expected = Expressions.and(
Expressions.equal(MetastoreColumn.STORAGE_PLUGIN.columnName(), "dfs"),
Expressions.equal(MetastoreColumn.WORKSPACE.columnName(), "tmp"),
Expressions.equal(MetastoreColumn.TABLE_NAME.columnName(), "nation"),
Expressions.equal(MetastoreColumn.ROW_GROUP_INDEX.columnName(), 4));
assertEquals(expected.toString(), transformer.transform(conditions).toString());
}
@Test
public void testToFilterMetadataTypesAll() {
Expression expected = Expressions.alwaysTrue();
Expression actual = transformer.transform(
Sets.newHashSet(MetadataType.PARTITION, MetadataType.FILE, MetadataType.ALL));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterMetadataTypesOne() {
Expression expected = Expressions.equal(MetastoreColumn.METADATA_TYPE.columnName(), MetadataType.PARTITION.name());
Expression actual = transformer.transform(Collections.singleton(MetadataType.PARTITION));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testToFilterMetadataTypesSeveral() {
Expression expected = Expressions.in(MetastoreColumn.METADATA_TYPE.columnName(),
MetadataType.PARTITION.name(), MetadataType.FILE.name());
Expression actual = transformer.transform(
Sets.newHashSet(MetadataType.PARTITION, MetadataType.FILE));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testCombineNone() {
Expression expected = Expressions.alwaysTrue();
Expression actual = transformer.combine();
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testCombineOne() {
Expression expected = Expressions.equal("a", 1);
Expression actual = transformer.combine(expected);
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testCombineTwo() {
Expression expected = Expressions.and(
Expressions.equal("a", 1), Expressions.equal("a", 2));
Expression actual = transformer.combine(
Expressions.equal("a", 1), Expressions.equal("a", 2));
assertEquals(expected.toString(), actual.toString());
}
@Test
public void testCombineFour() {
Expression expected = Expressions.and(
Expressions.equal("a", 1), Expressions.equal("a", 2),
Expressions.equal("a", 3), Expressions.equal("a", 4));
Expression actual = transformer.combine(
Expressions.equal("a", 1), Expressions.equal("a", 2),
Expressions.equal("a", 3), Expressions.equal("a", 4));
assertEquals(expected.toString(), actual.toString());
}
}