Запрос GeoHashes в Firetore в диапазоне Android

Я пытаюсь получить документы, которые находятся в пределах допустимого диапазона.

Просматривая видео и просматривая библиотеку геохешей для Android, я могу получить ограничивающую рамку и получить необходимые геохеши для запроса в firebase.

В качестве примера:

Point -> LatLng(40.4378698,-3.8196205) (Мадрид, Испания)

Радиус -> 5000meter (5 км)

Граничная рамка, которую я получаю:

[GeoHashQuery{startValue='ezjnh', endValue='ezjns'}, GeoHashQuery{startValue='ezjjs', endValue='ezjj~'}, GeoHashQuery{startValue='ezjq0', endValue='ezjq8'}, GeoHashQuery{startValue='ezjm8', endValue='ezjmh'}]

Если у меня есть этот список, я вызываю Firebase, чтобы получить документы, которые «соответствуют» этим критериям:

fun getUpTos(queries: MutableSet<GeoHashQuery>, onSuccessListener: OnSuccessListener<QuerySnapshot>, onFailureListener: OnFailureListener) {
        var reference = Firebase.firestore.collection("pois")
        queries.forEach { entry ->
            reference
                .whereGreaterThanOrEqualTo("geohash", entry.startValue)
                .whereLessThanOrEqualTo("geohash", entry.endValue)
        }

        reference.get()
            .addOnSuccessListener(onSuccessListener)
            .addOnFailureListener(onFailureListener)
    }

На данный момент у меня есть около 20 Пои в базе, чтобы начать тест. Все Пои находятся в Барселоне и один - в Мадриде.

После выполнения запроса я получаю ВСЕ пои, тогда как предполагалось, что он просто вернет мадридские пои.

Как я могу получить только те точки, которые соответствуют запросу? Кажется, не работает должным образом (или я явно что-то делаю не так)

Можно ли выполнить этот тип запросов?


person Shudy    schedule 14.08.2019    source источник


Ответы (1)


Можно ли выполнить этот тип запросов?

Да, это возможно.

Когда вы повторяете свой queries MutableSet, на каждой итерации вы создаете новый объект Query. Таким образом, вы не можете просто вызвать get() вне цикла только один раз и ожидать, что все эти запросы будут работать. Вместо этого вы можете добавить вызов get() к каждому запросу внутри цикла. Тип результата - _5 _ . Добавьте все эти Task объекты в List<Task<QuerySnapshot>>. В конце концов, передайте этот список задач в whenAllSuccess (Collection> tasks), как описано в моем ответе из следующего сообщения:

person Alex Mamo    schedule 14.08.2019
comment
Спасибо, все сработало отлично. Приношу свои извинения, что не принимаю раньше, я слишком быстро выбегаю из офиса. - person Shudy; 15.08.2019
comment
Еще раз привет, еще один вопрос, связанный с этим. @AlexMamo, можно вместо запроса документов добавить прослушиватель событий, когда какой-то документ изменяется / добавляется / удаляется после этого типа ограничений? Заранее спасибо! - person Shudy; 16.08.2019
comment
Конечно, проверьте это. Вы можете слушать обновления в реальном времени. - person Alex Mamo; 16.08.2019