only search text messages

Daniel Gultsch created

Change summary

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java | 2 
src/main/java/eu/siacs/conversations/services/MessageSearchTask.java  | 9 
src/main/java/eu/siacs/conversations/utils/FtsUtils.java              | 4 
3 files changed, 7 insertions(+), 8 deletions(-)

Detailed changes

src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java 🔗

@@ -725,7 +725,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
 
 	public Cursor getMessageSearchCursor(List<String> term) {
 		SQLiteDatabase db = this.getReadableDatabase();
-		String SQL = "SELECT "+Message.TABLENAME+".*,"+Conversation.TABLENAME+'.'+Conversation.CONTACTJID+','+Conversation.TABLENAME+'.'+Conversation.ACCOUNT+','+Conversation.TABLENAME+'.'+Conversation.MODE+" FROM "+Message.TABLENAME +" join "+Conversation.TABLENAME+" on "+Message.TABLENAME+'.'+Message.CONVERSATION+'='+Conversation.TABLENAME+'.'+Conversation.UUID+" join messages_index ON messages_index.uuid=messages.uuid where "+Message.ENCRYPTION+" NOT IN("+Message.ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE+','+Message.ENCRYPTION_PGP+','+Message.ENCRYPTION_DECRYPTION_FAILED+") AND messages_index.body MATCH ? ORDER BY "+Message.TIME_SENT+" DESC limit "+Config.MAX_SEARCH_RESULTS;
+		String SQL = "SELECT "+Message.TABLENAME+".*,"+Conversation.TABLENAME+'.'+Conversation.CONTACTJID+','+Conversation.TABLENAME+'.'+Conversation.ACCOUNT+','+Conversation.TABLENAME+'.'+Conversation.MODE+" FROM "+Message.TABLENAME +" join "+Conversation.TABLENAME+" on "+Message.TABLENAME+'.'+Message.CONVERSATION+'='+Conversation.TABLENAME+'.'+Conversation.UUID+" join messages_index ON messages_index.uuid=messages.uuid where "+Message.ENCRYPTION+" NOT IN("+Message.ENCRYPTION_AXOLOTL_NOT_FOR_THIS_DEVICE+','+Message.ENCRYPTION_PGP+','+Message.ENCRYPTION_DECRYPTION_FAILED+") AND "+Message.TYPE+" IN("+Message.TYPE_TEXT+','+Message.TYPE_PRIVATE+") AND messages_index.body MATCH ? ORDER BY "+Message.TIME_SENT+" DESC limit "+Config.MAX_SEARCH_RESULTS;
 		Log.d(Config.LOGTAG,"search term: "+FtsUtils.toMatchString(term));
 		return db.rawQuery(SQL,new String[]{FtsUtils.toMatchString(term)});
 	}

src/main/java/eu/siacs/conversations/services/MessageSearchTask.java 🔗

@@ -87,6 +87,7 @@ public class MessageSearchTask implements Runnable, Cancellable {
 			final HashMap<String, Conversational> conversationCache = new HashMap<>();
 			final List<Message> result = new ArrayList<>();
 			cursor = xmppConnectionService.databaseBackend.getMessageSearchCursor(term);
+			long dbTimer = SystemClock.elapsedRealtime();
 			if (isCancelled) {
 				Log.d(Config.LOGTAG, "canceled search task");
 				return;
@@ -99,10 +100,8 @@ public class MessageSearchTask implements Runnable, Cancellable {
 						return;
 					}
 					final String conversationUuid = cursor.getString(cursor.getColumnIndex(Message.CONVERSATION));
-					Conversational conversation;
-					if (conversationCache.containsKey(conversationUuid)) {
-						conversation = conversationCache.get(conversationUuid);
-					} else {
+					Conversational conversation = conversationCache.get(conversationUuid);
+					if (conversation == null) {
 						String accountUuid = cursor.getString(cursor.getColumnIndex(Conversation.ACCOUNT));
 						String contactJid = cursor.getString(cursor.getColumnIndex(Conversation.CONTACTJID));
 						int mode = cursor.getInt(cursor.getColumnIndex(Conversation.MODE));
@@ -114,7 +113,7 @@ public class MessageSearchTask implements Runnable, Cancellable {
 				} while (cursor.moveToPrevious());
 			}
 			long stopTimestamp = SystemClock.elapsedRealtime();
-			Log.d(Config.LOGTAG, "found " + result.size() + " messages in " + (stopTimestamp - startTimestamp) + "ms");
+			Log.d(Config.LOGTAG, "found " + result.size() + " messages in " + (stopTimestamp - startTimestamp) + "ms"+ " (db was "+(dbTimer - startTimestamp)+"ms)");
 			onSearchResultsAvailable.onSearchResultsAvailable(term, result);
 		} catch (Exception e) {
 			Log.d(Config.LOGTAG, "exception while searching ", e);

src/main/java/eu/siacs/conversations/utils/FtsUtils.java 🔗

@@ -46,7 +46,7 @@ public class FtsUtils {
 				continue;
 			}
 			final String cleaned = clean(part);
-			if (isKeyword(cleaned)) {
+			if (isKeyword(cleaned) || cleaned.contains("*")) {
 				term.add(part);
 			} else if (!cleaned.isEmpty()) {
 				term.add(cleaned);
@@ -72,7 +72,7 @@ public class FtsUtils {
 		return builder.toString();
 	}
 
-	public static boolean isKeyword(String term) {
+	static boolean isKeyword(String term) {
 		return KEYWORDS.contains(term.toUpperCase(Locale.ENGLISH));
 	}