fn main() {
println!("=== TegDB Streaming API Architecture Demo ===\n");
println!("The streaming API provides several key benefits:\n");
println!("1. MEMORY EFFICIENCY:");
println!(" - Traditional: SELECT * FROM large_table loads ALL rows into Vec<Vec<SqlValue>>");
println!(" - Streaming: Processes one row at a time, using O(1) memory instead of O(n)");
println!(" - Critical for tables with millions of rows\n");
println!("2. REDUCED LATENCY:");
println!(" - Traditional: Wait for ALL rows to be processed before getting any results");
println!(" - Streaming: Get first results immediately as they're found");
println!(" - Better user experience for interactive queries\n");
println!("3. EARLY TERMINATION:");
println!(" - LIMIT clauses can stop processing as soon as enough rows are found");
println!(" - Filtering happens during iteration, not after loading everything");
println!(" - Massive performance gains for selective queries\n");
println!("4. COMPOSABLE OPERATIONS:");
println!(" - stream.take(10) - get first 10 rows");
println!(" - stream.filter(|row| condition) - apply additional filtering");
println!(" - stream.collect() - convert back to Vec for compatibility");
println!(" - Lazy evaluation means only necessary work is done\n");
println!("5. REAL-WORLD SCENARIOS:");
println!(" - ETL processes: Stream data from source to destination");
println!(" - Analytics: Calculate aggregates without loading full dataset");
println!(" - Reporting: Generate reports with pagination");
println!(" - Real-time processing: Handle data as it comes in\n");
demonstrate_streaming_concept();
}
fn demonstrate_streaming_concept() {
println!("=== Conceptual API Usage ===\n");
println!("// Example 1: Basic streaming usage");
println!("let streaming_result = executor.execute_streaming_query(\"users\", None, None, Some(100))?;");
println!("for row_result in streaming_result.rows {{");
println!(" match row_result {{");
println!(" Ok(row) => process_row(row),");
println!(" Err(e) => handle_error(e),");
println!(" }}");
println!("}}\n");
println!("// Example 2: Memory-efficient aggregation");
println!("let stream = executor.execute_streaming_query(\"sales\", Some(&[\"amount\"]), None, None)?;");
println!("let total: f64 = stream.rows");
println!(" .filter_map(|row| row.ok()?.get(0)?.as_real())");
println!(" .sum();");
println!("// Processes millions of rows using constant memory!\n");
println!("// Example 3: Pagination");
println!("let stream = executor.execute_streaming_query(\"products\", None, None, None)?;");
println!(
"let page: Vec<_> = stream.rows.skip(page_size * page_num).take(page_size).collect();"
);
println!("// Only processes the rows actually needed\n");
println!("// Example 4: Early termination");
println!(
"let stream = executor.execute_streaming_query(\"logs\", None, Some(error_filter), None)?;"
);
println!("if let Some(first_error) = stream.rows.next() {{");
println!(" // Found the error immediately, no need to scan entire table");
println!(" handle_first_error(first_error);");
println!("}}\n");
println!("=== Architecture Benefits ===\n");
println!("1. The RowIterator struct implements lazy evaluation");
println!("2. StorageFormat.deserialize_row() is called on-demand");
println!("3. Transaction.scan() returns an iterator, not a Vec");
println!("4. Filters are applied during iteration, not after");
println!("5. LIMIT is enforced by the iterator, stopping early");
println!("6. Memory usage is bounded by single row size, not result set size\n");
println!("This architecture is especially important for:");
println!("- IoT data processing (millions of sensor readings)");
println!("- Log analysis (large log files)");
println!("- ETL workflows (transforming large datasets)");
println!("- Real-time analytics (processing data streams)");
println!("- Large reporting queries (financial reports, etc.)");
}