@@ -9,6 +9,7 @@ use dbsp::dynamic::{DowncastTrait, Erase};
99use feldera_sqllib:: { SqlString , WSet , Weight } ;
1010use sltsqlvalue:: * ;
1111use std:: ops:: { Add , Neg } ;
12+ use std:: sync:: Arc ;
1213
1314#[ derive( Eq , PartialEq ) ]
1415pub enum SortOrder {
@@ -117,21 +118,22 @@ where
117118/// Version of hash that takes the result of orderby: a zset that is expected
118119/// to contain a single vector with all the data.
119120pub fn zset_of_vectors_to_strings < K > (
120- set : & WSet < Vec < K > > ,
121+ set : & WSet < Arc < Vec < K > > > ,
121122 format : SqlString ,
122123 order : SortOrder ,
123124) -> Vec < Vec < SqlString > >
124125where
125126 K : DBData + ToSqlRow ,
126127{
127128 let mut data_rows = DataRows :: new ( & format, & order) ;
128- let mut cursor = set. cursor ( ) ;
129+ let mut cursor = ( * set) . cursor ( ) ;
129130 while cursor. key_valid ( ) {
130131 let w = * * cursor. weight ( ) ;
131132 if w != Weight :: one ( ) {
132133 panic ! ( "Weight is not one!" ) ;
133134 }
134- let row_vec: Vec < K > = unsafe { cursor. key ( ) . downcast :: < Vec < K > > ( ) } . to_vec ( ) ;
135+ let row_vec: & Arc < Vec < K > > = unsafe { cursor. key ( ) . downcast :: < Arc < Vec < K > > > ( ) } ;
136+ let row_vec = ( * row_vec) . to_vec ( ) ;
135137 let sql_rows = row_vec. iter ( ) . map ( |k| k. to_row ( ) ) ;
136138 for row in sql_rows {
137139 data_rows. push ( row) ;
@@ -161,19 +163,20 @@ where
161163
162164/// Version of hash that takes the result of orderby: a zset that is expected
163165/// to contain a single vector with all the data.
164- pub fn hash_vectors < K > ( set : & WSet < Vec < K > > , format : SqlString , order : SortOrder ) -> String
166+ pub fn hash_vectors < K > ( set : & WSet < Arc < Vec < K > > > , format : SqlString , order : SortOrder ) -> SqlString
165167where
166168 K : DBData + ToSqlRow ,
167169{
168170 // Result of orderby - there should be at most one row in the set.
169171 let mut builder = String :: default ( ) ;
170- let mut cursor = set. cursor ( ) ;
172+ let mut cursor = ( * set) . cursor ( ) ;
171173 while cursor. key_valid ( ) {
172174 let w = * * cursor. weight ( ) ;
173175 if w != Weight :: one ( ) {
174176 panic ! ( "Weight is not one!" ) ;
175177 }
176- let row_vec: Vec < K > = unsafe { cursor. key ( ) . downcast :: < Vec < K > > ( ) } . to_vec ( ) ;
178+ let row_vec: & Arc < Vec < K > > = unsafe { cursor. key ( ) . downcast :: < Arc < Vec < K > > > ( ) } ;
179+ let row_vec = ( * row_vec) . to_vec ( ) ;
177180 let sql_rows = row_vec. iter ( ) . map ( |k| k. to_row ( ) ) ;
178181 let mut data_rows = DataRows :: with_capacity ( & format, & order, sql_rows. len ( ) ) ;
179182 for row in sql_rows {
@@ -188,7 +191,7 @@ where
188191 }
189192 // println!("{}", builder);
190193 let digest = md5:: compute ( builder) ;
191- format ! ( "{:x}" , digest)
194+ SqlString :: from_ref ( & format ! ( "{:x}" , digest) )
192195}
193196
194197// The count of elements in a zset that contains a vector is
0 commit comments