| 106 | } |
| 107 | |
| 108 | void CheckFileWithSargs(const char* fileName, const char* softwareVersion) { |
| 109 | std::stringstream ss; |
| 110 | if (const char* example_dir = std::getenv("ORC_EXAMPLE_DIR")) { |
| 111 | ss << example_dir; |
| 112 | } else { |
| 113 | ss << "../../../examples"; |
| 114 | } |
| 115 | // Read a file with bloom filters written by CPP writer in version 1.6.11. |
| 116 | ss << "/" << fileName; |
| 117 | ReaderOptions readerOpts; |
| 118 | readerOpts.setReaderMetrics(nullptr); |
| 119 | std::unique_ptr<Reader> reader = |
| 120 | createReader(readLocalFile(ss.str().c_str(), readerOpts.getReaderMetrics()), readerOpts); |
| 121 | EXPECT_EQ(WriterId::ORC_CPP_WRITER, reader->getWriterId()); |
| 122 | EXPECT_EQ(softwareVersion, reader->getSoftwareVersion()); |
| 123 | |
| 124 | // Create SearchArgument with a EQUALS predicate which can leverage the bloom filters. |
| 125 | RowReaderOptions rowReaderOpts; |
| 126 | std::unique_ptr<SearchArgumentBuilder> sarg = SearchArgumentFactory::newBuilder(); |
| 127 | // Integer value 18000000000 has an inconsistent hash before the fix of ORC-1024. |
| 128 | sarg->equals(1, PredicateDataType::LONG, Literal(static_cast<int64_t>(18000000000L))); |
| 129 | std::unique_ptr<SearchArgument> final_sarg = sarg->build(); |
| 130 | rowReaderOpts.searchArgument(std::move(final_sarg)); |
| 131 | std::unique_ptr<RowReader> rowReader = reader->createRowReader(rowReaderOpts); |
| 132 | |
| 133 | // Make sure bad bloom filters won't affect the results. |
| 134 | std::unique_ptr<ColumnVectorBatch> batch = rowReader->createRowBatch(1024); |
| 135 | EXPECT_TRUE(rowReader->next(*batch)); |
| 136 | EXPECT_EQ(5, batch->numElements); |
| 137 | EXPECT_FALSE(rowReader->next(*batch)); |
| 138 | } |
| 139 | |
| 140 | TEST(TestRowReader, testSkipBadBloomFilters) { |
| 141 | CheckFileWithSargs("bad_bloom_filter_1.6.11.orc", "ORC C++ 1.6.11"); |
no test coverage detected