1
+ use num_traits:: Zero ;
2
+ use pgrx:: error;
3
+
1
4
use super :: memory_svecf32:: SVecf32Output ;
2
5
use crate :: datatype:: memory_svecf32:: SVecf32Input ;
3
6
use crate :: error:: * ;
@@ -9,22 +12,66 @@ use std::fmt::Write;
9
12
10
13
#[ pgrx:: pg_extern( immutable, strict, parallel_safe) ]
11
14
fn _vectors_svecf32_in ( input : & CStr , _oid : Oid , _typmod : i32 ) -> SVecf32Output {
12
- use crate :: utils:: parse:: { parse_pgvector_svector, svector_filter_nonzero , svector_sorted } ;
15
+ use crate :: utils:: parse:: parse_pgvector_svector;
13
16
let v = parse_pgvector_svector ( input. to_bytes ( ) , |s| s. parse :: < F32 > ( ) . ok ( ) ) ;
14
17
match v {
15
18
Err ( e) => {
16
19
bad_literal ( & e. to_string ( ) ) ;
17
20
}
18
- Ok ( ( indexes, values, dims) ) => {
19
- let ( mut sorted_indexes, mut sorted_values) = svector_sorted ( & indexes, & values) ;
21
+ Ok ( ( mut indexes, mut values, dims) ) => {
20
22
check_value_dims_1048575 ( dims) ;
21
- check_index_in_bound ( & sorted_indexes, dims) ;
22
- svector_filter_nonzero ( & mut sorted_indexes, & mut sorted_values) ;
23
- SVecf32Output :: new ( SVecf32Borrowed :: new (
24
- dims as u32 ,
25
- & sorted_indexes,
26
- & sorted_values,
27
- ) )
23
+ // is_sorted
24
+ if !indexes. windows ( 2 ) . all ( |i| i[ 0 ] <= i[ 1 ] ) {
25
+ assert_eq ! ( indexes. len( ) , values. len( ) ) ;
26
+ let n = indexes. len ( ) ;
27
+ let mut permutation = ( 0 ..n) . collect :: < Vec < _ > > ( ) ;
28
+ permutation. sort_unstable_by_key ( |& i| & indexes[ i] ) ;
29
+ for i in 0 ..n {
30
+ if i == permutation[ i] || usize:: MAX == permutation[ i] {
31
+ continue ;
32
+ }
33
+ let index = indexes[ i] ;
34
+ let value = values[ i] ;
35
+ let mut j = i;
36
+ while i != permutation[ j] {
37
+ let next = permutation[ j] ;
38
+ indexes[ j] = indexes[ permutation[ j] ] ;
39
+ values[ j] = values[ permutation[ j] ] ;
40
+ permutation[ j] = usize:: MAX ;
41
+ j = next;
42
+ }
43
+ indexes[ j] = index;
44
+ values[ j] = value;
45
+ permutation[ j] = usize:: MAX ;
46
+ }
47
+ }
48
+ let mut last: Option < u32 > = None ;
49
+ for index in indexes. clone ( ) {
50
+ if last == Some ( index) {
51
+ error ! (
52
+ "Indexes need to be unique, but there are more than one same index {index}"
53
+ )
54
+ }
55
+ if last >= Some ( dims as u32 ) {
56
+ error ! ( "Index out of bounds: the dim is {dims} but the index is {index}" ) ;
57
+ }
58
+ last = Some ( index) ;
59
+ {
60
+ let mut i = 0 ;
61
+ let mut j = 0 ;
62
+ while j < values. len ( ) {
63
+ if !values[ j] . is_zero ( ) {
64
+ indexes[ i] = indexes[ j] ;
65
+ values[ i] = values[ j] ;
66
+ i += 1 ;
67
+ }
68
+ j += 1 ;
69
+ }
70
+ indexes. truncate ( i) ;
71
+ values. truncate ( i) ;
72
+ }
73
+ }
74
+ SVecf32Output :: new ( SVecf32Borrowed :: new ( dims as u32 , & indexes, & values) )
28
75
}
29
76
}
30
77
}
0 commit comments