types

package
v0.0.0-...-bb56650 Latest Latest
Warning

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

Go to latest
Published: Feb 20, 2024 License: MIT Imports: 23 Imported by: 0

Documentation

Overview

Package types provides Go types matching BSON types that don't have built-in Go equivalents.

All BSON types have four representations in FerretDB:

  1. As they are used in "business logic" / handlers - `types` package.
  2. As they are used for logging - `fjson` package.
  3. As they are used in the wire protocol implementation - `bson` package.
  4. As they are used to store data in SQL based databases - `sjson` package.

The reason for that is a separation of concerns: to avoid method names clashes, to simplify type asserts, to make refactorings and optimizations easier, etc.

Mapping

Composite types (passed by pointers)

Alias      types package    Description

object     *types.Document  Document
array      *types.Array     Array

Scalar types (passed by values)

Alias      types package    Description

double     float64          64-bit binary floating point
string     string           UTF-8 string
binData    types.Binary     Binary data
objectId   types.ObjectID   Object ID
bool       bool             Boolean
date       time.Time        UTC datetime
null       types.NullType   Null
regex      types.Regex      Regular expression
int        int32            32-bit integer
timestamp  types.Timestamp  Timestamp
long       int64            64-bit integer

Index

Constants

View Source
const (
	// BinaryGeneric represents a BSON generic binary subtype.
	BinaryGeneric = BinarySubtype(0x00) // generic

	// BinaryFunction represents a BSON function.
	BinaryFunction = BinarySubtype(0x01) // function

	// BinaryGenericOld represents a BSON generic-old.
	BinaryGenericOld = BinarySubtype(0x02) // generic-old

	// BinaryUUIDOld represents a BSON UUID old.
	BinaryUUIDOld = BinarySubtype(0x03) // uuid-old

	// BinaryUUID represents a BSON UUID.
	BinaryUUID = BinarySubtype(0x04) // uuid

	// BinaryMD5 represents a BSON md5.
	BinaryMD5 = BinarySubtype(0x05) // md5

	// BinaryEncrypted represents a Encrypted BSON value.
	BinaryEncrypted = BinarySubtype(0x06) // encrypted

	// BinaryUser represents a  User defined.
	BinaryUser = BinarySubtype(0x80) // user
)
View Source
const MaxDocumentLen = 16 * 1024 * 1024 // 16 MiB = 16777216 bytes

MaxDocumentLen is the maximum BSON object size.

View Source
const MaxSafeDouble = float64(1<<53 - 1) // 52bit mantissa max value = 9007199254740991

MaxSafeDouble is the maximum double value that can be represented precisely.

View Source
const ObjectIDLen = 12

ObjectIDLen is an ObjectID length in bytes.

Variables

View Source
var (
	// ErrOptionNotImplemented indicates unimplemented regex option.
	ErrOptionNotImplemented = fmt.Errorf("regex: option not implemented")

	// ErrMissingParen indicates missing parentheses in regex expression.
	ErrMissingParen = fmt.Errorf("Regular expression is invalid: missing )")

	// ErrMissingBracket indicates missing terminating ] for character class.
	ErrMissingBracket = fmt.Errorf("Regular expression is invalid: missing terminating ] for character class")

	// ErrInvalidEscape indicates invalid escape errors.
	ErrInvalidEscape = fmt.Errorf("Regular expression is invalid: PCRE does not support \\L, \\l, \\N{name}, \\U, or \\u")

	// ErrMissingTerminator indicates syntax error in subpattern name (missing terminator).
	ErrMissingTerminator = fmt.Errorf("Regular expression is invalid: syntax error in subpattern name (missing terminator)")

	// ErrUnmatchedParentheses indicates unmatched parentheses.
	ErrUnmatchedParentheses = fmt.Errorf("Regular expression is invalid: unmatched parentheses")

	// ErrTrailingBackslash indicates \\ at end of the pattern.
	ErrTrailingBackslash = fmt.Errorf("Regular expression is invalid: \\ at end of pattern")

	// ErrNothingToRepeat indicates invalid regex: nothing to repeat.
	ErrNothingToRepeat = fmt.Errorf("Regular expression is invalid: nothing to repeat")

	// ErrInvalidClassRange indicates that range out of order in character class.
	ErrInvalidClassRange = fmt.Errorf("Regular expression is invalid: range out of order in character class")

	// ErrUnsupportedPerlOp indicates unrecognized character after the grouping sequence start.
	ErrUnsupportedPerlOp = fmt.Errorf("Regular expression is invalid: unrecognized character after (? or (?-")

	// ErrInvalidRepeatSize indicates that the regular expression is too large.
	ErrInvalidRepeatSize = fmt.Errorf("Regular expression is invalid: regular expression is too large")
)
View Source
var Null = NullType{}

