Backward pagination with cursor is working but missing an item
app-engine-ndb, google-app-engine
Solution
Ok, here's the official answer. You need to "reverse" the cursor, as follows:
rev_cursor = cursor.reversed()
I did not know this myself. :-( I'll make sure this is shown in the docs for fetch_page().
Problem
From looking for ideas/alternatives to providing a page/item count/navigation of items matching a GAE datastore query, I could find a hint how to backward page navigation with a single cursor by REVERSING ORDER. ``` class CursorTests(test_utils.NDBTest): def testFirst(self): class Bar(model.Model): value = model.IntegerProperty() self.entities = [] for i in range(10): e = Bar(value=i) e.put() self.entities.append(e) q = Bar.query() bars, next_cursor, more = q.order(Bar.key).fetch_page(3) barz, another_cursor, more2 = q.order(-Bar.key).fetch_page(3, start_cursor=next_cursor) self.assertEqual(len(bars), len(barz)) ``` Unfortunately it failed with this error. Traceback (most recent call last): File "/Users/reiot/Documents/Works/appengine-ndb-experiment/ndb/query_test.py", line 32, in testFirst self.assertEqual(len(bars), len(baz)) AssertionError: 3 != 2 Yes, an item in boundary is missing with reverse query. ``` bars = [Bar(key=Key('Bar', 1), value=0), Bar(key=Key('Bar', 2), value=1), Bar(key=Key('Bar', 3), value=2)] bars = [Bar(key=Key('Bar', 2), value=1), Bar(key=Key('Bar', 1), value=0)] ``` How can I fix this problem?