firebase-admin-python
firebase-admin-python copied to clipboard
Order diff between backend and client with order_by_key()
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.
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