Documentation
¶
Overview ¶
Package query is the search Query DSL — filter operators, sort expressions, sparse fieldsets, includes, and pagination styles — shared by every REST + gRPC list endpoint in go/kit.
Index ¶
- Constants
- Variables
- func AddFilter(q Query, operator filter.Operator, name string, val any)
- func AddFilterParam(queryParams url.Values, fieldName string, operator filter.Operator, ...)
- func DecodePositionCursor(encoded string) (time.Time, string)
- func DoesInclude(q Query, relationship string) bool
- func EncodePositionCursor(createdAt time.Time, id string) string
- func FiltersToURLValues(filters Filters[any]) url.Values
- func FormatNextURL[R resource.Resource](ctx context.Context, r []R, req protoreflect.ProtoMessage) string
- func GetFilterSingleOrArrayVal[T any](fName string, filters Filters[any]) []T
- func GetFilterVal[T any](fName string, filters Filters[any]) T
- func GetFilterValOrDefault[T any](fName string, filters Filters[any], def T) T
- func MarshalOperator(op filter.Operator) string
- func PaginationToURLValues(p *PaginationParams) url.Values
- func ParseOperator(val string) filter.Operator
- func SortingToURLValue(sp *SortingParams) string
- func SparseFieldsetsToURLValues(fields SparseFieldsets) url.Values
- func UpdateFilter[T any](q Query, name string, ...)
- func Validate(q Query, opts ...ValidationOpt) error
- type Cursor
- type Filters
- type Option
- func CursorPagination(before, after string, size int) Option
- func Fields(resourceType string, names ...string) Option
- func Filter(f filter.FieldFilter[any]) Option
- func FilterBy(op filter.Operator, fieldName, val any) Option
- func FilterByTriples(opFieldVals ...any) Option
- func IncludedResourceObjects(relationshipNames ...string) Option
- func Pagination(limit, offset int) Option
- func ParseOptsFromHTTPReq(r *http.Request, opts ...ParseOpt) ([]Option, error)
- func ParseURLQueryOpts(uri *url.URL, parseOpts ...ParseOpt) ([]Option, error)
- func SortBy(sortParams ...any) Option
- type PaginationParams
- type ParseOpt
- type Query
- type SortingDir
- type SortingParams
- type SparseFieldsets
- type ValidationFunc
- type ValidationOpt
Constants ¶
const ( FieldNameQuery = "query" FieldNamePagination = "pagination" FieldNameSorting = "sorting" FieldNameIncludes = "includes" )
Variables ¶
var ( ErrInvalidFilterFormat = errors.New("filter format should be filter[field][operator]") ErrInvalidOperator = errors.New("invalid operator") //nolint:gochecknoglobals // map is used in every GET request with filters, it's more efficient to keep it global Operators = map[string]filter.Operator{ "eq": filter.OpEq, "ne": filter.OpNEq, "gt": filter.OpGT, "gte": filter.OpGTEq, "lt": filter.OpLT, "lte": filter.OpLTEq, "in": filter.OpIn, "not-in": filter.OpNotIn, "like": filter.OpLike, "not-like": filter.OpNotLike, "btw": filter.OpBetween, "any": filter.OpContains, "any-like": filter.OpContainsLike, "is-null": filter.OpIsNull, "not-null": filter.OpNotNull, } //nolint:gochecknoglobals // map is used in every GET request with filters, it's more efficient to keep it global OperatorStrings = map[filter.Operator]string{ filter.OpEq: "eq", filter.OpNEq: "ne", filter.OpGT: "gt", filter.OpGTEq: "gte", filter.OpLT: "lt", filter.OpLTEq: "lte", filter.OpIn: "in", filter.OpNotIn: "not-in", filter.OpLike: "like", filter.OpNotLike: "not-like", filter.OpBetween: "btw", filter.OpContains: "any", filter.OpContainsLike: "any-like", filter.OpIsNull: "is-null", filter.OpNotNull: "not-null", } )
Functions ¶
func AddFilterParam ¶
func AddFilterParam(queryParams url.Values, fieldName string, operator filter.Operator, value interface{})
AddFilterParam is a convenience function to add a single filter parameter
func DecodePositionCursor ¶
DecodePositionCursor reverses EncodePositionCursor. Returns the zero values when the cursor is empty or malformed; callers should treat a zero return as "no cursor".
func DoesInclude ¶
func EncodePositionCursor ¶
EncodePositionCursor builds the opaque page[after] / page[before] value: base64(`<RFC3339Nano>|<uuid>`). Position only — filters and sort travel as their own query params, never inside the cursor.
func FiltersToURLValues ¶
FiltersToURLValues converts query filters to url.Values with proper JSON:API format The format follows: filter[field][operator]=value
func FormatNextURL ¶
func FormatNextURL[R resource.Resource](ctx context.Context, r []R, req protoreflect.ProtoMessage) string
FormatNextURL builds the JSON:API §Pagination `links.next` URL for the supplied result page. It preserves every filter / sort / include / fields[] param that came in on req and adds (or replaces) `page[after]=<opaqueCursor>` plus `page[size]=<limit>`.
Returns "" when the result set is empty, when the request was a fetch-by-id (no pagination needed), or when the gRPC metadata doesn't contain the forwarded host / path.
func GetFilterValOrDefault ¶
func MarshalOperator ¶
func PaginationToURLValues ¶
func PaginationToURLValues(p *PaginationParams) url.Values
func ParseOperator ¶
func SortingToURLValue ¶
func SortingToURLValue(sp *SortingParams) string
func SparseFieldsetsToURLValues ¶
func SparseFieldsetsToURLValues(fields SparseFieldsets) url.Values
func UpdateFilter ¶
func Validate ¶
func Validate(q Query, opts ...ValidationOpt) error
Types ¶
type Option ¶
type Option func(q *query)
func CursorPagination ¶
func FilterByTriples ¶
func IncludedResourceObjects ¶
func Pagination ¶
func ParseOptsFromHTTPReq ¶
func ParseURLQueryOpts ¶
type PaginationParams ¶
func (*PaginationParams) Delete ¶
func (p *PaginationParams) Delete()
func (*PaginationParams) IsCursor ¶
func (p *PaginationParams) IsCursor() bool
type ParseOpt ¶
type ParseOpt func(c *parseConfig)
func DefaultPagination ¶
func SkipDefaultPagination ¶
func SkipDefaultPagination() ParseOpt
type Query ¶
type Query interface {
Filters() Filters[any]
Sorting() *SortingParams
Merge(q Query)
Pagination() *PaginationParams
IncludedResourceObjects() []string
Fields() SparseFieldsets
Equal(another Query) bool
}
type SortingDir ¶
type SortingDir uint
const ( SortDirUndefined SortingDir = iota SortAsc SortDesc )
func (SortingDir) String ¶
func (sd SortingDir) String() string
func (SortingDir) Valid ¶
func (sd SortingDir) Valid() bool
type SortingParams ¶
type SortingParams struct {
// contains filtered or unexported fields
}
func (*SortingParams) Get ¶
func (sp *SortingParams) Get(key string) SortingDir
func (*SortingParams) Keys ¶
func (sp *SortingParams) Keys() []string
func (*SortingParams) Set ¶
func (sp *SortingParams) Set(key string, v SortingDir)
type SparseFieldsets ¶
type ValidationFunc ¶
type ValidationFunc func(f filter.FieldFilter[any]) error
type ValidationOpt ¶
type ValidationOpt func(c *validator) error
func AtLeastOneFilter ¶
func AtLeastOneFilter() ValidationOpt
func GroupedFilters ¶
func GroupedFilters(fs ...string) ValidationOpt
func MandatoryFilters ¶
func MandatoryFilters(fs ...string) ValidationOpt
func OptionalFilters ¶
func OptionalFilters(fs ...string) ValidationOpt
func SortFields ¶
func SortFields(fs ...string) ValidationOpt
func ValidFilter ¶
func ValidFilter(field string, fs ...ValidationFunc) ValidationOpt