1+ use num_traits:: Zero ;
2+ use pgrx:: error;
3+
14use super :: memory_svecf32:: SVecf32Output ;
25use crate :: datatype:: memory_svecf32:: SVecf32Input ;
36use crate :: error:: * ;
@@ -9,22 +12,66 @@ use std::fmt::Write;
912
1013#[ pgrx:: pg_extern( immutable, strict, parallel_safe) ]
1114fn _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;
1316 let v = parse_pgvector_svector ( input. to_bytes ( ) , |s| s. parse :: < F32 > ( ) . ok ( ) ) ;
1417 match v {
1518 Err ( e) => {
1619 bad_literal ( & e. to_string ( ) ) ;
1720 }
18- Ok ( ( indexes, values, dims) ) => {
19- let ( mut sorted_indexes, mut sorted_values) = svector_sorted ( & indexes, & values) ;
21+ Ok ( ( mut indexes, mut values, dims) ) => {
2022 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) )
2875 }
2976 }
3077}
0 commit comments