blob: f88afc05271a102798f6acb21209ab7befefde58 [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 "olap/key_coder.h"
#include <cstddef>
#include <unordered_map>
#include <utility>
namespace doris {
template <typename TraitsType>
KeyCoder::KeyCoder(TraitsType traits)
: _full_encode_ascending(traits.full_encode_ascending),
_encode_ascending(traits.encode_ascending),
_decode_ascending(traits.decode_ascending) {}
struct EnumClassHash {
template <typename T>
std::size_t operator()(T t) const {
return static_cast<std::size_t>(t);
}
};
// Helper class used to get KeyCoder
class KeyCoderResolver {
public:
~KeyCoderResolver() {
for (auto& iter : _coder_map) {
delete iter.second;
}
}
static KeyCoderResolver* instance() {
static KeyCoderResolver s_instance;
return &s_instance;
}
KeyCoder* get_coder(FieldType field_type) const {
auto it = _coder_map.find(field_type);
if (it != _coder_map.end()) {
return it->second;
}
return nullptr;
}
private:
KeyCoderResolver() {
add_mapping<FieldType::OLAP_FIELD_TYPE_TINYINT>();
add_mapping<FieldType::OLAP_FIELD_TYPE_SMALLINT>();
add_mapping<FieldType::OLAP_FIELD_TYPE_INT>();
add_mapping<FieldType::OLAP_FIELD_TYPE_UNSIGNED_INT>();
add_mapping<FieldType::OLAP_FIELD_TYPE_BIGINT>();
add_mapping<FieldType::OLAP_FIELD_TYPE_UNSIGNED_BIGINT>();
add_mapping<FieldType::OLAP_FIELD_TYPE_LARGEINT>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DATETIME>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DATE>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DECIMAL>();
add_mapping<FieldType::OLAP_FIELD_TYPE_CHAR>();
add_mapping<FieldType::OLAP_FIELD_TYPE_VARCHAR>();
add_mapping<FieldType::OLAP_FIELD_TYPE_STRING>();
add_mapping<FieldType::OLAP_FIELD_TYPE_BOOL>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DATEV2>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DATETIMEV2>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DECIMAL32>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DECIMAL64>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DECIMAL128I>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DECIMAL256>();
add_mapping<FieldType::OLAP_FIELD_TYPE_IPV4>();
add_mapping<FieldType::OLAP_FIELD_TYPE_IPV6>();
add_mapping<FieldType::OLAP_FIELD_TYPE_FLOAT>();
add_mapping<FieldType::OLAP_FIELD_TYPE_DOUBLE>();
}
template <FieldType field_type>
void add_mapping() {
_coder_map.emplace(field_type, new KeyCoder(KeyCoderTraits<field_type>()));
}
std::unordered_map<FieldType, KeyCoder*, EnumClassHash> _coder_map;
};
const KeyCoder* get_key_coder(FieldType type) {
return KeyCoderResolver::instance()->get_coder(type);
}
} // namespace doris