protected void mergeOneField(MergeState mergeState, FieldInfo fieldInfo) throws IOException {
    long maxPointCount = 0;
    int docCount = 0;
    for (int i=0;i<mergeState.pointsReaders.length;i++) {
      PointsReader pointsReader = mergeState.pointsReaders[i];
      if (pointsReader != null) {
        FieldInfo readerFieldInfo = mergeState.fieldInfos[i].fieldInfo(fieldInfo.name);
        if (readerFieldInfo != null) {
          maxPointCount += pointsReader.size(fieldInfo.name);
          docCount += pointsReader.getDocCount(fieldInfo.name);
        }
      }
    }
    final long finalMaxPointCount = maxPointCount;
    final int finalDocCount = docCount;
    writeField(fieldInfo,
               new PointsReader() {
                 @Override
                 public void intersect(String fieldName, IntersectVisitor mergedVisitor) throws IOException {
                   if (fieldName.equals(fieldInfo.name) == false) {
                     throw new IllegalArgumentException("field name must match the field being merged");
                   }
                   
                   for (int i=0;i<mergeState.pointsReaders.length;i++) {
                     PointsReader pointsReader = mergeState.pointsReaders[i];
                     if (pointsReader == null) {
                       // This segment has no points
                       continue;
                     }
                     FieldInfo readerFieldInfo = mergeState.fieldInfos[i].fieldInfo(fieldName);
                     if (readerFieldInfo == null) {
                       // This segment never saw this field
                       continue;
                     }

                     MergeState.DocMap docMap = mergeState.docMaps[i];
                     int docBase = mergeState.docBase[i];
                     pointsReader.intersect(fieldInfo.name,
                                            new IntersectVisitor() {
                                              @Override
                                              public void visit(int docID) {
                                                // Should never be called because our compare method never returns Relation.CELL_INSIDE_QUERY
                                                throw new IllegalStateException();
                                              }

                                              @Override
                                              public void visit(int docID, byte[] packedValue) throws IOException {
                                                int newDocID = docMap.get(docID);
                                                if (newDocID != -1) {
                                                  // Not deleted:
                                                  mergedVisitor.visit(docBase + newDocID, packedValue);
                                                }
                                              }

                                              @Override
                                              public Relation compare(byte[] minPackedValue, byte[] maxPackedValue) {
                                                // Forces this segment's PointsReader to always visit all docs + values:
                                                return Relation.CELL_CROSSES_QUERY;
                                              }
                                            });
                   }
                 }

                 @Override
                 public void checkIntegrity() {
                   throw new UnsupportedOperationException();
                 }

                 @Override
                 public long ramBytesUsed() {
                   return 0L;
                 }

                 @Override
                 public void close() {
                 }

                 @Override
                 public byte[] getMinPackedValue(String fieldName) {
                   throw new UnsupportedOperationException();
                 }

                 @Override
                 public byte[] getMaxPackedValue(String fieldName) {
                   throw new UnsupportedOperationException();
                 }

                 @Override
                 public int getNumDimensions(String fieldName) {
                   throw new UnsupportedOperationException();
                 }

                 @Override
                 public int getBytesPerDimension(String fieldName) {
                   throw new UnsupportedOperationException();
                 }

                 @Override
                 public long size(String fieldName) {
                   return finalMaxPointCount;
                 }

                 @Override
                 public int getDocCount(String fieldName) {
                   return finalDocCount;
                 }
               });
  }