core/src/main/java/com/orientechnologies/orient/core/sql/executor/OSelectExecutionPlanner.java
private static void splitProjectionsForGroupBy(QueryPlanningInfo info, OCommandContext ctx) {
    if (info.projection == null) {
      return;
    }

    OProjection preAggregate = new OProjection(-1);
    preAggregate.setItems(new ArrayList<>());
    OProjection aggregate = new OProjection(-1);
    aggregate.setItems(new ArrayList<>());
    OProjection postAggregate = new OProjection(-1);
    postAggregate.setItems(new ArrayList<>());

    boolean isSplitted = false;

    //split for aggregate projections
    AggregateProjectionSplit result = new AggregateProjectionSplit();
    for (OProjectionItem item : info.projection.getItems()) {
      result.reset();
      if (isAggregate(item)) {
        isSplitted = true;
        OProjectionItem post = item.splitForAggregation(result, ctx);
        OIdentifier postAlias = item.getProjectionAlias();
        postAlias = new OIdentifier(postAlias, true);
        post.setAlias(postAlias);
        postAggregate.getItems().add(post);
        aggregate.getItems().addAll(result.getAggregate());
        preAggregate.getItems().addAll(result.getPreAggregate());
      } else {
        preAggregate.getItems().add(item);
        //also push the alias forward in the chain
        OProjectionItem aggItem = new OProjectionItem(-1);
        aggItem.setExpression(new OExpression(item.getProjectionAlias()));
        aggregate.getItems().add(aggItem);
        postAggregate.getItems().add(aggItem);
      }
    }

    //bind split projections to the execution planner
    if (isSplitted) {
      info.preAggregateProjection = preAggregate;
      if (info.preAggregateProjection.getItems() == null || info.preAggregateProjection.getItems().size() == 0) {
        info.preAggregateProjection = null;
      }
      info.aggregateProjection = aggregate;
      if (info.aggregateProjection.getItems() == null || info.aggregateProjection.getItems().size() == 0) {
        info.aggregateProjection = null;
      }
      info.projection = postAggregate;

      addGroupByExpressionsToProjections(info);
    }
  }
private static void splitProjectionsForGroupBy(QueryPlanningInfo info, OCommandContext ctx) {
    if (info.projection == null) {
      return;
    }

    OProjection preAggregate = new OProjection(-1);
    preAggregate.setItems(new ArrayList<>());
    OProjection aggregate = new OProjection(-1);
    aggregate.setItems(new ArrayList<>());
    OProjection postAggregate = new OProjection(-1);
    postAggregate.setItems(new ArrayList<>());

    boolean isSplitted = false;

    //split for aggregate projections
    AggregateProjectionSplit result = new AggregateProjectionSplit();
    for (OProjectionItem item : info.projection.getItems()) {
      result.reset();
      if (isAggregate(item)) {
        isSplitted = true;
        OProjectionItem post = item.splitForAggregation(result, ctx);
        OIdentifier postAlias = item.getProjectionAlias();
        postAlias = new OIdentifier(postAlias, true);
        post.setAlias(postAlias);
        postAggregate.getItems().add(post);
        aggregate.getItems().addAll(result.getAggregate());
        preAggregate.getItems().addAll(result.getPreAggregate());
      } else {
        preAggregate.getItems().add(item);
        //also push the alias forward in the chain
        OProjectionItem aggItem = new OProjectionItem(-1);
        aggItem.setExpression(new OExpression(item.getProjectionAlias()));
        aggregate.getItems().add(aggItem);
        postAggregate.getItems().add(aggItem);
      }
    }

    //bind split projections to the execution planner
    if (isSplitted) {
      info.preAggregateProjection = preAggregate;
      if (info.preAggregateProjection.getItems() == null || info.preAggregateProjection.getItems().size() == 0) {
        info.preAggregateProjection = null;
      }
      info.aggregateProjection = aggregate;
      if (info.aggregateProjection.getItems() == null || info.aggregateProjection.getItems().size() == 0) {
        info.aggregateProjection = null;
      }
      info.projection = postAggregate;

      addGroupByExpressionsToProjections(info);
    }
  }
private static void splitProjectionsForGroupBy ( QueryPlanningInfo info , OCommandContext ctx ) { if ( info . projection == null ) { return ; } OProjection preAggregate = new OProjection ( - 1 ) ; preAggregate . setItems ( new ArrayList <> ( ) ) ; OProjection aggregate = new OProjection ( - 1 ) ; aggregate . setItems ( new ArrayList <> ( ) ) ; OProjection postAggregate = new OProjection ( - 1 ) ; postAggregate . setItems ( new ArrayList <> ( ) ) ; boolean isSplitted = false ; //split for aggregate projections AggregateProjectionSplit result = new AggregateProjectionSplit ( ) ; for ( OProjectionItem item : info . projection . getItems ( ) ) { result . reset ( ) ; if ( isAggregate ( item ) ) { isSplitted = true ; OProjectionItem post = item . splitForAggregation ( result , ctx ) ; OIdentifier postAlias = item . getProjectionAlias ( ) ; postAlias = new OIdentifier ( postAlias , true ) ; post . setAlias ( postAlias ) ; postAggregate . getItems ( ) . add ( post ) ; aggregate . getItems ( ) . addAll ( result . getAggregate ( ) ) ; preAggregate . getItems ( ) . addAll ( result . getPreAggregate ( ) ) ; } else { preAggregate . getItems ( ) . add ( item ) ; //also push the alias forward in the chain OProjectionItem aggItem = new OProjectionItem ( - 1 ) ; aggItem . setExpression ( new OExpression ( item . getProjectionAlias ( ) ) ) ; aggregate . getItems ( ) . add ( aggItem ) ; postAggregate . getItems ( ) . add ( aggItem ) ; } } //bind split projections to the execution planner if ( isSplitted ) { info . preAggregateProjection = preAggregate ; if ( info . preAggregateProjection . getItems ( ) == null || info . preAggregateProjection . getItems ( ) . size ( ) == 0 ) { info . preAggregateProjection = null ; } info . aggregateProjection = aggregate ; if ( info . aggregateProjection . getItems ( ) == null || info . aggregateProjection . getItems ( ) . size ( ) == 0 ) { info . aggregateProjection = null ; } info . projection = postAggregate ; addGroupByExpressionsToProjections ( info ) ; } }
splits projections in three parts (pre-aggregate, aggregate and final) to efficiently manage aggregations
splits projections in three parts ( pre - aggregate aggregate and final ) to efficiently manage aggregations