Remove batch splitting system (#475)

* First pass at removing batch splitting

* Refactor to separate module loading from request parsing

* Consolidate module functionality

* Tidy up comments

* Use array of modules instead of HashMap

* Formatting

* Use module hashes when importing modules
This commit is contained in:
Rob Knight 2026-02-09 10:31:47 +01:00 committed by GitHub
parent 5dab8195b4
commit acab26e5c1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 1425 additions and 1938 deletions

View file

@ -798,7 +798,6 @@ impl MainPodCompiler {
#[cfg(test)]
pub mod tests {
use num::BigUint;
use super::*;
@ -813,7 +812,7 @@ pub mod tests {
tickets_pod_full_flow, zu_kyc_pod_builder, zu_kyc_pod_request,
zu_kyc_sign_dict_builders, EthDosHelper, MOCK_VD_SET,
},
lang::parse,
lang::load_module,
middleware::{
containers::{Array, Set},
Signer as _, Value,
@ -1382,11 +1381,8 @@ pub mod tests {
Equal(b, 5)
)
"#;
let batch = parse(input, &params, &[])
.unwrap()
.first_batch()
.unwrap()
.clone();
let module = load_module(input, "test", &params, vec![]).unwrap();
let batch = module.batch.clone();
let pred_test = batch.predicate_ref_by_name("Test").unwrap();
// Try to build with wrong type in 1st arg
@ -1434,11 +1430,8 @@ pub mod tests {
c(6, 3)
)
"#;
let batch = parse(input, &params, &[])
.unwrap()
.first_batch()
.unwrap()
.clone();
let module = load_module(input, "test", &params, vec![]).unwrap();
let batch = module.batch.clone();
let pred_test = batch.predicate_ref_by_name("Test").unwrap();
let mut builder = MainPodBuilder::new(&params, vd_set);
@ -1459,11 +1452,8 @@ pub mod tests {
c(6, 3)
)
"#;
let batch = parse(input, &params, &[])
.unwrap()
.first_batch()
.unwrap()
.clone();
let module = load_module(input, "test", &params, vec![]).unwrap();
let batch = module.batch.clone();
let pred_test = batch.predicate_ref_by_name("Test").unwrap();
let mut builder = MainPodBuilder::new(&params, vd_set);
@ -1501,12 +1491,11 @@ pub mod tests {
"#;
// Parse and batch the predicate (this handles splitting internally)
let parsed = parse(input, &params, &[])?;
let batches = &parsed.custom_batches;
let module = load_module(input, "test", &params, vec![])?;
// Verify it was split
assert!(batches.split_chain("large_pred").is_some());
let chain_info = batches.split_chain("large_pred").unwrap();
assert!(module.split_chains.contains_key("large_pred"));
let chain_info = module.split_chains.get("large_pred").unwrap();
assert_eq!(chain_info.chain_pieces.len(), 2);
assert_eq!(chain_info.real_statement_count, 6);
@ -1538,10 +1527,10 @@ pub mod tests {
let statements = vec![st_a, st_b, st_c, st_d, st_e, st_f];
// Use apply_predicate (primary API) to automatically wire the split chain
let result = batches.apply_predicate(&mut builder, "large_pred", statements, true)?;
let result = module.apply_predicate(&mut builder, "large_pred", statements, true)?;
// The result should be a valid statement
let predicate = batches.predicate_ref_by_name("large_pred").unwrap();
let predicate = module.predicate_ref_by_name("large_pred").unwrap();
match &result {
Statement::Custom(pred_ref, _) => {
assert_eq!(pred_ref, &predicate);

View file

@ -632,7 +632,7 @@ mod tests {
dict,
examples::MOCK_VD_SET,
frontend::{Operation as FrontendOp, SignedDictBuilder},
lang::parse,
lang::load_module,
};
#[test]
@ -756,18 +756,17 @@ mod tests {
// pred_a accepts a Contains statement
// pred_b accepts a pred_a statement (Custom statement from pred_a)
let parsed = parse(
let module = load_module(
r#"
pred_a(X) = AND(Contains(X, "k", 1))
pred_b(X) = AND(pred_a(X))
"#,
"test",
&params,
&[],
vec![],
)
.expect("parse predicates");
let batch = parsed
.first_batch()
.expect("parse predicates should have a batch");
.expect("load module");
let batch = &module.batch;
let mut builder = MultiPodBuilder::new(&params, vd_set);
@ -1484,20 +1483,19 @@ mod tests {
let vd_set = &*MOCK_VD_SET;
// Chain of predicates: each accepts the output of the previous
let parsed = parse(
let module = load_module(
r#"
pred_a(X) = AND(Contains(X, "k", 1))
pred_b(X) = AND(pred_a(X))
pred_c(X) = AND(pred_b(X))
pred_d(X) = AND(pred_c(X))
"#,
"test",
&params,
&[],
vec![],
)
.expect("parse predicates");
let batch = parsed
.first_batch()
.expect("parse predicates should have a batch");
.expect("load module");
let batch = &module.batch;
let mut builder = MultiPodBuilder::new(&params, vd_set);
@ -1612,7 +1610,7 @@ mod tests {
// pred_a takes TWO custom statement arguments (b_out and c_out)
// pred_b and pred_c each take a Contains
// Note: AND clauses are newline-separated, not comma-separated
let parsed = parse(
let module = load_module(
r#"
pred_b(X) = AND(Contains(X, "k", 1))
pred_c(X) = AND(Contains(X, "k", 1))
@ -1621,13 +1619,12 @@ mod tests {
pred_c(Y)
)
"#,
"test",
&params,
&[],
vec![],
)
.expect("parse predicates");
let batch = parsed
.first_batch()
.expect("parse predicates should have a batch");
.expect("load module");
let batch = &module.batch;
let mut builder = MultiPodBuilder::new(&params, vd_set);

View file

@ -185,7 +185,7 @@ mod tests {
zu_kyc_pod_builder, zu_kyc_pod_request, zu_kyc_sign_dict_builders, MOCK_VD_SET,
},
frontend::{MainPodBuilder, Operation},
lang::parse,
lang::parse_request,
middleware::{Params, Value},
};
@ -210,7 +210,7 @@ mod tests {
assert!(request.exact_match_pod(&*kyc.pod).is_ok());
// This request does not match the POD, because the POD does not contain a NotEqual statement.
let non_matching_request = parse(
let non_matching_request = parse_request(
r#"
REQUEST(
NotEqual(4, 5)
@ -219,8 +219,7 @@ mod tests {
&params,
&[],
)
.unwrap()
.request;
.unwrap();
assert!(non_matching_request.exact_match_pod(&*kyc.pod).is_err());
}
@ -240,7 +239,7 @@ mod tests {
println!("{pod}");
let request = parse(
let request = parse_request(
r#"
REQUEST(
SumOf(a, b, c)
@ -252,7 +251,7 @@ mod tests {
)
.unwrap();
let bindings = request.request.exact_match_pod(&*pod.pod).unwrap();
let bindings = request.exact_match_pod(&*pod.pod).unwrap();
assert_eq!(*bindings.get("a").unwrap(), 10.into());
assert_eq!(*bindings.get("b").unwrap(), 9.into());
assert_eq!(*bindings.get("c").unwrap(), 1.into());