blob: 85dd73d33dfe291a919481fdb18952f1da55378e [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 "sargs/SargsApplier.hh"
#include "wrap/gtest-wrapper.h"
namespace orc {
TEST(TestSargsApplier, findColumnTest) {
auto type = std::unique_ptr<Type>(Type::buildTypeFromString(
"struct<a:int,c:string,e:struct<f:bigint,g:double>>"));
EXPECT_EQ(1, SargsApplier::findColumn(*type, "a"));
EXPECT_EQ(2, SargsApplier::findColumn(*type, "c"));
EXPECT_EQ(3, SargsApplier::findColumn(*type, "e"));
EXPECT_EQ(4, SargsApplier::findColumn(*type, "f"));
EXPECT_EQ(5, SargsApplier::findColumn(*type, "g"));
EXPECT_EQ(std::numeric_limits<uint64_t>::max(),
SargsApplier::findColumn(*type, "b"));
}
static proto::ColumnStatistics createIntStats(
int64_t min, int64_t max, bool hasNull = false) {
proto::ColumnStatistics statistics;
statistics.set_hasnull(hasNull);
auto intStats = statistics.mutable_intstatistics();
intStats->set_minimum(min);
intStats->set_maximum(max);
return statistics;
}
TEST(TestSargsApplier, testPickRowGroups) {
auto type = std::unique_ptr<Type>(
Type::buildTypeFromString("struct<x:int,y:int>"));
auto sarg = SearchArgumentFactory::newBuilder()
->startAnd()
.equals(
"x",
PredicateDataType::LONG,
Literal(static_cast<int64_t>(100)))
.equals(
"y",
PredicateDataType::LONG,
Literal(static_cast<int64_t>(10)))
.end()
.build();
// prepare row group column statistics
std::unordered_map<uint64_t, proto::RowIndex> rowIndexes;
// col 1
proto::RowIndex rowIndex1;
*rowIndex1.mutable_entry()->Add()->mutable_statistics() =
createIntStats(0L, 10L);
*rowIndex1.mutable_entry()->Add()->mutable_statistics() =
createIntStats(100L, 200L);
*rowIndex1.mutable_entry()->Add()->mutable_statistics() =
createIntStats(300L, 500L);
*rowIndex1.mutable_entry()->Add()->mutable_statistics() =
createIntStats(100L, 100L);
rowIndexes[1] = rowIndex1;
// col 2
proto::RowIndex rowIndex2;
*rowIndex2.mutable_entry()->Add()->mutable_statistics() =
createIntStats(0L, 9L);
*rowIndex2.mutable_entry()->Add()->mutable_statistics() =
createIntStats(11L, 20L);
*rowIndex2.mutable_entry()->Add()->mutable_statistics() =
createIntStats(10L, 10L);
*rowIndex2.mutable_entry()->Add()->mutable_statistics() =
createIntStats(0L, 100LL);
rowIndexes[2] = rowIndex2;
// evaluate row group index
SargsApplier applier(*type, sarg.get(), 1000, WriterVersion_ORC_135);
EXPECT_TRUE(applier.pickRowGroups(4000, rowIndexes, {}));
std::vector<bool> rowgroups = applier.getRowGroups();
EXPECT_EQ(4, rowgroups.size());
EXPECT_EQ(false, rowgroups[0]);
EXPECT_EQ(false, rowgroups[1]);
EXPECT_EQ(false, rowgroups[2]);
EXPECT_EQ(true, rowgroups[3]);
}
} // namespace orc