consultas de múltiples dominios de Android con RXJava

Estoy manteniendo una aplicación que no hice yo mismo.

La aplicación se ejecuta en un dispositivo android especial que puede leer códigos de barras usando un rayo láser y una vez que se ingresó un código de barras, la aplicación comienza a verificar a través de la database de Realms si ese código existe, pero las consultas de búsqueda son muchas porque la aplicación necesita busca tanto letras pequeñas como letras mayúsculas.

Cada elemento de la database contiene 3 códigos de barras y una vez el código UPC que el método de búsqueda necesita para iterar en todos ellos y devolver una respuesta.

Código debajo

fun readItemByMKTorUPC(Value : String,callback:NewCountingPresenter.findItem{ doAsync { val realm = Realm.getDefaultInstance() var findVal : ItemRealmSearchOnly? = ItemRealmSearchOnly() //--------------------MKT------------------------------- //search for MKT findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT",Value)?.findFirst() //if not found search for UPC Upper if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toUpperCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("UPC",Value)?.findFirst() } //if not found search for MKT Lower Case if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toLowerCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT",Value)?.findFirst() } //if not found search for MKT UPPER Case if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toUpperCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT",Value)?.findFirst() } //--------------------UPC------------------------------- //if not found search for UPC if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("UPC",Value)?.findFirst() } //if not found search for UPC Lower if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toLowerCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("UPC",Value)?.findFirst() } //--------------------MKT 2------------------------------- //if not found search for MKT 2 if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value; findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT2",Value)?.findFirst() } //if not found search for MKT 2 Upper if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toUpperCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT2",Value)?.findFirst() } //if not found search for MKT 2 lower if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toLowerCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT2",Value)?.findFirst() } //--------------------MKT3------------------------------- //if not found search for MKT 3 if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toUpperCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT3",Value)?.findFirst() } //if not found search for MKT 3 Upper if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toUpperCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT3",Value)?.findFirst() } //if not found search for MKT 3 lower if(findVal?.MKT.isNullOrEmpty()){ val Value :String = Value.toUpperCase(); findVal = realm.where(ItemRealmSearchOnly::class.java).contains("company_id",MyApplication.instance.company.companyNameId)?.equalTo("MKT3",Value)?.findFirst() } var item : ItemRealm = ItemRealm(); item.MKT = findVal?.MKT; item.MKT2 = findVal?.MKT2; item.MKT3 = findVal?.MKT3; item.UPC = findVal?.UPC; item.AMOUNT = findVal?.AMOUNT; uiThread { callback.clickHere(item); } } } 

El problema con este método es que lleva mucho time iterar en cada una de esas consultas y devolver una respuesta al usuario

Pensé en integrar el método RxJava 2 para este código, pero no pude encontrar ningún consejo útil sobre cómo hacerlo en línea.

Editar:

Encontré una solución gracias a Tim Castelijns dando a entender en los comentarios

  MyApplication.instance.printLog("scanner start: MKT"); findVal = realm.where(ItemRealmSearchOnly::class.java) .contains("company_id",MyApplication.instance.company.companyNameId) ?.equalTo("MKT",Value) ?.or()?.equalTo("MKT",Value.toUpperCase()) ?.or()?.equalTo("MKT",Value.toLowerCase()) ?.or()?.equalTo("UPC",Value) ?.or()?.equalTo("UPC",Value.toLowerCase()) ?.or()?.equalTo("UPC",Value.toUpperCase()) ?.or()?.equalTo("MKT2",Value) ?.or()?.equalTo("MKT2",Value.toLowerCase()) ?.or()?.equalTo("MKT2",Value.toUpperCase()) ?.or()?.equalTo("MKT3",Value) ?.or()?.equalTo("MKT3",Value.toLowerCase()) ?.or()?.equalTo("MKT3",Value.toUpperCase()) ?.findFirst(); MyApplication.instance.printLog("scanner end: MKT"); 

que mejoró el time de búsqueda por al less 200% que el método anterior