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}