class Context {
        final List<? extends Symbol> sourceSymbols;
        IntArrayList orderByPositions;

        public Context(List<? extends Symbol> sourceSymbols) {
            this.sourceSymbols = sourceSymbols;
            this.orderByPositions = new IntArrayList();
        }

        public int[] orderByPositions() {
            return orderByPositions.toArray();
        }
    }

    private OrderByPositionVisitor() {
    }

    @Nullable
    public static int[] orderByPositionsOrNull(Collection<? extends Symbol> orderBySymbols,
                                               List<? extends Symbol> outputSymbols) {<FILL_FUNCTION_BODY>

        Context context = new Context(outputSymbols);
        for (Symbol orderBySymbol : orderBySymbols) {
            orderBySymbol.accept(INSTANCE, context);
        }
        if (context.orderByPositions.size() == orderBySymbols.size()) {
            return context.orderByPositions();
        }
        return null;
    
<methods>public non-sealed void <init>() ,public java.lang.Void visitAggregation(io.crate.expression.symbol.Aggregation, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitAlias(io.crate.expression.symbol.AliasSymbol, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitDynamicReference(io.crate.expression.symbol.DynamicReference, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitFetchMarker(io.crate.expression.symbol.FetchMarker, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitFetchReference(io.crate.expression.symbol.FetchReference, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitFetchStub(io.crate.expression.symbol.FetchStub, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitField(io.crate.expression.symbol.ScopedSymbol, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitFunction(io.crate.expression.symbol.Function, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitInputColumn(io.crate.expression.symbol.InputColumn, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitLiteral(Literal<?>, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitMatchPredicate(io.crate.expression.symbol.MatchPredicate, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitOuterColumn(io.crate.expression.symbol.OuterColumn, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitParameterSymbol(io.crate.expression.symbol.ParameterSymbol, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitReference(io.crate.metadata.Reference, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitSelectSymbol(io.crate.expression.symbol.SelectSymbol, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitVoidReference(io.crate.expression.symbol.VoidReference, io.crate.planner.consumer.OrderByPositionVisitor.Context) ,public java.lang.Void visitWindowFunction(io.crate.expression.symbol.WindowFunction, io.crate.planner.consumer.OrderByPositionVisitor.Context) <variables>