Null represents BSON value Null.

Functions

func FormatAnyValue

func FormatAnyValue(value any) string

FormatAnyValue formats BSON value for error message output.

func Identical

func Identical(a, b any) bool

Identical returns true if a and b are the same type and has the same value.

func IsConflictPath

func IsConflictPath(paths []Path, path Path) error

IsConflictPath returns PathError error if adding a path creates conflict at any of paths. Returned PathError error codes:

  • ErrPathConflictOverwrite when path overwrites any paths: paths = []{{"a","b"}} path = {"a"};
  • ErrPathConflictCollision when path creates collision: paths = []{{"a"}} path = {"a","b"};

func RemoveByPath

func RemoveByPath[T CompositeTypeInterface](comp T, path Path)

RemoveByPath removes document by path, doing nothing if the key does not exist.

Types

type Array

type Array struct {
	// contains filtered or unexported fields
}

Array represents BSON array: an ordered collection of BSON values, accessed by 0-based indexes.

Zero value is a valid empty array.

func MakeArray

func MakeArray(capacity int) *Array

MakeArray creates an empty array with set capacity.

func NewArray

func NewArray(values ...any) (*Array, error)

NewArray creates an array with the given values.

It panics if any of the values is not a valid BSON type.

func (*Array) Append

func (a *Array) Append(values ...any)

Append appends given values to the array.

It panics if any of the values is not a valid BSON type.

func (*Array) Contains

func (a *Array) Contains(filterValue any) bool

Contains checks if the Array contains the given value.

It panics if the filterValue is not a valid BSON type.

func (*Array) ContainsAll

func (a *Array) ContainsAll(b *Array) bool

ContainsAll checks if Array a contains all the given values of Array b. Currently, this algorithm is O(n^2) without any performance tuning. This place can be significantly improved if a more performant algorithm is chosen.

func (*Array) DeepCopy

func (a *Array) DeepCopy() *Array

DeepCopy returns an unfrozen deep copy of this Array.

func (*Array) FilterArrayByType

func (a *Array) FilterArrayByType(ref any) *Array

FilterArrayByType returns a new array which contains only values of the same BSON type as ref. All numbers are treated as the same type.

func (*Array) Freeze

func (a *Array) Freeze()

Freeze prevents array from further modifications. Any methods that would modify the array will panic.

It is safe to call Freeze multiple times.

func (*Array) Get

func (a *Array) Get(index int) (any, error)

Get returns a value at the given index.

func (*Array) GetByPath

func (a *Array) GetByPath(path Path) (any, error)

GetByPath returns a value by path.

func (*Array) Iterator

func (a *Array) Iterator() iterator.Interface[int, any]

Iterator returns an iterator for the array.

func (*Array) Len

func (a *Array) Len() int

Len returns the number of values in the array.

It returns 0 for nil Array.

func (*Array) Max

func (a *Array) Max() any

Max returns the maximum value from the array.

func (*Array) Min

func (a *Array) Min() any

Min returns the minimum value from the array.

func (*Array) Remove

func (a *Array) Remove(index int)

Remove removes the value at the given index.

func (*Array) RemoveByPath

func (a *Array) RemoveByPath(path Path)

RemoveByPath removes (cuts) value by path, doing nothing if path points to nothing.

func (*Array) Set

func (a *Array) Set(index int, value any) error

Set sets the value at the given index.

It panics if the value is not a valid BSON type.

type Binary

type Binary struct {
	Subtype BinarySubtype
	B       []byte
}

Binary represents BSON type Binary.

type BinarySubtype

type BinarySubtype byte

BinarySubtype represents BSON Binary's subtype.

func (BinarySubtype) String

func (i BinarySubtype) String() string

