I wanted to post a quick hack to see if it is along the correct lines.  A few 
of the questions regard whether to resuse existing MultiReaders or simply strip 
out only the SegmentReaders.  I do a compare on the segment name and made it 
public.  Thanks!


public static IndexReader reopen(IndexReader indexReader) throws IOException {
    if (indexReader instanceof MultiReader) {
      MultiReader multiReader = (MultiReader)indexReader;
      
      SegmentInfos segmentInfos = new SegmentInfos();
      segmentInfos.read(indexReader.directory());
      if (segmentInfos.size() == 1) {          // index is optimized
        return SegmentReader.get(segmentInfos, segmentInfos.info(0), false);
      }
      
      IndexReader[] existingIndexReaders = multiReader.getSubReaders();
      // now go through and compare the segment readers
      Map<String,SegmentReader> existingSegmentMap = new 
HashMap<String,SegmentReader>();
      getSegmentReaders(existingIndexReaders, existingSegmentMap);
      
      Map<String,SegmentInfo> newSegmentInfosMap = new 
HashMap<String,SegmentInfo>();
      
      List<SegmentReader> newSegmentReaders = new ArrayList<SegmentReader>();
      
      Iterator segmentInfosIterator = segmentInfos.iterator();
      while (segmentInfosIterator.hasNext()) {
        SegmentInfo segmentInfo = (SegmentInfo)segmentInfosIterator.next();
        
        if (!existingSegmentMap.containsKey(segmentInfo.name)) {
          // it's new
          SegmentReader newSegmentReader = SegmentReader.get(segmentInfo);
          newSegmentReaders.add(newSegmentReader);
        }
      }
      List<IndexReader> allSegmentReaders = new ArrayList<IndexReader>();
      allSegmentReaders.add(multiReader);
      allSegmentReaders.addAll(newSegmentReaders);
      
      return new MultiReader(indexReader.directory(), segmentInfos, false, 
(IndexReader[])allSegmentReaders.toArray(new IndexReader[0]));
    }
    throw new RuntimeException("indexReader not supported at this time");
  }
  
  public static void getSegmentReaders(IndexReader[] indexReaders, 
Map<String,SegmentReader> map) {
    for (int x=0; x < indexReaders.length; x++) {
      if (indexReaders[x] instanceof MultiReader) {
        MultiReader multiReader = (MultiReader)indexReaders[x];
        IndexReader[] subReaders = multiReader.getSubReaders();
        getSegmentReaders(subReaders, map);
      } else if (indexReaders[x] instanceof SegmentReader) {
        SegmentReader segmentReader = (SegmentReader)indexReaders[x];
        map.put(segmentReader.segment, segmentReader);
      }
    }
  }

Reply via email to