/** Asserts this info still exists in IW's segment infos */ synchronized boolean assertInfoIsLive(SegmentCommitInfo info) { int idx = segmentInfos.indexOf(info); assert idx != -1: "info=" + info + " isn't live"; assert segmentInfos.info(idx) == info: "info=" + info + " doesn't match live info in segmentInfos"; return true; }
/** Returns readable description of this segment. */ @Override public String toString() { StringBuilder buffer = new StringBuilder(); buffer.append(getSegmentsFileName()).append(": "); final int count = size(); for(int i = 0; i < count; i++) { if (i > 0) { buffer.append(' '); } final SegmentCommitInfo info = info(i); buffer.append(info.toString(0)); } return buffer.toString(); }
final synchronized int maxDoc(int i) { if (i >= 0 && i < segmentInfos.size()) { return segmentInfos.info(i).info.maxDoc(); } else { return -1; } }
synchronized SegmentCommitInfo newestSegment() { return segmentInfos.size() > 0 ? segmentInfos.info(segmentInfos.size()-1) : null; }
/** Returns true if the number of segments eligible for * merging is less than or equal to the specified {@code * maxNumSegments}. */ protected boolean isMerged(SegmentInfos infos, int maxNumSegments, Map<SegmentCommitInfo,Boolean> segmentsToMerge, MergeContext mergeContext) throws IOException { final int numSegments = infos.size(); int numToMerge = 0; SegmentCommitInfo mergeInfo = null; boolean segmentIsOriginal = false; for(int i=0;i<numSegments && numToMerge <= maxNumSegments;i++) { final SegmentCommitInfo info = infos.info(i); final Boolean isOriginal = segmentsToMerge.get(info); if (isOriginal != null) { segmentIsOriginal = isOriginal; numToMerge++; mergeInfo = info; } } return numToMerge <= maxNumSegments && (numToMerge != 1 || !segmentIsOriginal || isMerged(infos, mergeInfo, mergeContext)); }
/** Returns all file names referenced by SegmentInfo. * The returned collection is recomputed on each * invocation. */ public Collection<String> files(boolean includeSegmentsFile) throws IOException { HashSet<String> files = new HashSet<>(); if (includeSegmentsFile) { final String segmentFileName = getSegmentsFileName(); if (segmentFileName != null) { files.add(segmentFileName); } } final int size = size(); for(int i=0;i<size;i++) { final SegmentCommitInfo info = info(i); files.addAll(info.files()); } return files; }
if (last > 1 || !isMerged(infos, infos.info(0), mergeContext)) { spec.add(new OneMerge(segments.subList(0, last))); long sumSize = 0; for(int j=0;j<finalMergeSize;j++) { sumSize += size(infos.info(j+i), mergeContext); if (i == 0 || (sumSize < 2*size(infos.info(i-1), mergeContext) && sumSize < bestSize)) { bestStart = i; bestSize = sumSize;
SegmentCommitInfo info = infos.info(start); if (size(info, mergeContext) > maxMergeSizeForForcedMerge || sizeDocs(info, mergeContext) > maxMergeDocs) { if (verbose(mergeContext)) { if (last - start - 1 > 1 || (start != last - 1 && !isMerged(infos, infos.info(start + 1), mergeContext))) { if (last > 0 && (++start + 1 < last || !isMerged(infos, infos.info(start), mergeContext))) { spec.add(new OneMerge(segments.subList(start, last)));
ReaderPool(Directory directory, Directory originalDirectory, SegmentInfos segmentInfos, FieldInfos.FieldNumbers fieldNumbers, LongSupplier completedDelGenSupplier, InfoStream infoStream, String softDeletesField, StandardDirectoryReader reader) throws IOException { this.directory = directory; this.originalDirectory = originalDirectory; this.segmentInfos = segmentInfos; this.fieldNumbers = fieldNumbers; this.completedDelGenSupplier = completedDelGenSupplier; this.infoStream = infoStream; this.softDeletesField = softDeletesField; if (reader != null) { // Pre-enroll all segment readers into the reader pool; this is necessary so // any in-memory NRT live docs are correctly carried over, and so NRT readers // pulled from this IW share the same segment reader: List<LeafReaderContext> leaves = reader.leaves(); assert segmentInfos.size() == leaves.size(); for (int i=0;i<leaves.size();i++) { LeafReaderContext leaf = leaves.get(i); SegmentReader segReader = (SegmentReader) leaf.reader(); SegmentReader newReader = new SegmentReader(segmentInfos.info(i), segReader, segReader.getLiveDocs(), segReader.getHardLiveDocs(), segReader.numDocs(), true); readerMap.put(newReader.getOriginalSegmentInfo(), new ReadersAndUpdates(segmentInfos.getIndexCreatedVersionMajor(), newReader, newPendingDeletes(newReader, newReader.getOriginalSegmentInfo()))); } } }
final SegmentCommitInfo info = infos.info(i); long size = size(info, mergeContext);
final SegmentCommitInfo info = infos.info(--last); if (segmentsToMerge.get(info) != null) { last++; if (maxNumSegments == 1 && last == 1 && isMerged(infos, infos.info(0), mergeContext)) { if (verbose(mergeContext)) { message("already 1 seg; skip", mergeContext); SegmentCommitInfo info = infos.info(i); if (size(info, mergeContext) > maxMergeSizeForForcedMerge || sizeDocs(info, mergeContext) > maxMergeDocs) { anyTooLarge = true;
final SegmentCommitInfo info = infos.info(i); assert info.info.dir == dir; final ReadersAndUpdates rld = writer.getPooledInstance(info, true);
assert mergeContext != null; for(int i=0;i<numSegments;i++) { final SegmentCommitInfo info = segmentInfos.info(i); int delCount = mergeContext.numDeletesToMerge(info); assert assertDelCount(delCount, info);
SegmentCommitInfo commitInfo = infos.info(i);
final SegmentCommitInfo info = sis.info(i); long segmentName = Long.parseLong(info.info.name.substring(1), Character.MAX_RADIX); if (segmentName > result.maxSegmentName) {
/** Returns the number of documents currently in this index. */ public synchronized int docCount() { int count = 0; for (int i = 0; i < segmentInfos.size(); i++) { SegmentInfo si = segmentInfos.info(i); count += si.docCount; } return count; }
public synchronized boolean infoIsLive(SegmentCommitInfo info) { int idx = segmentInfos.indexOf(info); assert idx != -1: "info=" + info + " isn't live"; assert segmentInfos.info(idx) == info: "info=" + info + " doesn't match live info in segmentInfos"; return true; }
final synchronized int getDocCount(int i) { if (i >= 0 && i < segmentInfos.size()) { return segmentInfos.info(i).docCount; } else { return -1; } }
@SuppressForbidden(reason = "System.out required: command line tool") public void listSegments() throws IOException { DecimalFormat formatter = new DecimalFormat("###,###.###", DecimalFormatSymbols.getInstance(Locale.ROOT)); for (int x = 0; x < infos.size(); x++) { SegmentCommitInfo info = infos.info(x); String sizeStr = formatter.format(info.sizeInBytes()); System.out.println(info.info.name + " " + sizeStr); } }
/** * Returns a copy of this instance, also copying each * SegmentInfo. */ public Object clone() { SegmentInfos sis = (SegmentInfos) super.clone(); for(int i=0;i<sis.size();i++) { sis.set(i, sis.info(i).clone()); } return sis; }