blob: 1c0fef1c594850967d9f52231ea2e9ec131599ef [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.
#pragma once
#include <memory>
#include "arrow/status.h"
#include "arrow/util/logging.h"
#include "gandiva/arrow.h"
#include "gandiva/visibility.h"
namespace gandiva {
/// \brief Selection Vector : vector of indices in a row-batch for a selection,
/// backed by an arrow-array.
class GANDIVA_EXPORT SelectionVector {
public:
virtual ~SelectionVector() = default;
enum Mode : int {
MODE_NONE,
MODE_UINT16,
MODE_UINT32,
MODE_UINT64,
MODE_MAX = MODE_UINT64, // dummy
};
static constexpr int kNumModes = static_cast<int>(MODE_MAX) + 1;
static constexpr Mode kAllModes[kNumModes] = {MODE_NONE, MODE_UINT16, MODE_UINT32,
MODE_UINT64};
/// Get the value at a given index.
virtual uint64_t GetIndex(int64_t index) const = 0;
/// Set the value at a given index.
virtual void SetIndex(int64_t index, uint64_t value) = 0;
// Get the max supported value in the selection vector.
virtual uint64_t GetMaxSupportedValue() const = 0;
/// The maximum slots (capacity) of the selection vector.
virtual int64_t GetMaxSlots() const = 0;
/// The number of slots (size) of the selection vector.
virtual int64_t GetNumSlots() const = 0;
/// Set the number of slots in the selection vector.
virtual void SetNumSlots(int64_t num_slots) = 0;
/// Convert to arrow-array.
virtual ArrayPtr ToArray() const = 0;
/// Get the underlying arrow buffer.
virtual arrow::Buffer& GetBuffer() const = 0;
/// Mode of SelectionVector
virtual Mode GetMode() const = 0;
/// \brief populate selection vector for all the set bits in the bitmap.
///
/// \param[in] bitmap the bitmap
/// \param[in] bitmap_size size of the bitmap in bytes
/// \param[in] max_bitmap_index max valid index in bitmap (can be lesser than
/// capacity in the bitmap, due to alignment/padding).
Status PopulateFromBitMap(const uint8_t* bitmap, int64_t bitmap_size,
int64_t max_bitmap_index);
/// \brief make selection vector with int16 type records.
///
/// \param[in] max_slots max number of slots
/// \param[in] buffer buffer sized to accommodate max_slots
/// \param[out] selection_vector selection vector backed by 'buffer'
static Status MakeInt16(int64_t max_slots, std::shared_ptr<arrow::Buffer> buffer,
std::shared_ptr<SelectionVector>* selection_vector);
/// \param[in] max_slots max number of slots
/// \param[in] pool memory pool to allocate buffer
/// \param[out] selection_vector selection vector backed by a buffer allocated from the
/// pool.
static Status MakeInt16(int64_t max_slots, arrow::MemoryPool* pool,
std::shared_ptr<SelectionVector>* selection_vector);
/// \brief creates a selection vector with pre populated buffer.
///
/// \param[in] num_slots size of the selection vector
/// \param[in] buffer pre-populated buffer
/// \param[out] selection_vector selection vector backed by 'buffer'
static Status MakeImmutableInt16(int64_t num_slots,
std::shared_ptr<arrow::Buffer> buffer,
std::shared_ptr<SelectionVector>* selection_vector);
/// \brief make selection vector with int32 type records.
///
/// \param[in] max_slots max number of slots
/// \param[in] buffer buffer sized to accommodate max_slots
/// \param[out] selection_vector selection vector backed by 'buffer'
static Status MakeInt32(int64_t max_slots, std::shared_ptr<arrow::Buffer> buffer,
std::shared_ptr<SelectionVector>* selection_vector);
/// \brief make selection vector with int32 type records.
///
/// \param[in] max_slots max number of slots
/// \param[in] pool memory pool to allocate buffer
/// \param[out] selection_vector selection vector backed by a buffer allocated from the
/// pool.
static Status MakeInt32(int64_t max_slots, arrow::MemoryPool* pool,
std::shared_ptr<SelectionVector>* selection_vector);
/// \brief creates a selection vector with pre populated buffer.
///
/// \param[in] num_slots size of the selection vector
/// \param[in] buffer pre-populated buffer
/// \param[out] selection_vector selection vector backed by 'buffer'
static Status MakeImmutableInt32(int64_t num_slots,
std::shared_ptr<arrow::Buffer> buffer,
std::shared_ptr<SelectionVector>* selection_vector);
/// \brief make selection vector with int64 type records.
///
/// \param[in] max_slots max number of slots
/// \param[in] buffer buffer sized to accommodate max_slots
/// \param[out] selection_vector selection vector backed by 'buffer'
static Status MakeInt64(int64_t max_slots, std::shared_ptr<arrow::Buffer> buffer,
std::shared_ptr<SelectionVector>* selection_vector);
/// \brief make selection vector with int64 type records.
///
/// \param[in] max_slots max number of slots
/// \param[in] pool memory pool to allocate buffer
/// \param[out] selection_vector selection vector backed by a buffer allocated from the
/// pool.
static Status MakeInt64(int64_t max_slots, arrow::MemoryPool* pool,
std::shared_ptr<SelectionVector>* selection_vector);
};
} // namespace gandiva