github.com/weaviate/weaviate@v1.24.6/entities/filters/filters.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 filters
    13  
    14  import (
    15  	"encoding/json"
    16  
    17  	"github.com/weaviate/weaviate/entities/models"
    18  	"github.com/weaviate/weaviate/entities/schema"
    19  )
    20  
    21  type Operator int
    22  
    23  const (
    24  	OperatorEqual Operator = iota + 1
    25  	OperatorNotEqual
    26  	OperatorGreaterThan
    27  	OperatorGreaterThanEqual
    28  	OperatorLessThan
    29  	OperatorLessThanEqual
    30  	OperatorAnd
    31  	OperatorOr
    32  	OperatorWithinGeoRange
    33  	OperatorLike
    34  	OperatorIsNull
    35  	ContainsAny
    36  	ContainsAll
    37  )
    38  
    39  func (o Operator) OnValue() bool {
    40  	switch o {
    41  	case OperatorEqual,
    42  		OperatorNotEqual,
    43  		OperatorGreaterThan,
    44  		OperatorGreaterThanEqual,
    45  		OperatorLessThan,
    46  		OperatorLessThanEqual,
    47  		OperatorWithinGeoRange,
    48  		OperatorLike,
    49  		OperatorIsNull,
    50  		ContainsAny,
    51  		ContainsAll:
    52  		return true
    53  	default:
    54  		return false
    55  	}
    56  }
    57  
    58  func (o Operator) Name() string {
    59  	switch o {
    60  	case OperatorEqual:
    61  		return "Equal"
    62  	case OperatorNotEqual:
    63  		return "NotEqual"
    64  	case OperatorGreaterThan:
    65  		return "GreaterThan"
    66  	case OperatorGreaterThanEqual:
    67  		return "GreaterThanEqual"
    68  	case OperatorLessThan:
    69  		return "LessThan"
    70  	case OperatorLessThanEqual:
    71  		return "LessThanEqual"
    72  	case OperatorAnd:
    73  		return "And"
    74  	case OperatorOr:
    75  		return "Or"
    76  	case OperatorWithinGeoRange:
    77  		return "WithinGeoRange"
    78  	case OperatorLike:
    79  		return "Like"
    80  	case OperatorIsNull:
    81  		return "IsNull"
    82  	case ContainsAny:
    83  		return "ContainsAny"
    84  	case ContainsAll:
    85  		return "ContainsAll"
    86  	default:
    87  		panic("Unknown operator")
    88  	}
    89  }
    90  
    91  type LocalFilter struct {
    92  	Root *Clause `json:"root"`
    93  }
    94  
    95  type Value struct {
    96  	Value interface{}     `json:"value"`
    97  	Type  schema.DataType `json:"type"`
    98  }
    99  
   100  func (v *Value) UnmarshalJSON(data []byte) error {
   101  	type Alias Value
   102  	aux := struct {
   103  		*Alias
   104  	}{
   105  		Alias: (*Alias)(v),
   106  	}
   107  
   108  	err := json.Unmarshal(data, &aux)
   109  	if err != nil {
   110  		return err
   111  	}
   112  
   113  	asFloat, ok := v.Value.(float64)
   114  	if v.Type == schema.DataTypeInt && ok {
   115  		v.Value = int(asFloat)
   116  	}
   117  
   118  	if v.Type == schema.DataTypeGeoCoordinates {
   119  		temp := struct {
   120  			Value GeoRange `json:"value"`
   121  		}{}
   122  
   123  		if err := json.Unmarshal(data, &temp); err != nil {
   124  			return err
   125  		}
   126  		v.Value = temp.Value
   127  	}
   128  
   129  	return nil
   130  }
   131  
   132  type Clause struct {
   133  	Operator Operator `json:"operator"`
   134  	On       *Path    `json:"on"`
   135  	Value    *Value   `json:"value"`
   136  	Operands []Clause `json:"operands"`
   137  }
   138  
   139  // GeoRange to be used with fields of type GeoCoordinates. Identifies a point
   140  // and a maximum distance from that point.
   141  type GeoRange struct {
   142  	*models.GeoCoordinates
   143  	Distance float32 `json:"distance"`
   144  }