type CompareResult

type CompareResult int8

CompareResult represents the result of a comparison.

const (
	Equal   CompareResult = 0  // ==
	Less    CompareResult = -1 // <
	Greater CompareResult = 1  // >
)

Values match results of comparison functions such as bytes.Compare. They do not match MongoDB SortType values where 1 means ascending order and -1 means descending.

func Compare

func Compare(docValue, filterValue any) CompareResult

Compare compares any BSON values in the same way as MongoDB does it for filtering.

It converts types as needed; that may result in different types being equal. For that reason, it typically should not be used in tests.

Compare and contrast with test helpers in testutil package.

func CompareForAggregation

func CompareForAggregation(docValue, filterValue any) CompareResult

CompareForAggregation compares bson values. Unlike `Compare`, an array and non array would not result in Equal. This is specially used for aggregation grouping comparison.

func CompareOrder

func CompareOrder(a, b any, order SortType) CompareResult

CompareOrder detects the data type for two values and compares them. When the types are equal, it compares their values using Compare. This is used by update operator $max.

func CompareOrderForOperator

func CompareOrderForOperator(a, b any, order SortType) CompareResult

CompareOrderForOperator detects the data type for two values and compares them. If a is an array, the array is filtered by the same type as b type. It is used by $gt, $gte, $lt and $lte comparison.

func CompareOrderForSort

func CompareOrderForSort(a, b any, order SortType) CompareResult

CompareOrderForSort detects the data type for two values and compares them. If a or b is array, the minimum element of each array is used for Ascending sort, and maximum element for Descending sort. Hence, an array is used for type comparison and value comparison. Empty Array is smaller than Null.

This is used by sort operation.

func (CompareResult) String

func (i CompareResult) String() string

type CompositeType

type CompositeType interface {
	*Document | *Array
}

CompositeType represents composite type - *Document or *Array.

type CompositeTypeInterface

type CompositeTypeInterface interface {
	CompositeType

	GetByPath(path Path) (any, error)
	RemoveByPath(path Path)
	// contains filtered or unexported methods
}

CompositeTypeInterface consists of Document and Array.

type Document

type Document struct {
	// contains filtered or unexported fields
}

Document represents BSON document: an ordered collection of fields (key/value pairs where key is a string and value is any BSON value).

Data documents (that are stored in the backend) have a special RecordID property that is not a field and can't be accessed by most methods. It is used to locate the document in the backend.

func ConvertDocument

func ConvertDocument(d document) (*Document, error)

ConvertDocument converts bson.Document to *types.Document. It references the same data without copying it.

Remove this function. TODO https://github.com/FerretDB/FerretDB/issues/260

func MakeDocument

func MakeDocument(capacity int) *Document

MakeDocument creates an empty document with set capacity.

func NewDocument

func NewDocument(pairs ...any) (*Document, error)

NewDocument creates a document with the given key/value pairs.

func (*Document) Command

func (d *Document) Command() string

Command returns the first document's key. This is often used as a command name. It returns an empty string if document is nil or empty.

func (*Document) DeepCopy

func (d *Document) DeepCopy() *Document

DeepCopy returns an unfrozen deep copy of this Document. RecordID is copied too.

func (*Document) FindDuplicateKey

func (d *Document) FindDuplicateKey() (string, bool)

FindDuplicateKey returns the first duplicate key in the document and true if duplicate exists. If duplicate keys don't exist it returns empty string and false.

func (*Document) Freeze

func (d *Document) Freeze()

Freeze prevents document from further field modifications. Any methods that would modify document fields will panic.

RecordID modification is not prevented.

It is safe to call Freeze multiple times.

func (*Document) Get

func (d *Document) Get(key string) (any, error)

Get returns a value at the given key. If the key is duplicated, it panics. It returns nil for nil Document.

The only possible error is returned for a missing key. In that case, Get returns nil for the value. The new code is encouraged to do this:

v, _ := d.Get("key")
if v == nil { ... }

The error value will be removed in the future.

func (*Document) GetByPath

func (d *Document) GetByPath(path Path) (any, error)

GetByPath returns a value by path. If the Path has only one element, it returns the value for the given key.

func (*Document) Has

func (d *Document) Has(key string) bool

Has returns true if the given key is present in the document.

