public static QuerySelector parse(Selector selector, OutputStream outputStream,
                                      MetaComplexEvent metaComplexEvent, Map<String, Table> tableMap,
                                      List<VariableExpressionExecutor> variableExpressionExecutors,
                                      int metaPosition, ProcessingMode processingMode,
                                      boolean outputExpectsExpiredEvents, SiddhiQueryContext siddhiQueryContext) {
        boolean currentOn = false;
        boolean expiredOn = false;
        String id = null;

        if (outputStream.getOutputEventType() == OutputStream.OutputEventType.CURRENT_EVENTS || outputStream
                .getOutputEventType() == OutputStream.OutputEventType.ALL_EVENTS) {
            currentOn = true;
        }
        if (outputStream.getOutputEventType() == OutputStream.OutputEventType.EXPIRED_EVENTS || outputStream
                .getOutputEventType() == OutputStream.OutputEventType.ALL_EVENTS) {
            expiredOn = true;
        }
        boolean groupBy = !selector.getGroupByList().isEmpty();
        id = outputStream.getId();
        containsAggregatorThreadLocal.remove();
        QuerySelector querySelector = new QuerySelector(id, selector, currentOn, expiredOn, siddhiQueryContext);
        List<AttributeProcessor> attributeProcessors = getAttributeProcessors(selector, id,
                metaComplexEvent, tableMap, variableExpressionExecutors, outputStream, metaPosition,
                processingMode, outputExpectsExpiredEvents, groupBy, siddhiQueryContext);
        querySelector.setAttributeProcessorList(attributeProcessors,
                "true".equals(containsAggregatorThreadLocal.get()));
        containsAggregatorThreadLocal.remove();
        ConditionExpressionExecutor havingCondition = generateHavingExecutor(selector.getHavingExpression(),
                metaComplexEvent, tableMap, variableExpressionExecutors, siddhiQueryContext);
        querySelector.setHavingConditionExecutor(havingCondition, "true".equals(containsAggregatorThreadLocal.get()));
        containsAggregatorThreadLocal.remove();
        if (!selector.getGroupByList().isEmpty()) {
            List<Expression> groupByExpressionList = selector.getGroupByList().stream()
                    .map(groupByVariable -> (Expression) groupByVariable)
                    .collect(Collectors.toList());
            querySelector.setGroupByKeyGenerator(new GroupByKeyGenerator(groupByExpressionList, metaComplexEvent,
                    SiddhiConstants.UNKNOWN_STATE, null, variableExpressionExecutors,
                    siddhiQueryContext));
        }
        if (!selector.getOrderByList().isEmpty()) {
            querySelector.setOrderByEventComparator(new OrderByEventComparator(selector.getOrderByList(),
                    metaComplexEvent, SiddhiConstants.HAVING_STATE, null, variableExpressionExecutors,
                    siddhiQueryContext));
        }
        if (selector.getLimit() != null) {
            ExpressionExecutor expressionExecutor = ExpressionParser.parseExpression((Expression) selector.getLimit(),
                    metaComplexEvent, SiddhiConstants.HAVING_STATE, tableMap, variableExpressionExecutors,
                    false, 0,
                    ProcessingMode.BATCH, false, siddhiQueryContext);
            containsAggregatorThreadLocal.remove();
            querySelector.setLimit(((Number)
                    (((ConstantExpressionExecutor) expressionExecutor).getValue())).longValue());
        }
        if (selector.getOffset() != null) {
            ExpressionExecutor expressionExecutor = ExpressionParser.parseExpression((Expression) selector.getOffset(),
                    metaComplexEvent, SiddhiConstants.HAVING_STATE, tableMap, variableExpressionExecutors,
                    false, 0,
                    ProcessingMode.BATCH, false, siddhiQueryContext);
            containsAggregatorThreadLocal.remove();
            querySelector.setOffset(((Number)
                    (((ConstantExpressionExecutor) expressionExecutor).getValue())).longValue());
        }
        return querySelector;
    }
Parse Selector portion of a query and return corresponding QuerySelector.

@param selector                    selector to be parsed
@param outputStream                output stream
@param metaComplexEvent            Meta event used to collect execution info of stream associated with query
@param tableMap                    Table Map
@param variableExpressionExecutors variable expression executors
@param metaPosition                helps to identify the meta position of aggregates
@param processingMode              processing mode of the query
@param outputExpectsExpiredEvents  is expired events sent as output
@param siddhiQueryContext          current siddhi query context
@return QuerySelector
modules/siddhi-core/src/main/java/io/siddhi/core/util/parser/SelectorParser.java