11use crate :: types:: AsValueRef ;
22use crate :: types:: Value ;
33use crate :: types:: ValueType ;
4+ use crate :: vdbe:: Register ;
45use crate :: LimboError ;
56use crate :: Result ;
67use crate :: ValueRef ;
@@ -33,75 +34,50 @@ pub fn parse_vector<'a>(
3334 }
3435}
3536
36- pub fn vector32 < I , E , V > ( args : I ) -> Result < Value >
37- where
38- V : AsValueRef ,
39- E : ExactSizeIterator < Item = V > ,
40- I : IntoIterator < IntoIter = E , Item = V > ,
41- {
42- let mut args = args. into_iter ( ) ;
37+ pub fn vector32 ( args : & [ Register ] ) -> Result < Value > {
4338 if args. len ( ) != 1 {
4439 return Err ( LimboError :: ConversionError (
4540 "vector32 requires exactly one argument" . to_string ( ) ,
4641 ) ) ;
4742 }
48- let value = args. next ( ) . unwrap ( ) ;
49- let vector = parse_vector ( & value, Some ( VectorType :: Float32Dense ) ) ?;
43+ let value = args[ 0 ] . get_value ( ) ;
44+ let vector = parse_vector ( value, Some ( VectorType :: Float32Dense ) ) ?;
5045 let vector = operations:: convert:: vector_convert ( vector, VectorType :: Float32Dense ) ?;
5146 Ok ( operations:: serialize:: vector_serialize ( vector) )
5247}
5348
54- pub fn vector32_sparse < I , E , V > ( args : I ) -> Result < Value >
55- where
56- V : AsValueRef ,
57- E : ExactSizeIterator < Item = V > ,
58- I : IntoIterator < IntoIter = E , Item = V > ,
59- {
60- let mut args = args. into_iter ( ) ;
49+ pub fn vector32_sparse ( args : & [ Register ] ) -> Result < Value > {
6150 if args. len ( ) != 1 {
6251 return Err ( LimboError :: ConversionError (
6352 "vector32_sparse requires exactly one argument" . to_string ( ) ,
6453 ) ) ;
6554 }
66- let value = args. next ( ) . unwrap ( ) ;
67- let vector = parse_vector ( & value, Some ( VectorType :: Float32Sparse ) ) ?;
55+ let value = args[ 0 ] . get_value ( ) ;
56+ let vector = parse_vector ( value, Some ( VectorType :: Float32Sparse ) ) ?;
6857 let vector = operations:: convert:: vector_convert ( vector, VectorType :: Float32Sparse ) ?;
6958 Ok ( operations:: serialize:: vector_serialize ( vector) )
7059}
7160
72- pub fn vector64 < I , E , V > ( args : I ) -> Result < Value >
73- where
74- V : AsValueRef ,
75- E : ExactSizeIterator < Item = V > ,
76- I : IntoIterator < IntoIter = E , Item = V > ,
77- {
78- let mut args = args. into_iter ( ) ;
61+ pub fn vector64 ( args : & [ Register ] ) -> Result < Value > {
7962 if args. len ( ) != 1 {
8063 return Err ( LimboError :: ConversionError (
8164 "vector64 requires exactly one argument" . to_string ( ) ,
8265 ) ) ;
8366 }
84- let value = args. next ( ) . unwrap ( ) ;
85- let vector = parse_vector ( & value, Some ( VectorType :: Float64Dense ) ) ?;
67+ let value = args[ 0 ] . get_value ( ) ;
68+ let vector = parse_vector ( value, Some ( VectorType :: Float64Dense ) ) ?;
8669 let vector = operations:: convert:: vector_convert ( vector, VectorType :: Float64Dense ) ?;
8770 Ok ( operations:: serialize:: vector_serialize ( vector) )
8871}
8972
90- pub fn vector_extract < I , E , V > ( args : I ) -> Result < Value >
91- where
92- V : AsValueRef ,
93- E : ExactSizeIterator < Item = V > ,
94- I : IntoIterator < IntoIter = E , Item = V > ,
95- {
96- let mut args = args. into_iter ( ) ;
73+ pub fn vector_extract ( args : & [ Register ] ) -> Result < Value > {
9774 if args. len ( ) != 1 {
9875 return Err ( LimboError :: ConversionError (
9976 "vector_extract requires exactly one argument" . to_string ( ) ,
10077 ) ) ;
10178 }
10279
103- let value = args. next ( ) . unwrap ( ) ;
104- let value = value. as_value_ref ( ) ;
80+ let value = args[ 0 ] . get_value ( ) . as_value_ref ( ) ;
10581 let blob = match value {
10682 ValueRef :: Blob ( b) => b,
10783 _ => {
@@ -119,110 +95,77 @@ where
11995 Ok ( Value :: build_text ( operations:: text:: vector_to_text ( & vector) ) )
12096}
12197
122- pub fn vector_distance_cos < I , E , V > ( args : I ) -> Result < Value >
123- where
124- V : AsValueRef ,
125- E : ExactSizeIterator < Item = V > ,
126- I : IntoIterator < IntoIter = E , Item = V > ,
127- {
128- let mut args = args. into_iter ( ) ;
98+ pub fn vector_distance_cos ( args : & [ Register ] ) -> Result < Value > {
12999 if args. len ( ) != 2 {
130100 return Err ( LimboError :: ConversionError (
131101 "vector_distance_cos requires exactly two arguments" . to_string ( ) ,
132102 ) ) ;
133103 }
134104
135- let value_0 = args. next ( ) . unwrap ( ) ;
136- let value_1 = args. next ( ) . unwrap ( ) ;
137- let x = parse_vector ( & value_0, None ) ?;
138- let y = parse_vector ( & value_1, None ) ?;
105+ let value_0 = args[ 0 ] . get_value ( ) ;
106+ let value_1 = args[ 1 ] . get_value ( ) ;
107+ let x = parse_vector ( value_0, None ) ?;
108+ let y = parse_vector ( value_1, None ) ?;
139109 let dist = operations:: distance_cos:: vector_distance_cos ( & x, & y) ?;
140110 Ok ( Value :: Float ( dist) )
141111}
142112
143- pub fn vector_distance_l2 < I , E , V > ( args : I ) -> Result < Value >
144- where
145- V : AsValueRef ,
146- E : ExactSizeIterator < Item = V > ,
147- I : IntoIterator < IntoIter = E , Item = V > ,
148- {
149- let mut args = args. into_iter ( ) ;
113+ pub fn vector_distance_l2 ( args : & [ Register ] ) -> Result < Value > {
150114 if args. len ( ) != 2 {
151115 return Err ( LimboError :: ConversionError (
152116 "distance_l2 requires exactly two arguments" . to_string ( ) ,
153117 ) ) ;
154118 }
155119
156- let value_0 = args. next ( ) . unwrap ( ) ;
157- let value_1 = args. next ( ) . unwrap ( ) ;
158- let x = parse_vector ( & value_0, None ) ?;
159- let y = parse_vector ( & value_1, None ) ?;
120+ let value_0 = args[ 0 ] . get_value ( ) ;
121+ let value_1 = args[ 1 ] . get_value ( ) ;
122+ let x = parse_vector ( value_0, None ) ?;
123+ let y = parse_vector ( value_1, None ) ?;
160124 let dist = operations:: distance_l2:: vector_distance_l2 ( & x, & y) ?;
161125 Ok ( Value :: Float ( dist) )
162126}
163127
164- pub fn vector_distance_jaccard < I , E , V > ( args : I ) -> Result < Value >
165- where
166- V : AsValueRef ,
167- E : ExactSizeIterator < Item = V > ,
168- I : IntoIterator < IntoIter = E , Item = V > ,
169- {
170- let mut args = args. into_iter ( ) ;
128+ pub fn vector_distance_jaccard ( args : & [ Register ] ) -> Result < Value > {
171129 if args. len ( ) != 2 {
172130 return Err ( LimboError :: ConversionError (
173131 "distance_jaccard requires exactly two arguments" . to_string ( ) ,
174132 ) ) ;
175133 }
176134
177- let value_0 = args. next ( ) . unwrap ( ) ;
178- let value_1 = args. next ( ) . unwrap ( ) ;
179- let x = parse_vector ( & value_0, None ) ?;
180- let y = parse_vector ( & value_1, None ) ?;
135+ let value_0 = args[ 0 ] . get_value ( ) ;
136+ let value_1 = args[ 1 ] . get_value ( ) ;
137+ let x = parse_vector ( value_0, None ) ?;
138+ let y = parse_vector ( value_1, None ) ?;
181139 let dist = operations:: jaccard:: vector_distance_jaccard ( & x, & y) ?;
182140 Ok ( Value :: Float ( dist) )
183141}
184142
185- pub fn vector_concat < I , E , V > ( args : I ) -> Result < Value >
186- where
187- V : AsValueRef ,
188- E : ExactSizeIterator < Item = V > ,
189- I : IntoIterator < IntoIter = E , Item = V > ,
190- {
191- let mut args = args. into_iter ( ) ;
143+ pub fn vector_concat ( args : & [ Register ] ) -> Result < Value > {
192144 if args. len ( ) != 2 {
193145 return Err ( LimboError :: InvalidArgument (
194146 "concat requires exactly two arguments" . into ( ) ,
195147 ) ) ;
196148 }
197149
198- let value_0 = args. next ( ) . unwrap ( ) ;
199- let value_1 = args. next ( ) . unwrap ( ) ;
200- let x = parse_vector ( & value_0, None ) ?;
201- let y = parse_vector ( & value_1, None ) ?;
150+ let value_0 = args[ 0 ] . get_value ( ) ;
151+ let value_1 = args[ 1 ] . get_value ( ) ;
152+ let x = parse_vector ( value_0, None ) ?;
153+ let y = parse_vector ( value_1, None ) ?;
202154 let vector = operations:: concat:: vector_concat ( & x, & y) ?;
203155 Ok ( operations:: serialize:: vector_serialize ( vector) )
204156}
205157
206- pub fn vector_slice < I , E , V > ( args : I ) -> Result < Value >
207- where
208- V : AsValueRef ,
209- E : ExactSizeIterator < Item = V > ,
210- I : IntoIterator < IntoIter = E , Item = V > ,
211- {
212- let mut args = args. into_iter ( ) ;
158+ pub fn vector_slice ( args : & [ Register ] ) -> Result < Value > {
213159 if args. len ( ) != 3 {
214160 return Err ( LimboError :: InvalidArgument (
215161 "vector_slice requires exactly three arguments" . into ( ) ,
216162 ) ) ;
217163 }
218- let value_0 = args. next ( ) . unwrap ( ) ;
219- let value_1 = args. next ( ) . unwrap ( ) ;
220- let value_1 = value_1. as_value_ref ( ) ;
221-
222- let value_2 = args. next ( ) . unwrap ( ) ;
223- let value_2 = value_2. as_value_ref ( ) ;
164+ let value_0 = args[ 0 ] . get_value ( ) ;
165+ let value_1 = args[ 1 ] . get_value ( ) . as_value_ref ( ) ;
166+ let value_2 = args[ 2 ] . get_value ( ) . as_value_ref ( ) ;
224167
225- let vector = parse_vector ( & value_0, None ) ?;
168+ let vector = parse_vector ( value_0, None ) ?;
226169
227170 let start_index = value_1
228171 . as_int ( )
0 commit comments