@Override public Query rewrite(IndexReader reader) throws IOException { if (lowerValue == null && upperValue == null) { return new DocValuesFieldExistsQuery(field); } return super.rewrite(reader); }
@Override public int hashCode() { return 31 * classHash() + field.hashCode(); }
@Override public Scorer scorer(LeafReaderContext context) throws IOException { DocIdSetIterator iterator = getDocValuesDocIdSetIterator(field, context.reader()); if (iterator == null) { return null; } return new ConstantScoreScorer(this, score(), iterator); }
@Override public boolean equals(Object other) { return sameClassAs(other) && field.equals(((DocValuesFieldExistsQuery) other).field); }
/** * Returns true if we can use <code>query</code> with a {@link SortedDocsProducer} on <code>fieldName</code>. */ private static boolean checkMatchAllOrRangeQuery(Query query, String fieldName) { if (query == null) { return true; } else if (query.getClass() == MatchAllDocsQuery.class) { return true; } else if (query instanceof PointRangeQuery) { PointRangeQuery pointQuery = (PointRangeQuery) query; return fieldName.equals(pointQuery.getField()); } else if (query instanceof DocValuesFieldExistsQuery) { DocValuesFieldExistsQuery existsQuery = (DocValuesFieldExistsQuery) query; return fieldName.equals(existsQuery.getField()); } else { return false; } }
@Override public boolean equals(Object other) { return sameClassAs(other) && field.equals(((DocValuesFieldExistsQuery) other).field); }
/** * Returns true if we can use <code>query</code> with a {@link SortedDocsProducer} on <code>fieldName</code>. */ private static boolean checkMatchAllOrRangeQuery(Query query, String fieldName) { if (query == null) { return true; } else if (query.getClass() == MatchAllDocsQuery.class) { return true; } else if (query instanceof PointRangeQuery) { PointRangeQuery pointQuery = (PointRangeQuery) query; return fieldName.equals(pointQuery.getField()); } else if (query instanceof DocValuesFieldExistsQuery) { DocValuesFieldExistsQuery existsQuery = (DocValuesFieldExistsQuery) query; return fieldName.equals(existsQuery.getField()); } else { return false; } }
@Override public Query rewrite(IndexReader reader) throws IOException { if (lowerValue == Long.MIN_VALUE && upperValue == Long.MAX_VALUE) { return new DocValuesFieldExistsQuery(field); } return super.rewrite(reader); }
private static void checkSoftDeletes(String softDeletesField, SegmentCommitInfo info, SegmentReader reader, PrintStream infoStream, boolean failFast) throws IOException { if (infoStream != null) infoStream.print(" test: check soft deletes....."); try { int softDeletes = PendingSoftDeletes.countSoftDeletes(DocValuesFieldExistsQuery.getDocValuesDocIdSetIterator(softDeletesField, reader), reader.getLiveDocs()); if (softDeletes != info.getSoftDelCount()) { throw new RuntimeException("actual soft deletes: " + softDeletes + " but expected: " +info.getSoftDelCount()); } } catch (Exception e) { if (failFast) { throw IOUtils.rethrowAlways(e); } msg(infoStream, "ERROR [" + String.valueOf(e.getMessage()) + "]"); if (infoStream != null) { e.printStackTrace(infoStream); } } }
@Override public int hashCode() { return 31 * classHash() + field.hashCode(); }
@Override public int numDeletesToMerge(SegmentCommitInfo info, int delCount, IOSupplier<CodecReader> readerSupplier) throws IOException { final int numDeletesToMerge = super.numDeletesToMerge(info, delCount, readerSupplier); if (numDeletesToMerge != 0 && info.getSoftDelCount() > 0) { final CodecReader reader = readerSupplier.get(); if (reader.getLiveDocs() != null) { BooleanQuery.Builder builder = new BooleanQuery.Builder(); builder.add(new DocValuesFieldExistsQuery(field), BooleanClause.Occur.FILTER); builder.add(retentionQuerySupplier.get(), BooleanClause.Occur.FILTER); Scorer scorer = getScorer(builder.build(), FilterCodecReader.wrapLiveDocs(reader, null, reader.maxDoc())); if (scorer != null) { DocIdSetIterator iterator = scorer.iterator(); Bits liveDocs = reader.getLiveDocs(); int numDeletedDocs = reader.numDeletedDocs(); while (iterator.nextDoc() != DocIdSetIterator.NO_MORE_DOCS) { if (liveDocs.get(iterator.docID()) == false) { numDeletedDocs--; } } return numDeletedDocs; } } } assert numDeletesToMerge >= 0 : "numDeletesToMerge: " + numDeletesToMerge; assert numDeletesToMerge <= info.info.maxDoc() : "numDeletesToMerge: " + numDeletesToMerge + " maxDoc:" + info.info.maxDoc(); return numDeletesToMerge; } }
static LeafReader wrap(LeafReader reader, String field) throws IOException { DocIdSetIterator iterator = DocValuesFieldExistsQuery.getDocValuesDocIdSetIterator(field, reader); if (iterator == null) { return reader; } Bits liveDocs = reader.getLiveDocs(); final FixedBitSet bits; if (liveDocs != null) { bits = FixedBitSet.copyOf(liveDocs); } else { bits = new FixedBitSet(reader.maxDoc()); bits.set(0, reader.maxDoc()); } int numSoftDeletes = PendingSoftDeletes.applySoftDeletes(iterator, bits); int numDeletes = reader.numDeletedDocs() + numSoftDeletes; int numDocs = reader.maxDoc() - numDeletes; assert assertDocCounts(numDocs, numSoftDeletes, reader); return reader instanceof CodecReader ? new SoftDeletesFilterCodecReader((CodecReader) reader, bits, numDocs) : new SoftDeletesFilterLeafReader(reader, bits, numDocs); }
@Override public Query existsQuery(QueryShardContext context) { return new DocValuesFieldExistsQuery(name()); }
@Override void onNewReader(CodecReader reader, SegmentCommitInfo info) throws IOException { super.onNewReader(reader, info); hardDeletes.onNewReader(reader, info); if (dvGeneration < info.getDocValuesGen()) { // only re-calculate this if we haven't seen this generation final DocIdSetIterator iterator = DocValuesFieldExistsQuery.getDocValuesDocIdSetIterator(field, reader); int newDelCount; if (iterator != null) { // nothing is deleted we don't have a soft deletes field in this segment assert info.info.maxDoc() > 0 : "maxDoc is 0"; newDelCount = applySoftDeletes(iterator, getMutableBits()); assert newDelCount >= 0 : " illegal pending delete count: " + newDelCount; } else { newDelCount = 0; } assert info.getSoftDelCount() == newDelCount : "softDeleteCount doesn't match " + info.getSoftDelCount() + " != " + newDelCount; dvGeneration = info.getDocValuesGen(); } assert getDelCount() <= info.info.maxDoc() : getDelCount() + " > " + info.info.maxDoc(); }
@Override public Query existsQuery(QueryShardContext context) { return new DocValuesFieldExistsQuery(name()); }
Bits wrappedLiveDocs = wrappedReader.getLiveDocs(); int hardDeleteCount = 0; DocIdSetIterator softDeletedDocs = DocValuesFieldExistsQuery.getDocValuesDocIdSetIterator(config.getSoftDeletesField(), wrappedReader); if (softDeletedDocs != null) { int docId;
@Override public Query existsQuery(QueryShardContext context) { return new DocValuesFieldExistsQuery(name()); }
Bits liveDocs = leaf.getLiveDocs(); numSoftDeleted += PendingSoftDeletes.countSoftDeletes( DocValuesFieldExistsQuery.getDocValuesDocIdSetIterator(config.getSoftDeletesField(), leaf), liveDocs);
builder.add(new DocValuesFieldExistsQuery(softDeleteField), BooleanClause.Occur.FILTER); builder.add(retentionQuery, BooleanClause.Occur.FILTER); Scorer scorer = getScorer(builder.build(), wrappedReader);
private static void checkSoftDeletes(String softDeletesField, SegmentCommitInfo info, SegmentReader reader, PrintStream infoStream, boolean failFast) throws IOException { if (infoStream != null) infoStream.print(" test: check soft deletes....."); try { int softDeletes = PendingSoftDeletes.countSoftDeletes(DocValuesFieldExistsQuery.getDocValuesDocIdSetIterator(softDeletesField, reader), reader.getLiveDocs()); if (softDeletes != info.getSoftDelCount()) { throw new RuntimeException("actual soft deletes: " + softDeletes + " but expected: " +info.getSoftDelCount()); } } catch (Exception e) { if (failFast) { throw IOUtils.rethrowAlways(e); } msg(infoStream, "ERROR [" + String.valueOf(e.getMessage()) + "]"); if (infoStream != null) { e.printStackTrace(infoStream); } } }