use crate::optimizer::heuristic::macros::define_rewrite_pushdown_rule;
use crate::optimizer::heuristic::result::TransformResult;
use crate::planning::plan::core::nodes::access::graph_scan_node::ScanEdgesNode;
use crate::planning::plan::core::nodes::operation::sort_node::LimitNode;
define_rewrite_pushdown_rule! {
name: PushLimitDownScanEdgesRule,
parent_node: Limit,
child_node: ScanEdges,
apply: |_ctx, limit_node: &LimitNode, scan_edges_node: &ScanEdgesNode| {
let limit_rows = limit_node.offset() + limit_node.count();
if let Some(existing_limit) = scan_edges_node.limit() {
if limit_rows >= existing_limit {
return Ok(None::<TransformResult>);
}
}
let mut new_scan_edges = scan_edges_node.clone();
new_scan_edges.set_limit(limit_rows);
let mut result = TransformResult::new();
result.erase_all = true;
result.add_new_node(PlanNodeEnum::ScanEdges(new_scan_edges));
Ok(Some(result))
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::optimizer::heuristic::rule::RewriteRule;
#[test]
fn test_rule_name() {
let rule = PushLimitDownScanEdgesRule::new();
assert_eq!(rule.name(), "PushLimitDownScanEdgesRule");
}
#[test]
fn test_rule_pattern() {
let rule = PushLimitDownScanEdgesRule::new();
let pattern = rule.pattern();
assert!(pattern.node.is_some());
}
}