Hi Joel,

You should trust the javadocs.

Looking at our default Codec on master (Lucene84Codec), and at its default
doc values implementation (Lucene80DocValuesProducer), it is clearly
reusing the private "BytesRef term" instance.

If your code is fully consuming this BytesRef before calling any other
methods on the same SortedDocValues instance, you can safely reuse it for
that duration.

But if you want to call methods on that same SortedDocValues and continue
using the previous BytesRef, you'll need to make a copy.

Maybe improve the javadocs?

Mike McCandless

http://blog.mikemccandless.com


On Thu, May 14, 2020 at 4:12 PM Joel Bernstein <[email protected]> wrote:

> In the SortedDocValues.lookupOrd documentation it says that a deep copy is 
> needed for the returned BytesRef. I wanted to verify that this was actually 
> true. I'm
>
> trying to see a way that this BytesRef could be safely reused by the API but 
> I don't see one. Is there actually an implementation of lookupOrd that 
> somehow reuses the
>
> same BytesRef between invocations. The java doc is copied below:
>
> Thanks!
>
> /** Retrieves the value for the specified ordinal. The returned
>  * {@link BytesRef} may be re-used across calls to {@link #lookupOrd(int)}
>  * so make sure to {@link BytesRef#deepCopyOf(BytesRef) copy it} if you want
>  * to keep it around.
>  * @param ord ordinal to lookup (must be &gt;= 0 and &lt; {@link 
> #getValueCount()})
>  * @see #ordValue()
>  */
> public abstract BytesRef lookupOrd(int ord) throws IOException;
>
>
>
> Joel Bernstein
> http://joelsolr.blogspot.com/
>

Reply via email to