}
HashtableOfObject addQueryResults(char[][] categories, char[] key, int matchRule, MemoryIndex memoryIndex) throws IOException {
// assumes sender has called startQuery() & will call stopQuery() when finished
if (this.categoryOffsets == null) return null; // file is empty
HashtableOfObject results = null; // initialized if needed
if (key == null) {
for (int i = 0, l = categories.length; i < l; i++) {
HashtableOfObject wordsToDocNumbers = readCategoryTable(categories[i], true); // cache if key is null since its a definite match
if (wordsToDocNumbers != null) {
char[][] words = wordsToDocNumbers.keyTable;
if (results == null)
results = new HashtableOfObject(wordsToDocNumbers.elementSize);
for (int j = 0, m = words.length; j < m; j++)
if (words[j] != null)
results = addQueryResult(results, words[j], wordsToDocNumbers, memoryIndex);
}
}
if (results != null && this.cachedChunks == null)
cacheDocumentNames();
} else {
switch (matchRule) {
case SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE:
for (int i = 0, l = categories.length; i < l; i++) {
HashtableOfObject wordsToDocNumbers = readCategoryTable(categories[i], false);
if (wordsToDocNumbers != null && wordsToDocNumbers.containsKey(key))
results = addQueryResult(results, key, wordsToDocNumbers, memoryIndex);
}
break;
case SearchPattern.R_PREFIX_MATCH | SearchPattern.R_CASE_SENSITIVE:
for (int i = 0, l = categories.length; i < l; i++) {
HashtableOfObject wordsToDocNumbers = readCategoryTable(categories[i], false);
if (wordsToDocNumbers != null) {
char[][] words = wordsToDocNumbers.keyTable;
for (int j = 0, m = words.length; j < m; j++) {
char[] word = words[j];
if (word != null && key[0] == word[0] && CharOperation.prefixEquals(key, word))
results = addQueryResult(results, word, wordsToDocNumbers, memoryIndex);
}
}
}
break;
default:
for (int i = 0, l = categories.length; i < l; i++) {
HashtableOfObject wordsToDocNumbers = readCategoryTable(categories[i], false);
if (wordsToDocNumbers != null) {
char[][] words = wordsToDocNumbers.keyTable;
for (int j = 0, m = words.length; j < m; j++) {
char[] word = words[j];
if (word != null && Index.isMatch(key, word, matchRule))