Spaces:
Running
Running
// _ _ | |
// __ _____ __ ___ ___ __ _| |_ ___ | |
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ | |
// \ V V / __/ (_| |\ V /| | (_| | || __/ | |
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| | |
// | |
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. | |
// | |
// CONTACT: [email protected] | |
// | |
package aggregation | |
import ( | |
"fmt" | |
"github.com/weaviate/weaviate/entities/filters" | |
"github.com/weaviate/weaviate/entities/schema" | |
"github.com/weaviate/weaviate/entities/searchparams" | |
) | |
type Params struct { | |
Filters *filters.LocalFilter `json:"filters"` | |
ClassName schema.ClassName `json:"className"` | |
Properties []ParamProperty `json:"properties"` | |
GroupBy *filters.Path `json:"groupBy"` | |
IncludeMetaCount bool `json:"includeMetaCount"` | |
Limit *int `json:"limit"` | |
ObjectLimit *int `json:"objectLimit"` | |
SearchVector []float32 `json:"searchVector"` | |
Certainty float64 `json:"certainty"` | |
Tenant string `json:"tenant"` | |
ModuleParams map[string]interface{} `json:"moduleParams"` | |
NearVector *searchparams.NearVector `json:"nearVector"` | |
NearObject *searchparams.NearObject `json:"nearObject"` | |
Hybrid *searchparams.HybridSearch `json:"hybrid"` | |
} | |
type ParamProperty struct { | |
Name schema.PropertyName `json:"name"` | |
Aggregators []Aggregator `json:"aggregators"` | |
} | |
type Aggregator struct { | |
Type string `json:"type"` | |
Limit *int `json:"limit"` // used on TopOccurrence Agg | |
} | |
func (a Aggregator) String() string { | |
return a.Type | |
} | |
// Aggregators used in every prop | |
var ( | |
CountAggregator = Aggregator{Type: "count"} | |
TypeAggregator = Aggregator{Type: "type"} | |
) | |
// Aggregators used in numerical props | |
var ( | |
SumAggregator = Aggregator{Type: "sum"} | |
MeanAggregator = Aggregator{Type: "mean"} | |
ModeAggregator = Aggregator{Type: "mode"} | |
MedianAggregator = Aggregator{Type: "median"} | |
MaximumAggregator = Aggregator{Type: "maximum"} | |
MinimumAggregator = Aggregator{Type: "minimum"} | |
) | |
// Aggregators used in boolean props | |
var ( | |
TotalTrueAggregator = Aggregator{Type: "totalTrue"} | |
PercentageTrueAggregator = Aggregator{Type: "percentageTrue"} | |
TotalFalseAggregator = Aggregator{Type: "totalFalse"} | |
PercentageFalseAggregator = Aggregator{Type: "percentageFalse"} | |
) | |
const TopOccurrencesType = "topOccurrences" | |
// NewTopOccurrencesAggregator creates a TopOccurrencesAggregator, we cannot | |
// use a singleton for this as the desired limit can be different each time | |
func NewTopOccurrencesAggregator(limit *int) Aggregator { | |
return Aggregator{Type: TopOccurrencesType, Limit: limit} | |
} | |
// Aggregators used in ref props | |
var ( | |
PointingToAggregator = Aggregator{Type: "pointingTo"} | |
) | |
func ParseAggregatorProp(name string) (Aggregator, error) { | |
switch name { | |
// common | |
case CountAggregator.String(): | |
return CountAggregator, nil | |
case TypeAggregator.String(): | |
return TypeAggregator, nil | |
// numerical | |
case MeanAggregator.String(): | |
return MeanAggregator, nil | |
case MedianAggregator.String(): | |
return MedianAggregator, nil | |
case ModeAggregator.String(): | |
return ModeAggregator, nil | |
case MaximumAggregator.String(): | |
return MaximumAggregator, nil | |
case MinimumAggregator.String(): | |
return MinimumAggregator, nil | |
case SumAggregator.String(): | |
return SumAggregator, nil | |
// boolean | |
case TotalTrueAggregator.String(): | |
return TotalTrueAggregator, nil | |
case TotalFalseAggregator.String(): | |
return TotalFalseAggregator, nil | |
case PercentageTrueAggregator.String(): | |
return PercentageTrueAggregator, nil | |
case PercentageFalseAggregator.String(): | |
return PercentageFalseAggregator, nil | |
// string/text | |
case TopOccurrencesType: | |
return NewTopOccurrencesAggregator(ptInt(5)), nil // default to limit 5, can be overwritten | |
// ref | |
case PointingToAggregator.String(): | |
return PointingToAggregator, nil | |
default: | |
return Aggregator{}, fmt.Errorf("unrecognized aggregator prop '%s'", name) | |
} | |
} | |
func ptInt(in int) *int { | |
return &in | |
} | |