Skip to content

Commit bc7c86e

Browse files
MohitMaliDeveloperkelson42
authored andcommitted
Use SuggestionSearch instead of Search for better search functionality.
* Since `Search` is not compatible with those zim files which does not have Xapian index but `SuggestionSearch` have this functionality to search inside those zim files so we have used this. * Update test cases for test new search functionality.
1 parent 29625b8 commit bc7c86e

File tree

10 files changed

+34
-37
lines changed

10 files changed

+34
-37
lines changed

core/src/main/java/org/kiwix/kiwixmobile/core/reader/ZimFileReader.kt

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,8 @@ import org.kiwix.libkiwix.JNIKiwixException
3737
import org.kiwix.libzim.Archive
3838
import org.kiwix.libzim.DirectAccessInfo
3939
import org.kiwix.libzim.Item
40-
import org.kiwix.libzim.Query
41-
import org.kiwix.libzim.Search
42-
import org.kiwix.libzim.Searcher
40+
import org.kiwix.libzim.SuggestionSearch
41+
import org.kiwix.libzim.SuggestionSearcher
4342
import java.io.File
4443
import java.io.FileInputStream
4544
import java.io.IOException
@@ -56,7 +55,7 @@ class ZimFileReader constructor(
5655
val zimFile: File,
5756
private val jniKiwixReader: Archive,
5857
private val nightModeConfig: NightModeConfig,
59-
private val searcher: Searcher = Searcher(jniKiwixReader)
58+
private val searcher: SuggestionSearcher = SuggestionSearcher(jniKiwixReader)
6059
) {
6160
interface Factory {
6261
fun create(file: File): ZimFileReader?
@@ -130,9 +129,9 @@ class ZimFileReader constructor(
130129
null
131130
}
132131

133-
fun searchSuggestions(prefix: String): Search? =
132+
fun searchSuggestions(prefix: String): SuggestionSearch? =
134133
try {
135-
searcher.search(Query(prefix))
134+
searcher.suggest(prefix)
136135
} catch (ignore: Exception) {
137136
// to handled the exception if there is no FT Xapian index found in the current zim file
138137
null

core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchResultGenerator.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,14 @@ import kotlinx.coroutines.Dispatchers
2222
import kotlinx.coroutines.withContext
2323
import kotlinx.coroutines.yield
2424
import org.kiwix.kiwixmobile.core.reader.ZimFileReader
25-
import org.kiwix.libzim.Search
25+
import org.kiwix.libzim.SuggestionSearch
2626
import javax.inject.Inject
2727

2828
interface SearchResultGenerator {
2929
suspend fun generateSearchResults(
3030
searchTerm: String,
3131
zimFileReader: ZimFileReader?
32-
): Search?
32+
): SuggestionSearch?
3333
}
3434

3535
class ZimSearchResultGenerator @Inject constructor() : SearchResultGenerator {

core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchState.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ data class SearchState(
3030
if (searchTerm.isEmpty()) {
3131
recentResults
3232
} else {
33-
searchResultsWithTerm.search?.let {
33+
searchResultsWithTerm.suggestionSearch?.let {
3434
val maximumResults = it.estimatedMatches
3535
val safeEndIndex =
3636
if (startIndex + 100 < maximumResults) startIndex + 100 else maximumResults

core/src/main/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModel.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.effects.SearchInPreviousScree
5959
import org.kiwix.kiwixmobile.core.search.viewmodel.effects.ShowDeleteSearchDialog
6060
import org.kiwix.kiwixmobile.core.search.viewmodel.effects.ShowToast
6161
import org.kiwix.kiwixmobile.core.search.viewmodel.effects.StartSpeechInput
62-
import org.kiwix.libzim.Search
62+
import org.kiwix.libzim.SuggestionSearch
6363
import javax.inject.Inject
6464

6565
@OptIn(ExperimentalCoroutinesApi::class)
@@ -174,4 +174,4 @@ class SearchViewModel @Inject constructor(
174174
}
175175
}
176176

177-
data class SearchResultsWithTerm(val searchTerm: String, val search: Search?)
177+
data class SearchResultsWithTerm(val searchTerm: String, val suggestionSearch: SuggestionSearch?)

core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchStateTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -30,27 +30,27 @@ internal class SearchStateTest {
3030
@Test
3131
internal fun `visibleResults use searchResults when searchTerm is not empty`() {
3232
val searchTerm = "notEmpty"
33-
val searchWrapper: SearchWrapper = mockk()
34-
val searchIteratorWrapper: SearchIteratorWrapper = mockk()
35-
val entryWrapper: EntryWrapper = mockk()
33+
val suggestionSearchWrapper: SuggestionSearchWrapper = mockk()
34+
val searchIteratorWrapper: SuggestionIteratorWrapper = mockk()
35+
val entryWrapper: SuggestionItemWrapper = mockk()
3636
val estimatedMatches = 1
37-
every { searchWrapper.estimatedMatches } returns estimatedMatches.toLong()
37+
every { suggestionSearchWrapper.estimatedMatches } returns estimatedMatches.toLong()
3838
// Settings list to hasNext() to ensure it returns true only for the first call.
3939
// Otherwise, if we do not set this, the method will always return true when checking if the iterator has a next value,
4040
// causing our test case to get stuck in an infinite loop due to this explicit setting.
4141
every { searchIteratorWrapper.hasNext() } returnsMany listOf(true, false)
4242
every { searchIteratorWrapper.next() } returns entryWrapper
4343
every { entryWrapper.title } returns searchTerm
4444
every {
45-
searchWrapper.getResults(
45+
suggestionSearchWrapper.getResults(
4646
0,
4747
estimatedMatches
4848
)
4949
} returns searchIteratorWrapper
5050
assertThat(
5151
SearchState(
5252
searchTerm,
53-
SearchResultsWithTerm("", searchWrapper),
53+
SearchResultsWithTerm("", suggestionSearchWrapper),
5454
emptyList(),
5555
FromWebView
5656
).getVisibleResults(0)

core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchViewModelTest.kt

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ import org.kiwix.kiwixmobile.core.search.viewmodel.effects.SearchInPreviousScree
7474
import org.kiwix.kiwixmobile.core.search.viewmodel.effects.ShowDeleteSearchDialog
7575
import org.kiwix.kiwixmobile.core.search.viewmodel.effects.ShowToast
7676
import org.kiwix.kiwixmobile.core.search.viewmodel.effects.StartSpeechInput
77-
import org.kiwix.libzim.Search
77+
import org.kiwix.libzim.SuggestionSearch
7878

7979
@OptIn(ExperimentalCoroutinesApi::class)
8080
internal class SearchViewModelTest {
@@ -122,20 +122,20 @@ internal class SearchViewModelTest {
122122
val item = ZimSearchResultListItem("")
123123
val searchTerm = "searchTerm"
124124
val searchOrigin = FromWebView
125-
val search: Search = mockk()
125+
val suggestionSearch: SuggestionSearch = mockk()
126126
viewModel.state.test(this)
127127
.also {
128128
emissionOf(
129129
searchTerm = searchTerm,
130-
search = search,
130+
suggestionSearch = suggestionSearch,
131131
databaseResults = listOf(RecentSearchListItem("")),
132132
searchOrigin = searchOrigin
133133
)
134134
}
135135
.assertValue(
136136
SearchState(
137137
searchTerm,
138-
SearchResultsWithTerm(searchTerm, search),
138+
SearchResultsWithTerm(searchTerm, suggestionSearch),
139139
listOf(RecentSearchListItem("")),
140140
searchOrigin
141141
)
@@ -243,14 +243,14 @@ internal class SearchViewModelTest {
243243

244244
private fun TestScope.emissionOf(
245245
searchTerm: String,
246-
search: Search,
246+
suggestionSearch: SuggestionSearch,
247247
databaseResults: List<RecentSearchListItem>,
248248
searchOrigin: SearchOrigin
249249
) {
250250

251251
coEvery {
252252
searchResultGenerator.generateSearchResults(searchTerm, zimFileReader)
253-
} returns search
253+
} returns suggestionSearch
254254
viewModel.actions.trySend(Filter(searchTerm)).isSuccess
255255
recentsFromDb.trySend(databaseResults).isSuccess
256256
viewModel.actions.trySend(ScreenWasStartedFrom(searchOrigin)).isSuccess

core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/EntryWrapper.kt renamed to core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SuggestionItemWrapper.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@
1818

1919
package org.kiwix.kiwixmobile.core.search.viewmodel
2020

21-
import org.kiwix.libzim.Entry
21+
import org.kiwix.libzim.SuggestionItem
2222

23-
internal class EntryWrapper : Entry() {
23+
class SuggestionItemWrapper : SuggestionItem() {
2424
override fun getTitle(): String = super.getTitle()
2525
}

core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchIteratorWrapper.kt renamed to core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SuggestionIteratorWrapper.kt

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@
1818

1919
package org.kiwix.kiwixmobile.core.search.viewmodel
2020

21-
import org.kiwix.libzim.SearchIterator
21+
import org.kiwix.libzim.SuggestionIterator
2222

23-
// Create this as a helper class, as we can not directly use libkiwix/libzim functions in testing
24-
internal class SearchIteratorWrapper : SearchIterator() {
23+
class SuggestionIteratorWrapper : SuggestionIterator() {
2524
override fun remove() {}
2625

2726
override fun hasNext(): Boolean = super.hasNext()
28-
override fun next(): EntryWrapper = super.next() as EntryWrapper
27+
override fun next(): SuggestionItemWrapper = super.next() as SuggestionItemWrapper
2928
}

core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SearchWrapper.kt renamed to core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/SuggestionSearchWrapper.kt

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@
1818

1919
package org.kiwix.kiwixmobile.core.search.viewmodel
2020

21-
import org.kiwix.libzim.Search
21+
import org.kiwix.libzim.SuggestionSearch
2222

23-
// Create this as a helper class, as we can not directly use libkiwix/libzim functions in testing
24-
internal class SearchWrapper : Search() {
23+
class SuggestionSearchWrapper : SuggestionSearch() {
2524
override fun getEstimatedMatches(): Long = super.getEstimatedMatches()
2625

27-
override fun getResults(start: Int, maxResults: Int): SearchIteratorWrapper =
28-
super.getResults(start, maxResults) as SearchIteratorWrapper
26+
override fun getResults(start: Int, maxResults: Int): SuggestionIteratorWrapper =
27+
super.getResults(start, maxResults) as SuggestionIteratorWrapper
2928
}

core/src/test/java/org/kiwix/kiwixmobile/core/search/viewmodel/ZimSearchResultGeneratorTest.kt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ internal class ZimSearchResultGeneratorTest {
4444
@Test
4545
internal fun `suggestion results are distinct`() {
4646
val searchTerm = " "
47-
val searchWrapper: SearchWrapper = mockk()
48-
every { zimFileReader.searchSuggestions(searchTerm) } returns searchWrapper
47+
val suggestionSearchWrapper: SuggestionSearchWrapper = mockk()
48+
every { zimFileReader.searchSuggestions(searchTerm) } returns suggestionSearchWrapper
4949
runBlocking {
5050
assertThat(zimSearchResultGenerator.generateSearchResults(searchTerm, zimFileReader))
51-
.isEqualTo(searchWrapper)
51+
.isEqualTo(suggestionSearchWrapper)
5252
verify {
5353
zimFileReader.searchSuggestions(searchTerm)
5454
}

0 commit comments

Comments
 (0)