Skip to content

Commit cdef5e3

Browse files
committed
Add the auto UUID field in the evaluator.
1 parent e85ffbd commit cdef5e3

File tree

2 files changed

+27
-10
lines changed

2 files changed

+27
-10
lines changed

src/execution/evaluator.rs

Lines changed: 25 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -278,14 +278,13 @@ fn assemble_value(
278278
}
279279
}
280280

281-
fn assemble_input_values(
282-
value_mappings: &[AnalyzedValueMapping],
283-
scoped_entries: RefList<'_, &ScopeEntry<'_>>,
284-
) -> Vec<value::Value> {
281+
fn assemble_input_values<'a>(
282+
value_mappings: &'a [AnalyzedValueMapping],
283+
scoped_entries: RefList<'a, &ScopeEntry<'a>>,
284+
) -> impl Iterator<Item = value::Value> + 'a {
285285
value_mappings
286286
.iter()
287-
.map(|value_mapping| assemble_value(value_mapping, scoped_entries))
288-
.collect()
287+
.map(move |value_mapping| assemble_value(value_mapping, scoped_entries))
289288
}
290289

291290
async fn evaluate_child_op_scope(
@@ -316,7 +315,9 @@ async fn evaluate_op_scope(
316315
for reactive_op in op_scope.reactive_ops.iter() {
317316
match reactive_op {
318317
AnalyzedReactiveOp::Transform(op) => {
319-
let input_values = assemble_input_values(&op.inputs, scoped_entries);
318+
let mut input_values = Vec::with_capacity(op.inputs.len());
319+
input_values
320+
.extend(assemble_input_values(&op.inputs, scoped_entries).collect::<Vec<_>>());
320321
let output_value_cell = memory.get_cache_entry(
321322
|| {
322323
Ok(op
@@ -402,7 +403,23 @@ async fn evaluate_op_scope(
402403
}
403404

404405
AnalyzedReactiveOp::Collect(op) => {
405-
let field_values = assemble_input_values(&op.input.fields, scoped_entries);
406+
let mut field_values = Vec::with_capacity(
407+
op.input.fields.len() + if op.has_auto_uuid_field { 1 } else { 0 },
408+
);
409+
let field_values_iter = assemble_input_values(&op.input.fields, scoped_entries);
410+
if op.has_auto_uuid_field {
411+
field_values.push(value::Value::Null);
412+
field_values.extend(field_values_iter);
413+
let uuid = memory.next_uuid(
414+
op.fingerprinter
415+
.clone()
416+
.with(&field_values[1..])?
417+
.into_fingerprint(),
418+
)?;
419+
field_values[0] = value::Value::Basic(value::BasicValue::Uuid(uuid));
420+
} else {
421+
field_values.extend(field_values_iter);
422+
};
406423
let collector_entry = scoped_entries
407424
.headn(op.collector_ref.scope_up_level as usize)
408425
.unwrap();

src/utils/fingerprint.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -81,13 +81,13 @@ impl Fingerprinter {
8181
Fingerprint(self.hasher.finalize().into())
8282
}
8383

84-
pub fn with<S: Serialize>(self, value: &S) -> Result<Self, FingerprinterError> {
84+
pub fn with<S: Serialize + ?Sized>(self, value: &S) -> Result<Self, FingerprinterError> {
8585
let mut fingerprinter = self;
8686
value.serialize(&mut fingerprinter)?;
8787
Ok(fingerprinter)
8888
}
8989

90-
pub fn write<S: Serialize>(&mut self, value: &S) -> Result<(), FingerprinterError> {
90+
pub fn write<S: Serialize + ?Sized>(&mut self, value: &S) -> Result<(), FingerprinterError> {
9191
value.serialize(self)
9292
}
9393

0 commit comments

Comments
 (0)