// MoonBit Stream Quality Engine - Benchmark Stream Generator Module
// Copyright 2026 zmjknn
// Apache-2.0 License
///|
/// Generates a synthetic stream of IoT sensor events with intentional quality flaws for benchmark evaluation.
pub fn generate_benchmark_sensor_stream(
count : Int,
base_timestamp? : Int64 = 1700000000000L,
) -> Array[@core.StreamEvent] {
let events : Array[@core.StreamEvent] = []
for i = 0; i < count; i = i + 1 {
let payload : Map[String, @core.Value] = Map([])
// Every 20th event is missing device_id (completeness flaw)
if i % 20 != 0 {
payload.set(
"device_id",
@core.Value::String("sensor-" + (i % 5).to_string()),
)
}
// Every 15th event has an extreme temperature outlier (range flaw)
let temp = if i % 15 == 0 {
250.0
} else {
20.0 + (i % 10).to_double() * 0.5
}
payload.set("temperature", @core.Value::Double(temp))
// Humidity field
payload.set("humidity", @core.Value::Double(55.0 + (i % 5).to_double()))
// Email alert field (every 25th has invalid format)
let email = if i % 25 == 0 {
"invalid_email_format"
} else {
"operator_" + (i % 3).to_string() + "@factory.com"
}
payload.set("operator_email", @core.Value::String(email))
// Timestamp with out-of-order latency for every 30th event (chronology flaw)
let ts_offset = if i % 30 == 0 { -10000L } else { i.to_int64() * 1000L }
let ts = base_timestamp + ts_offset
events.push(
@core.StreamEvent::new(
"evt-" + i.to_string(),
ts,
event_type="sensor_telemetry",
payload~,
),
)
}
events
}
///|
/// Generates a synthetic stream of E-Commerce Transaction events with cross-field and uniqueness constraints.
pub fn generate_benchmark_order_stream(
count : Int,
base_timestamp? : Int64 = 1700000000000L,
) -> Array[@core.StreamEvent] {
let events : Array[@core.StreamEvent] = []
for i = 0; i < count; i = i + 1 {
let payload : Map[String, @core.Value] = Map([])
// Order ID (every 12th event duplicates previous order_id -> uniqueness flaw)
let order_id = if i % 12 == 0 && i > 0 {
"ord-" + (i - 1).to_string()
} else {
"ord-" + i.to_string()
}
payload.set("order_id", @core.Value::String(order_id))
// Timestamps for cross-field check (end_time >= start_time)
let start_t = base_timestamp + i.to_int64() * 500L
// Every 18th event has end_time < start_time (cross-field constraint flaw)
let end_t = if i % 18 == 0 { start_t - 500L } else { start_t + 1200L }
payload.set("start_time", @core.Value::Int(start_t))
payload.set("end_time", @core.Value::Int(end_t))
// Payment status & Amount
payload.set("amount", @core.Value::Double(99.99 + i.to_double()))
payload.set("currency", @core.Value::String("USD"))
events.push(
@core.StreamEvent::new(
"order-evt-" + i.to_string(),
start_t,
event_type="order_created",
payload~,
),
)
}
events
}