[jsword-devel] Cannot search last 2 verses of Revelation

DM Smith dmsmith at crosswire.org
Sat Jul 19 11:27:40 MST 2014


getCount(currentTestament) should return the number of keyed entries in the Testament. Indexing is 0 based.

So the -1 was right and the bug is in getCount. It is returning 2 less than it should.

There are a couple of different ways that getCount can be computed. The index file contains 1 fixed size entry for each key. Dividing the size of the index by the size of an entry will give the number of entries in the file.

The other way is to compute the number of entries in the v11n. Basically, each book has a Chapter 0. Each chapter has a verse 0. There also is a verse 0 for the testament.

I'd have to look to see how getCount(Testament) is written.

The problem with changing the -1 to +1 is that it might break for the OT.

I was happily surprised last night that even more family dropped in for the weekend. Doubt I'll be able to look at it soon.

In Him,
	DM

On Jul 19, 2014, at 8:34 AM, Chris Burrell <chris at burrell.me.uk> wrote:

> Fixing to this:   int maxIndex = v11n.getCount(currentTestament) + 1;
> 
>  seems to sort the issue out - however, not sure I understand why. I could understand v11n.getCount(), but not v11n.getCount()+1. Is there an issue perhaps in v11n.getCount() as well?
> 
> I'm afraid I don't understand the index (non-lucene) file enough to fix this properly
> Chris
> 
> 
> 
> On 19 July 2014 13:17, Chris Burrell <chris at burrell.me.uk> wrote:
>  @Test
>     public void testMe() {
>         assertTrue(Books.installed().getBook("ESV").getGlobalKeyList().contains(new Verse(Versifications.instance().getVersification("NRSV"), BibleBook.REV, 22, 21)));
> 
>     }
> 
> 
> On 19 July 2014 13:16, Chris Burrell <chris at burrell.me.uk> wrote:
> The issue with this method here. Lucene relies on getGlobalKeyList, but that doesn't return the right number of keys. It seems to chop off the end
> 
> @Override
>     public Key getGlobalKeyList() throws BookException {
>         ZVerseBackendState rafBook = null;
>         try {
>             rafBook = initState();
> 
>             String v11nName = getBookMetaData().getProperty(ConfigEntryType.VERSIFICATION).toString();
>             Versification v11n = Versifications.instance().getVersification(v11nName);
> 
>             Testament[] testaments = new Testament[] {
>                     Testament.OLD, Testament.NEW
>             };
> 
>             BitwisePassage passage = new RocketPassage(v11n);
>             passage.raiseEventSuppresion();
>             passage.raiseNormalizeProtection();
> 
>             for (Testament currentTestament : testaments) {
>                 RandomAccessFile idxRaf = rafBook.getIdxRaf(currentTestament);
> 
>                 // If Bible does not contain the desired testament, then false
>                 if (idxRaf == null) {
>                     // no keys in this testament
>                     continue;
>                 }
> 
>                 int maxIndex = v11n.getCount(currentTestament) - 1;
> 
>                 // Read in the whole index, a few hundred Kb at most.
>                 byte[] temp = SwordUtil.readRAF(idxRaf, 0, IDX_ENTRY_SIZE * maxIndex);
> 
>                 // For each entry of 10 bytes, the length of the verse in bytes
>                 // is in the last 2 bytes. If both bytes are 0, then there is no content.
>                 for (int ii = 0; ii < temp.length; ii += IDX_ENTRY_SIZE) {
>                     // This can be simplified to temp[ii + 8] == 0 && temp[ii + 9] == 0.
>                     // int verseSize = SwordUtil.decodeLittleEndian16(temp, ii + 8);
>                     // if (verseSize > 0) {
>                     if (temp[ii + 8] != 0 || temp[ii + 9] != 0) {
>                         int ordinal = ii / IDX_ENTRY_SIZE;
>                         passage.addVersifiedOrdinal(v11n.getOrdinal(currentTestament, ordinal));
>                     }
>                 }
>             }
> 
>             passage.lowerNormalizeProtection();
>             passage.lowerEventSuppressionAndTest();
> 
>             return passage;
>         } catch (IOException e) {
>             throw new BookException(JSMsg.gettext("Unable to read key list from book."));
>         } finally {
>             OpenFileStateManager.release(rafBook);
>         }
>     }
> 
> Chris
> 
> 
> 
> On 19 July 2014 11:15, Martin Denham <mjdenham at gmail.com> wrote:
> For clarification, this is different to the search problem I mentioned yesterday.
> 
> I won't be able to look at this for at least a few days, and I am not so knowledgeable regarding Lucene, so if anybody else fixes it in the mean time - great.
> 
> Martin
> 
> 
> On 19 July 2014 09:24, Martin Denham <mjdenham at gmail.com> wrote:
> This bug affects both STEP and And Bible so it probably affects most JSword apps.
> 
> No search results are returned for the last 2 verses of Revelation.
> 
> Examples
> If you search for 'Amen' you see many results but the last is in Rev 19, not Rev 22 and the last 2 verses of Revelation contain Amen.
> 
> Searching for 'Jesus' in Rev 22 yields only verse which is verse 16 and omits verses 21 and 22.
> 
> Martin
> 
> 
> _______________________________________________
> jsword-devel mailing list
> jsword-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/jsword-devel
> 
> 
> 
> 
> _______________________________________________
> jsword-devel mailing list
> jsword-devel at crosswire.org
> http://www.crosswire.org/mailman/listinfo/jsword-devel

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.crosswire.org/pipermail/jsword-devel/attachments/20140719/6d677e62/attachment.html>


More information about the jsword-devel mailing list