if(groupSpecs != null) { dumper.display("group "); dumper.display("$").display(toGroupVarName); dumper.display(" as "); dumper.display("$").display(groupVarName); dumper.display(" by "); for(int i = 0; i < groupSpecs.length; i++) { if(i > 0) dumper.display(", ");  dumper.display(groupSpecs[i].getGroupExpression().toString()); dumper.display(" as "); dumper.display("$").display(groupSpecs[i].getKeyVarName()); } dumper.nl(); }
    public void dump(ExpressionDumper dumper) {        dumper.display("let ", getASTNode());        dumper.startIndent();        dumper.display("$").display(varName);        dumper.display(" := ");        inputSequence.dump(dumper);        dumper.endIndent();        if(whereExpr != null) {            dumper.nl().display("where ");            whereExpr.dump(dumper);        }        if(orderSpecs != null) {            dumper.nl().display("order by ");            for(int i = 0; i < orderSpecs.length; i++) {                if(i > 0)                    dumper.display(", ");                //TODO : toString() or... dump ?                dumper.display(orderSpecs[i].toString());            }        }        //TODO : QuantifiedExpr        if (returnExpr instanceof LetExpr)            dumper.display(", ");        else            dumper.nl().display("return ");         dumper.startIndent();        returnExpr.dump(dumper);        dumper.endIndent();    }