1
+ from copy import deepcopy
2
+
3
+ import numpy as np
1
4
import pytest
2
5
3
6
import pinecone
4
- from core .utils import dict_to_proto_struct
5
7
from pinecone import DescribeIndexStatsRequest
6
8
from pinecone .core .grpc .protos .vector_service_pb2 import Vector , DescribeIndexStatsRequest , UpdateRequest , \
7
- UpsertRequest , FetchRequest , QueryRequest , DeleteRequest , QueryVector , UpsertResponse
9
+ UpsertRequest , FetchRequest , QueryRequest , DeleteRequest , QueryVector , UpsertResponse , SparseValues
10
+ from pinecone .core .utils import dict_to_proto_struct
8
11
9
12
10
13
class TestGrpcIndex :
@@ -13,6 +16,10 @@ def setup_method(self):
13
16
self .vector_dim = 8
14
17
self .vals1 = [0.1 ] * self .vector_dim
15
18
self .vals2 = [0.2 ] * self .vector_dim
19
+ self .sparse_indices_1 = [1 , 8 , 42 ]
20
+ self .sparse_values_1 = [0.8 , 0.9 , 0.42 ]
21
+ self .sparse_indices_2 = [1 , 3 , 5 ]
22
+ self .sparse_values_2 = [0.7 , 0.3 , 0.31415 ]
16
23
self .md1 = {'genre' : 'action' , 'year' : 2021 }
17
24
self .md2 = {'genre' : 'documentary' , 'year' : 2020 }
18
25
self .filter1 = {'genre' : {'$in' : ['action' ]}}
@@ -21,59 +28,77 @@ def setup_method(self):
21
28
pinecone .init (api_key = 'example-key' )
22
29
self .index = pinecone .GRPCIndex ('example-name' )
23
30
31
+ self .expected_vec1 = Vector (id = 'vec1' , values = self .vals1 , metadata = {})
32
+ self .expected_vec2 = Vector (id = 'vec2' , values = self .vals2 , metadata = {})
33
+ self .expected_vec_md1 = Vector (id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct (self .md1 ))
34
+ self .expected_vec_md2 = Vector (id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct (self .md2 ))
35
+
24
36
# region: upsert tests
25
37
26
- def test_upsert_tuplesOfIdVec_UpserWithoutMD (self , mocker ):
27
- mocker .patch .object (self .index , '_wrap_grpc_call' , autospec = True )
28
- self .index .upsert ([('vec1' , self .vals1 ), ('vec2' , self .vals2 )], namespace = 'ns' )
38
+ def _assert_called_once (self , vectors ):
29
39
self .index ._wrap_grpc_call .assert_called_once_with (
30
40
self .index .stub .Upsert ,
31
41
UpsertRequest (
32
- vectors = [
33
- Vector (id = 'vec1' , values = self .vals1 , metadata = {}),
34
- Vector (id = 'vec2' , values = self .vals2 , metadata = {})],
42
+ vectors = vectors ,
35
43
namespace = 'ns' ),
36
44
timeout = None
37
45
)
38
46
47
+ def test_upsert_tuplesOfIdVec_UpserWithoutMD (self , mocker ):
48
+ mocker .patch .object (self .index , '_wrap_grpc_call' , autospec = True )
49
+ self .index .upsert ([('vec1' , self .vals1 ), ('vec2' , self .vals2 )], namespace = 'ns' )
50
+ self ._assert_called_once ([
51
+ self .expected_vec1 ,
52
+ self .expected_vec2
53
+ ])
54
+
55
+
39
56
def test_upsert_tuplesOfIdVecMD_UpsertVectorsWithMD (self , mocker ):
40
57
mocker .patch .object (self .index , '_wrap_grpc_call' , autospec = True )
41
58
self .index .upsert ([('vec1' , self .vals1 , self .md1 ), ('vec2' , self .vals2 , self .md2 )], namespace = 'ns' )
42
- self .index ._wrap_grpc_call .assert_called_once_with (
43
- self .index .stub .Upsert ,
44
- UpsertRequest (
45
- vectors = [
46
- Vector (id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct (self .md1 )),
47
- Vector (id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct (self .md2 ))],
48
- namespace = 'ns' ),
49
- timeout = None )
59
+ self ._assert_called_once ([
60
+ self .expected_vec_md1 ,
61
+ self .expected_vec_md2 ],
62
+ )
63
+
50
64
51
65
def test_upsert_vectors_upsertInputVectors (self , mocker ):
52
66
mocker .patch .object (self .index , '_wrap_grpc_call' , autospec = True )
53
- self .index .upsert ([Vector ( id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct ( self . md1 )) ,
54
- Vector ( id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct ( self . md2 )) ],
67
+ self .index .upsert ([self .expected_vec_md1 ,
68
+ self .expected_vec_md2 ],
55
69
namespace = 'ns' )
56
- self .index ._wrap_grpc_call .assert_called_once_with (
57
- self .index .stub .Upsert ,
58
- UpsertRequest (
59
- vectors = [
60
- Vector (id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct (self .md1 )),
61
- Vector (id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct (self .md2 ))],
62
- namespace = 'ns' ),
63
- timeout = None )
70
+ self ._assert_called_once ([
71
+ self .expected_vec_md1 ,
72
+ self .expected_vec_md2 ],
73
+ )
74
+
75
+
76
+ def test_upsert_vectors_upsertInputVectorsSparse (self , mocker ):
77
+ mocker .patch .object (self .index , '_wrap_grpc_call' , autospec = True )
78
+ self .index .upsert ([Vector (id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct (self .md1 ),
79
+ sparse_values = SparseValues (indices = self .sparse_indices_1 , values = self .sparse_values_1 )),
80
+ Vector (id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct (self .md2 ),
81
+ sparse_values = SparseValues (indices = self .sparse_indices_2 , values = self .sparse_values_2 ))],
82
+ namespace = 'ns' )
83
+ self ._assert_called_once ([
84
+ Vector (id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct (self .md1 ),
85
+ sparse_values = SparseValues (indices = self .sparse_indices_1 , values = self .sparse_values_1 )),
86
+ Vector (id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct (self .md2 ),
87
+ sparse_values = SparseValues (indices = self .sparse_indices_2 , values = self .sparse_values_2 ))],
88
+ )
64
89
65
90
def test_upsert_async_upsertInputVectorsAsync (self , mocker ):
66
91
mocker .patch .object (self .index , '_wrap_grpc_call' , autospec = True )
67
- self .index .upsert ([Vector ( id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct ( self . md1 )) ,
68
- Vector ( id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct ( self . md2 )) ],
92
+ self .index .upsert ([self .expected_vec_md1 ,
93
+ self .expected_vec_md2 ],
69
94
namespace = 'ns' ,
70
95
async_req = True )
71
96
self .index ._wrap_grpc_call .assert_called_once_with (
72
97
self .index .stub .Upsert .future ,
73
98
UpsertRequest (
74
99
vectors = [
75
- Vector ( id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct ( self . md1 )) ,
76
- Vector ( id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct ( self . md2 )) ],
100
+ self .expected_vec_md1 ,
101
+ self .expected_vec_md2 ],
77
102
namespace = 'ns' ),
78
103
timeout = None )
79
104
@@ -82,8 +107,8 @@ def test_upsert_vectorListIsMultiplyOfBatchSize_vectorsUpsertedInBatches(self, m
82
107
side_effect = lambda stub , upsert_request , timeout : UpsertResponse (
83
108
upserted_count = len (upsert_request .vectors )))
84
109
85
- result = self .index .upsert ([Vector ( id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct ( self . md1 )) ,
86
- Vector ( id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct ( self . md2 )) ],
110
+ result = self .index .upsert ([self .expected_vec_md1 ,
111
+ self .expected_vec_md2 ],
87
112
namespace = 'ns' ,
88
113
batch_size = 1 ,
89
114
show_progress = False )
@@ -98,7 +123,7 @@ def test_upsert_vectorListIsMultiplyOfBatchSize_vectorsUpsertedInBatches(self, m
98
123
self .index ._wrap_grpc_call .assert_any_call (
99
124
self .index .stub .Upsert ,
100
125
UpsertRequest (
101
- vectors = [Vector ( id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct ( self . md2 )) ],
126
+ vectors = [self .expected_vec_md2 ],
102
127
namespace = 'ns' ),
103
128
timeout = None )
104
129
@@ -109,7 +134,7 @@ def test_upsert_vectorListNotMultiplyOfBatchSize_vectorsUpsertedInBatches(self,
109
134
side_effect = lambda stub , upsert_request , timeout : UpsertResponse (
110
135
upserted_count = len (upsert_request .vectors )))
111
136
112
- result = self .index .upsert ([Vector ( id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct ( self . md1 )) ,
137
+ result = self .index .upsert ([self .expected_vec_md1 ,
113
138
Vector (id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct (self .md2 )),
114
139
Vector (id = 'vec3' , values = self .vals1 , metadata = dict_to_proto_struct (self .md1 ))],
115
140
namespace = 'ns' ,
@@ -118,8 +143,8 @@ def test_upsert_vectorListNotMultiplyOfBatchSize_vectorsUpsertedInBatches(self,
118
143
self .index .stub .Upsert ,
119
144
UpsertRequest (
120
145
vectors = [
121
- Vector ( id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct ( self . md1 )) ,
122
- Vector ( id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct ( self . md2 )) ],
146
+ self .expected_vec_md1 ,
147
+ self .expected_vec_md2 ],
123
148
namespace = 'ns' ),
124
149
timeout = None )
125
150
@@ -137,19 +162,14 @@ def test_upsert_vectorListSmallerThanBatchSize_vectorsUpsertedInBatches(self, mo
137
162
side_effect = lambda stub , upsert_request , timeout : UpsertResponse (
138
163
upserted_count = len (upsert_request .vectors )))
139
164
140
- result = self .index .upsert ([Vector ( id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct ( self . md1 )) ,
141
- Vector ( id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct ( self . md2 )) ],
165
+ result = self .index .upsert ([self .expected_vec_md1 ,
166
+ self .expected_vec_md2 ],
142
167
namespace = 'ns' ,
143
168
batch_size = 5 )
144
-
145
- self .index ._wrap_grpc_call .assert_called_once_with (
146
- self .index .stub .Upsert ,
147
- UpsertRequest (
148
- vectors = [
149
- Vector (id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct (self .md1 )),
150
- Vector (id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct (self .md2 ))],
151
- namespace = 'ns' ),
152
- timeout = None )
169
+ self ._assert_called_once ([
170
+ self .expected_vec_md1 ,
171
+ self .expected_vec_md2 ],
172
+ )
153
173
154
174
assert result .upserted_count == 2
155
175
@@ -167,8 +187,8 @@ def test_upsert_tuplesList_vectorsUpsertedInBatches(self, mocker):
167
187
self .index .stub .Upsert ,
168
188
UpsertRequest (
169
189
vectors = [
170
- Vector ( id = 'vec1' , values = self .vals1 , metadata = dict_to_proto_struct ( self . md1 )) ,
171
- Vector ( id = 'vec2' , values = self .vals2 , metadata = dict_to_proto_struct ( self . md2 )) ],
190
+ self .expected_vec_md1 ,
191
+ self .expected_vec_md2 ],
172
192
namespace = 'ns' ),
173
193
timeout = None )
174
194
0 commit comments