@@ -5,18 +5,25 @@ use base::scalar::*;
5
5
use base:: vector:: * ;
6
6
use pgrx:: pg_sys:: Oid ;
7
7
use std:: ffi:: { CStr , CString } ;
8
+ use std:: fmt:: Write ;
8
9
9
10
#[ pgrx:: pg_extern( immutable, strict, parallel_safe) ]
10
11
fn _vectors_svecf32_in ( input : & CStr , _oid : Oid , _typmod : i32 ) -> SVecf32Output {
11
- use crate :: utils:: parse:: parse_pgvector_svector;
12
+ use crate :: utils:: parse:: { parse_pgvector_svector, svector_filter_nonzero } ;
12
13
let v = parse_pgvector_svector ( input. to_bytes ( ) , |s| s. parse :: < F32 > ( ) . ok ( ) ) ;
13
14
match v {
14
15
Err ( e) => {
15
16
bad_literal ( & e. to_string ( ) ) ;
16
17
}
17
18
Ok ( ( indexes, values, dims) ) => {
18
19
check_value_dims_1048575 ( dims) ;
19
- SVecf32Output :: new ( SVecf32Borrowed :: new ( dims as u32 , & indexes, & values) )
20
+ check_index_in_bound ( & indexes, dims) ;
21
+ let ( non_zero_indexes, non_zero_values) = svector_filter_nonzero ( & indexes, & values) ;
22
+ SVecf32Output :: new ( SVecf32Borrowed :: new (
23
+ dims as u32 ,
24
+ & non_zero_indexes,
25
+ & non_zero_values,
26
+ ) )
20
27
}
21
28
}
22
29
}
@@ -27,16 +34,16 @@ fn _vectors_svecf32_out(vector: SVecf32Input<'_>) -> CString {
27
34
let mut buffer = String :: new ( ) ;
28
35
buffer. push ( '{' ) ;
29
36
let svec = vector. for_borrow ( ) ;
30
- let mut need_splitter = true ;
37
+ let mut need_splitter = false ;
31
38
for ( & index, & value) in svec. indexes ( ) . iter ( ) . zip ( svec. values ( ) . iter ( ) ) {
32
39
match need_splitter {
33
- true => {
34
- buffer . push_str ( format ! ( "{}:{}" , index, value) . as_str ( ) ) ;
35
- need_splitter = false ;
40
+ false => {
41
+ write ! ( buffer , "{}:{}" , index, value) . unwrap ( ) ;
42
+ need_splitter = true ;
36
43
}
37
- false => buffer . push_str ( format ! ( ", {}:{}" , index, value) . as_str ( ) ) ,
44
+ true => write ! ( buffer , ", {}:{}" , index, value) . unwrap ( ) ,
38
45
}
39
46
}
40
- buffer . push_str ( format ! ( "}}/{}" , dims) . as_str ( ) ) ;
47
+ write ! ( buffer , "}}/{}" , dims) . unwrap ( ) ;
41
48
CString :: new ( buffer) . unwrap ( )
42
49
}
0 commit comments