@Override
  public SortedKeyValueIterator<Key, Value> deepCopy(IteratorEnvironment env) {
    ValueSummingIterator iterator = new ValueSummingIterator();
    iterator.encoder = encoder;
    iterator.hasTop = true;
    iterator.sum = sum;
    iterator.type = type;

    switch (Type.valueOf(type)) {
      case VARLEN:
        iterator.encoder = VAR_LEN_ENCODER;
        break;
      case FIXEDLEN:
        iterator.encoder = FIXED_LEN_ENCODER;
        break;
      case STRING:
        iterator.encoder = STRING_ENCODER;
        break;
    }

    return iterator;
  }
  @Override
  public boolean validateOptions(Map<String, String> options) {
    try {
      this.type = options.get(TYPE);
      if (type == null) {
        throw new IllegalArgumentException("no type specified");
      }

      switch (Type.valueOf(type)) {
        case VARLEN:
          this.encoder = VAR_LEN_ENCODER;
          break;
        case FIXEDLEN:
          this.encoder = FIXED_LEN_ENCODER;
          break;
        case STRING:
          this.encoder = STRING_ENCODER;
          break;
      }
    } catch (Exception e) {
      throw new IllegalArgumentException("bad encoder option", e);
    }
    return true;
  }