milvus/internal/distributed/proxy/httpserver/request_v2.go

668 lines
21 KiB
Go

// 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.
package httpserver
import (
"strconv"
"github.com/gin-gonic/gin"
"github.com/milvus-io/milvus-proto/go-api/v2/commonpb"
"github.com/milvus-io/milvus/pkg/v2/util/merr"
)
type EmptyReq struct{}
func (req *EmptyReq) GetDbName() string { return "" }
type DatabaseReq struct {
DbName string `json:"dbName"`
}
func (req *DatabaseReq) GetDbName() string { return req.DbName }
type DatabaseReqRequiredName struct {
DbName string `json:"dbName" binding:"required"`
}
func (req *DatabaseReqRequiredName) GetDbName() string { return req.DbName }
type DatabaseReqWithProperties struct {
DbName string `json:"dbName" binding:"required"`
Properties map[string]interface{} `json:"properties"`
}
func (req *DatabaseReqWithProperties) GetDbName() string { return req.DbName }
type DropDatabasePropertiesReq struct {
DbName string `json:"dbName" binding:"required"`
PropertyKeys []string `json:"propertyKeys"`
}
func (req *DatabaseReqWithProperties) DropDatabasPropertiesReq() string { return req.DbName }
type CollectionNameReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionNames []string `json:"partitionNames"` // get partitions load state
}
func (req *CollectionNameReq) GetDbName() string {
return req.DbName
}
func (req *CollectionNameReq) GetCollectionName() string {
return req.CollectionName
}
func (req *CollectionNameReq) GetPartitionNames() []string {
return req.PartitionNames
}
type CollectionReqWithProperties struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
Properties map[string]interface{} `json:"properties"`
}
func (req *CollectionReqWithProperties) GetDbName() string { return req.DbName }
func (req *CollectionReqWithProperties) GetCollectionName() string {
return req.CollectionName
}
type OptionalCollectionNameReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName"`
}
func (req *OptionalCollectionNameReq) GetDbName() string {
return req.DbName
}
func (req *OptionalCollectionNameReq) GetCollectionName() string {
return req.CollectionName
}
type RenameCollectionReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
NewCollectionName string `json:"newCollectionName" binding:"required"`
NewDbName string `json:"newDbName"`
}
func (req *RenameCollectionReq) GetDbName() string { return req.DbName }
type DropCollectionPropertiesReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PropertyKeys []string `json:"propertyKeys"`
}
func (req *DropCollectionPropertiesReq) GetDbName() string { return req.DbName }
func (req *DropCollectionPropertiesReq) GetCollectionName() string {
return req.CollectionName
}
type CompactReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
IsClustering bool `json:"isClustering"`
}
func (req *CompactReq) GetDbName() string { return req.DbName }
func (req *CompactReq) GetCollectionName() string {
return req.CollectionName
}
type GetCompactionStateReq struct {
JobID int64 `json:"jobID"`
}
type FlushReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
}
func (req *FlushReq) GetDbName() string { return req.DbName }
func (req *FlushReq) GetCollectionName() string {
return req.CollectionName
}
type CollectionFieldReqWithParams struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
FieldName string `json:"fieldName" binding:"required"`
FieldParams map[string]interface{} `json:"fieldParams"`
}
func (req *CollectionFieldReqWithParams) GetDbName() string { return req.DbName }
func (req *CollectionFieldReqWithParams) GetCollectionName() string {
return req.CollectionName
}
func (req *CollectionFieldReqWithParams) GetFieldName() string {
return req.FieldName
}
type PartitionReq struct {
// CollectionNameReq
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionName string `json:"partitionName" binding:"required"`
}
func (req *PartitionReq) GetDbName() string { return req.DbName }
func (req *PartitionReq) GetCollectionName() string { return req.CollectionName }
func (req *PartitionReq) GetPartitionName() string { return req.PartitionName }
type ImportReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionName string `json:"partitionName"`
Files [][]string `json:"files" binding:"required"`
Options map[string]string `json:"options"`
}
func (req *ImportReq) GetDbName() string {
return req.DbName
}
func (req *ImportReq) GetCollectionName() string {
return req.CollectionName
}
func (req *ImportReq) GetPartitionName() string {
return req.PartitionName
}
func (req *ImportReq) GetFiles() [][]string {
return req.Files
}
func (req *ImportReq) GetOptions() map[string]string {
return req.Options
}
type JobIDReq struct {
JobID string `json:"jobId" binding:"required"`
}
func (req *JobIDReq) GetJobID() string { return req.JobID }
type QueryReqV2 struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionNames []string `json:"partitionNames"`
OutputFields []string `json:"outputFields"`
Filter string `json:"filter"`
Limit int32 `json:"limit"`
Offset int32 `json:"offset"`
ExprParams map[string]interface{} `json:"exprParams"`
}
func (req *QueryReqV2) GetDbName() string { return req.DbName }
type CollectionIDReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionName string `json:"partitionName"`
PartitionNames []string `json:"partitionNames"`
OutputFields []string `json:"outputFields"`
ID interface{} `json:"id" binding:"required"`
}
func (req *CollectionIDReq) GetDbName() string { return req.DbName }
type CollectionFilterReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionName string `json:"partitionName"`
Filter string `json:"filter" binding:"required"`
ExprParams map[string]interface{} `json:"exprParams"`
}
func (req *CollectionFilterReq) GetDbName() string { return req.DbName }
type CollectionDataReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionName string `json:"partitionName"`
Data []map[string]interface{} `json:"data" binding:"required"`
}
func (req *CollectionDataReq) GetDbName() string { return req.DbName }
type SearchReqV2 struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
Data []interface{} `json:"data" binding:"required"`
AnnsField string `json:"annsField"`
PartitionNames []string `json:"partitionNames"`
Filter string `json:"filter"`
GroupByField string `json:"groupingField"`
GroupSize int32 `json:"groupSize"`
StrictGroupSize bool `json:"strictGroupSize"`
Limit int32 `json:"limit"`
Offset int32 `json:"offset"`
OutputFields []string `json:"outputFields"`
SearchParams map[string]interface{} `json:"searchParams"`
ConsistencyLevel string `json:"consistencyLevel"`
ExprParams map[string]interface{} `json:"exprParams"`
// not use Params any more, just for compatibility
Params map[string]float64 `json:"params"`
}
func (req *SearchReqV2) GetDbName() string { return req.DbName }
type Rand struct {
Strategy string `json:"strategy"`
Params map[string]interface{} `json:"params"`
}
type SubSearchReq struct {
Data []interface{} `json:"data" binding:"required"`
AnnsField string `json:"annsField"`
Filter string `json:"filter"`
GroupByField string `json:"groupingField"`
MetricType string `json:"metricType"`
Limit int32 `json:"limit"`
Offset int32 `json:"offset"`
SearchParams map[string]interface{} `json:"params"`
ExprParams map[string]interface{} `json:"exprParams"`
}
type HybridSearchReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionNames []string `json:"partitionNames"`
Search []SubSearchReq `json:"search"`
Rerank Rand `json:"rerank"`
Limit int32 `json:"limit"`
GroupByField string `json:"groupingField"`
GroupSize int32 `json:"groupSize"`
StrictGroupSize bool `json:"strictGroupSize"`
OutputFields []string `json:"outputFields"`
ConsistencyLevel string `json:"consistencyLevel"`
}
func (req *HybridSearchReq) GetDbName() string { return req.DbName }
type ReturnErrMsg struct {
Code int32 `json:"code"`
Message string `json:"message"`
}
type PartitionsReq struct {
// CollectionNameReq
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
PartitionNames []string `json:"partitionNames" binding:"required"`
}
func (req *PartitionsReq) GetDbName() string { return req.DbName }
type UserReq struct {
UserName string `json:"userName" binding:"required"`
}
func (req *UserReq) GetUserName() string { return req.UserName }
type BaseGetter interface {
GetBase() *commonpb.MsgBase
}
type UserNameGetter interface {
GetUserName() string
}
type RoleNameGetter interface {
GetRoleName() string
}
type IndexNameGetter interface {
GetIndexName() string
}
type AliasNameGetter interface {
GetAliasName() string
}
type FilesGetter interface {
GetFiles() [][]string
}
type OptionsGetter interface {
GetOptions() map[string]string
}
type JobIDGetter interface {
GetJobID() string
}
type PasswordReq struct {
UserName string `json:"userName" binding:"required"`
Password string `json:"password" binding:"required"`
}
type NewPasswordReq struct {
UserName string `json:"userName" binding:"required"`
Password string `json:"password" binding:"required"`
NewPassword string `json:"newPassword" binding:"required"`
}
type UserRoleReq struct {
UserName string `json:"userName" binding:"required"`
RoleName string `json:"roleName" binding:"required"`
}
type RoleReq struct {
DbName string `json:"dbName"`
RoleName string `json:"roleName" binding:"required"`
}
func (req *RoleReq) GetDbName() string { return req.DbName }
func (req *RoleReq) GetRoleName() string {
return req.RoleName
}
type PrivilegeGroupReq struct {
PrivilegeGroupName string `json:"privilegeGroupName" binding:"required"`
Privileges []string `json:"privileges"`
}
type GrantV2Req struct {
RoleName string `json:"roleName" binding:"required"`
DbName string `json:"dbName"`
CollectionName string `json:"collectionName"`
Privilege string `json:"privilege" binding:"required"`
}
type GrantReq struct {
RoleName string `json:"roleName" binding:"required"`
ObjectType string `json:"objectType" binding:"required"`
ObjectName string `json:"objectName" binding:"required"`
Privilege string `json:"privilege" binding:"required"`
DbName string `json:"dbName"`
}
func (req *GrantReq) GetDbName() string { return req.DbName }
type IndexParam struct {
FieldName string `json:"fieldName" binding:"required"`
IndexName string `json:"indexName"`
MetricType string `json:"metricType"`
IndexType string `json:"indexType"`
Params map[string]interface{} `json:"params"`
}
type IndexParamReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
IndexParams []IndexParam `json:"indexParams" binding:"required"`
}
func (req *IndexParamReq) GetDbName() string { return req.DbName }
type IndexReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
IndexName string `json:"indexName" binding:"required"`
}
func (req *IndexReq) GetDbName() string { return req.DbName }
func (req *IndexReq) GetCollectionName() string {
return req.CollectionName
}
func (req *IndexReq) GetIndexName() string {
return req.IndexName
}
type IndexReqWithProperties struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
IndexName string `json:"indexName" binding:"required"`
Properties map[string]interface{} `json:"properties"`
}
func (req *IndexReqWithProperties) GetDbName() string { return req.DbName }
func (req *IndexReqWithProperties) GetCollectionName() string {
return req.CollectionName
}
func (req *IndexReqWithProperties) GetIndexName() string {
return req.IndexName
}
type DropIndexPropertiesReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
IndexName string `json:"indexName" binding:"required"`
PropertyKeys []string `json:"propertyKeys"`
}
func (req *DropIndexPropertiesReq) GetDbName() string { return req.DbName }
func (req *DropIndexPropertiesReq) GetCollectionName() string {
return req.CollectionName
}
func (req *DropIndexPropertiesReq) GetIndexName() string {
return req.IndexName
}
type FieldSchema struct {
FieldName string `json:"fieldName" binding:"required"`
DataType string `json:"dataType" binding:"required"`
ElementDataType string `json:"elementDataType"`
IsPrimary bool `json:"isPrimary"`
IsPartitionKey bool `json:"isPartitionKey"`
IsClusteringKey bool `json:"isClusteringKey"`
ElementTypeParams map[string]interface{} `json:"elementTypeParams" binding:"required"`
Nullable bool `json:"nullable" binding:"required"`
DefaultValue interface{} `json:"defaultValue" binding:"required"`
}
type FunctionSchema struct {
FunctionName string `json:"name" binding:"required"`
Description string `json:"description"`
FunctionType string `json:"type" binding:"required"`
InputFieldNames []string `json:"inputFieldNames" binding:"required"`
OutputFieldNames []string `json:"outputFieldNames" binding:"required"`
Params map[string]interface{} `json:"params"`
}
type CollectionSchema struct {
Fields []FieldSchema `json:"fields"`
Functions []FunctionSchema `json:"functions"`
AutoId bool `json:"autoID"`
EnableDynamicField bool `json:"enableDynamicField"`
}
type CollectionReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
Dimension int32 `json:"dimension"`
IDType string `json:"idType"`
AutoID bool `json:"autoID"`
MetricType string `json:"metricType"`
PrimaryFieldName string `json:"primaryFieldName"`
VectorFieldName string `json:"vectorFieldName"`
Schema CollectionSchema `json:"schema"`
IndexParams []IndexParam `json:"indexParams"`
Params map[string]interface{} `json:"params"`
Description string `json:"description"`
}
func (req *CollectionReq) GetDbName() string { return req.DbName }
type AliasReq struct {
DbName string `json:"dbName"`
AliasName string `json:"aliasName" binding:"required"`
}
func (req *AliasReq) GetDbName() string { return req.DbName }
func (req *AliasReq) GetAliasName() string {
return req.AliasName
}
type AliasCollectionReq struct {
DbName string `json:"dbName"`
CollectionName string `json:"collectionName" binding:"required"`
AliasName string `json:"aliasName" binding:"required"`
}
func (req *AliasCollectionReq) GetDbName() string { return req.DbName }
func (req *AliasCollectionReq) GetCollectionName() string {
return req.CollectionName
}
func (req *AliasCollectionReq) GetAliasName() string {
return req.AliasName
}
func wrapperReturnHas(has bool) gin.H {
return gin.H{HTTPReturnCode: merr.Code(nil), HTTPReturnData: gin.H{HTTPReturnHas: has}}
}
func wrapperReturnList(names []string) gin.H {
if names == nil {
return gin.H{HTTPReturnCode: merr.Code(nil), HTTPReturnData: []string{}}
}
return gin.H{HTTPReturnCode: merr.Code(nil), HTTPReturnData: names}
}
func wrapperReturnRowCount(pairs []*commonpb.KeyValuePair) gin.H {
rowCountValue := "0"
for _, keyValue := range pairs {
if keyValue.Key == "row_count" {
rowCountValue = keyValue.GetValue()
}
}
rowCount, err := strconv.ParseInt(rowCountValue, 10, 64)
if err != nil {
return gin.H{HTTPReturnCode: merr.Code(nil), HTTPReturnData: gin.H{HTTPReturnRowCount: rowCountValue}}
}
return gin.H{HTTPReturnCode: merr.Code(nil), HTTPReturnData: gin.H{HTTPReturnRowCount: rowCount}}
}
func wrapperReturnDefault() gin.H {
return gin.H{HTTPReturnCode: merr.Code(nil), HTTPReturnData: gin.H{}}
}
func wrapperReturnDefaultWithCost(cost int) gin.H {
return gin.H{HTTPReturnCode: merr.Code(nil), HTTPReturnData: gin.H{}, HTTPReturnCost: cost}
}
type ResourceGroupNodeFilter struct {
NodeLabels map[string]string `json:"node_labels" binding:"required"`
}
func (req *ResourceGroupNodeFilter) GetNodeLabels() map[string]string {
return req.NodeLabels
}
type ResourceGroupLimit struct {
NodeNum int32 `json:"node_num" binding:"required"`
}
func (req *ResourceGroupLimit) GetNodeNum() int32 {
return req.NodeNum
}
type ResourceGroupTransfer struct {
ResourceGroup string `json:"resource_group" binding:"required"`
}
func (req *ResourceGroupTransfer) GetResourceGroup() string {
return req.ResourceGroup
}
type ResourceGroupConfig struct {
Requests *ResourceGroupLimit `json:"requests" binding:"required"`
Limits *ResourceGroupLimit `json:"limits" binding:"required"`
TransferFrom []*ResourceGroupTransfer `json:"transfer_from"`
TransferTo []*ResourceGroupTransfer `json:"transfer_to"`
NodeFilter *ResourceGroupNodeFilter `json:"node_filter"`
}
func (req *ResourceGroupConfig) GetRequests() *ResourceGroupLimit {
return req.Requests
}
func (req *ResourceGroupConfig) GetLimits() *ResourceGroupLimit {
return req.Limits
}
func (req *ResourceGroupConfig) GetTransferFrom() []*ResourceGroupTransfer {
return req.TransferFrom
}
func (req *ResourceGroupConfig) GetTransferTo() []*ResourceGroupTransfer {
return req.TransferTo
}
func (req *ResourceGroupConfig) GetNodeFilter() *ResourceGroupNodeFilter {
return req.NodeFilter
}
type ResourceGroupReq struct {
Name string `json:"name" binding:"required"`
Config *ResourceGroupConfig `json:"config"`
}
func (req *ResourceGroupReq) GetName() string {
return req.Name
}
func (req *ResourceGroupReq) GetConfig() *ResourceGroupConfig {
return req.Config
}
type UpdateResourceGroupReq struct {
ResourceGroups map[string]*ResourceGroupConfig `json:"resource_groups" binding:"required"`
}
func (req *UpdateResourceGroupReq) GetResourceGroups() map[string]*ResourceGroupConfig {
return req.ResourceGroups
}
type TransferReplicaReq struct {
SourceRgName string `json:"sourceRgName" binding:"required"`
TargetRgName string `json:"targetRgName" binding:"required"`
CollectionName string `json:"collectionName" binding:"required"`
ReplicaNum int64 `json:"replicaNum" binding:"required"`
}
func (req *TransferReplicaReq) GetSourceRgName() string {
return req.SourceRgName
}
func (req *TransferReplicaReq) GetTargetRgName() string {
return req.TargetRgName
}
func (req *TransferReplicaReq) GetCollectionName() string {
return req.CollectionName
}
func (req *TransferReplicaReq) GetReplicaNum() int64 {
return req.ReplicaNum
}