Documentation ¶
Index ¶
- Constants
- Variables
- func ApplyBackwardCompatibilityRules(existing *DefaultCollection, current *Factory) error
- func ApplySearchIndexBackwardCompatibilityRules(existing *SearchIndex, current *SearchFactory) error
- func DefaultFacetableType(fieldType FieldType) bool
- func DefaultSortableType(fieldType FieldType) bool
- func Generate(jsonSchema []byte, format string) ([]byte, error)
- func Infer(sch *schema.Schema, name string, docs [][]byte, primaryKey []string, ...) error
- func IsPrimitiveType(fieldType FieldType) bool
- func IsReservedField(name string) bool
- func IsSearchID(name string) bool
- func IsValidKeyType(t FieldType) bool
- func RemoveIndexingVersion(schema jsoniter.RawMessage) jsoniter.RawMessage
- func SetIndexingVersion(factory *Factory) error
- func SupportedFacetableType(fieldType FieldType, subType FieldType) bool
- func SupportedIndexableType(fieldType FieldType) bool
- func SupportedSearchIndexableType(fieldType FieldType, subType FieldType) bool
- func ToSearchDateKey(key string) string
- func ValidateFieldAttributes(isSearch bool, field *Field) error
- func ValidateFieldBuilder(f FieldBuilder) error
- func ValidateSupportedProperties(v []byte) error
- type CollectionType
- type DefaultCollection
- func (d *DefaultCollection) AddSearchIndex(index *SearchIndex)
- func (d *DefaultCollection) CompatibleSchemaSince(version int32) bool
- func (d *DefaultCollection) GetActiveIndexedFields() []*QueryableField
- func (d *DefaultCollection) GetField(name string) *Field
- func (d *DefaultCollection) GetFields() []*Field
- func (d *DefaultCollection) GetImplicitSearchIndex() *ImplicitSearchIndex
- func (d *DefaultCollection) GetIndexedFields() []*QueryableField
- func (d *DefaultCollection) GetIndexes() *Indexes
- func (d *DefaultCollection) GetInt64FieldsPath() map[string]struct{}
- func (d *DefaultCollection) GetName() string
- func (d *DefaultCollection) GetPrimaryKey() *Index
- func (d *DefaultCollection) GetQueryableField(name string) (*QueryableField, error)
- func (d *DefaultCollection) GetQueryableFields() []*QueryableField
- func (d *DefaultCollection) GetVersion() int32
- func (d *DefaultCollection) GetWriteModeIndexes() []*QueryableField
- func (d *DefaultCollection) LookupFieldVersion(keyPath []string) []*FieldVersion
- func (d *DefaultCollection) SecondaryIndexKeyword() string
- func (d *DefaultCollection) TaggedDefaultsForInsert() map[string]struct{}
- func (d *DefaultCollection) TaggedDefaultsForUpdate() map[string]struct{}
- func (d *DefaultCollection) Type() CollectionType
- func (d *DefaultCollection) UpdateRowSchema(doc map[string]any, version int32)
- func (d *DefaultCollection) UpdateRowSchemaRaw(doc []byte, version int32) ([]byte, error)
- func (d *DefaultCollection) Validate(document interface{}) error
- type Factory
- type FactoryBuilder
- type Field
- func (f *Field) GetDefaulter() *FieldDefaulter
- func (f *Field) GetDimensions() int
- func (f *Field) GetNestedField(name string) *Field
- func (f *Field) IsAutoGenerated() bool
- func (f *Field) IsCompatible(keyPath string, f1 *Field) error
- func (f *Field) IsFaceted() bool
- func (f *Field) IsIndexable() bool
- func (f *Field) IsIndexed() bool
- func (f *Field) IsMap() bool
- func (f *Field) IsPrimaryKey() bool
- func (f *Field) IsSearchId() bool
- func (f *Field) IsSearchIndexed() bool
- func (f *Field) IsSorted() bool
- func (f *Field) Name() string
- func (f *Field) Type() FieldType
- type FieldBuilder
- type FieldDefaulter
- type FieldSchemaValidator
- type FieldType
- type FieldVersion
- type FieldVersions
- type ImplicitSearchIndex
- type Index
- type IndexState
- type IndexType
- type Indexes
- type JSONSchema
- type PrimaryIndexSchemaValidator
- type QueryableField
- type QueryableFieldsBuilder
- type ReservedField
- type SearchFactory
- type SearchIdSchemaValidator
- type SearchIndex
- func (s *SearchIndex) GetField(name string) *Field
- func (s *SearchIndex) GetInt64FieldsPath() map[string]struct{}
- func (s *SearchIndex) GetQueryableField(name string) (*QueryableField, error)
- func (s *SearchIndex) GetSearchDeltaFields(existingFields []*QueryableField, fieldsInSearch []tsApi.Field) []tsApi.Field
- func (s *SearchIndex) StoreIndexName() string
- func (s *SearchIndex) Validate(doc map[string]any) error
- type SearchIndexSourceValidator
- type SearchIndexValidator
- type SearchJSONSchema
- type SearchSource
- type SearchSourceType
- type Validator
- type Version
- type VersionDelta
- type VersionDeltaField
- type Versions
Constants ¶
const ( PrimaryKeyIndexName = "pkey" AutoPrimaryKeyF = "id" PrimaryKeySchemaK = "primary_key" // DateTimeFormat represents the supported date time format. DateTimeFormat = time.RFC3339Nano CollectionTypeF = "collection_type" IndexingSchemaVersionKey = "indexing_version" DefaultIndexingSchemaVersion = "v1" SecondaryKeyIndexName = "skey" )
const (
ObjFlattenDelimiter = "."
)
const (
SearchId = "id"
)
Variables ¶
var ( MsgFieldNameInvalidPattern = "" /* 131-byte string literal not displayed */ ValidFieldNamePattern = regexp.MustCompile(`^[a-zA-Z_$][a-zA-Z0-9_$]*$`) )
var ( ErrIncompatibleSchema = fmt.Errorf("error incompatible schema") ErrExpectedString = fmt.Errorf("expected string type") ErrExpectedNumber = fmt.Errorf("expected json.Number") ErrUnsupportedType = fmt.Errorf("unsupported type") )
Supported subtypes.
var ( ErrCollectionNameMismatch = errors.InvalidArgument("mismatch in the collection name") ErrIndexNameMismatch = errors.InvalidArgument("mismatch in the index name") )
var FieldNames = [...]string{ UnknownType: "unknown", NullType: "null", BoolType: "bool", Int32Type: "int32", Int64Type: "int64", DoubleType: "double", StringType: "string", ByteType: "byte", UUIDType: "uuid", DateTimeType: "datetime", ArrayType: "array", ObjectType: "object", VectorType: "vector", }
var ReservedFields = [...]string{ CreatedAt: "_tigris_created_at", UpdatedAt: "_tigris_updated_at", Metadata: "_tigris_metadata", IdToSearchKey: "_tigris_id", DateSearchKeyPrefix: "_tigris_date_", SearchArrNullItem: "_tigris_null", SearchNullKeys: "_tigris_null_keys", }
var SupportedFieldProperties = container.NewHashSet(
"type",
"format",
"items",
"maxLength",
"description",
"contentEncoding",
"properties",
"autoGenerate",
"sorted",
"sort",
"index",
"facet",
"searchIndex",
"default",
"createdAt",
"updatedAt",
"title",
"required",
"index",
"facet",
"searchIndex",
"maxItems",
"additionalProperties",
"dimensions",
"id",
)
Functions ¶
func ApplyBackwardCompatibilityRules ¶
func ApplyBackwardCompatibilityRules(existing *DefaultCollection, current *Factory) error
ApplyBackwardCompatibilityRules is to validate incoming collection request against the existing present collection. It performs following validations,
- Primary Key Changed, or order of fields part of the primary key is changed
- Collection name change
- A validation on field property is also applied like for instance if existing field has some property, but it is removed in the new schema
- Any index exist on the collection will also have same checks like type, etc
func ApplySearchIndexBackwardCompatibilityRules ¶
func ApplySearchIndexBackwardCompatibilityRules(existing *SearchIndex, current *SearchFactory) error
ApplySearchIndexBackwardCompatibilityRules is to validate incoming index schema against the existing index version. It performs following validations,
- Collection name change.
- A validation on field like changing the type is not allowed.
- A validation on index source, it is defined during index creation and should not change afterwards.
func DefaultFacetableType ¶
DefaultFacetableType are the types for which faceting is automatically enabled for database collections.
func DefaultSortableType ¶
DefaultSortableType are the types for which sorting is automatically enabled.
func IsPrimitiveType ¶
func IsReservedField ¶
func IsSearchID ¶
func IsValidKeyType ¶
func RemoveIndexingVersion ¶
func RemoveIndexingVersion(schema jsoniter.RawMessage) jsoniter.RawMessage
func SetIndexingVersion ¶
func SupportedFacetableType ¶
func SupportedIndexableType ¶
func ToSearchDateKey ¶
ToSearchDateKey can be used to generate storage field for search backend Original date strings are persisted as it is under this field.
func ValidateFieldAttributes ¶
ValidateFieldAttributes is validated when a schema request is received. Each builder(collection/search) calls this method to validate if field is properly formed. This is done outside the fieldBuilder to avoid doing validation during reloading of schemas. This method recursively checks each field that whether the attributes are properly set or not.
func ValidateFieldBuilder ¶
func ValidateFieldBuilder(f FieldBuilder) error
ValidateFieldBuilder is to validate before building a field. This is done because there are some validation that can't be caught in the "ValidateFieldAttributes" like the values for default fields. Anything that needs to be validated on builder and can't be done on field has to be done here. Similar to ValidateFieldAttributes, this is also only done during incoming requests and ignored during reloading of schemas.
func ValidateSupportedProperties ¶
ValidateSupportedProperties to validate what all JSON tagging is allowed on a field. We can extend this to also validate based on whether the schema is for search or for collection.
Types ¶
type CollectionType ¶
type CollectionType string
const (
DocumentsType CollectionType = "documents"
)
func GetCollectionType ¶
func GetCollectionType(_ jsoniter.RawMessage) (CollectionType, error)
type DefaultCollection ¶
type DefaultCollection struct { // Id is the dictionary encoded value for this collection. Id uint32 // SchVer returns the schema version SchVer int // Name is the name of the collection. Name string // EncodedName is the encoded name of the collection. EncodedName []byte // EncodedTableIndexName is the encoded name of the collection's Secondary Index. EncodedTableIndexName []byte // Fields are derived from the user schema. Fields []*Field // Indexes is a wrapper on the indexes part of this collection. // Primary Key contains the fields used to make up the primary key PrimaryKey *Index // Secondary SecondaryIndexes for this collection SecondaryIndexes *Indexes // Validator is used to validate the JSON document. As it is expensive to create this, it is only created once // during constructor of the collection. Validator *jsonschema.Schema // JSON schema Schema jsoniter.RawMessage // SchemaDeltas contains incompatible schema changes from version to version SchemaDeltas []VersionDelta // FieldVersions contains the list of schema versions at which the field had incompatible change FieldVersions map[string]*FieldVersions // ImplicitSearchIndex is created by the Tigris to use a search index for in-memory indexes. This is needed till we move // to secondary indexes which will be stored in FDB. ImplicitSearchIndex *ImplicitSearchIndex // search indexes are indexes that are explicitly created by the user and tagged Tigris as source. Collection will be // responsible for ensuring these indexes are in sync when any mutation happens to this collection. SearchIndexes map[string]*SearchIndex // QueryableFields are similar to Fields but these are flattened forms of fields. For instance, a simple field // will be one to one mapped to queryable field but complex fields like object type field there may be more than // one queryableFields. As queryableFields represent a flattened state these can be used as-is to index in memory. QueryableFields []*QueryableField // CollectionType is the type of the collection. Only two types of collections are supported "messages" and "documents" CollectionType CollectionType // This is the existing fields in search FieldsInSearch []tsApi.Field // contains filtered or unexported fields }
DefaultCollection is used to represent a collection. The tenant in the metadata package is responsible for creating the collection.
func NewDefaultCollection ¶
func NewDefaultCollection(id uint32, schVer int, factory *Factory, schemas Versions, implicitSearchIndex *ImplicitSearchIndex, ) (*DefaultCollection, error)
func (*DefaultCollection) AddSearchIndex ¶
func (d *DefaultCollection) AddSearchIndex(index *SearchIndex)
func (*DefaultCollection) CompatibleSchemaSince ¶
func (d *DefaultCollection) CompatibleSchemaSince(version int32) bool
CompatibleSchemaSince determines if there was incompatible schema change since given version.
func (*DefaultCollection) GetActiveIndexedFields ¶
func (d *DefaultCollection) GetActiveIndexedFields() []*QueryableField
Indexes that can be used for queries.
func (*DefaultCollection) GetField ¶
func (d *DefaultCollection) GetField(name string) *Field
func (*DefaultCollection) GetFields ¶
func (d *DefaultCollection) GetFields() []*Field
func (*DefaultCollection) GetImplicitSearchIndex ¶
func (d *DefaultCollection) GetImplicitSearchIndex() *ImplicitSearchIndex
func (*DefaultCollection) GetIndexedFields ¶
func (d *DefaultCollection) GetIndexedFields() []*QueryableField
func (*DefaultCollection) GetIndexes ¶
func (d *DefaultCollection) GetIndexes() *Indexes
func (*DefaultCollection) GetInt64FieldsPath ¶
func (d *DefaultCollection) GetInt64FieldsPath() map[string]struct{}
func (*DefaultCollection) GetName ¶
func (d *DefaultCollection) GetName() string
func (*DefaultCollection) GetPrimaryKey ¶
func (d *DefaultCollection) GetPrimaryKey() *Index
func (*DefaultCollection) GetQueryableField ¶
func (d *DefaultCollection) GetQueryableField(name string) (*QueryableField, error)
func (*DefaultCollection) GetQueryableFields ¶
func (d *DefaultCollection) GetQueryableFields() []*QueryableField
func (*DefaultCollection) GetVersion ¶
func (d *DefaultCollection) GetVersion() int32
func (*DefaultCollection) GetWriteModeIndexes ¶
func (d *DefaultCollection) GetWriteModeIndexes() []*QueryableField
func (*DefaultCollection) LookupFieldVersion ¶
func (d *DefaultCollection) LookupFieldVersion(keyPath []string) []*FieldVersion
LookupFieldVersion returns the list of the schema versions for the specified keyPath, when this field had incompatible change. Returns nil if the field has never been changed, meaning that it has version 1.
func (*DefaultCollection) SecondaryIndexKeyword ¶
func (d *DefaultCollection) SecondaryIndexKeyword() string
The subspace within a collection where the secondary index information is stored.
func (*DefaultCollection) TaggedDefaultsForInsert ¶
func (d *DefaultCollection) TaggedDefaultsForInsert() map[string]struct{}
func (*DefaultCollection) TaggedDefaultsForUpdate ¶
func (d *DefaultCollection) TaggedDefaultsForUpdate() map[string]struct{}
func (*DefaultCollection) Type ¶
func (d *DefaultCollection) Type() CollectionType
func (*DefaultCollection) UpdateRowSchema ¶
func (d *DefaultCollection) UpdateRowSchema(doc map[string]any, version int32)
UpdateRowSchema fixes the schema of provided, unmarshalled, document from given Version to the latest collection schema.
func (*DefaultCollection) UpdateRowSchemaRaw ¶
func (d *DefaultCollection) UpdateRowSchemaRaw(doc []byte, version int32) ([]byte, error)
UpdateRowSchemaRaw fixes the schema of provided document from given Version to the latest collection schema.
func (*DefaultCollection) Validate ¶
func (d *DefaultCollection) Validate(document interface{}) error
Validate expects an unmarshalled document which it will validate again the schema of this collection.
type Factory ¶
type Factory struct { // Name is the collection name of this schema. Name string // Fields are derived from the user schema. Fields []*Field // Primary Key points to the fields used for the primary index. At this point the dictionary encoded value is not // set for these indexes which is set as part of collection creation. PrimaryKey *Index // Indexes is a wrapper on the secondary indexes part of this collection. Indexes *Indexes // Schema is the raw JSON schema received as part of CreateOrUpdateCollection request. This is stored as-is in the // schema subspace. Schema jsoniter.RawMessage // CollectionType is the type of the collection. Only two types of collections are supported "messages" and "documents" CollectionType CollectionType IndexingVersion string Version int32 }
Factory is used as an intermediate step so that collection can be initialized with properly encoded values.
func (*Factory) SecondaryIndexes ¶
type FactoryBuilder ¶
type FactoryBuilder struct {
// contains filtered or unexported fields
}
func NewFactoryBuilder ¶
func NewFactoryBuilder(onUserRequest bool) *FactoryBuilder
func (*FactoryBuilder) Build ¶
func (fb *FactoryBuilder) Build(collection string, reqSchema jsoniter.RawMessage) (*Factory, error)
Build is used to deserialize the user json schema into a schema factory.
func (*FactoryBuilder) BuildSearch ¶
func (fb *FactoryBuilder) BuildSearch(index string, reqSchema jsoniter.RawMessage) (*SearchFactory, error)
type Field ¶
type Field struct { FieldName string Defaulter *FieldDefaulter DataType FieldType MaxLength *int32 FillCreatedAt *bool FillUpdatedAt *bool UniqueKeyField *bool PrimaryKeyField *bool AutoGenerated *bool Sorted *bool Indexed *bool Faceted *bool SearchIndexed *bool SearchIdField *bool Dimensions *int // Nested fields are the fields where we know the schema of nested attributes like if properties are Fields []*Field AdditionalProperties *bool }
func (*Field) GetDefaulter ¶
func (f *Field) GetDefaulter() *FieldDefaulter
func (*Field) GetDimensions ¶
func (*Field) GetNestedField ¶
func (*Field) IsAutoGenerated ¶
func (*Field) IsIndexable ¶
func (*Field) IsPrimaryKey ¶
func (*Field) IsSearchId ¶
func (*Field) IsSearchIndexed ¶
type FieldBuilder ¶
type FieldBuilder struct { FieldName string Description string `json:"description,omitempty"` Type string `json:"type,omitempty"` Format string `json:"format,omitempty"` Encoding string `json:"contentEncoding,omitempty"` Default interface{} `json:"default,omitempty"` CreatedAt *bool `json:"createdAt,omitempty"` UpdatedAt *bool `json:"updatedAt,omitempty"` MaxLength *int32 `json:"maxLength,omitempty"` MaxItems *int32 `json:"maxItems,omitempty"` Auto *bool `json:"autoGenerate,omitempty"` Sorted *bool `json:"sort,omitempty"` Index *bool `json:"index,omitempty"` Facet *bool `json:"facet,omitempty"` ID *bool `json:"id,omitempty"` SearchIndex *bool `json:"searchIndex,omitempty"` Dimensions *int `json:"dimensions,omitempty"` Items *FieldBuilder `json:"items,omitempty"` Properties jsoniter.RawMessage `json:"properties,omitempty"` Primary *bool Fields []*Field AdditionalProperties *bool `json:"additionalProperties,omitempty"` }
type FieldDefaulter ¶
type FieldDefaulter struct {
// contains filtered or unexported fields
}
func (*FieldDefaulter) GetValue ¶
func (defaulter *FieldDefaulter) GetValue() interface{}
GetValue returns the value if there is default tag set for a field. For functions, it will execute it and return the value. If the function is now() then it is converted to createdAt during the construction of the defaulter.
func (*FieldDefaulter) TaggedWithCreatedAt ¶
func (defaulter *FieldDefaulter) TaggedWithCreatedAt() bool
func (*FieldDefaulter) TaggedWithUpdatedAt ¶
func (defaulter *FieldDefaulter) TaggedWithUpdatedAt() bool
type FieldSchemaValidator ¶
type FieldSchemaValidator struct{}
func (*FieldSchemaValidator) Validate ¶
func (v *FieldSchemaValidator) Validate(existing *DefaultCollection, current *Factory) error
func (*FieldSchemaValidator) ValidateIndex ¶
func (v *FieldSchemaValidator) ValidateIndex(existing *SearchIndex, current *SearchFactory) error
type FieldType ¶
type FieldType int
const ( UnknownType FieldType = iota NullType BoolType Int32Type Int64Type DoubleType StringType // ByteType is a base64 encoded characters, this means if this type is used as key then we need to decode it // and then use it as key. ByteType UUIDType // DateTimeType is a valid date representation as defined by RFC 3339, see https://datatracker.ietf.org/doc/html/rfc3339#section-5.6 DateTimeType ArrayType ObjectType VectorType // For internal querying usage. MaxType )
type FieldVersion ¶
type FieldVersion struct { Change *VersionDeltaField Version int }
FieldVersion contains individual field change, along with the schema version at which this change has happened.
type FieldVersions ¶
type FieldVersions struct {
// contains filtered or unexported fields
}
FieldVersions contains all the changes of the field, across all the schema versions.
type ImplicitSearchIndex ¶
type ImplicitSearchIndex struct { // Name is the name of the index. Name string // StoreSchema is the search schema of the underlying search engine. StoreSchema *tsApi.CollectionSchema // QueryableFields are similar to Fields but these are flattened forms of fields. For instance, a simple field // will be one to one mapped to queryable field but complex fields like object type field there may be more than // one queryableFields. As queryableFields represent a flattened state these can be used as-is to index in memory. QueryableFields []*QueryableField // contains filtered or unexported fields }
ImplicitSearchIndex is a search index that is automatically created by Tigris when a collection is created. Lifecycle of this index is tied to the collection.
func NewImplicitSearchIndex ¶
func (*ImplicitSearchIndex) GetSearchDeltaFields ¶
func (s *ImplicitSearchIndex) GetSearchDeltaFields(existingFields []*QueryableField, incomingFields []*Field) []tsApi.Field
func (*ImplicitSearchIndex) StoreIndexName ¶
func (s *ImplicitSearchIndex) StoreIndexName() string
type Index ¶
type Index struct { // Fields that are part of this index. An index can have a single or composite fields. Fields []*Field // Name is used by dictionary encoder for this index. Name string // Id is assigned to this index by the dictionary encoder. Id uint32 // Secondary indexes can be in 4 states: // 1. UNKNOWN = Have not fetched the index metadata yet so the state is unknown // 2. NOT_INDEXED = field is not indexed // 3. INDEX_WRITE_MODE = index is being built in the background and cannot be used for queries // 4. INDEX_ACTIVE = index can be used for queries // Note: this is not used for primary key indexes State IndexState // Either a PrimaryKey index or a Secondary Key index IdxType IndexType }
Index can be composite, so it has a list of fields, each index has name and encoded id. The encoded is used for key building.
func (*Index) IsCompatible ¶
func (*Index) IsSecondaryIndex ¶
func (*Index) StateString ¶
type IndexState ¶
type IndexState uint8
const ( UNKNOWN IndexState = iota NOT_INDEXED INDEX_DELETED INDEX_WRITE_MODE INDEX_ACTIVE )
type Indexes ¶
type Indexes struct {
All []*Index
}
Indexes is to wrap different index that a collection can have.
func (*Indexes) IsActiveIndex ¶
func (*Indexes) IsWriteModeIndex ¶
type JSONSchema ¶
type JSONSchema struct { Name string `json:"title,omitempty"` Description string `json:"description,omitempty"` Properties jsoniter.RawMessage `json:"properties,omitempty"` PrimaryKeys []string `json:"primary_key,omitempty"` CollectionType string `json:"collection_type,omitempty"` IndexingVersion string `json:"indexing_version,omitempty"` Version int32 `json:"version,omitempty"` }
type PrimaryIndexSchemaValidator ¶
type PrimaryIndexSchemaValidator struct{}
func (*PrimaryIndexSchemaValidator) Validate ¶
func (v *PrimaryIndexSchemaValidator) Validate(existing *DefaultCollection, current *Factory) error
type QueryableField ¶
type QueryableField struct { FieldName string Indexed bool // Secondary Index InMemoryAlias string Faceted bool SearchIndexed bool Sortable bool DataType FieldType SubType FieldType SearchType string DoNotFlatten bool Dimensions *int SearchIdField bool // This is not stored in flattened form in search // but will allow filtering on array of objects. // ToDo: With secondary indexes on array of objects we need to revisit this. AllowedNestedQFields []*QueryableField // contains filtered or unexported fields }
QueryableField is internal structure used after flattening the fields i.e. the representation of the queryable field is of the following form "field" OR "parent.field". This allows us to perform look faster by just checking in this structure. Object that doesn't have any nested fields will be same as any other top level field.
func (*QueryableField) InMemoryName ¶
func (q *QueryableField) InMemoryName() string
InMemoryName returns key name that is used to index this field in the indexing store. For example, an "id" key is indexed with "_tigris_id" name.
func (*QueryableField) IsReserved ¶
func (q *QueryableField) IsReserved() bool
IsReserved returns true if the queryable field is internal field.
func (*QueryableField) KeyPath ¶
func (q *QueryableField) KeyPath() []string
func (*QueryableField) Name ¶
func (q *QueryableField) Name() string
Name returns the name of this field as defined in the schema.
func (*QueryableField) ShouldPack ¶
func (q *QueryableField) ShouldPack() bool
ShouldPack returns true if we need to pack this field before sending to indexing store.
func (*QueryableField) Type ¶
func (q *QueryableField) Type() FieldType
Type returns the data type of this field.
type QueryableFieldsBuilder ¶
type QueryableFieldsBuilder struct{}
func NewQueryableFieldsBuilder ¶
func NewQueryableFieldsBuilder() *QueryableFieldsBuilder
func (*QueryableFieldsBuilder) BuildQueryableFields ¶
func (builder *QueryableFieldsBuilder) BuildQueryableFields(fields []*Field, fieldsInSearch []tsApi.Field) []*QueryableField
func (*QueryableFieldsBuilder) NewQueryableField ¶
func (builder *QueryableFieldsBuilder) NewQueryableField(name string, f *Field, fieldsInSearch []tsApi.Field) *QueryableField
type ReservedField ¶
type ReservedField uint8
const ( CreatedAt ReservedField = iota UpdatedAt Metadata IdToSearchKey DateSearchKeyPrefix SearchArrNullItem SearchNullKeys )
type SearchFactory ¶
type SearchFactory struct { // Name is the index name. Name string // Fields are derived from the user schema. Fields []*Field // Schema is the raw JSON schema received Schema jsoniter.RawMessage Sub string Source SearchSource }
SearchFactory is used as an intermediate step so that collection can be initialized with properly encoded values.
type SearchIdSchemaValidator ¶
type SearchIdSchemaValidator struct{}
func (*SearchIdSchemaValidator) IdField ¶
func (v *SearchIdSchemaValidator) IdField(current []*Field) *Field
func (*SearchIdSchemaValidator) ValidateIndex ¶
func (v *SearchIdSchemaValidator) ValidateIndex(existing *SearchIndex, current *SearchFactory) error
type SearchIndex ¶
type SearchIndex struct { // Name is the name of the index. Name string // index version Version int // Fields are derived from the user schema. Fields []*Field // JSON schema. Schema jsoniter.RawMessage // StoreSchema is the search schema of the underlying search engine. StoreSchema *tsApi.CollectionSchema // QueryableFields are similar to Fields but these are flattened forms of fields. For instance, a simple field // will be one to one mapped to queryable field but complex fields like object type field there may be more than // one queryableFields. As queryableFields represent a flattened state these can be used as-is to index in memory. QueryableFields []*QueryableField // Source of this index Source SearchSource SearchIDField *QueryableField // contains filtered or unexported fields }
SearchIndex is to manage search index created by the user.
func NewSearchIndex ¶
func NewSearchIndex(ver int, searchStoreName string, factory *SearchFactory, fieldsInSearch []tsApi.Field) *SearchIndex
func (*SearchIndex) GetField ¶
func (s *SearchIndex) GetField(name string) *Field
func (*SearchIndex) GetInt64FieldsPath ¶
func (s *SearchIndex) GetInt64FieldsPath() map[string]struct{}
func (*SearchIndex) GetQueryableField ¶
func (s *SearchIndex) GetQueryableField(name string) (*QueryableField, error)
func (*SearchIndex) GetSearchDeltaFields ¶
func (s *SearchIndex) GetSearchDeltaFields(existingFields []*QueryableField, fieldsInSearch []tsApi.Field) []tsApi.Field
func (*SearchIndex) StoreIndexName ¶
func (s *SearchIndex) StoreIndexName() string
type SearchIndexSourceValidator ¶
type SearchIndexSourceValidator struct{}
func (*SearchIndexSourceValidator) ValidateIndex ¶
func (v *SearchIndexSourceValidator) ValidateIndex(existing *SearchIndex, current *SearchFactory) error
type SearchIndexValidator ¶
type SearchIndexValidator interface {
ValidateIndex(existing *SearchIndex, current *SearchFactory) error
}
SearchIndexValidator is a backward compatibility validator i.e. when an update request for a search index is received then a set of validators are run to ensure that search index is safe to upgrade from state A to B.
type SearchJSONSchema ¶
type SearchJSONSchema struct { Name string `json:"title,omitempty"` Description string `json:"description,omitempty"` Properties jsoniter.RawMessage `json:"properties,omitempty"` Source *SearchSource `json:"source,omitempty"` }
type SearchSource ¶
type SearchSource struct { // Type is the source type i.e. either it is Tigris or the index will be maintained by the user. Type SearchSourceType `json:"type,omitempty"` // CollectionName is the source name i.e. collection name in case of Tigris otherwise it is optional. CollectionName string `json:"collection,omitempty"` // DatabaseBranch is in case the collection is part of a database branch. Only applicable if Type is Tigris. DatabaseBranch string `json:"branch,omitempty"` }
type SearchSourceType ¶
type SearchSourceType string
const ( // SearchSourceTigris is when the source type is Tigris for the search index. SearchSourceTigris SearchSourceType = "tigris" // SearchSourceExternal is when the source type is external for the search index. SearchSourceExternal SearchSourceType = "external" )
type Validator ¶
type Validator interface {
Validate(existing *DefaultCollection, current *Factory) error
}
Validator is a backward compatibility validator i.e. when an update request for a collection is received then a set of validators are run to ensure that collection is safe to upgrade from state A to B.
Note: Validators have no role during initial collection creation as there is no backward compatibility check at that point.
type VersionDelta ¶
type VersionDelta struct { Version int Fields []*VersionDeltaField }
VersionDelta contains all fields schema changes in particular schema Version.
type VersionDeltaField ¶
type VersionDeltaField struct { KeyPath []string // Key path of the field From FieldType // The type is changing from this To FieldType // to this MaxLength int }
VersionDeltaField describes field schema change.
If field is deleted then To is equal to `UnknownType`. If field is added then From is equal to `UnknownType`.