@Override public void onMatch(RelOptRuleCall call) { final Project project = call.rel(0); boolean changed = false; final RexBuilder rexBuilder = project.getCluster().getRexBuilder(); List<RexNode> newProjects = new ArrayList<>(); for (RexNode oldNode : project.getProjects()) { RexNode newNode = analyzeRexNode(rexBuilder, oldNode); if (!newNode.toString().equals(oldNode.toString())) { changed = true; newProjects.add(newNode); } else { newProjects.add(oldNode); } } if (!changed) { return; } Project newProject = project.copy(project.getTraitSet(), project.getInput(), newProjects, project.getRowType(), project.getFlags()); call.transformTo(newProject); }