David,

On Sat, Aug 12, 2017 at 4:43 PM, David Smiley <david.w.smi...@gmail.com>
wrote:

> Hi Xavier,
>
> BTW the lucene-user list is probably the best place to report this.
>

Certainly, I intended to post to that list, but sent it to dev one instead,
sorry.



>
> I looked closer at this.  This aspect of the MemoryIndex API is
> debatable.... wether a MemoryIndex.addField(...TokenStream...)  should be
> allowed to be null or not.  Apparently Analyzer.tokenStream(field,...)
> can return null if the field doesn't have a terms index, so I suppose we
> should allow null TokenStream because otherwise it could be trappy
> (unexpected NPE).  Obviously this would be a simple short-circuit
> implementation.  On the other hand, passing in null may point to bugs in
> your expectation of how to use MemoryIndex.  That appears to be the case
> for you -- you are supposed to call MemoryIndex.addField( ffield, ...)
> where ffield is your local variable of type DoublePoint which implements
> IndexableField.  It was an incorrect assumption to think that MemoryIndex
> requires that you grab the tokenStream from the field.  Those addField
> convenience methods that take TokenStream are only appropriate for fields
> with a terms index, i.e.  only works for fields in which IndexOptions !=
> NONE.  DoublePoint in particular does not have this but instead has a
> points-index (aka PointValues) which is seen by calling
> field.fieldType().pointDimensionCount() > 0.
>

 ok, makes sense. At the time I implemented this code there were not
convenience method in MemoryIndex to add a field without the tokenStream. I
modified my code to do so, and it works fine now with 6.6.0.

thanks!
xavier


> So I think I lean towards the current behavior, albeit with a check for a
> null tokenStream to throw an error that clarifies the contract.  More
> Javadocs too of course.
>
> ~ David
>
> On Sat, Aug 12, 2017 at 5:21 AM xavier jmlucjav <jmluc...@gmail.com>
> wrote:
>
>> Hi,
>>
>> I have this piece of code working fine in 6.4.2
>>
>> MemoryIndex mi = new MemoryIndex();
>> float fval = 3.3f;
>> final String floatfield = "floatfield";
>> DoublePoint ffield = new DoublePoint(floatfield, fval);
>> mi.addField(floatfield, ffield.tokenS
>>
>>
>> If I upgrade to 6.5.1 or 6.6.0 I get a NPE here:
>> Exception in thread "main" java.lang.NullPointerException
>> at org.apache.lucene.index.memory.MemoryIndex.storeTerms(Memory
>> Index.java:619)
>> at org.apache.lucene.index.memory.MemoryIndex.addField(MemoryIn
>> dex.java:509)
>> at org.apache.lucene.index.memory.MemoryIndex.addField(MemoryIn
>> dex.java:484)
>> at org.apache.lucene.index.memory.MemoryIndex.addField(MemoryIn
>> dex.java:459)
>> at org.apache.lucene.index.memory.MemoryIndex.addField(MemoryIn
>> dex.java:370)
>>
>>
>> Looking at the code, it looks like in the code path it is being followed,
>> before, it was checked if teh tokenStream was null or not before calling
>> MemoryIndex.storeTerms. Now this check is gone, so the NPE.
>>
>> Is this intended and I should create the field in some other way now? Or
>> is this just a bug?
>>
>> xavier
>>
> --
> Lucene/Solr Search Committer, Consultant, Developer, Author, Speaker
> LinkedIn: http://linkedin.com/in/davidwsmiley | Book:
> http://www.solrenterprisesearchserver.com
>

Reply via email to