// Copyright (C) 2019-2020 Zilliz. All rights reserved. // // Licensed 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 #include #ifdef __linux__ #include #endif #include "exceptions/EasyAssert.h" #include "knowhere/index/vector_index/adapter/VectorAdapter.h" #include "indexbuilder/VecIndexCreator.h" #include "indexbuilder/index_c.h" #include "indexbuilder/IndexFactory.h" #include "common/type_c.h" #include "storage/Types.h" CStatus CreateIndex(enum CDataType dtype, const char* serialized_type_params, const char* serialized_index_params, CIndex* res_index, CStorageConfig c_storage_config) { auto status = CStatus(); try { AssertInfo(res_index, "failed to create index, passed index was null"); std::string address(c_storage_config.address); std::string bucket_name(c_storage_config.bucket_name); std::string access_key(c_storage_config.access_key_id); std::string access_value(c_storage_config.access_key_value); std::string remote_root_path(c_storage_config.remote_root_path); std::string storage_type(c_storage_config.storage_type); std::string iam_endpoint(c_storage_config.iam_endpoint); auto storage_config = milvus::storage::StorageConfig{address, bucket_name, access_key, access_value, remote_root_path, storage_type, iam_endpoint, c_storage_config.useSSL, c_storage_config.useIAM}; auto index = milvus::indexbuilder::IndexFactory::GetInstance().CreateIndex( dtype, serialized_type_params, serialized_index_params, storage_config); *res_index = index.release(); status.error_code = Success; status.error_msg = ""; } catch (std::exception& e) { status.error_code = UnexpectedError; status.error_msg = strdup(e.what()); } return status; } CStatus DeleteIndex(CIndex index) { auto status = CStatus(); try { AssertInfo(index, "failed to delete index, passed index was null"); auto cIndex = reinterpret_cast(index); delete cIndex; status.error_code = Success; status.error_msg = ""; } catch (std::exception& e) { status.error_code = UnexpectedError; status.error_msg = strdup(e.what()); } return status; } CStatus BuildFloatVecIndex(CIndex index, int64_t float_value_num, const float* vectors) { auto status = CStatus(); try { AssertInfo(index, "failed to build float vector index, passed index was null"); auto real_index = reinterpret_cast(index); auto cIndex = dynamic_cast(real_index); auto dim = cIndex->dim(); auto row_nums = float_value_num / dim; auto ds = knowhere::GenDataset(row_nums, dim, vectors); cIndex->Build(ds); status.error_code = Success; status.error_msg = ""; } catch (std::exception& e) { status.error_code = UnexpectedError; status.error_msg = strdup(e.what()); } return status; } CStatus BuildBinaryVecIndex(CIndex index, int64_t data_size, const uint8_t* vectors) { auto status = CStatus(); try { AssertInfo(index, "failed to build binary vector index, passed index was null"); auto real_index = reinterpret_cast(index); auto cIndex = dynamic_cast(real_index); auto dim = cIndex->dim(); auto row_nums = (data_size * 8) / dim; auto ds = knowhere::GenDataset(row_nums, dim, vectors); cIndex->Build(ds); status.error_code = Success; status.error_msg = ""; } catch (std::exception& e) { status.error_code = UnexpectedError; status.error_msg = strdup(e.what()); } return status; } // field_data: // 1, serialized proto::schema::BoolArray, if type is bool; // 2, serialized proto::schema::StringArray, if type is string; // 3, raw pointer, if type is of fundamental except bool type; // TODO: optimize here if necessary. CStatus BuildScalarIndex(CIndex c_index, int64_t size, const void* field_data) { auto status = CStatus(); try { AssertInfo(c_index, "failed to build scalar index, passed index was null"); auto real_index = reinterpret_cast(c_index); const int64_t dim = 8; // not important here auto dataset = knowhere::GenDataset(size, dim, field_data); real_index->Build(dataset); status.error_code = Success; status.error_msg = ""; } catch (std::exception& e) { status.error_code = UnexpectedError; status.error_msg = strdup(e.what()); } return status; } CStatus SerializeIndexToBinarySet(CIndex index, CBinarySet* c_binary_set) { auto status = CStatus(); try { AssertInfo(index, "failed to serialize index to binary set, passed index was null"); auto real_index = reinterpret_cast(index); auto binary = std::make_unique(real_index->Serialize()); *c_binary_set = binary.release(); status.error_code = Success; status.error_msg = ""; } catch (std::exception& e) { status.error_code = UnexpectedError; status.error_msg = strdup(e.what()); } return status; } CStatus LoadIndexFromBinarySet(CIndex index, CBinarySet c_binary_set) { auto status = CStatus(); try { AssertInfo(index, "failed to load index from binary set, passed index was null"); auto real_index = reinterpret_cast(index); auto binary_set = reinterpret_cast(c_binary_set); real_index->Load(*binary_set); status.error_code = Success; status.error_msg = ""; } catch (std::exception& e) { status.error_code = UnexpectedError; status.error_msg = strdup(e.what()); } return status; } CStatus CleanLocalData(CIndex index) { auto status = CStatus(); try { AssertInfo(index, "failed to build float vector index, passed index was null"); auto real_index = reinterpret_cast(index); auto cIndex = dynamic_cast(real_index); cIndex->CleanLocalData(); status.error_code = Success; status.error_msg = ""; } catch (std::exception& e) { status.error_code = UnexpectedError; status.error_msg = strdup(e.what()); } return status; }