@@ -11,7 +11,7 @@ use crate::{
1111 utils:: immutable:: RefList ,
1212} ;
1313
14- use super :: memoization:: EvaluationCache ;
14+ use super :: memoization:: { evaluate_with_cell , EvaluationCache } ;
1515
1616#[ derive( Debug ) ]
1717pub struct ScopeValueBuilder {
@@ -59,7 +59,7 @@ impl ScopeValueBuilder {
5959 }
6060
6161 fn augmented_from (
62- source : value:: ScopeValue ,
62+ source : & value:: ScopeValue ,
6363 schema : & schema:: CollectionSchema ,
6464 ) -> Result < Self > {
6565 let val_index_base = if schema. has_key ( ) { 1 } else { 0 } ;
@@ -70,7 +70,7 @@ impl ScopeValueBuilder {
7070 let value:: ScopeValue ( source_fields) = source;
7171 for ( ( v, t) , r) in source_fields
7272 . fields
73- . into_iter ( )
73+ . iter ( )
7474 . zip ( schema. row . fields [ val_index_base..( val_index_base + len) ] . iter ( ) )
7575 . zip ( & mut builder. fields )
7676 {
@@ -82,17 +82,17 @@ impl ScopeValueBuilder {
8282}
8383
8484fn augmented_value (
85- val : value:: Value ,
85+ val : & value:: Value ,
8686 val_type : & schema:: ValueType ,
8787) -> Result < value:: Value < ScopeValueBuilder > > {
8888 let value = match ( val, val_type) {
8989 ( value:: Value :: Null , _) => value:: Value :: Null ,
90- ( value:: Value :: Basic ( v) , _) => value:: Value :: Basic ( v) ,
90+ ( value:: Value :: Basic ( v) , _) => value:: Value :: Basic ( v. clone ( ) ) ,
9191 ( value:: Value :: Struct ( v) , schema:: ValueType :: Struct ( t) ) => {
9292 value:: Value :: Struct ( value:: FieldValues {
9393 fields : v
9494 . fields
95- . into_iter ( )
95+ . iter ( )
9696 . enumerate ( )
9797 . map ( |( i, v) | augmented_value ( v, & t. fields [ i] . value_type . typ ) )
9898 . collect :: < Result < Vec < _ > > > ( ) ?,
@@ -106,8 +106,8 @@ fn augmented_value(
106106 )
107107 }
108108 ( value:: Value :: Table ( v) , schema:: ValueType :: Collection ( t) ) => value:: Value :: Table (
109- v. into_iter ( )
110- . map ( |( k, v) | Ok ( ( k, ScopeValueBuilder :: augmented_from ( v, t) ?) ) )
109+ v. iter ( )
110+ . map ( |( k, v) | Ok ( ( k. clone ( ) , ScopeValueBuilder :: augmented_from ( v, t) ?) ) )
111111 . collect :: < Result < BTreeMap < _ , _ > > > ( ) ?,
112112 ) ,
113113 ( value:: Value :: List ( v) , schema:: ValueType :: Collection ( t) ) => value:: Value :: List (
@@ -245,7 +245,7 @@ impl<'a> ScopeEntry<'a> {
245245 . expect ( "Field is already set, violating single-definition rule" ) ;
246246 }
247247
248- fn define_field ( & self , output_field : & AnalyzedOpOutput , val : value:: Value ) -> Result < ( ) > {
248+ fn define_field ( & self , output_field : & AnalyzedOpOutput , val : & value:: Value ) -> Result < ( ) > {
249249 let field_index = output_field. field_idx as usize ;
250250 let field_schema = & self . schema . fields [ field_index] ;
251251 let val = augmented_value ( val, & field_schema. value_type . typ ) ?;
@@ -304,30 +304,28 @@ async fn evaluate_op_scope(
304304 match reactive_op {
305305 AnalyzedReactiveOp :: Transform ( op) => {
306306 let input_values = assemble_input_values ( & op. inputs , scoped_entries) ;
307- let output_value = if let Some ( cache) = op
308- . function_exec_info
309- . enable_cache
310- . then_some ( cache)
311- . flatten ( )
312- {
313- let key = op
314- . function_exec_info
315- . fingerprinter
316- . clone ( )
317- . with ( & input_values) ?
318- . to_fingerprint ( ) ;
319- cache
320- . evaluate (
307+
308+ let output_value_cell = match ( op. function_exec_info . enable_cache , cache) {
309+ ( true , Some ( cache) ) => {
310+ let key = op
311+ . function_exec_info
312+ . fingerprinter
313+ . clone ( )
314+ . with ( & input_values) ?
315+ . to_fingerprint ( ) ;
316+ Some ( cache. get (
321317 key,
322318 & op. function_exec_info . output_type ,
323319 /*ttl=*/ None ,
324- move || op. executor . evaluate ( input_values) ,
325- )
326- . await ?
327- } else {
328- op. executor . evaluate ( input_values) . await ?
320+ ) ?)
321+ }
322+ _ => None ,
329323 } ;
330- head_scope. define_field ( & op. output , output_value) ?;
324+ let output_value = evaluate_with_cell ( output_value_cell. as_ref ( ) , move || {
325+ op. executor . evaluate ( input_values)
326+ } )
327+ . await ?;
328+ head_scope. define_field ( & op. output , & output_value) ?;
331329 }
332330
333331 AnalyzedReactiveOp :: ForEach ( op) => {
@@ -442,7 +440,7 @@ pub async fn evaluate_source_entry<'a>(
442440 let result = match source_op. executor . get_value ( & key) . await ? {
443441 Some ( val) => {
444442 let scope_value =
445- ScopeValueBuilder :: augmented_from ( value:: ScopeValue ( val) , & collection_schema) ?;
443+ ScopeValueBuilder :: augmented_from ( & value:: ScopeValue ( val) , & collection_schema) ?;
446444 root_scope_entry. define_field_w_builder (
447445 & source_op. output ,
448446 value:: Value :: Table ( BTreeMap :: from ( [ ( key. clone ( ) , scope_value) ] ) ) ,
@@ -463,7 +461,7 @@ pub async fn evaluate_source_entry<'a>(
463461
464462pub async fn evaluate_transient_flow (
465463 flow : & AnalyzedTransientFlow ,
466- input_values : Vec < value:: Value > ,
464+ input_values : & Vec < value:: Value > ,
467465) -> Result < value:: Value > {
468466 let root_schema = & flow. data_schema . schema ;
469467 let root_scope_value =
0 commit comments