blob: 53e780143a3f5ea7b9b765ac7e973f8320eaa6fd [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 <memory>
#include "paimon/memory/bytes.h"
#include "paimon/predicate/literal.h"
#include "paimon/result.h"
namespace paimon {
class Dictionary {
public:
virtual ~Dictionary() = default;
/// Finds the code for a given key using two-phase binary search.
///
/// Firstly do a binary search on chunk representative key
/// If found, return, otherwise, do a binary search inside the chunk
///
/// @param key The key to search for
/// @return Code (>= 0) if found, or -(insertion_point + 1) if not found.
virtual Result<int32_t> Find(const Literal& key) = 0;
/// Finds the key for a given code using two-phase binary search.
///
/// Firstly do a binary search on chunk representative code
/// If found, return, otherwise, do a binary search inside the chunk
///
/// @param code The key to search for, must be valid
/// @return Key literal corresponding to the code
virtual Result<Literal> Find(int32_t code) = 0;
class Appender {
public:
virtual ~Appender() = default;
/// Appends a (key, code) pair to the dictionary in sorted order.
///
/// This method enforces strict ordering constraints:
/// - Keys must be in strictly ascending order (each key > previous key)
/// - Codes must be incrementing integers with a step of one
/// - Keys cannot be null
///
/// The method automatically manages chunk creation and splitting:
/// - Creates a new chunk if none exists, first key of the chunk will be put in chunk header
/// - If current chunk is full or the size limit cannot fit a single key, flushes it and
/// remove the chunk
///
/// @param key The key to append, must not be null and must be > previous key
/// @param code The code to associate with the key, must be previous code + 1
/// @return Status::OK() if successful, or Status::Invalid() if constraints are violated
virtual Status AppendSorted(const Literal& key, int32_t code) = 0;
virtual Result<PAIMON_UNIQUE_PTR<Bytes>> Serialize() = 0;
};
};
} // namespace paimon