// Licensed to the LF AI & Data foundation 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 #include #include "common/FieldData.h" namespace milvus { /** * @brief base class for different type vector * @todo implement full null value support */ class BaseVector { public: BaseVector(DataType data_type, size_t length, std::optional null_count = std::nullopt) : type_kind_(data_type), length_(length), null_count_(null_count) { } virtual ~BaseVector() = default; int64_t size() { return length_; } DataType type() { return type_kind_; } protected: DataType type_kind_; size_t length_; std::optional null_count_; }; using VectorPtr = std::shared_ptr; /** * @brief Single vector for scalar types * @todo using memory pool && buffer replace FieldData */ class ColumnVector final : public BaseVector { public: ColumnVector(DataType data_type, size_t length, std::optional null_count = std::nullopt) : BaseVector(data_type, length, null_count) { values_ = InitScalarFieldData(data_type, length); } // ColumnVector(FixedVector&& data) // : BaseVector(DataType::BOOL, data.size()) { // values_ = // std::make_shared>(DataType::BOOL, std::move(data)); // } // the size is the number of bits ColumnVector(TargetBitmap&& bitmap) : BaseVector(DataType::INT8, bitmap.size()) { values_ = std::make_shared>( bitmap.size(), DataType::INT8, std::move(bitmap).into()); } virtual ~ColumnVector() override { values_.reset(); } void* GetRawData() { return values_->Data(); } template const As* RawAsValues() const { return reinterpret_cast(values_->Data()); } private: FieldDataPtr values_; }; using ColumnVectorPtr = std::shared_ptr; /** * @brief Multi vectors for scalar types * mainly using it to pass internal result in segcore scalar engine system */ class RowVector : public BaseVector { public: RowVector(std::vector& data_types, size_t length, std::optional null_count = std::nullopt) : BaseVector(DataType::ROW, length, null_count) { for (auto& type : data_types) { children_values_.emplace_back( std::make_shared(type, length)); } } RowVector(const std::vector& children) : BaseVector(DataType::ROW, 0) { for (auto& child : children) { children_values_.push_back(child); if (child->size() > length_) { length_ = child->size(); } } } const std::vector& childrens() { return children_values_; } VectorPtr child(int index) { assert(index < children_values_.size()); return children_values_[index]; } private: std::vector children_values_; }; using RowVectorPtr = std::shared_ptr; } // namespace milvus