Rasik, The class you sent it the same as TestMultiSearcher, except for the name. The code is the same, no? Maybe you attached the wrong class?
The diff looks rather large, too... Otis --- Rasik Pandey <[EMAIL PROTECTED]> wrote: > Otis, > Here a the test program that will generate the null pointer and the > requested diff. Hope they are helpful. > > Thanks, > Rasik Pandey > > > > -----Message d'origine----- > De : Otis Gospodnetic [mailto:[EMAIL PROTECTED]] > Envoy� : jeudi 12 septembre 2002 18:23 > � : Lucene Developers List > Cc : [EMAIL PROTECTED] > Objet : Re: Nullpointer in code > > > Rasik, > > Thanks for feedback, but that stuff is a bit hard to read. > The best way to help would be to write a class that demonstrates > this, > then fix your code to work, then make a diff between your fixed code > and > the code in the CVS, and finally, it would be great to have a unit > test > for it, but I can write that later. > > Thanks, > Otis > > > --- Rasik Pandey <[EMAIL PROTECTED]> wrote: > > Developers, > > I am encountering a null pointer exception when executing a wild > card > > query search on an empty index which doesn't contain any terms and > of > > course not the Term generated from the wild card query (ie the > > WildCardTermEnum has an empty "actualEnum"). Please see below for > > what i > > propose to be the fix (simple). I assume that this is sufficient or > > would a change in one of the SegmentReader or TermsInfosReader > > classes > > be more appropriate (not likely)? > > > > I do not have access to commit this change, so if you deem that it > is > > necessary can you please make the modification. > > > > Cheers, > > Rasik Pandey > > > > Basically in the constructor of WildCardTermEnum the constructor > > calls; > > > > setEnum(reader.terms(new Term(searchTerm.field(), pre))); > > ----or > > super.setEnum(an empty termEnum); or > FilteredTermEnum.setEnum(an > > empty termEnum); > > > > > > Then in FilteredTermnEnum: > > protected void setEnum(TermEnum actualEnum) throws IOException { > > this.actualEnum = actualEnum; > > // Find the first term that matches > > > > > > !!!!!!!!the result of actualEnum.term(); is null in my > case!!!!!!!!! > > Term term = actualEnum.term(); > > > > > !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > > > > > > !!!!!!!!!!!!the below line leads to the null > pointer!!!!!!!!!! > > if (termCompare(term)) > > !!!!!!!!!!!!!!!!!!!!see > > below!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > > > > currentTerm = term; > > else next(); > > } > > > > > > Then back in WildCardTermEnum: > > > > final protected boolean termCompare(Term term) { > > !!!!!!!!!!!the below line should test to ensure that "term" > is > > not null!!!!!! > > if (field == term.field()) { > > !!!!!!!!!!!!!!!!see below line for the simple > > fix!!!!!!!!!!!!!!!!!!!!!!!!!!!! > > > > !!!!!!!!!!!!!!!!!below is the changed line for the simple > > fix!!!!!!!!!!!!!!!!!!!!!!!! > > if (term != null && field == term.field()) { > > > > > !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! > > !!!!!!!!!!!!! > > String searchText = term.text(); > > if (searchText.startsWith(pre)) { > > return wildcardEquals(text, 0, searchText, preLen); > > } > > } > > endEnum = true; > > return false; > > } > > > > > > -- > > To unsubscribe, e-mail: > > <mailto:[EMAIL PROTECTED]> > > For additional commands, e-mail: > > <mailto:[EMAIL PROTECTED]> > > > > > __________________________________________________ > Yahoo! - We Remember > 9-11: A tribute to the more than 3,000 lives lost > http://dir.remember.yahoo.com/tribute > > -- > To unsubscribe, e-mail: > <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: > <mailto:[EMAIL PROTECTED]> > > ATTACHMENT part 2 application/octet-stream name=TestWildcardTermEnum.java > C:\Program Files\GNU\WinCvs 1.2\cvs.exe diff -r 1.1 > WildcardTermEnum.java > Index: WildcardTermEnum.java > =================================================================== > RCS file: > /home/cvspublic/jakarta-lucene/src/java/org/apache/lucene/search/WildcardTermEnum.java,v > retrieving revision 1.1 > diff -r1.1 WildcardTermEnum.java > 62,65c62,68 > < /** Subclass of FilteredTermEnum for enumerating all terms that > match the specified wildcard filter term. > < > < <p>Term enumerations are always ordered by Term.compareTo(). > Each term in > < the enumeration is greater than all that precede it. */ > --- > > /** > > * Subclass of FilteredTermEnum for enumerating all terms that > match the > > * specified wildcard filter term. > > * <p> > > * Term enumerations are always ordered by Term.compareTo(). Each > term in > > * the enumeration is greater than all that precede it. > > */ > 74c77 > < > --- > > > 93c96 > < > --- > > > 95c98 > < if (field == term.field()) { > --- > > if (term != null && field == term.field()) { > 104c107 > < > --- > > > 108c111 > < > --- > > > 112c115 > < > --- > > > 116c119 > < > --- > > > 119,139c122,219 > < > < public static final boolean wildcardEquals(String pattern, int > patternIdx, String string, int stringIdx) { > < for ( int p = patternIdx; ; ++p ) { > < for ( int s = stringIdx; ; ++p, ++s ) { > < boolean sEnd = (s >= string.length()); > < boolean pEnd = (p >= pattern.length()); > < > < if (sEnd && pEnd) return true; > < if (sEnd || pEnd) break; > < if (pattern.charAt(p) == WILDCARD_CHAR) continue; > < if (pattern.charAt(p) == WILDCARD_STRING) { > < int i; > < ++p; > < for (i = string.length(); i >= s; --i) > < if (wildcardEquals(pattern, p, string, i)) > < return true; > < break; > < } > < if (pattern.charAt(p) != string.charAt(s)) break; > < } > < return false; > --- > > > > /** > > * Determines if a word matches a wildcard pattern. > > * <small>Work released by Granta Design Ltd after originally > being done on > > * company time.</small> > > */ > > public static final boolean wildcardEquals(String pattern, int > patternIdx, > > String string, int stringIdx) > > { > > for (int p = patternIdx; ; ++p) > > { > > for (int s = stringIdx; ; ++p, ++s) > > { > > // End of string yet? > > boolean sEnd = (s >= string.length()); > > // End of pattern yet? > > boolean pEnd = (p >= pattern.length()); > > > > // If we're looking at the end of the string... > > if (sEnd) > > { > > // Assume the only thing left on the pattern > is/are wildcards > > boolean justWildcardsLeft = true; > > > > // Current wildcard position > > int wildcardSearchPos = p; > > // While we haven't found the end of the > pattern, > > // and haven't encountered any non-wildcard characters > > while (wildcardSearchPos < pattern.length() && > justWildcardsLeft) > > { > > // Check the character at the current > position > > char wildchar = > pattern.charAt(wildcardSearchPos); > > // If it's not a wildcard character, then > there is more > > // pattern information after this/these wildcards. > > > > if (wildchar != WILDCARD_CHAR && > > wildchar != WILDCARD_STRING) > > { > > justWildcardsLeft = false; > > } > > else > > { > > // Look at the next character > > wildcardSearchPos++; > > } > > } > > > > // This was a prefix wildcard search, and we've > matched, so > > // return true. > > if (justWildcardsLeft) > > { > > return true; > > } > > } > > > > // If we've gone past the end of the string, or the > pattern, > > // return false. > > if (sEnd || pEnd) > > { > > break; > > } > > > > // Match a single character, so continue. > > if (pattern.charAt(p) == WILDCARD_CHAR) > > { > > continue; > > } > > > > // > > if (pattern.charAt(p) == WILDCARD_STRING) > > { > > // Look at the character beyond the '*'. > > ++p; > > // Examine the string, starting at the last > character. > > for (int i = string.length(); i >= s; --i) > > { > > if (wildcardEquals(pattern, p, string, i)) > > { > > return true; > > } > > } > > break; > > } > > if (pattern.charAt(p) != string.charAt(s)) > > { > > break; > > } > > } > > return false; > > } > > } > > > > public void close() throws IOException > > { > > super.close(); > > searchTerm = null; > > field = null; > > text = null; > 141,148d220 > < } > < > < public void close() throws IOException { > < super.close(); > < searchTerm = null; > < field = null; > < text = null; > < } > > CVS command finished execution > > > -- > To unsubscribe, e-mail: > <mailto:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> __________________________________________________ Do you Yahoo!? New DSL Internet Access from SBC & Yahoo! http://sbc.yahoo.com -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>
