From eb840ecca8fc2db8155d13acf62dd8507e2d32e9 Mon Sep 17 00:00:00 2001 From: wubiao Date: Wed, 25 Sep 2019 13:53:00 +0800 Subject: [PATCH] Support boolean/date/datetime/decimal types in segment V2 (#1863) --- .../olap/rowset/segment_v2/bitshuffle_page.h | 2 ++ .../olap/rowset/segment_v2/encoding_info.cpp | 22 ++++++++++++ .../segment_v2/column_reader_writer_test.cpp | 36 +++++++++++++++++++ 3 files changed, 60 insertions(+) diff --git a/be/src/olap/rowset/segment_v2/bitshuffle_page.h b/be/src/olap/rowset/segment_v2/bitshuffle_page.h index 21d8066f503c96..6a9bd1ae98fbcc 100644 --- a/be/src/olap/rowset/segment_v2/bitshuffle_page.h +++ b/be/src/olap/rowset/segment_v2/bitshuffle_page.h @@ -232,8 +232,10 @@ class BitShufflePageDecoder : public PageDecoder { switch (_size_of_element) { case 1: case 2: + case 3: case 4: case 8: + case 12: case 16: break; default: diff --git a/be/src/olap/rowset/segment_v2/encoding_info.cpp b/be/src/olap/rowset/segment_v2/encoding_info.cpp index 7486b8f56a58ef..3cfb71525cd417 100644 --- a/be/src/olap/rowset/segment_v2/encoding_info.cpp +++ b/be/src/olap/rowset/segment_v2/encoding_info.cpp @@ -19,6 +19,7 @@ #include "olap/olap_common.h" #include "olap/rowset/segment_v2/bitshuffle_page.h" +#include "olap/rowset/segment_v2/rle_page.h" namespace doris { namespace segment_v2 { @@ -54,6 +55,18 @@ struct TypeEncodingTraits { } }; +template +struct TypeEncodingTraits { + static Status create_page_builder(const PageBuilderOptions& opts, PageBuilder** builder) { + *builder = new RlePageBuilder(opts); + return Status::OK(); + } + static Status create_page_decoder(const Slice& data, const PageDecoderOptions& opts, PageDecoder** decoder) { + *decoder = new RlePageDecoder(data, opts); + return Status::OK(); + } +}; + template struct EncodingTraits : TypeEncodingTraits { static const FieldType type = Type; @@ -109,6 +122,15 @@ EncodingInfoResolver::EncodingInfoResolver() { _add_map(); _add_map(); _add_map(); + _add_map(); + _add_map(); + _add_map(); + _add_map(); + _add_map(); + _add_map(); + _add_map(); + _add_map(); + _add_map(); } EncodingInfoResolver::~EncodingInfoResolver() { diff --git a/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp b/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp index cfdc90500b2660..79e82df2462e17 100644 --- a/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp +++ b/be/test/olap/rowset/segment_v2/column_reader_writer_test.cpp @@ -17,6 +17,7 @@ #include "olap/rowset/segment_v2/column_reader.h" #include "olap/rowset/segment_v2/column_writer.h" +#include "olap/decimal12.h" #include #include @@ -201,6 +202,41 @@ TEST_F(ColumnReaderWriterTest, test_nullable) { delete[] double_vals; } +TEST_F(ColumnReaderWriterTest, test_types) { + size_t num_uint8_rows = 1024 * 1024; + uint8_t* is_null = new uint8_t[num_uint8_rows]; + + bool* bool_vals = new bool[num_uint8_rows]; + uint24_t* date_vals = new uint24_t[num_uint8_rows]; + uint64_t* datetime_vals = new uint64_t[num_uint8_rows]; + decimal12_t* decimal_vals = new decimal12_t[num_uint8_rows]; + for (int i = 0; i < num_uint8_rows; ++i) { + bool_vals[i] = i % 2; + date_vals[i] = i + 33; + datetime_vals[i] = i + 33; + decimal_vals[i] = decimal12_t(i, i); // 1.000000001 + BitmapChange(is_null, i, (i % 4) == 0); + } + test_nullable_data((uint8_t*)bool_vals, is_null, num_uint8_rows, "null_bool_bs"); + test_nullable_data((uint8_t*)date_vals, is_null, num_uint8_rows / 3, "null_date_bs"); + + for (int i = 0; i < num_uint8_rows; ++i) { + BitmapChange(is_null, i, (i % 16) == 0); + } + test_nullable_data((uint8_t*)datetime_vals, is_null, num_uint8_rows / 8, "null_datetime_bs"); + + for (int i = 0; i< num_uint8_rows; ++i) { + BitmapChange(is_null, i, (i % 24) == 0); + } + test_nullable_data((uint8_t*)decimal_vals, is_null, num_uint8_rows / 12, "null_decimal_bs"); + + delete[] is_null; + delete[] bool_vals; + delete[] date_vals; + delete[] datetime_vals; + delete[] decimal_vals; +} + } }