blob: bc6fad21af0a342b4b4243ca79b55fb84913520e [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.metadata;
import org.apache.drill.categories.MetastoreTest;
import org.apache.drill.common.types.TypeProtos;
import org.apache.drill.metastore.statistics.BaseStatisticsKind;
import org.apache.drill.metastore.statistics.ColumnStatistics;
import org.apache.drill.metastore.statistics.ColumnStatisticsKind;
import org.apache.drill.metastore.statistics.StatisticsHolder;
import org.apache.drill.metastore.statistics.TableStatisticsKind;
import org.apache.drill.test.BaseTest;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@Category(MetastoreTest.class)
public class MetadataSerDeTest extends BaseTest {
@Test
public void testStatisticsHolderSerialization() {
checkStatisticsHolderSerialization(1, TableStatisticsKind.ROW_COUNT,
"{\"statisticsValue\":1,\"statisticsKind\":{\"exact\":true,\"name\":\"rowCount\"}}");
checkStatisticsHolderSerialization(1.234, TableStatisticsKind.EST_ROW_COUNT,
"{\"statisticsValue\":1.234,\"statisticsKind\":{\"name\":\"rowcount\"}}");
checkStatisticsHolderSerialization(true, TableStatisticsKind.HAS_DESCRIPTIVE_STATISTICS,
"{\"statisticsValue\":true,\"statisticsKind\":{\"name\":\"hasDescriptiveStatistics\"}}");
checkStatisticsHolderSerialization(null, TableStatisticsKind.EST_ROW_COUNT,
"{\"statisticsKind\":{\"name\":\"rowcount\"}}");
checkStatisticsHolderSerialization("aAaAaAa", ColumnStatisticsKind.MIN_VALUE,
"{\"statisticsValue\":\"aAaAaAa\",\"statisticsKind\":{\"exact\":true,\"name\":\"minValue\"}}");
checkStatisticsHolderSerialization(new BigDecimal("123.321"), ColumnStatisticsKind.MIN_VALUE,
"{\"statisticsValue\":{\"java.math.BigDecimal\":123.321},\"statisticsKind\":{\"exact\":true,\"name\":\"minValue\"}}");
checkStatisticsHolderSerialization(new byte[]{1, 1, 2, 3, 5, 8}, ColumnStatisticsKind.MAX_VALUE,
"{\"statisticsValue\":{\"[B\":\"AQECAwUI\"},\"statisticsKind\":{\"exact\":true,\"name\":\"maxValue\"}}");
}
@Test
public void testStatisticsHolderDeserialization() {
checkStatisticsHolderDeserialization(1, TableStatisticsKind.ROW_COUNT);
checkStatisticsHolderDeserialization(1.234, TableStatisticsKind.EST_ROW_COUNT);
checkStatisticsHolderDeserialization(true, TableStatisticsKind.HAS_DESCRIPTIVE_STATISTICS);
checkStatisticsHolderDeserialization(null, TableStatisticsKind.EST_ROW_COUNT);
checkStatisticsHolderDeserialization("aAaAaAa", ColumnStatisticsKind.MIN_VALUE);
checkStatisticsHolderDeserialization(new BigDecimal("123.321"), ColumnStatisticsKind.MIN_VALUE);
checkStatisticsHolderDeserialization(new byte[]{1, 1, 2, 3, 5, 8}, ColumnStatisticsKind.MAX_VALUE);
}
@Test
public void testColumnStatisticsSerialization() {
List<StatisticsHolder<?>> statistics = Arrays.asList(
new StatisticsHolder<>("aaa", ColumnStatisticsKind.MIN_VALUE),
new StatisticsHolder<>("zzz", ColumnStatisticsKind.MAX_VALUE),
new StatisticsHolder<>(3, ColumnStatisticsKind.NULLS_COUNT),
new StatisticsHolder<>(2.1, ColumnStatisticsKind.NDV));
ColumnStatistics<String> columnStatistics = new ColumnStatistics<>(statistics, TypeProtos.MinorType.VARCHAR);
String serializedColumnStatistics = columnStatistics.jsonString();
String expected =
"{" +
"\"statistics\":[" +
"{\"statisticsValue\":2.1,\"statisticsKind\":{\"name\":\"approx_count_distinct\"}}," +
"{\"statisticsValue\":\"aaa\",\"statisticsKind\":{\"exact\":true,\"name\":\"minValue\"}}," +
"{\"statisticsValue\":3,\"statisticsKind\":{\"exact\":true,\"name\":\"nullsCount\"}}," +
"{\"statisticsValue\":\"zzz\",\"statisticsKind\":{\"exact\":true,\"name\":\"maxValue\"}}]," +
"\"type\":\"VARCHAR\"" +
"}";
assertEquals("StatisticsHolder was incorrectly serialized",
expected,
serializedColumnStatistics);
}
@Test
public void testColumnStatisticsDeserialization() {
List<StatisticsHolder<?>> statistics = Arrays.asList(
new StatisticsHolder<>("aaa", ColumnStatisticsKind.MIN_VALUE),
new StatisticsHolder<>("zzz", ColumnStatisticsKind.MAX_VALUE),
new StatisticsHolder<>(3, ColumnStatisticsKind.NULLS_COUNT),
new StatisticsHolder<>(2.1, ColumnStatisticsKind.NDV));
ColumnStatistics<String> columnStatistics = new ColumnStatistics<>(statistics, TypeProtos.MinorType.VARCHAR);
String serializedColumnStatistics = columnStatistics.jsonString();
ColumnStatistics<?> deserialized = ColumnStatistics.of(serializedColumnStatistics);
assertEquals("Type was incorrectly deserialized",
columnStatistics.getComparatorType(),
deserialized.getComparatorType());
for (StatisticsHolder<?> statistic : statistics) {
assertEquals("Statistics kind was incorrectly deserialized",
statistic.getStatisticsKind().isExact(),
deserialized.containsExact(statistic.getStatisticsKind()));
assertEquals("Statistics value was incorrectly deserialized",
statistic.getStatisticsValue(),
deserialized.get(statistic.getStatisticsKind()));
}
}
private <T> void checkStatisticsHolderSerialization(T statisticsValue,
BaseStatisticsKind<?> statisticsKind, String expectedString) {
StatisticsHolder<T> statisticsHolder =
new StatisticsHolder<>(statisticsValue, statisticsKind);
String serializedStatisticsHolder = statisticsHolder.jsonString();
assertEquals("StatisticsHolder was incorrectly serialized",
expectedString,
serializedStatisticsHolder);
}
private <T> void checkStatisticsHolderDeserialization(T statisticsValue,
BaseStatisticsKind<?> statisticsKind) {
StatisticsHolder<T> rowCount =
new StatisticsHolder<>(statisticsValue, statisticsKind);
StatisticsHolder<?> deserializedRowCount = StatisticsHolder.of(rowCount.jsonString());
assertTrue("Statistics value was incorrectly deserialized",
Objects.deepEquals(rowCount.getStatisticsValue(), deserializedRowCount.getStatisticsValue()));
assertStatisticsKindsEquals(rowCount, deserializedRowCount);
}
private <T> void assertStatisticsKindsEquals(StatisticsHolder<T> expected, StatisticsHolder<?> actual) {
assertEquals("isExact statistics kind was incorrectly deserialized",
expected.getStatisticsKind().isExact(),
actual.getStatisticsKind().isExact());
assertEquals("getName statistics kind was incorrectly deserialized",
expected.getStatisticsKind().getName(),
actual.getStatisticsKind().getName());
}
}