Since there is no logical OR
operator in Firestore, I am trying to merge 2 separate queries locally.
Now I wonder how I can keep up the proper order of the results. When I run 2 queries independently, I can't oder the results specificly (at least not the order in which I get the results from Firestore with the orderBy
method).
My idea was to put the 2nd query inside the onSuccessListener
of the 1st query. Is this a bad idea performance wise?
public void loadNotes(View v) {
collectionRef.whereLessThan("priority", 2)
.orderBy("priority")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
Note note = documentSnapshot.toObject(Note.class);
//adding the results to a List
}
collectionRef.whereGreaterThan("priority", 2)
.orderBy("priority")
.get()
.addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot queryDocumentSnapshots) {
for (QueryDocumentSnapshot documentSnapshot : queryDocumentSnapshots) {
Note note = documentSnapshot.toObject(Note.class);
//adding the results to a List
}
}
});
}
});
}
To merge 2 separate queries locally, I recommend you to use
Tasks.whenAllSuccess()
method. You can achieve this, using the following lines of code:As you can see, when overriding the
onSuccess()
method the result is alist
of objects which has the exact order of the tasks that were passed as arguments into thewhenAllSuccess()
method.There is also another approach and that would be to use
Tasks.continueWith()
method. But according to the use-case of your app, you can use eiterwhenAllSuccess()
method orcontinueWith()
method. Please see here the official documentation.