Spaces:
Running
Running
File size: 5,563 Bytes
b110593 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 |
// _ _
// __ _____ __ ___ ___ __ _| |_ ___
// \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \
// \ V V / __/ (_| |\ V /| | (_| | || __/
// \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___|
//
// Copyright © 2016 - 2024 Weaviate B.V. All rights reserved.
//
// CONTACT: [email protected]
//
// package objects provides managers for all kind-related items, such as objects.
// Manager provides methods for "regular" interaction, such as
// add, get, delete, update, etc. Additionally BatchManager allows for
// efficient batch-adding of object instances and references.
package objects
import (
"context"
"fmt"
"time"
"github.com/go-openapi/strfmt"
"github.com/google/uuid"
"github.com/sirupsen/logrus"
"github.com/weaviate/weaviate/entities/additional"
"github.com/weaviate/weaviate/entities/filters"
"github.com/weaviate/weaviate/entities/models"
"github.com/weaviate/weaviate/entities/modulecapabilities"
"github.com/weaviate/weaviate/entities/moduletools"
"github.com/weaviate/weaviate/entities/schema/crossref"
"github.com/weaviate/weaviate/entities/search"
"github.com/weaviate/weaviate/usecases/config"
)
// Manager manages kind changes at a use-case level, i.e. agnostic of
// underlying databases or storage providers
type Manager struct {
config *config.WeaviateConfig
locks locks
schemaManager schemaManager
logger logrus.FieldLogger
authorizer authorizer
vectorRepo VectorRepo
timeSource timeSource
modulesProvider ModulesProvider
autoSchemaManager *autoSchemaManager
metrics objectsMetrics
}
type objectsMetrics interface {
BatchInc()
BatchDec()
BatchRefInc()
BatchRefDec()
BatchDeleteInc()
BatchDeleteDec()
AddObjectInc()
AddObjectDec()
UpdateObjectInc()
UpdateObjectDec()
MergeObjectInc()
MergeObjectDec()
DeleteObjectInc()
DeleteObjectDec()
GetObjectInc()
GetObjectDec()
HeadObjectInc()
HeadObjectDec()
AddReferenceInc()
AddReferenceDec()
UpdateReferenceInc()
UpdateReferenceDec()
DeleteReferenceInc()
DeleteReferenceDec()
AddUsageDimensions(className, queryType, operation string, dims int)
}
type timeSource interface {
Now() int64
}
type locks interface {
LockConnector() (func() error, error)
LockSchema() (func() error, error)
}
type authorizer interface {
Authorize(principal *models.Principal, verb, resource string) error
}
type VectorRepo interface {
PutObject(ctx context.Context, concept *models.Object, vector []float32,
repl *additional.ReplicationProperties) error
DeleteObject(ctx context.Context, className string, id strfmt.UUID,
repl *additional.ReplicationProperties, tenant string) error
// Object returns object of the specified class giving by its id
Object(ctx context.Context, class string, id strfmt.UUID, props search.SelectProperties,
additional additional.Properties, repl *additional.ReplicationProperties,
tenant string) (*search.Result, error)
// Exists returns true if an object of a giving class exists
Exists(ctx context.Context, class string, id strfmt.UUID,
repl *additional.ReplicationProperties, tenant string) (bool, error)
ObjectByID(ctx context.Context, id strfmt.UUID, props search.SelectProperties,
additional additional.Properties, tenant string) (*search.Result, error)
ObjectSearch(ctx context.Context, offset, limit int, filters *filters.LocalFilter,
sort []filters.Sort, additional additional.Properties, tenant string) (search.Results, error)
AddReference(ctx context.Context, source *crossref.RefSource,
target *crossref.Ref, repl *additional.ReplicationProperties, tenant string) error
Merge(ctx context.Context, merge MergeDocument, repl *additional.ReplicationProperties, tenant string) error
Query(context.Context, *QueryInput) (search.Results, *Error)
}
type ModulesProvider interface {
GetObjectAdditionalExtend(ctx context.Context, in *search.Result,
moduleParams map[string]interface{}) (*search.Result, error)
ListObjectsAdditionalExtend(ctx context.Context, in search.Results,
moduleParams map[string]interface{}) (search.Results, error)
UsingRef2Vec(className string) bool
UpdateVector(ctx context.Context, object *models.Object, class *models.Class,
objectDiff *moduletools.ObjectDiff, repo modulecapabilities.FindObjectFn,
logger logrus.FieldLogger) error
VectorizerName(className string) (string, error)
}
// NewManager creates a new manager
func NewManager(locks locks, schemaManager schemaManager,
config *config.WeaviateConfig, logger logrus.FieldLogger,
authorizer authorizer, vectorRepo VectorRepo,
modulesProvider ModulesProvider, metrics objectsMetrics,
) *Manager {
return &Manager{
config: config,
locks: locks,
schemaManager: schemaManager,
logger: logger,
authorizer: authorizer,
vectorRepo: vectorRepo,
timeSource: defaultTimeSource{},
modulesProvider: modulesProvider,
autoSchemaManager: newAutoSchemaManager(schemaManager, vectorRepo, config, logger),
metrics: metrics,
}
}
func generateUUID() (strfmt.UUID, error) {
id, err := uuid.NewRandom()
if err != nil {
return "", fmt.Errorf("could not generate uuid v4: %v", err)
}
return strfmt.UUID(id.String()), nil
}
type defaultTimeSource struct{}
func (ts defaultTimeSource) Now() int64 {
return time.Now().UnixNano() / int64(time.Millisecond)
}
|