github.com/weaviate/weaviate@v1.24.6/usecases/traverser/traverser_aggregate.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package traverser 13 14 import ( 15 "context" 16 "fmt" 17 18 "github.com/pkg/errors" 19 "github.com/weaviate/weaviate/entities/aggregation" 20 enterrors "github.com/weaviate/weaviate/entities/errors" 21 "github.com/weaviate/weaviate/entities/filters" 22 "github.com/weaviate/weaviate/entities/models" 23 ) 24 25 // Aggregate resolves meta queries 26 func (t *Traverser) Aggregate(ctx context.Context, principal *models.Principal, 27 params *aggregation.Params, 28 ) (interface{}, error) { 29 t.metrics.QueriesAggregateInc(params.ClassName.String()) 30 defer t.metrics.QueriesAggregateDec(params.ClassName.String()) 31 32 err := t.authorizer.Authorize(principal, "get", "traversal/*") 33 if err != nil { 34 return nil, err 35 } 36 37 unlock, err := t.locks.LockConnector() 38 if err != nil { 39 return nil, enterrors.NewErrLockConnector(err) 40 } 41 defer unlock() 42 43 inspector := newTypeInspector(t.schemaGetter) 44 45 if params.NearVector != nil || params.NearObject != nil || len(params.ModuleParams) > 0 { 46 className := params.ClassName.String() 47 err = t.nearParamsVector.validateNearParams(params.NearVector, 48 params.NearObject, params.ModuleParams, className) 49 if err != nil { 50 return nil, err 51 } 52 searchVector, targetVector, err := t.nearParamsVector.vectorFromParams(ctx, 53 params.NearVector, params.NearObject, params.ModuleParams, className, params.Tenant) 54 if err != nil { 55 return nil, err 56 } 57 58 targetVector, err = t.targetVectorParamHelper.GetTargetVectorOrDefault(t.schemaGetter.GetSchemaSkipAuth(), 59 className, targetVector) 60 if err != nil { 61 return nil, err 62 } 63 params.TargetVector = targetVector 64 params.SearchVector = searchVector 65 66 certainty := t.nearParamsVector.extractCertaintyFromParams(params.NearVector, 67 params.NearObject, params.ModuleParams) 68 69 if certainty == 0 && params.ObjectLimit == nil { 70 return nil, fmt.Errorf("must provide certainty or objectLimit with vector search") 71 } 72 params.Certainty = certainty 73 } 74 75 if params.Hybrid != nil && params.Hybrid.Vector == nil && params.Hybrid.Query != "" { 76 targetVector := "" 77 if len(params.Hybrid.TargetVectors) == 1 { 78 targetVector = params.Hybrid.TargetVectors[0] 79 } 80 targetVector, err = t.targetVectorParamHelper.GetTargetVectorOrDefault(t.schemaGetter.GetSchemaSkipAuth(), 81 params.ClassName.String(), targetVector) 82 if err != nil { 83 return nil, err 84 } 85 vec, err := t.nearParamsVector.modulesProvider. 86 VectorFromInput(ctx, params.ClassName.String(), params.Hybrid.Query, targetVector) 87 if err != nil { 88 return nil, err 89 } 90 params.Hybrid.Vector = vec 91 } 92 93 if params.Filters != nil { 94 if err := filters.ValidateFilters(t.schemaGetter.GetSchemaSkipAuth(), params.Filters); err != nil { 95 return nil, errors.Wrap(err, "invalid 'where' filter") 96 } 97 } 98 99 res, err := t.vectorSearcher.Aggregate(ctx, *params) 100 if err != nil || res == nil { 101 return nil, err 102 } 103 104 return inspector.WithTypes(res, *params) 105 }