gf2121 commented on code in PR #12573: URL: https://github.com/apache/lucene/pull/12573#discussion_r1333106578
########## lucene/core/src/java/org/apache/lucene/index/BufferedUpdates.java: ########## @@ -197,6 +183,160 @@ boolean any() { @Override public long ramBytesUsed() { - return bytesUsed.get() + fieldUpdatesBytesUsed.get() + termsBytesUsed.get(); + return bytesUsed.get() + fieldUpdatesBytesUsed.get() + deleteTerms.ramBytesUsed(); + } + + static class DeletedTerms implements Accountable { + + private final Counter bytesUsed = Counter.newCounter(); + private final ByteBlockPool pool = + new ByteBlockPool(new ByteBlockPool.DirectTrackingAllocator(bytesUsed)); + private final Map<String, BytesRefIntMap> deleteTerms = new HashMap<>(); + private int termsSize = 0; + + DeletedTerms() {} + + /** + * Get the newest doc id of the deleted term. + * + * @param term The deleted term. + * @return The newest doc id of this deleted term. + */ + int get(Term term) { + BytesRefIntMap hash = deleteTerms.get(term.field); + if (hash == null) { + return -1; + } + return hash.get(term.bytes); + } + + /** + * Put the newest doc id of the deleted term. + * + * @param term The deleted term. + * @param value The newest doc id of the deleted term. + */ + void put(Term term, int value) { + BytesRefIntMap hash = + deleteTerms.computeIfAbsent( + term.field, + k -> { + bytesUsed.addAndGet(RamUsageEstimator.sizeOf(term.field)); + return new BytesRefIntMap(pool, bytesUsed); + }); + int v = hash.put(term.bytes, value); + if (v == -1) { + termsSize++; + } + } + + void clear() { + bytesUsed.addAndGet(-bytesUsed.get()); + deleteTerms.clear(); + termsSize = 0; + } + + int size() { + return termsSize; + } + + boolean isEmpty() { + return termsSize == 0; + } + + /** Just for test, not efficient. */ + Set<Term> keySet() { + return deleteTerms.entrySet().stream() + .flatMap( + entry -> entry.getValue().keySet().stream().map(b -> new Term(entry.getKey(), b))) + .collect(Collectors.toSet()); + } + + interface DeletedTermConsumer<E extends Exception> { + void accept(Term term, int docId) throws E; Review Comment: The implementation in `FrozenBufferedUpdates` does not throw exceptions. The generic means to avoid handling exception there :) -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: issues-unsubscr...@lucene.apache.org For additional commands, e-mail: issues-h...@lucene.apache.org