func (*Document) HasByPath

func (d *Document) HasByPath(path Path) bool

HasByPath returns true if the given path is present in the document.

func (*Document) Iterator

func (d *Document) Iterator() iterator.Interface[string, any]

Iterator returns an iterator over the document fields.

It returns valid (done) iterator for nil Document.

func (*Document) Keys

func (d *Document) Keys() []string

Keys returns a copy of document's keys.

If there are duplicate keys in the document, the result will have duplicate keys too.

If document or document's fields are not set (nil), it returns nil.

func (*Document) Len

func (d *Document) Len() int

Len returns the number of fields in the document.

It returns 0 for nil Document.

func (*Document) Map

func (d *Document) Map() map[string]any

Map returns this document as a map. Do not modify it.

If there are duplicate keys in the document, the last value is set in the corresponding field.

It returns nil for nil Document.

func (*Document) RecordID

func (d *Document) RecordID() int64

RecordID returns the document's RecordID (that is 0 by default).

func (*Document) Remove

func (d *Document) Remove(key string) any

Remove the given key and return its value, or nil if the key does not exist. If the key is duplicated, it panics.

func (*Document) RemoveByPath

func (d *Document) RemoveByPath(path Path)

RemoveByPath removes document by path, doing nothing if the key does not exist. If the Path has only one element, it removes the value for the given key.

func (*Document) Set

func (d *Document) Set(key string, value any)

Set sets the value for the given key, replacing any existing value. If the key is duplicated, it panics. If the key doesn't exist, it will be set.

As a special case, _id always becomes the first key.

func (*Document) SetByPath

func (d *Document) SetByPath(path Path, value any) error

SetByPath sets value by given path. If the Path has only one element, it sets the value for the given key. If some parts of the path are missing, they will be created. The Document type will be used to create these parts. If multiple fields match the path it panics.

func (*Document) SetRecordID

func (d *Document) SetRecordID(recordID int64)

SetRecordID sets the document's RecordID.

func (*Document) SortFieldsByKey

func (d *Document) SortFieldsByKey()

SortFieldsByKey sorts the document fields by ascending order of the key.

func (*Document) ValidateData

func (d *Document) ValidateData() error

ValidateData checks if the document represents a valid "data document". It places `_id` field into the fields slice 0 index. It replaces negative zero -0 with valid positive zero 0. If the document is not valid it returns *ValidationError.

func (*Document) Values

func (d *Document) Values() []any

Values returns a copy of document's values in the same order as Keys().

If document or document's fields are not set (nil), it returns nil.

type DocumentsIterator

type DocumentsIterator iterator.Interface[struct{}, *Document]

DocumentsIterator represents an iterator over documents (slice, query results, etc).

Key/index is not used there because it is unclear what it should be in the filter/sort/limit/skip chain, and it is not used anyway.

type NullType

type NullType struct{}

NullType represents BSON type Null.

Most callers should use types.Null value instead.

type ObjectID

type ObjectID [ObjectIDLen]byte

ObjectID represents BSON type ObjectID.

Normally, it is generated by the driver, but in some cases (like upserts) FerretDB has to do itself.

func NewObjectID

func NewObjectID() ObjectID

NewObjectID returns a new ObjectID.

type Path

type Path struct {
	// contains filtered or unexported fields
}

Path represents a parsed dot notation - a sequence of elements (document keys and array indexes) separated by dots.

Path's elements can't be empty, include dots or spaces.

Path should be stored and passed as a value. Its methods return new values, not modifying the receiver's state.

func NewPathFromString

func NewPathFromString(s string) (Path, error)

NewPathFromString returns Path from a given dot notation.

It returns an error if the path is invalid.

func NewStaticPath

func NewStaticPath(path ...string) Path

NewStaticPath returns Path from a strings slice.

It panics on invalid paths. For that reason, it should not be used with user-provided paths.

func (Path) Append

func (p Path) Append(elem string) Path

Append returns new Path constructed from the current path and given element.

func (Path) Len

func (p Path) Len() int

Len returns path length.

func (Path) Prefix

func (p Path) Prefix() string

Prefix returns the first path element.

func (Path) Slice

func (p Path) Slice() []string

Slice returns path elements array.

func (Path) String

func (p Path) String() string

