#pragma once
#include <array>
#include <vector>
#include "common/arrow/arrow.h"
#include "common/arrow/arrow_buffer.h"
#include "common/types/types.h"
struct ArrowSchema;
namespace lbug {
namespace processor {
class FlatTuple;
}
namespace common {
class Value;
static inline uint64_t getNumBytesForBits(uint64_t numBits) {
return (numBits + 7) / 8;
}
struct ArrowVector {
ArrowBuffer data;
ArrowBuffer validity;
ArrowBuffer overflow;
int64_t numValues = 0;
int64_t capacity = 0;
int64_t numNulls = 0;
std::vector<std::unique_ptr<ArrowVector>> childData;
std::unique_ptr<ArrowArray> array;
std::array<const void*, 3> buffers = {{nullptr, nullptr, nullptr}};
std::vector<ArrowArray*> childPointers;
};
class ArrowRowBatch {
public:
ArrowRowBatch(const std::vector<LogicalType>& types, std::int64_t capacity,
bool fallbackExtensionTypes);
void append(const processor::FlatTuple& tuple);
std::int64_t size() const { return numTuples; }
ArrowArray toArray(const std::vector<LogicalType>& types);
private:
static void appendValue(ArrowVector* vector, const Value& value, bool fallbackExtensionTypes);
static ArrowArray* convertVectorToArray(ArrowVector& vector, const LogicalType& type,
bool fallbackExtensionTypes);
static ArrowArray* convertStructVectorToArray(ArrowVector& vector, const LogicalType& type,
bool fallbackExtensionTypes);
static ArrowArray* convertInternalIDVectorToArray(ArrowVector& vector, const LogicalType& type,
bool fallbackExtensionTypes);
static void copyNonNullValue(ArrowVector* vector, const Value& value, std::int64_t pos,
bool fallbackExtensionTypes);
static void copyNullValue(ArrowVector* vector, const Value& value, std::int64_t pos);
template<LogicalTypeID DT>
static void templateCopyNonNullValue(ArrowVector* vector, const Value& value, std::int64_t pos,
bool fallbackExtensionTypes);
template<LogicalTypeID DT>
static void templateCopyNullValue(ArrowVector* vector, std::int64_t pos);
static void copyNullValueUnion(ArrowVector* vector, const Value& value, std::int64_t pos);
template<LogicalTypeID DT>
static ArrowArray* templateCreateArray(ArrowVector& vector, const LogicalType& type,
bool fallbackExtensionTypes);
private:
std::vector<std::unique_ptr<ArrowVector>> vectors;
std::int64_t numTuples;
bool fallbackExtensionTypes = false;
};
} }