blob: 21261b3cb017a36a407f46111000cbf644b49807 [file]
/*
* 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.
*/
#pragma once
#include <map>
#include <memory>
#include <vector>
#include "paimon/common/file_index/rangebitmap/bit_slice_index_bitmap.h"
#include "paimon/common/file_index/rangebitmap/dictionary/dictionary.h"
#include "paimon/common/file_index/rangebitmap/dictionary/key_factory.h"
#include "paimon/fs/file_system.h"
#include "paimon/predicate/literal.h"
#include "paimon/result.h"
#include "paimon/utils/roaring_bitmap32.h"
namespace paimon {
class InputStream;
class MemoryPool;
class RangeBitmap {
public:
static Result<std::unique_ptr<RangeBitmap>> Create(
const std::shared_ptr<InputStream>& input_stream, int64_t offset, FieldType field_type,
const std::shared_ptr<MemoryPool>& pool);
Result<RoaringBitmap32> Eq(const Literal& key);
Result<RoaringBitmap32> Neq(const Literal& key);
Result<RoaringBitmap32> Lt(const Literal& key);
Result<RoaringBitmap32> Lte(const Literal& key);
Result<RoaringBitmap32> Gt(const Literal& key);
Result<RoaringBitmap32> Gte(const Literal& key);
Result<RoaringBitmap32> In(const std::vector<Literal>& keys);
Result<RoaringBitmap32> NotIn(const std::vector<Literal>& keys);
Result<RoaringBitmap32> IsNull();
Result<RoaringBitmap32> IsNotNull();
public:
static constexpr int8_t kCurrentVersion = 1;
private:
Status Not(RoaringBitmap32* out);
RangeBitmap(int32_t rid, int32_t cardinality, int32_t dictionary_offset, int32_t bsi_offset,
const Literal& min, const Literal& max,
const std::shared_ptr<KeyFactory>& key_factory,
const std::shared_ptr<InputStream>& input_stream,
const std::shared_ptr<MemoryPool>& pool);
Result<BitSliceIndexBitmap*> GetBitSliceIndex();
Result<Dictionary*> GetDictionary();
private:
std::shared_ptr<MemoryPool> pool_;
int32_t rid_;
int32_t cardinality_;
int32_t bsi_offset_;
int32_t dictionary_offset_;
Literal min_;
Literal max_;
std::shared_ptr<KeyFactory> key_factory_;
std::shared_ptr<InputStream> input_stream_;
// For lazy loading
std::unique_ptr<BitSliceIndexBitmap> bsi_;
std::unique_ptr<Dictionary> dictionary_;
public:
class Appender {
public:
static Result<std::unique_ptr<Appender>> Create(const std::shared_ptr<KeyFactory>& factory,
int64_t limited_serialized_size_in_bytes,
const std::shared_ptr<MemoryPool>& pool);
void Append(const Literal& key);
Result<PAIMON_UNIQUE_PTR<Bytes>> Serialize() const;
private:
Appender(const std::shared_ptr<KeyFactory>& factory,
int64_t limited_serialized_size_in_bytes, const std::shared_ptr<MemoryPool>& pool);
struct LiteralComparator {
std::shared_ptr<KeyFactory> factory;
explicit LiteralComparator(std::shared_ptr<KeyFactory> f) : factory(std::move(f)) {}
bool operator()(const Literal& lhs, const Literal& rhs) const {
const auto result = factory->CompareLiteral(lhs, rhs);
return result.ok() && result.value() < 0;
}
};
std::shared_ptr<MemoryPool> pool_;
int32_t rid_;
std::map<Literal, RoaringBitmap32, LiteralComparator> bitmaps_;
std::shared_ptr<KeyFactory> factory_;
int64_t chunk_size_bytes_limit_;
};
};
} // namespace paimon