cosmos-sdk/orm/model/ormtable/index.go

81 lines
2.9 KiB
Go

package ormtable
import (
"context"
"github.com/cosmos/cosmos-sdk/orm/types/kv"
"google.golang.org/protobuf/proto"
"google.golang.org/protobuf/reflect/protoreflect"
"github.com/cosmos/cosmos-sdk/orm/encoding/ormkv"
"github.com/cosmos/cosmos-sdk/orm/model/ormlist"
)
// Index defines an index on a table. Index instances
// are stateless, with all state existing only in the store passed
// to index methods.
type Index interface {
// List does iteration over the index with the provided prefix key and options.
// Prefix key values must correspond in type to the index's fields and the
// number of values provided cannot exceed the number of fields in the index,
// although fewer values can be provided.
List(ctx context.Context, prefixKey []interface{}, options ...ormlist.Option) (Iterator, error)
// ListRange does range iteration over the index with the provided from and to
// values and options.
//
// From and to values must correspond in type to the index's fields and the number of values
// provided cannot exceed the number of fields in the index, although fewer
// values can be provided.
//
// Range iteration can only be done for from and to values which are
// well-ordered, meaning that any unordered components must be equal. Ex.
// the bytes type is considered unordered, so a range iterator is created
// over an index with a bytes field, both start and end must have the same
// value for bytes.
//
// Range iteration is inclusive at both ends.
ListRange(ctx context.Context, from, to []interface{}, options ...ormlist.Option) (Iterator, error)
// DeleteBy deletes any entries which match the provided prefix key.
DeleteBy(context context.Context, prefixKey ...interface{}) error
// DeleteRange deletes any entries between the provided range keys.
DeleteRange(context context.Context, from, to []interface{}) error
// MessageType returns the protobuf message type of the index.
MessageType() protoreflect.MessageType
// Fields returns the canonical field names of the index.
Fields() string
doNotImplement()
}
// concreteIndex is used internally by table implementations.
type concreteIndex interface {
Index
ormkv.IndexCodec
readValueFromIndexKey(context ReadBackend, primaryKey []protoreflect.Value, value []byte, message proto.Message) error
}
// UniqueIndex defines an unique index on a table.
type UniqueIndex interface {
Index
// Has returns true if the key values are present in the store for this index.
Has(context context.Context, keyValues ...interface{}) (found bool, err error)
// Get retrieves the message if one exists for the provided key values.
Get(context context.Context, message proto.Message, keyValues ...interface{}) (found bool, err error)
}
type indexer interface {
onInsert(store kv.Store, message protoreflect.Message) error
onUpdate(store kv.Store, new, existing protoreflect.Message) error
onDelete(store kv.Store, message protoreflect.Message) error
}