blob: 51f1ed38eb0e7a7e106f59fdd44e097f8b047911 [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.
*/
#include <errno.h>
#include <stdlib.h>
#include "dbcommon/log/exception.h"
#include "dbcommon/log/logger.h"
#include "gtest/gtest.h"
#include "storage/format/orc/orc-proto-definition.h"
#include "storage/format/orc/type-impl.h"
#include "storage/format/orc/vector.h"
#include "storage/testutil/file-utils.h"
namespace orc {
TEST(TESTOrcProtoDefinition, TestColumnStatistics) {
proto::ColumnStatistics stats;
ColumnStatisticsImpl cs(stats);
EXPECT_EQ(cs.getNumberOfValues(), stats.numberofvalues());
}
TEST(TESTOrcProtoDefinition, TestBinaryColumnStatistics) {
proto::ColumnStatistics stats;
BinaryColumnStatisticsImpl bcs(stats, true);
EXPECT_EQ(bcs.getNumberOfValues(), stats.numberofvalues());
EXPECT_THROW(bcs.getTotalLength(), dbcommon::TransactionAbortException);
EXPECT_EQ(bcs.hasTotalLength(), false);
proto::ColumnStatistics stats1;
BinaryColumnStatisticsImpl bcs1(stats1, false);
EXPECT_EQ(bcs1.getNumberOfValues(), stats1.numberofvalues());
EXPECT_THROW(bcs.getTotalLength(), dbcommon::TransactionAbortException);
EXPECT_EQ(bcs1.hasTotalLength(), false);
proto::ColumnStatistics stats2;
stats2.mutable_binarystatistics()->set_sum(1000);
BinaryColumnStatisticsImpl bcs2(stats2, true);
EXPECT_EQ(bcs2.getNumberOfValues(), stats2.numberofvalues());
EXPECT_EQ(bcs2.getTotalLength(), 1000);
EXPECT_EQ(bcs2.hasTotalLength(), true);
proto::ColumnStatistics stats3;
stats3.mutable_binarystatistics()->set_sum(2000);
BinaryColumnStatisticsImpl bcs3(stats3, false);
EXPECT_EQ(bcs3.getNumberOfValues(), stats3.numberofvalues());
EXPECT_THROW(bcs3.getTotalLength(), dbcommon::TransactionAbortException);
EXPECT_EQ(bcs3.hasTotalLength(), false);
}
TEST(TESTOrcProtoDefinition, TestBoolearColumnStatistics) {
proto::ColumnStatistics stats;
BooleanColumnStatisticsImpl bcs(stats, true);
EXPECT_EQ(bcs.getNumberOfValues(), stats.numberofvalues());
EXPECT_THROW(bcs.getFalseCount(), dbcommon::TransactionAbortException);
EXPECT_THROW(bcs.getTrueCount(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats1;
BooleanColumnStatisticsImpl bcs1(stats1, false);
EXPECT_EQ(bcs1.getNumberOfValues(), stats1.numberofvalues());
EXPECT_THROW(bcs1.getFalseCount(), dbcommon::TransactionAbortException);
EXPECT_THROW(bcs1.getTrueCount(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats2;
stats2.mutable_bucketstatistics()->add_count(1000);
BooleanColumnStatisticsImpl bcs2(stats2, true);
EXPECT_EQ(bcs2.getNumberOfValues(), stats2.numberofvalues());
EXPECT_EQ(bcs2.getFalseCount(),
bcs2.getNumberOfValues() - bcs2.getTrueCount());
EXPECT_EQ(bcs2.getTrueCount(), 1000);
EXPECT_EQ(bcs2.hasCount(), true);
proto::ColumnStatistics stats3;
stats3.mutable_bucketstatistics()->add_count(2000);
BooleanColumnStatisticsImpl bcs3(stats3, false);
EXPECT_EQ(bcs3.getNumberOfValues(), stats3.numberofvalues());
EXPECT_THROW(bcs3.getFalseCount(), dbcommon::TransactionAbortException);
EXPECT_THROW(bcs3.getTrueCount(), dbcommon::TransactionAbortException);
}
TEST(TESTOrcProtoDefinition, TestDateColumnStatistics) {
proto::ColumnStatistics stats;
DateColumnStatisticsImpl dcs(stats, true);
EXPECT_EQ(dcs.getNumberOfValues(), stats.numberofvalues());
EXPECT_THROW(dcs.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs.getMinimum(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats1;
DateColumnStatisticsImpl dcs1(stats1, false);
EXPECT_EQ(dcs1.getNumberOfValues(), stats1.numberofvalues());
EXPECT_THROW(dcs1.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs1.getMinimum(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats2;
stats2.mutable_datestatistics()->set_maximum(10000);
stats2.mutable_datestatistics()->set_minimum(1);
DateColumnStatisticsImpl dcs2(stats2, true);
EXPECT_EQ(dcs2.getNumberOfValues(), stats2.numberofvalues());
EXPECT_EQ(dcs2.getMaximum(), 10000);
EXPECT_EQ(dcs2.getMinimum(), 1);
EXPECT_EQ(dcs2.hasMaximum(), true);
EXPECT_EQ(dcs2.hasMinimum(), true);
proto::ColumnStatistics stats3;
stats3.mutable_datestatistics()->set_maximum(20000);
stats3.mutable_datestatistics()->set_minimum(2);
DateColumnStatisticsImpl dcs3(stats3, false);
EXPECT_EQ(dcs3.getNumberOfValues(), stats3.numberofvalues());
EXPECT_THROW(dcs3.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs3.getMinimum(), dbcommon::TransactionAbortException);
}
TEST(TESTOrcProtoDefinition, DecimalColumnStatisticsImpl) {
proto::ColumnStatistics stats;
DecimalColumnStatisticsImpl dcs(stats, true);
EXPECT_EQ(dcs.getNumberOfValues(), stats.numberofvalues());
EXPECT_THROW(dcs.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs.getMinimum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs.getSum(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats1;
DecimalColumnStatisticsImpl dcs1(stats1, false);
EXPECT_EQ(dcs1.getNumberOfValues(), stats1.numberofvalues());
EXPECT_THROW(dcs1.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs1.getMinimum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs1.getSum(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats2;
stats2.mutable_decimalstatistics()->set_maximum("1000.0");
stats2.mutable_decimalstatistics()->set_minimum("1.0");
stats2.mutable_decimalstatistics()->set_sum("1000000.0");
DecimalColumnStatisticsImpl dcs2(stats2, true);
EXPECT_EQ(dcs2.getNumberOfValues(), stats2.numberofvalues());
EXPECT_EQ(dcs2.getMaximum().toString(), "1000.0");
EXPECT_EQ(dcs2.getMinimum().toString(), "1.0");
EXPECT_EQ(dcs2.getSum().toString(), "1000000.0");
EXPECT_EQ(dcs2.hasMaximum(), true);
EXPECT_EQ(dcs2.hasMinimum(), true);
EXPECT_EQ(dcs2.hasSum(), true);
proto::ColumnStatistics stats3;
stats3.mutable_decimalstatistics()->set_maximum("1000.0");
stats3.mutable_decimalstatistics()->set_minimum("1.0");
stats3.mutable_decimalstatistics()->set_sum("1000000.0");
DecimalColumnStatisticsImpl dcs3(stats3, false);
EXPECT_EQ(dcs3.getNumberOfValues(), stats3.numberofvalues());
EXPECT_THROW(dcs3.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs3.getMinimum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs3.getSum(), dbcommon::TransactionAbortException);
}
TEST(TESTOrcProtoDefinition, TestDecimal) {
Decimal d("1000.0");
std::string s = d.toString();
EXPECT_EQ(s, "1000.0");
}
TEST(TESTOrcProtoDefinition, DoubleColumnStatisticsImpl) {
proto::ColumnStatistics stats;
DoubleColumnStatisticsImpl dcs(stats);
EXPECT_EQ(dcs.getNumberOfValues(), stats.numberofvalues());
EXPECT_THROW(dcs.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs.getMinimum(), dbcommon::TransactionAbortException);
EXPECT_THROW(dcs.getSum(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats2;
stats2.mutable_doublestatistics()->set_maximum(1000.0);
stats2.mutable_doublestatistics()->set_minimum(1.0);
stats2.mutable_doublestatistics()->set_sum(1000000.0);
DoubleColumnStatisticsImpl dcs2(stats2);
EXPECT_EQ(dcs2.getNumberOfValues(), stats2.numberofvalues());
EXPECT_EQ(dcs2.getMaximum(), 1000.0);
EXPECT_EQ(dcs2.getMinimum(), 1.0);
EXPECT_EQ(dcs2.getSum(), 1000000.0);
EXPECT_EQ(dcs2.hasMaximum(), true);
EXPECT_EQ(dcs2.hasMinimum(), true);
EXPECT_EQ(dcs2.hasSum(), true);
}
TEST(TESTOrcProtoDefinition, IntegerColumnStatisticsImpl) {
proto::ColumnStatistics stats;
IntegerColumnStatisticsImpl ics(stats);
EXPECT_EQ(ics.getNumberOfValues(), stats.numberofvalues());
EXPECT_THROW(ics.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(ics.getMinimum(), dbcommon::TransactionAbortException);
EXPECT_THROW(ics.getSum(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats2;
stats2.mutable_intstatistics()->set_maximum(1000);
stats2.mutable_intstatistics()->set_minimum(1);
stats2.mutable_intstatistics()->set_sum(1000000);
IntegerColumnStatisticsImpl ics2(stats2);
EXPECT_EQ(ics2.getNumberOfValues(), stats2.numberofvalues());
EXPECT_EQ(ics2.getMaximum(), 1000);
EXPECT_EQ(ics2.getMinimum(), 1);
EXPECT_EQ(ics2.getSum(), 1000000);
EXPECT_EQ(ics2.hasMaximum(), true);
EXPECT_EQ(ics2.hasMinimum(), true);
EXPECT_EQ(ics2.hasSum(), true);
}
TEST(TESTOrcProtoDefinition, StringColumnStatisticsImpl) {
proto::ColumnStatistics stats;
StringColumnStatisticsImpl scs(stats, true);
EXPECT_EQ(scs.getNumberOfValues(), stats.numberofvalues());
EXPECT_THROW(scs.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(scs.getMinimum(), dbcommon::TransactionAbortException);
EXPECT_THROW(scs.getTotalLength(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats1;
StringColumnStatisticsImpl scs1(stats, false);
EXPECT_EQ(scs1.getNumberOfValues(), stats1.numberofvalues());
EXPECT_THROW(scs1.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(scs1.getMinimum(), dbcommon::TransactionAbortException);
EXPECT_THROW(scs1.getTotalLength(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats2;
stats2.mutable_stringstatistics()->set_maximum("1000");
stats2.mutable_stringstatistics()->set_minimum("1");
stats2.mutable_stringstatistics()->set_sum(1000000);
StringColumnStatisticsImpl scs2(stats2, true);
EXPECT_EQ(scs2.getNumberOfValues(), stats2.numberofvalues());
EXPECT_STREQ(scs2.getMaximum(), "1000");
EXPECT_STREQ(scs2.getMinimum(), "1");
EXPECT_EQ(scs2.getTotalLength(), 1000000);
EXPECT_EQ(scs2.hasMaximum(), true);
EXPECT_EQ(scs2.hasMinimum(), true);
EXPECT_EQ(scs2.hasTotalLength(), true);
proto::ColumnStatistics stats3;
stats3.mutable_stringstatistics()->set_maximum("1000");
stats3.mutable_stringstatistics()->set_minimum("1");
stats3.mutable_stringstatistics()->set_sum(1000000);
StringColumnStatisticsImpl scs3(stats3, false);
EXPECT_EQ(scs3.getNumberOfValues(), stats3.numberofvalues());
EXPECT_THROW(scs3.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(scs3.getMinimum(), dbcommon::TransactionAbortException);
EXPECT_THROW(scs3.getTotalLength(), dbcommon::TransactionAbortException);
}
TEST(TESTOrcProtoDefinition, TimestampColumnStatisticsImpl) {
proto::ColumnStatistics stats;
TimestampColumnStatisticsImpl tcs(stats, true);
EXPECT_EQ(tcs.getNumberOfValues(), stats.numberofvalues());
EXPECT_THROW(tcs.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(tcs.getMinimum(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats1;
TimestampColumnStatisticsImpl tcs1(stats, false);
EXPECT_EQ(tcs1.getNumberOfValues(), stats1.numberofvalues());
EXPECT_THROW(tcs1.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(tcs1.getMinimum(), dbcommon::TransactionAbortException);
proto::ColumnStatistics stats2;
stats2.mutable_timestampstatistics()->set_maximum(1000);
stats2.mutable_timestampstatistics()->set_minimum(1);
TimestampColumnStatisticsImpl tcs2(stats2, true);
EXPECT_EQ(tcs2.getNumberOfValues(), stats2.numberofvalues());
EXPECT_EQ(tcs2.getMaximum(), 1000);
EXPECT_EQ(tcs2.getMinimum(), 1);
EXPECT_EQ(tcs2.hasMaximum(), true);
EXPECT_EQ(tcs2.hasMinimum(), true);
proto::ColumnStatistics stats3;
stats3.mutable_timestampstatistics()->set_maximum(1000);
stats3.mutable_timestampstatistics()->set_minimum(1);
TimestampColumnStatisticsImpl tcs3(stats3, false);
EXPECT_EQ(tcs3.getNumberOfValues(), stats3.numberofvalues());
EXPECT_THROW(tcs3.getMaximum(), dbcommon::TransactionAbortException);
EXPECT_THROW(tcs3.getMinimum(), dbcommon::TransactionAbortException);
}
TEST(TESTOrcProtoDefinition, StreamInformationImpl) {
proto::Stream stream;
stream.set_column(0);
stream.set_kind(orc::proto::Stream_Kind::Stream_Kind_DATA);
stream.set_length(100);
StreamInformationImpl si(80, stream);
EXPECT_EQ(si.getColumnId(), 0);
EXPECT_EQ(si.getKind(), StreamKind::StreamKind_DATA);
EXPECT_EQ(si.getLength(), 100);
EXPECT_EQ(si.getOffset(), 80);
}
TEST(TESTOrcProtoDefinition, StripeInformationImpl) {
InputStream *input = nullptr;
dbcommon::MemoryPool *pool = dbcommon::getDefaultPool();
StripeInformationImpl si(80, 0, 1, 2, 3, input, *pool,
CompressionKind::CompressionKind_LZ4, 88);
EXPECT_EQ(si.getOffset(), 80);
EXPECT_EQ(si.getIndexLength(), 0);
EXPECT_EQ(si.getDataLength(), 1);
EXPECT_EQ(si.getFooterLength(), 2);
EXPECT_EQ(si.getNumberOfRows(), 3);
}
TEST(TESTOrcProtoDefinition, StatisticsImpl) {
proto::StripeStatistics stripeStats;
orc::proto::ColumnStatistics *cs = stripeStats.add_colstats();
cs->set_hasnull(true);
cs->set_numberofvalues(100);
StatisticsImpl si(stripeStats, true);
EXPECT_EQ(si.getNumberOfColumns(), 1);
EXPECT_EQ(si.getColumnStatistics(0)->getNumberOfValues(), 100);
}
} // namespace orc