github.com/weaviate/weaviate@v1.24.6/usecases/objects/query.go (about) 1 // _ _ 2 // __ _____ __ ___ ___ __ _| |_ ___ 3 // \ \ /\ / / _ \/ _` \ \ / / |/ _` | __/ _ \ 4 // \ V V / __/ (_| |\ V /| | (_| | || __/ 5 // \_/\_/ \___|\__,_| \_/ |_|\__,_|\__\___| 6 // 7 // Copyright © 2016 - 2024 Weaviate B.V. All rights reserved. 8 // 9 // CONTACT: hello@weaviate.io 10 // 11 12 package objects 13 14 import ( 15 "context" 16 "fmt" 17 18 "github.com/weaviate/weaviate/entities/additional" 19 "github.com/weaviate/weaviate/entities/filters" 20 "github.com/weaviate/weaviate/entities/models" 21 ) 22 23 type QueryInput struct { 24 Class string 25 Offset int 26 Limit int 27 Cursor *filters.Cursor 28 Filters *filters.LocalFilter 29 Sort []filters.Sort 30 Tenant string 31 Additional additional.Properties 32 } 33 34 type QueryParams struct { 35 Class string 36 Offset *int64 37 Limit *int64 38 After *string 39 Sort *string 40 Order *string 41 Tenant *string 42 Additional additional.Properties 43 } 44 45 func (q *QueryParams) inputs(m *Manager) (*QueryInput, error) { 46 smartOffset, smartLimit, err := m.localOffsetLimit(q.Offset, q.Limit) 47 if err != nil { 48 return nil, err 49 } 50 sort := m.getSort(q.Sort, q.Order) 51 cursor := m.getCursor(q.After, q.Limit) 52 tenant := "" 53 if q.Tenant != nil { 54 tenant = *q.Tenant 55 } 56 return &QueryInput{ 57 Class: q.Class, 58 Offset: smartOffset, 59 Limit: smartLimit, 60 Sort: sort, 61 Cursor: cursor, 62 Tenant: tenant, 63 Additional: q.Additional, 64 }, nil 65 } 66 67 func (m *Manager) Query(ctx context.Context, principal *models.Principal, params *QueryParams, 68 ) ([]*models.Object, *Error) { 69 path := fmt.Sprintf("objects/%s", params.Class) 70 if err := m.authorizer.Authorize(principal, "list", path); err != nil { 71 return nil, &Error{path, StatusForbidden, err} 72 } 73 unlock, err := m.locks.LockConnector() 74 if err != nil { 75 return nil, &Error{"cannot lock", StatusInternalServerError, err} 76 } 77 defer unlock() 78 79 m.metrics.GetObjectInc() 80 defer m.metrics.GetObjectDec() 81 82 q, err := params.inputs(m) 83 if err != nil { 84 return nil, &Error{"offset or limit", StatusBadRequest, err} 85 } 86 res, rerr := m.vectorRepo.Query(ctx, q) 87 if rerr != nil { 88 return nil, rerr 89 } 90 91 if m.modulesProvider != nil { 92 res, err = m.modulesProvider.ListObjectsAdditionalExtend(ctx, res, q.Additional.ModuleParams) 93 if err != nil { 94 return nil, &Error{"extend results", StatusInternalServerError, err} 95 } 96 } 97 98 if q.Additional.Vector { 99 m.trackUsageList(res) 100 } 101 102 return res.ObjectsWithVector(q.Additional.Vector), nil 103 }