alamb commented on code in PR #10386:
URL: https://github.com/apache/datafusion/pull/10386#discussion_r1590780379
##########
datafusion/optimizer/src/simplify_expressions/expr_simplifier.rs:
##########
@@ -1670,17 +1734,106 @@ fn inlist_except(mut l1: InList, l2: InList) ->
Result<Expr> {
Ok(Expr::InList(l1))
}
+pub struct RewriteCycle {
+ consecutive_unchanged_count: usize,
+ total_iterations: usize,
+ num_rewriters: usize,
+}
+pub type RewriteCycleResult = ControlFlow<Result<Expr>, Expr>;
+
+impl RewriteCycle {
+ fn new() -> Self {
+ RewriteCycle {
+ // use usize::MAX as default to avoid checking null in is_done()
comparison
+ // real value is set later by record_num_rewriters
+ num_rewriters: usize::MAX,
+ consecutive_unchanged_count: 0,
+ total_iterations: 0,
+ }
+ }
+
+ pub fn completed_cycles(&self) -> usize {
+ // default value indicates we have not completed a cycle
+ if self.num_rewriters == usize::MAX {
+ 0
+ } else {
+ self.total_iterations / self.num_rewriters
+ }
+ }
+
+ pub fn total_iterations(&self) -> usize {
+ self.total_iterations
+ }
+
+ fn record_num_rewriters(&mut self) {
+ self.num_rewriters = self.total_iterations;
+ }
+
+ fn is_done(&self) -> bool {
+ self.consecutive_unchanged_count >= self.num_rewriters
Review Comment:
🤔 I think there are cases when simplification will do something that allows
more constant propagation to proceed so even if `transformed=false` is returned
another application of a different pass could actually simplify things -- so in
this case for example if the const evaluator returns false, simpliy could still
return true
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]