String returns a dot notation for that path.

func (Path) Suffix

func (p Path) Suffix() string

Suffix returns the last path element.

func (Path) TrimPrefix

func (p Path) TrimPrefix() Path

TrimPrefix returns a copy of path without the first element.

func (Path) TrimSuffix

func (p Path) TrimSuffix() Path

TrimSuffix returns a path without the last element.

type PathError

type PathError struct {
	// contains filtered or unexported fields
}

PathError describes an error that could occur on path related operations.

func (*PathError) Code

func (e *PathError) Code() PathErrorCode

Code returns the PathError code.

func (*PathError) Error

func (e *PathError) Error() string

Error implements the error interface.

type PathErrorCode

type PathErrorCode int

PathErrorCode represents PathError code.

const (

	// ErrPathElementEmpty indicates that provided path contains an empty element.
	ErrPathElementEmpty PathErrorCode

	// ErrPathElementInvalid indicates that provided path contains an invalid element (other than empty).
	ErrPathElementInvalid

	// ErrPathKeyNotFound indicates that key was not found in document.
	ErrPathKeyNotFound

	// ErrPathIndexInvalid indicates that provided array index is invalid.
	ErrPathIndexInvalid

	// ErrPathIndexOutOfBound indicates that provided array index is out of bound.
	ErrPathIndexOutOfBound

	// ErrPathCannotAccess indicates that path couldn't be accessed.
	ErrPathCannotAccess

	// ErrPathCannotCreateField indicates that it's impossible to create a specific field.
	ErrPathCannotCreateField

	// ErrPathConflictOverwrite indicates a path overwrites another path.
	ErrPathConflictOverwrite

	// ErrPathConflictCollision indicates a path creates collision at another path.
	ErrPathConflictCollision
)

func (PathErrorCode) String

func (i PathErrorCode) String() string

type Regex

type Regex struct {
	Pattern string
	Options string
}

Regex represents BSON type Regex.

func (Regex) Compile

func (r Regex) Compile() (*regexp.Regexp, error)

Compile returns Go Regexp object.

type ScalarType

type ScalarType interface {
	float64 | string | Binary | ObjectID | bool | time.Time | NullType | Regex | int32 | Timestamp | int64
}

ScalarType represents scalar type.

type SortType

type SortType int8

SortType represents sort type for $sort aggregation.

const (
	// Ascending is used for sort in ascending order.
	Ascending SortType = 1

	// Descending is used for sort in descending order.
	Descending SortType = -1
)

func (SortType) String

func (i SortType) String() string

type Timestamp

type Timestamp uint64

Timestamp represents BSON type Timestamp.

func NewTimestamp

func NewTimestamp(t time.Time, c uint32) Timestamp

NewTimestamp returns the timestamp for the given time and counter values.

func NextTimestamp

func NextTimestamp(t time.Time) Timestamp

NextTimestamp returns the next timestamp for the given time value.

func (Timestamp) Signed

func (ts Timestamp) Signed() int64

Signed returns the timestamp as a signed value.

func (Timestamp) Time

func (ts Timestamp) Time() time.Time

Time returns timestamp's time component.

type Type

type Type interface {
	ScalarType | CompositeType
}

Type represents any BSON type (scalar or composite).

type ValidationError

type ValidationError struct {
	// contains filtered or unexported fields
}

ValidationError describes an error that could occur when validating a document.

func (*ValidationError) Code

Code returns the ValidationError code.

func (*ValidationError) Error

func (e *ValidationError) Error() string

Error implements the error interface.

type ValidationErrorCode

type ValidationErrorCode int

ValidationErrorCode represents ValidationData error code.

const (

	// ErrValidation indicates that document is invalid.
	ErrValidation ValidationErrorCode

	// ErrWrongIDType indicates that _id field is invalid.
	ErrWrongIDType

	// ErrIDNotFound indicates that _id field is not found.
	ErrIDNotFound
)

func (ValidationErrorCode) String

func (i ValidationErrorCode) String() string

Directories

Path Synopsis
Package fjson provides converters to FJSON (JSON with some extensions) for built-in and `types` types.
Package fjson provides converters to FJSON (JSON with some extensions) for built-in and `types` types.

Jump to

Keyboard shortcuts

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