[sword-devel] Counting Keys in a Module

DM Smith dmsmith555 at yahoo.com
Mon Apr 21 13:09:28 MST 2008


Troy A. Griffitts wrote:
> Theoretically, it is not always a good thing for a container object to 
> provide a count method.  The problem is more easily seen when thinking 
> about a tree container.  A count method can traverse the tree to sum all 
> nodes, but typically there is no efficient way to obtain this 
> information-- without storing 'accounting' information about the 
> container, and this has the danger of getting out of sync.
>
> In any case, can you provide the use case for needing the count of 
> entries in a module?  Maybe we can think of an alternative route.  One 
> place we've needed them is for providing search status % information in 
> the status update callback.  We can't determine the % if we don't know 
> the total count of entries.
>   
The performance improvement that I got for JSword on the display of the 
dictionaries was due in part to knowing the number of entries in a 
dictionary.

Many modern GUIs have a list widget that does not need to be fully 
populated but merely need to know how to get the rows by index it needs 
to display. These also need a total size in order to make the scrollbar 
work. If I recall correctly, GnomeSword has a performance problem with 
dictionaries and this might help that.

For a dictionary, one can take the size of the dat file and divide it by 
the size of a dat file entry to determine the number of dictionary 
entries. I looked to see if there were any way for a dictionary to have 
dat entries that did not point to a valid place and I did not find any. 
It looks like the strict ordering of the keys requires this to work. I 
tested this against all the dictionary modules at CrossWire and this is 
true for them.

In Him,
    DM
> We can always provide a brute force count method in SWModule with 
> something like:
>
> long SWModule::entryCount() {
> 	SWKey *saveKey = getKey().clone();
> 	long count = 0;
> 	for (*this = TOP; !this->Error(); (*this)++)
> 		count++;
> 	setKey(saveKey);
> 	delete saveKey;
> 	return count;
> }
>
>
>
> mmital wrote:
>   
>> Hello,
>>
>> I was just wondering if you managed to solve your problem. I had the same
>> question. Thanks,
>>
>>
>> Jeremy Erickson wrote:
>>     
>>> Hi,
>>> 	What is the proper way in Sword to quickly determine the number of keys
>>> in a 
>>> module?  Currently in BibleTime we use the following code to determine the 
>>> starting and ending indices:
>>>
>>>     *m_module = sword::TOP;
>>>     unsigned long verseLowIndex = m_module->Index();
>>>     *m_module = sword::BOTTOM;
>>>     unsigned long verseHighIndex = m_module->Index();
>>>
>>> This code works as expected when the module is a Bible, but it does not
>>> work 
>>> when the module is a Lexicon.  In this case, the Index() function always 
>>> returns 0.  Is this because StrKey does not reimplement the Index()
>>> function?  
>>> In any case, what would the cleanest way for me to count the keys in a
>>> module 
>>> be, so that it works with all types of modules?
>>>
>>> -Jeremy Erickson




More information about the sword-devel mailing list