Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Can I write Firestore query using if else statement? [duplicate]

I want to build a method that can accommodate all cases of my query.

so I want to search for an event from my events collection. it can be searched based on filter whether it is free events or not, and also if it needs to search specific event type or show all events regardless of the event type.

I assumed that I can build a query like this, but the result is wrong. is the way I write the query right?

Here the code of my method:

   fun searchEventByParameters(onlyFreeEvents: Boolean, startDate: Date, endDate: Date, selectedCity: String, selectedEventType: String, limit: Long, lastDocument: DocumentSnapshot?, completion: (errorMessage:String?, events: ArrayList<Event>?, lastDocument: DocumentSnapshot?) -> Unit) {

        val ref = db.collection("events")
        lateinit var query : Query

        query = ref
            .whereEqualTo(FIRESTORE_EVENT_FIELD_CITY,selectedCity)
            .whereEqualTo(FIRESTORE_EVENT_FIELD_IS_ACTIVE,true)
            .whereEqualTo(FIRESTORE_EVENT_FIELD_HAS_BEEN_APPROVED,true)


        if (onlyFreeEvents) {
            query.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)
        }

        if (selectedEventType == "show specific event type") {
            query.whereEqualTo(FIRESTORE_EVENT_FIELD_EVENT_TYPE, selectedEventType)
        }

        query.whereGreaterThan(FIRESTORE_EVENT_FIELD_DATE_START_TIME,startDate)
            .whereLessThan(FIRESTORE_EVENT_FIELD_DATE_START_TIME,endDate)
            .orderBy(FIRESTORE_EVENT_FIELD_DATE_START_TIME, Query.Direction.ASCENDING)
            .limit(limit)

        if (lastDocument != null) {
            query.startAfter(lastDocument)
        }



        query.get()
            .addOnSuccessListener { snapshot ->

                val eventDocuments = snapshot.documents

                if (eventDocuments.isEmpty()) {

                    completion("Tidak ada event",null,null)

                } else {

                    val lastDocument = snapshot.documents.last()
                    val eventArray = ArrayList<Event>()

                    for (document in eventDocuments) {
                        val eventData = document.data
                        val event = Event(dataEvent = eventData)
                        eventArray.add(event)
                    }

                    completion(null,eventArray,lastDocument)

                }



            }.addOnFailureListener {
                completion(it.localizedMessage,null, null)
            }




    }

here is the screenshot of my database

enter image description here

I assume I can chaining the query like that, but the result is weird. no matter I choose the filter, say I want only show only free events or only music event (event type), the result seems always show all the events in the collection, and the pagination is also failed, seems never-ending.

like image 755
Agung Laksana Avatar asked Nov 26 '25 03:11

Agung Laksana


1 Answers

Cloud Firestore queries are immutable! This means that you can not change the properties of an existing query. If you change the value by calling for instance:

query.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)

It becomes a new query. So to solve this, you need to save the new query in the original object:

query = query.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)

Now your query will filter the elements using the following four whereEqualTo() calls cumulative:

.whereEqualTo(FIRESTORE_EVENT_FIELD_CITY,selectedCity)
.whereEqualTo(FIRESTORE_EVENT_FIELD_IS_ACTIVE,true)
.whereEqualTo(FIRESTORE_EVENT_FIELD_HAS_BEEN_APPROVED,true)
.whereEqualTo(FIRESTORE_EVENT_FIELD_PRICE,0)
like image 61
Alex Mamo Avatar answered Nov 28 '25 15:11

Alex Mamo



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!