Ejemplo n.º 1
0
  @Override
  public void updateAggregate(Session session) {
    // TODO aggregates: check nested MIN(MAX(ID)) and so on
    // if (on != null) {
    // on.updateAggregate();
    // }
    HashMap<Expression, Object> group = select.getCurrentGroup();
    if (group == null) {
      // this is a different level (the enclosing query)
      return;
    }

    int groupRowId = select.getCurrentGroupRowId();
    if (lastGroupRowId == groupRowId) {
      // already visited
      return;
    }
    lastGroupRowId = groupRowId;

    AggregateData data = (AggregateData) group.get(this);
    if (data == null) {
      data = AggregateData.create(type);
      group.put(this, data);
    }
    Value v = on == null ? null : on.getValue(session);
    if (type == GROUP_CONCAT) {
      if (v != ValueNull.INSTANCE) {
        v = v.convertTo(Value.STRING);
        if (groupConcatOrderList != null) {
          int size = groupConcatOrderList.size();
          Value[] array = new Value[1 + size];
          array[0] = v;
          for (int i = 0; i < size; i++) {
            SelectOrderBy o = groupConcatOrderList.get(i);
            array[i + 1] = o.expression.getValue(session);
          }
          v = ValueArray.get(array);
        }
      }
    }
    data.add(session.getDatabase(), dataType, distinct, v);
  }