git.iko.soy/parseable-android
on master help sign in
Fix search failing on streams with non-text columns (#31)
0bc5ab9iko
app/src/main/java/com/parseable/android/ui/screens/logviewer/LogViewerViewModel.kt+8−4
@@ -188,6 +188,11 @@ class LogViewerViewModel @Inject constructor(
188 }
188 }
189
189
190 fun addFilter(column: String, operator: String, value: String) {
190 fun addFilter(column: String, operator: String, value: String) {
191+ addFilterInternal(column, operator, value)
192+ refresh()
193+ }
194+
195+ private fun addFilterInternal(column: String, operator: String, value: String) {
191 if (operator !in ALLOWED_OPERATORS) return
196 if (operator !in ALLOWED_OPERATORS) return
192 val safeColumn = escapeIdentifier(column)
197 val safeColumn = escapeIdentifier(column)
193 val safeValue = escapeSql(value)
198 val safeValue = escapeSql(value)
@@ -208,7 +213,6 @@ class LogViewerViewModel @Inject constructor(
208 ),
213 ),
209 )
214 )
210 }
215 }
211− refresh()
212 }
216 }
213
217
214 fun removeFilter(display: String) {
218 fun removeFilter(display: String) {
@@ -280,7 +284,7 @@ class LogViewerViewModel @Inject constructor(
280 if (searchableColumns.isEmpty()) return null
284 if (searchableColumns.isEmpty()) return null
281 val safeSearch = escapeSql(searchQuery)
285 val safeSearch = escapeSql(searchQuery)
282 return searchableColumns.joinToString(" OR ") {
286 return searchableColumns.joinToString(" OR ") {
283− "\"${escapeIdentifier(it)}\" ILIKE '%$safeSearch%'"
287+ "CAST(\"${escapeIdentifier(it)}\" AS VARCHAR) ILIKE '%$safeSearch%'"
284 }
288 }
285 }
289 }
286
290
@@ -439,7 +443,7 @@ class LogViewerViewModel @Inject constructor(
439 if (current.filters.searchQuery.isNotBlank()) {
443 if (current.filters.searchQuery.isNotBlank()) {
440 val searchClause = buildSearchClause(current.searchableColumns, current.filters.searchQuery)
444 val searchClause = buildSearchClause(current.searchableColumns, current.filters.searchQuery)
441 if (searchClause != null) {
445 if (searchClause != null) {
442− clauses.add(searchClause)
446+ clauses.add("($searchClause)")
443 }
447 }
444 }
448 }
445
449
@@ -640,7 +644,7 @@ class LogViewerViewModel @Inject constructor(
640 for (group in builder.rules) {
644 for (group in builder.rules) {
641 for (rule in group.rules) {
645 for (rule in group.rules) {
642 if (rule.field.isNotBlank()) {
646 if (rule.field.isNotBlank()) {
643− addFilter(rule.field, rule.operator, rule.value)
647+ addFilterInternal(rule.field, rule.operator, rule.value)
644 }
648 }
645 }
649 }
646 }
650 }
app/src/test/java/com/parseable/android/LogViewerViewModelTest.kt+3−3
@@ -164,9 +164,9 @@ class LogViewerViewModelTest {
164 startTime = any(),
164 startTime = any(),
165 endTime = any(),
165 endTime = any(),
166 filterSql = match {
166 filterSql = match {
167− it.contains("\"message\" ILIKE '%error%'") &&
167+ it.contains("CAST(\"message\" AS VARCHAR) ILIKE '%error%'") &&
168− it.contains("\"level\" ILIKE '%error%'") &&
168+ it.contains("CAST(\"level\" AS VARCHAR) ILIKE '%error%'") &&
169− !it.contains("p_timestamp ILIKE") // Internal columns excluded
169+ !it.contains("p_timestamp") // Internal columns excluded
170 },
170 },
171 limit = any(),
171 limit = any(),
172 )
172 )