selector

package
v0.9.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 20, 2025 License: Apache-2.0 Imports: 24 Imported by: 0

Documentation

Index

Constants

View Source
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

func AsSelectorError(err error, target any) bool

AsSelectorError checks if an error is of type SelectorError and assigns it to target.

func IsSelectorError

func IsSelectorError(err error) bool

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

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

func (fs *FieldSelector) Parse(ctx context.Context, resolver Resolver) (string, []any, error)

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

func SelectorFieldResolver(model any) (Resolver, error)

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

type SelectorError struct {
	SelectorError error
	OriginalError error
}

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

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

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL