001package gudusoft.gsqlparser.nodes.powerquery; 002 003import gudusoft.gsqlparser.nodes.TParseTreeNode; 004import gudusoft.gsqlparser.nodes.TParseTreeVisitor; 005 006import java.util.ArrayList; 007import java.util.List; 008 009/** 010 * Power Query M-Language {@code let ... in ...} document container. 011 * 012 * <p>Holds the ordered list of step bindings (name = expression) plus the 013 * identifier that the {@code in} clause returns. Mirrors the parse-graph 014 * shape produced by {@link gudusoft.gsqlparser.parser.PowerQuerySqlParser}. 015 * 016 * <p>This is the root node of a parsed M document. Lineage extraction walks 017 * this container to find {@link TPowerQueryNativeQuery} and 018 * {@link TPowerQueryNavChain} steps. 019 */ 020public class TPowerQueryLetExpr extends TParseTreeNode { 021 022 private final List<TPowerQueryStep> steps = new ArrayList<>(); 023 private String resultStepName; 024 025 public List<TPowerQueryStep> getSteps() { 026 return steps; 027 } 028 029 public void addStep(TPowerQueryStep step) { 030 if (step != null) { 031 this.steps.add(step); 032 } 033 } 034 035 public String getResultStepName() { 036 return resultStepName; 037 } 038 039 public void setResultStepName(String resultStepName) { 040 this.resultStepName = resultStepName; 041 } 042 043 /** 044 * Look up a step by its binding name. {@code null} if not found. 045 */ 046 public TPowerQueryStep findStep(String name) { 047 if (name == null) return null; 048 for (TPowerQueryStep step : steps) { 049 if (name.equals(step.getName())) { 050 return step; 051 } 052 } 053 return null; 054 } 055 056 @Override 057 public void accept(TParseTreeVisitor v) { 058 v.preVisit(this); 059 v.postVisit(this); 060 } 061 062 @Override 063 public void acceptChildren(TParseTreeVisitor v) { 064 v.preVisit(this); 065 for (TPowerQueryStep step : steps) { 066 if (step != null) step.acceptChildren(v); 067 } 068 v.postVisit(this); 069 } 070}