milvus/core/src/server/delivery/request/BaseRequest.cpp
yukun 67d8a9b54c
Add http interface for hybrid search (#2079)
* Add http interface for hybrid search

Signed-off-by: fishpenguin <kun.yu@zilliz.com>

* Add unittest for http hybrid interface

Signed-off-by: fishpenguin <kun.yu@zilliz.com>

* clang format

Signed-off-by: fishpenguin <kun.yu@zilliz.com>

* Fix codacy quality

Signed-off-by: fishpenguin <kun.yu@zilliz.com>
2020-04-25 13:19:17 +08:00

152 lines
4.7 KiB
C++

// 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 "server/delivery/request/BaseRequest.h"
#include "utils/CommonUtil.h"
#include "utils/Exception.h"
#include "utils/Log.h"
#include <map>
namespace milvus {
namespace server {
static const char* DQL_REQUEST_GROUP = "dql";
static const char* DDL_DML_REQUEST_GROUP = "ddl_dml";
static const char* INFO_REQUEST_GROUP = "info";
namespace {
std::string
RequestGroup(BaseRequest::RequestType type) {
static std::map<BaseRequest::RequestType, std::string> s_map_type_group = {
// general operations
{BaseRequest::kCmd, INFO_REQUEST_GROUP},
// data operations
{BaseRequest::kInsert, DDL_DML_REQUEST_GROUP},
{BaseRequest::kCompact, DDL_DML_REQUEST_GROUP},
{BaseRequest::kFlush, DDL_DML_REQUEST_GROUP},
{BaseRequest::kDeleteByID, DDL_DML_REQUEST_GROUP},
{BaseRequest::kGetVectorByID, INFO_REQUEST_GROUP},
{BaseRequest::kGetVectorIDs, INFO_REQUEST_GROUP},
{BaseRequest::kInsertEntity, DDL_DML_REQUEST_GROUP},
// collection operations
{BaseRequest::kShowCollections, INFO_REQUEST_GROUP},
{BaseRequest::kCreateCollection, DDL_DML_REQUEST_GROUP},
{BaseRequest::kHasCollection, INFO_REQUEST_GROUP},
{BaseRequest::kDescribeCollection, INFO_REQUEST_GROUP},
{BaseRequest::kCountCollection, INFO_REQUEST_GROUP},
{BaseRequest::kShowCollectionInfo, INFO_REQUEST_GROUP},
{BaseRequest::kDropCollection, DDL_DML_REQUEST_GROUP},
{BaseRequest::kPreloadCollection, DQL_REQUEST_GROUP},
{BaseRequest::kCreateHybridCollection, DDL_DML_REQUEST_GROUP},
{BaseRequest::kDescribeHybridCollection, INFO_REQUEST_GROUP},
// partition operations
{BaseRequest::kCreatePartition, DDL_DML_REQUEST_GROUP},
{BaseRequest::kShowPartitions, INFO_REQUEST_GROUP},
{BaseRequest::kDropPartition, DDL_DML_REQUEST_GROUP},
// index operations
{BaseRequest::kCreateIndex, DDL_DML_REQUEST_GROUP},
{BaseRequest::kDescribeIndex, INFO_REQUEST_GROUP},
{BaseRequest::kDropIndex, DDL_DML_REQUEST_GROUP},
// search operations
{BaseRequest::kSearchByID, DQL_REQUEST_GROUP},
{BaseRequest::kSearch, DQL_REQUEST_GROUP},
{BaseRequest::kSearchCombine, DQL_REQUEST_GROUP},
{BaseRequest::kHybridSearch, DQL_REQUEST_GROUP},
};
auto iter = s_map_type_group.find(type);
if (iter == s_map_type_group.end()) {
LOG_SERVER_ERROR_ << "Unsupported request type: " << type;
throw Exception(SERVER_NOT_IMPLEMENT, "request group undefined");
}
return iter->second;
}
} // namespace
BaseRequest::BaseRequest(const std::shared_ptr<milvus::server::Context>& context, BaseRequest::RequestType type,
bool async)
: context_(context), type_(type), async_(async), done_(false) {
request_group_ = milvus::server::RequestGroup(type);
}
BaseRequest::~BaseRequest() {
WaitToFinish();
}
Status
BaseRequest::PreExecute() {
status_ = OnPreExecute();
if (!status_.ok()) {
Done();
}
return status_;
}
Status
BaseRequest::Execute() {
status_ = OnExecute();
Done();
return status_;
}
Status
BaseRequest::PostExecute() {
status_ = OnPostExecute();
return status_;
}
Status
BaseRequest::OnPreExecute() {
return Status::OK();
}
Status
BaseRequest::OnPostExecute() {
return Status::OK();
}
void
BaseRequest::Done() {
done_ = true;
finish_cond_.notify_all();
}
void
BaseRequest::set_status(const Status& status) {
status_ = status;
if (!status_.ok()) {
LOG_SERVER_ERROR_ << status_.message();
}
}
std::string
BaseRequest::CollectionNotExistMsg(const std::string& collection_name) {
return "Collection " + collection_name +
" does not exist. Use milvus.has_collection to verify whether the collection exists. "
"You also can check whether the collection name exists.";
}
Status
BaseRequest::WaitToFinish() {
std::unique_lock<std::mutex> lock(finish_mtx_);
finish_cond_.wait(lock, [this] { return done_; });
return status_;
}
} // namespace server
} // namespace milvus