Documentation
¶
Index ¶
- Constants
- func AsSelectorError(err error, target any) bool
- func IsSelectorError(err error) bool
- func ResolveFieldsFromSchema(dest any) (map[SelectorName]*gormschema.Field, error)
- type AnnotationSelector
- func NewAnnotationSelector(input string) (*AnnotationSelector, error)
- func NewAnnotationSelectorFromMap(annotations map[string]string) (*AnnotationSelector, error)
- func NewAnnotationSelectorFromMapOrDie(annotations map[string]string) *AnnotationSelector
- func NewAnnotationSelectorOrDie(input string) *AnnotationSelector
- type CompositeSelectorResolver
- type EmptyResolver
- type FieldSelector
- func NewFieldSelector(input string, opts ...FieldSelectorOption) (*FieldSelector, error)
- func NewFieldSelectorFromMap(fields map[string]string, opts ...FieldSelectorOption) (*FieldSelector, error)
- func NewFieldSelectorFromMapOrDie(fields map[string]string, opts ...FieldSelectorOption) *FieldSelector
- func NewFieldSelectorOrDie(input string, opts ...FieldSelectorOption) *FieldSelector
- type FieldSelectorOption
- type LabelSelector
- type Resolver
- type SelectorError
- type SelectorField
- type SelectorName
- type SelectorNameMapping
- type SelectorNameSet
- type SelectorOpt
- type SelectorResolver
- type SelectorType
Constants ¶
const ( Unknown = iota UUID Bool Int SmallInt BigInt Float String Timestamp BoolArray IntArray SmallIntArray BigIntArray FloatArray TextArray TimestampArray Jsonb )
Variables ¶
This section is empty.
Functions ¶
func AsSelectorError ¶
AsSelectorError checks if an error is of type SelectorError and assigns it to target.
func IsSelectorError ¶
IsSelectorError checks if an error is of type SelectorError.
func ResolveFieldsFromSchema ¶
func ResolveFieldsFromSchema(dest any) (map[SelectorName]*gormschema.Field, error)
ResolveFieldsFromSchema parses the schema of the given model and extracts the fields annotated with the `selector` tag. This is useful for determining which fields can be used in selector queries.
Types ¶
type AnnotationSelector ¶ added in v0.4.0
type AnnotationSelector struct {
// contains filtered or unexported fields
}
func NewAnnotationSelector ¶ added in v0.4.0
func NewAnnotationSelector(input string) (*AnnotationSelector, error)
NewAnnotationSelector creates an AnnotationSelector from a string using Kubernetes-style label selector syntax.
Parameters:
input - A string representing the annotation selector in Kubernetes syntax.
Example:
selector, err := NewAnnotationSelector("env=prod,tier=backend")
// selector represents: "env=prod,tier=backend"
func NewAnnotationSelectorFromMap ¶ added in v0.4.0
func NewAnnotationSelectorFromMap(annotations map[string]string) (*AnnotationSelector, error)
NewAnnotationSelectorFromMap creates an AnnotationSelector from a map of annotations.
Example:
annotations := map[string]string{"env": "prod", "tier": "backend"}
selector, err := NewAnnotationSelectorFromMap(annotations)
// selector represents: "env!=prod,tier!=backend"
func NewAnnotationSelectorFromMapOrDie ¶ added in v0.4.0
func NewAnnotationSelectorFromMapOrDie(annotations map[string]string) *AnnotationSelector
NewAnnotationSelectorFromMapOrDie creates an AnnotationSelector from a map of annotations. It panics if the creation fais.
Example:
annotations := map[string]string{"env": "prod", "tier": "backend"}
selector := NewAnnotationSelectorFromMapOrDie(annotations)
// selector represents: "env=prod,tier=backend"
func NewAnnotationSelectorOrDie ¶ added in v0.4.0
func NewAnnotationSelectorOrDie(input string) *AnnotationSelector
NewAnnotationSelectorOrDie creates an AnnotationSelector from a string using Kubernetes-style label selector syntax. It panics if the creation fais.
Parameters:
input - A string representing the annotation selector in Kubernetes syntax.
Example:
selector := NewAnnotationSelectorOrDie("env=prod,tier=backend")
// selector represents: "env=prod,tier=backend"
func (*AnnotationSelector) Parse ¶ added in v0.4.0
func (s *AnnotationSelector) Parse(ctx context.Context, name SelectorName, resolver Resolver) (string, []any, error)
Parse converts the AnnotationSelector into a SQL query with parameters. The method uses a provided resolver to determine the correct annotations field.
Parameters:
ctx - The context for managing operation lifecycle. name - The selector name to resolve the annotations field. resolver - A Resolver instance used to resolve the selector fields.
Returns:
string - The generated SQL query string. []any - Parameters to be used with the SQL query. error - An error if parsing or field resolution fails.
Example:
s, _ := NewAnnotationSelector("key1=value1,key2!=value2")
query, args, err := s.Parse(ctx, "annotations", myResolver)
if err != nil {
log.Fatalf("Failed to parse annotation selector: %v", err)
}
fmt.Printf("Query: %s, Args: %v\n", query, args)
func (*AnnotationSelector) Tokenize ¶ added in v0.4.0
func (s *AnnotationSelector) Tokenize(ctx context.Context, input any) (queryparser.TokenSet, error)
Tokenize converts a selector string into a set of queryparser tokens.
type CompositeSelectorResolver ¶ added in v0.5.0
type CompositeSelectorResolver struct {
// contains filtered or unexported fields
}
CompositeSelectorResolver combines multiple resolvers to support multiple models
func NewCompositeSelectorResolver ¶ added in v0.5.0
func NewCompositeSelectorResolver(dest ...any) (*CompositeSelectorResolver, error)
NewCompositeSelectorResolver initializes a resolver that can handle multiple models
func (*CompositeSelectorResolver) List ¶ added in v0.5.0
func (r *CompositeSelectorResolver) List() []SelectorName
List aggregates all selector names from the registered resolvers
func (*CompositeSelectorResolver) ResolveFields ¶ added in v0.5.0
func (r *CompositeSelectorResolver) ResolveFields(name SelectorName) ([]*SelectorField, error)
ResolveFields retrieves field metadata from resolvers, prefixing them with the table name
func (*CompositeSelectorResolver) ResolveNames ¶ added in v0.5.0
func (r *CompositeSelectorResolver) ResolveNames(name SelectorName) ([]string, error)
ResolveNames retrieves field names from all resolvers and prefixes them with the table name
type EmptyResolver ¶ added in v0.5.0
type EmptyResolver struct{}
EmptyResolver provides a no-op implementation of the Resolver
func (EmptyResolver) List ¶ added in v0.5.0
func (r EmptyResolver) List() []SelectorName
List returns an empty slice of selector names
func (EmptyResolver) ResolveFields ¶ added in v0.5.0
func (r EmptyResolver) ResolveFields(name SelectorName) ([]*SelectorField, error)
ResolveFields returns an empty slice of selector fields
func (EmptyResolver) ResolveNames ¶ added in v0.5.0
func (r EmptyResolver) ResolveNames(name SelectorName) ([]string, error)
ResolveNames returns an empty slice of field names
type FieldSelector ¶ added in v0.4.0
type FieldSelector struct {
// contains filtered or unexported fields
}
func NewFieldSelector ¶
func NewFieldSelector(input string, opts ...FieldSelectorOption) (*FieldSelector, error)
NewFieldSelector creates a FieldSelector from a given string input using Kubernetes selector syntax. This function parses the input string to generate a FieldSelector that can be used for filtering resources based on specified field conditions.
Example:
fs, err := NewFieldSelector("key1=value1,key2!=value2")
if err != nil {
log.Fatalf("Failed to create FieldSelector: %v", err)
}
// Successfully creates a FieldSelector for the given conditions.
Parameters:
input - A string containing the field selector conditions in Kubernetes selector syntax.
func NewFieldSelectorFromMap ¶ added in v0.4.0
func NewFieldSelectorFromMap(fields map[string]string, opts ...FieldSelectorOption) (*FieldSelector, error)
NewFieldSelectorFromMap creates a FieldSelector from a map of key-value pairs, where each pair represents a field selector condition.
Example:
fs, err := NewFieldSelectorFromMap(map[string]string{"key1": "value1", "key2": "value2"})
// Equivalent to creating a selector: "key1=value1,key2=value2"
func NewFieldSelectorFromMapOrDie ¶ added in v0.4.0
func NewFieldSelectorFromMapOrDie(fields map[string]string, opts ...FieldSelectorOption) *FieldSelector
NewFieldSelectorFromMapOrDie creates a FieldSelector from a map of key-value pairs, where each pair represents a field selector condition. If the operation fails, it panics.
Example:
fs := NewFieldSelectorFromMapOrDie(map[string]string{"key1": "value1", "key2": "value2"})
// Equivalent to creating a selector: "key1=value1,key2=value2"
func NewFieldSelectorOrDie ¶ added in v0.4.0
func NewFieldSelectorOrDie(input string, opts ...FieldSelectorOption) *FieldSelector
NewFieldSelectorOrDie creates a FieldSelector from a given string input using Kubernetes selector syntax. If the input is invalid or parsing fails, it panics.
This function is useful for cases where selector initialization is expected to succeed, and failure is considered a programming error.
Example:
fs := NewFieldSelectorOrDie("key1=value1,key2!=value2")
// Creates a FieldSelector for the given conditions.
Parameters:
input - A string containing the field selector conditions in Kubernetes selector syntax.
func (*FieldSelector) Add ¶ added in v0.4.0
func (fs *FieldSelector) Add(src *FieldSelector) *FieldSelector
Add merges the requirements from the given FieldSelector into the current FieldSelector.
func (*FieldSelector) Parse ¶ added in v0.4.0
Parse translates a FieldSelector into a SQL query with parameters. It resolves field names, operators, and values using the provided `resolver` and generates a corresponding SQL query that can be executed against a database.
Parameters:
ctx - A context.Context to manage the operation lifecycle. resolver - A pre-initialized Resolver that resolves selector names to field mappings.
Returns:
string - The generated SQL query as a string. []any - A slice of arguments to be used as parameters for the SQL query. error - An error if parsing fails due to invalid input, unresolved fields, or other issues.
Example Usage:
resolver, _ := NewCompositeSelectorResolver(&Device{}, &DeviceLabel{})
fs, _ := NewFieldSelector("key1=value1,key2!=value2")
query, args, err := fs.Parse(ctx, resolver)
if err != nil {
log.Fatalf("Failed to parse selector: %v", err)
}
fmt.Printf("Query: %s, Args: %v\n", query, args)
func (*FieldSelector) Tokenize ¶ added in v0.4.0
func (fs *FieldSelector) Tokenize(ctx context.Context, input any) (queryparser.TokenSet, error)
Tokenize converts a selector string into a set of queryparser tokens.
type FieldSelectorOption ¶ added in v0.4.0
type FieldSelectorOption func(*FieldSelector)
func WithPrivateSelectors ¶ added in v0.4.0
func WithPrivateSelectors() FieldSelectorOption
WithPrivateSelectors enables the use of private selectors in the FieldSelector. Private selectors are internal selectors that can be used for specific processing but are not exposed to the end-user for querying.
type LabelSelector ¶ added in v0.4.0
type LabelSelector struct {
// contains filtered or unexported fields
}
func NewLabelSelector ¶ added in v0.4.0
func NewLabelSelector(input string) (*LabelSelector, error)
NewLabelSelector creates a LabelSelector from a string using Kubernetes-style label selector syntax.
Parameters:
input - A string representing the label selector in Kubernetes syntax.
Example:
selector, err := NewLabelSelector("env=prod,tier=backend")
// selector represents: "env=prod,tier=backend"
func NewLabelSelectorFromMap ¶ added in v0.4.0
func NewLabelSelectorFromMap(labels map[string]string) (*LabelSelector, error)
NewLabelSelectorFromMap creates a LabelSelector from a map of labels.
Example:
labels := map[string]string{"env": "prod", "tier": "backend"}
selector, err := NewLabelSelectorFromMap(labels)
// selector represents: "env=prod,tier=backend"
func NewLabelSelectorFromMapOrDie ¶ added in v0.4.0
func NewLabelSelectorFromMapOrDie(labels map[string]string) *LabelSelector
NewLabelSelectorFromMapOrDie creates a LabelSelector from a map of labels. It panics if the creation fails.
Example:
labels := map[string]string{"env": "prod", "tier": "backend"}
selector := NewLabelSelectorFromMapOrDie(labels)
// selector represents: "env=prod,tier=backend"
func NewLabelSelectorOrDie ¶ added in v0.4.0
func NewLabelSelectorOrDie(input string) *LabelSelector
NewLabelSelectorOrDie creates a LabelSelector from a string using Kubernetes-style label selector syntax. It panics if the creation fails.
Parameters:
input - A string representing the label selector in Kubernetes syntax.
Example:
selector := NewLabelSelectorOrDie("env=prod,tier=backend")
// selector represents: "env=prod,tier=backend"
func (*LabelSelector) Parse ¶ added in v0.4.0
func (ls *LabelSelector) Parse(ctx context.Context, name SelectorName, resolver Resolver) (string, []any, error)
Parse converts the LabelSelector into a SQL query with parameters. The method uses a provided resolver to determine the correct labels field.
Parameters:
ctx - The context for managing operation lifecycle. name - The selector name to resolve the labels field. resolver - A Resolver instance used to resolve the selector fields.
Returns:
string - The generated SQL query string. []any - Parameters to be used with the SQL query. error - An error if parsing or field resolution fails.
Example:
ls, _ := NewLabelSelector("key1=value1,key2!=value2")
query, args, err := ls.Parse(ctx, "labels", myResolver)
if err != nil {
log.Fatalf("Failed to parse label selector: %v", err)
}
fmt.Printf("Query: %s, Args: %v\n", query, args)
func (*LabelSelector) Tokenize ¶ added in v0.4.0
func (ls *LabelSelector) Tokenize(ctx context.Context, input any) (queryparser.TokenSet, error)
Tokenize converts a selector string into a set of queryparser tokens.
type Resolver ¶ added in v0.5.0
type Resolver interface {
// ResolveNames takes a selector name and returns the corresponding field names.
// This is useful when a selector can map to multiple fields in the database.
ResolveNames(name SelectorName) ([]string, error)
// ResolveFields takes a selector name and returns detailed metadata associated with the selector.
ResolveFields(name SelectorName) ([]*SelectorField, error)
// List returns a list of all available selector names known by the resolver.
List() []SelectorName
}
Resolver is an interface that provides methods for dynamically resolving selector names and fields in a database model.
func SelectorFieldResolver ¶
SelectorFieldResolver initializes a new selectorFieldResolver. It resolves schema fields from the provided model. If the model implements SelectorNameMapping or SelectorResolver, it will be used to resolve custom selectors.
type SelectorError ¶
SelectorError represents an error related to a selector, wrapping another error.
func NewSelectorError ¶
func NewSelectorError(selectorError, originalError error) *SelectorError
NewSelectorError creates a new SelectorError.
func (*SelectorError) Error ¶
func (e *SelectorError) Error() string
Error returns the string representation of the SelectorError.
func (*SelectorError) Unwrap ¶
func (e *SelectorError) Unwrap() error
Unwrap returns the original error.
type SelectorField ¶
type SelectorField struct {
Name SelectorName
Type SelectorType
FieldName string
FieldType gormschema.DataType
Options SelectorOpt
}
func (*SelectorField) IsJSONBCast ¶
func (sf *SelectorField) IsJSONBCast() bool
IsJSONBCast returns true if the field's data type is 'jsonb' and the expected type is not Jsonb.
type SelectorName ¶ added in v0.4.0
type SelectorName interface {
String() string // Returns the string representation of the selector name.
}
SelectorName represents the name of a selector.
func NewHiddenSelectorName ¶ added in v0.4.0
func NewHiddenSelectorName(name string) SelectorName
NewHiddenSelectorName creates a new hidden selector.
func NewSelectorName ¶ added in v0.4.0
func NewSelectorName(name string) SelectorName
NewSelectorName creates a new SelectorName instance.
type SelectorNameMapping ¶ added in v0.4.0
type SelectorNameMapping interface {
// MapSelectorName maps a custom selector to one or more selectors.
MapSelectorName(selector SelectorName) []SelectorName
// ListSelectors returns all custom selectors.
ListSelectors() SelectorNameSet
}
SelectorNameMapping defines an interface for mapping a custom selector to one or more selectors defined for the model.
type SelectorNameSet ¶ added in v0.4.0
type SelectorNameSet struct {
*queryparser.Set[SelectorName]
}
func NewSelectorFieldNameSet ¶ added in v0.4.0
func NewSelectorFieldNameSet() SelectorNameSet
NewSelectorFieldNameSet initializes a new SelectorNameSet.
func (SelectorNameSet) Add ¶ added in v0.4.0
func (s SelectorNameSet) Add(items ...SelectorName) SelectorNameSet
Add is a wrapper for the embedded Set's Add method that returns SelectorNameSet.
type SelectorOpt ¶ added in v0.4.0
type SelectorOpt = map[string]struct{}
SelectorOpt represents a set of options for a selector.
type SelectorResolver ¶ added in v0.4.0
type SelectorResolver interface {
// ResolveSelector manually resolves a selector to a SelectorField instance.
ResolveSelector(selector SelectorName) (*SelectorField, error)
// ListSelectors returns all custom selectors.
ListSelectors() SelectorNameSet
}
SelectorResolver defines an interface for manually resolving a selector to specific SelectorField instances, enabling direct use of fields.
type SelectorType ¶ added in v0.4.0
type SelectorType int
SelectorType represents the type of a selector.
func (SelectorType) IsArray ¶ added in v0.4.0
func (t SelectorType) IsArray() bool
func (SelectorType) String ¶ added in v0.4.0
func (t SelectorType) String() string