firebase-admin-python icon indicating copy to clipboard operation
firebase-admin-python copied to clipboard

Order diff between backend and client with order_by_key()

Open tperraut opened this issue 2 years ago • 1 comments

Describe your environment

  • Operating System version: macOS 12.4
  • Firebase SDK version: 6.1.0
  • Firebase Product: database
  • Python version: 3.7.9
  • Pip version: 21.3.1

Describe the problem

When using order_by_key(), the order of the returned OrderedDict is not the same as the database making pagination very difficult

Steps to reproduce:

  • Create a collection with this json in "/test" for example :
{
  "123": {"myValue": true},
  "100001": {"myValue": true},
  "100002": {"myValue": true},
  "100003": {"myValue": true},
  "100004": {"myValue": true},
  "100005": {"myValue": true}
}
  • Query it with :
db.reference("/test").order_by_key().limit_to_first(4).get()
  • Comparison :

Current :

OrderedDict([('100001', {'myValue': True}), ('100002', {'myValue': True}), ('100003', {'myValue': True}), ('123', {'myValue': True})])

Expected :

OrderedDict([('123', {'myValue': True}), ('100001', {'myValue': True}), ('100002', {'myValue': True}), ('100003', {'myValue': True})])

Comments

So according to this link, order should be the same as the collection but in the corresponding OrderedDict the order is not the same so if you want make a pagination strategy, it just loops as getting the last key of the OrderedDict returned and using it in start_at will return the same result over and over again.

tperraut avatar Mar 01 '23 15:03 tperraut

We fixed this issue on a fork replacing this line : https://github.com/firebase/firebase-admin-python/blob/5c21b81e35443f749a5df16e7e02dd817dca8c1c/firebase_admin/db.py#L622 by

if isinstance(result, (dict, list)) and self._order_by != '$priority' and self._order_by != '$key':

So the client sorter is not triggered when ordering by key and we will have the same order as the database given here instead of a pure lexicographic one

tperraut avatar Mar 02 '23 09:03 tperraut