public Interval locate(DataColumn column, Integer intervalIndex) {
    ColumnGroup columnGroup = column.getColumnGroup();
    Date columnMinDate = (Date) column.getMinValue();
    String type = column.getIntervalType();

    if (columnGroup == null) return null;
    if (columnMinDate == null) return null;
    if (type == null) return null;

    // Calculate the interval min. date.
    DateIntervalType intervalType = DateIntervalType.getByName(type);
    Calendar c = firstIntervalDate(intervalType, columnMinDate, columnGroup);
    nextIntervalDate(c, intervalType, intervalIndex);
    Date intervalMinDate = c.getTime();

    // Calculate the interval max. date.
    nextIntervalDate(c, intervalType, 1);
    Date intervalMaxDate = c.getTime();

    // Build & return the selected interval
    return new IntervalDateRange(intervalIndex, intervalType, intervalMinDate, intervalMaxDate);
  }
  public IntervalList build(DataColumn dataColumn) {
    ColumnGroup columnGroup = dataColumn.getColumnGroup();
    Date minDate = (Date) dataColumn.getMinValue();
    Date maxDate = (Date) dataColumn.getMaxValue();

    IntervalDateRangeList results = new IntervalDateRangeList(columnGroup);
    if (minDate == null || maxDate == null) {
      return results;
    }
    DateIntervalType intervalType = DateIntervalType.getByName(dataColumn.getIntervalType());
    if (intervalType == null) {
      intervalType = DateIntervalType.YEAR;
    }
    Calendar c = firstIntervalDate(intervalType, minDate, columnGroup);
    int counter = 0;
    while (c.getTime().compareTo(maxDate) <= 0) {
      Date intervalMinDate = c.getTime();

      // Create the next interval
      nextIntervalDate(c, intervalType, 1);
      Date intervalMaxDate = c.getTime();
      IntervalDateRange interval =
          new IntervalDateRange(counter++, intervalType, intervalMinDate, intervalMaxDate);
      results.add(interval);
    }

    // Reverse intervals if requested
    boolean asc = columnGroup.isAscendingOrder();
    if (!asc) Collections.reverse(results);

    // Return the results
    results.setIntervalType(intervalType.toString());
    results.setMinValue(minDate);
    results.setMaxValue(maxDate);
    return results;
  }