@Override void apply(BufferedUpdates bufferedUpdates, int docIDUpto) { for (DocValuesUpdate update : item) { switch (update.type) { case NUMERIC: bufferedUpdates.addNumericUpdate(new NumericDocValuesUpdate(update.term, update.field, (Long) update.value), docIDUpto); break; case BINARY: bufferedUpdates.addBinaryUpdate(new BinaryDocValuesUpdate(update.term, update.field, (BytesRef) update.value), docIDUpto); break; default: throw new IllegalArgumentException(update.type + " DocValues updates not supported yet!"); } } }
public void addBinaryUpdate(BinaryDocValuesUpdate update, int docIDUpto) { LinkedHashMap<Term,BinaryDocValuesUpdate> fieldUpdates = binaryUpdates.get(update.field); if (fieldUpdates == null) { fieldUpdates = new LinkedHashMap<>(); binaryUpdates.put(update.field, fieldUpdates); bytesUsed.addAndGet(BYTES_PER_BINARY_FIELD_ENTRY); } final BinaryDocValuesUpdate current = fieldUpdates.get(update.term); if (current != null && docIDUpto < current.docIDUpto) { // Only record the new number if it's greater than or equal to the current // one. This is important because if multiple threads are replacing the // same doc at nearly the same time, it's possible that one thread that // got a higher docID is scheduled before the other threads. return; } update.docIDUpto = docIDUpto; // since it's a LinkedHashMap, we must first remove the Term entry so that // it's added last (we're interested in insertion-order). if (current != null) { fieldUpdates.remove(update.term); } fieldUpdates.put(update.term, update); numBinaryUpdates.incrementAndGet(); if (current == null) { bytesUsed.addAndGet(BYTES_PER_BINARY_UPDATE_ENTRY + update.sizeInBytes()); } }
/** * Updates documents' DocValues fields to the given values. Each field update * is applied to the set of documents that are associated with the * {@link Term} to the same value. All updates are atomically applied and * flushed together. * * @param updates * the updates to apply * @throws CorruptIndexException * if the index is corrupt * @throws IOException * if there is a low-level IO error */ public void updateDocValues(Term term, Field... updates) throws IOException { ensureOpen(); DocValuesUpdate[] dvUpdates = new DocValuesUpdate[updates.length]; for (int i = 0; i < updates.length; i++) { final Field f = updates[i]; final DocValuesType dvType = f.fieldType().docValueType(); if (dvType == null) { throw new IllegalArgumentException("can only update NUMERIC or BINARY fields! field=" + f.name()); } if (!globalFieldNumberMap.contains(f.name(), dvType)) { throw new IllegalArgumentException("can only update existing docvalues fields! field=" + f.name() + ", type=" + dvType); } switch (dvType) { case NUMERIC: dvUpdates[i] = new NumericDocValuesUpdate(term, f.name(), (Long) f.numericValue()); break; case BINARY: dvUpdates[i] = new BinaryDocValuesUpdate(term, f.name(), f.binaryValue()); break; default: throw new IllegalArgumentException("can only update NUMERIC or BINARY fields: field=" + f.name() + ", type=" + dvType); } } try { if (docWriter.updateDocValues(dvUpdates)) { processEvents(true, false); } } catch (OutOfMemoryError oom) { tragicEvent(oom, "updateDocValues"); } }
/** * Updates a document's {@link BinaryDocValues} for <code>field</code> to the * given <code>value</code>. You can only update fields that already exist in * the index, not add new fields through this method. * * <p> * <b>NOTE:</b> this method currently replaces the existing value of all * affected documents with the new value. * * @param term * the term to identify the document(s) to be updated * @param field * field name of the {@link BinaryDocValues} field * @param value * new value for the field * @throws CorruptIndexException * if the index is corrupt * @throws IOException * if there is a low-level IO error */ public void updateBinaryDocValue(Term term, String field, BytesRef value) throws IOException { ensureOpen(); if (value == null) { throw new IllegalArgumentException("cannot update a field to a null value: " + field); } if (!globalFieldNumberMap.contains(field, DocValuesType.BINARY)) { throw new IllegalArgumentException("can only update existing binary-docvalues fields!"); } try { if (docWriter.updateDocValues(new BinaryDocValuesUpdate(term, field, value))) { processEvents(true, false); } } catch (OutOfMemoryError oom) { tragicEvent(oom, "updateBinaryDocValue"); } }