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  }