在过去的几天里,我一直在花时间试图弄清楚如何在 Google App Engine 中进行正确的分页。一旦我有了一个可行的解决方案,我就会在谷歌代码上打开这些东西,因为我看到很多人都在为此苦苦挣扎。
目标:为 GAE 创建一个简单但功能强大的分页解决方案,具有以下功能:
- 向前和向后分页,支持首页和末页
- 按字段的(子集)排序(一次仅一个订单)
- 具有类似方式的过滤条件(例如,输入“Tom”将过滤并仅显示名称以“Tom”开头的人)
- 跟踪总页数
设计决策:
- 不要使用限制/偏移,因为它不会缩放。而是依靠游标
- 使用分片保持总页数更新
- 接受妥协,但以最佳性能/可扩展性为目标
障碍(即最后的堡垒):我觉得剩下的唯一问题是当我有一个过滤标准(例如,名称以“Tom”开头)和一个不同属性的排序标准时。
例如人[姓名,年龄]
- 按名称“汤姆*”过滤
- 按年龄排序
通读文档,我想我找到了解决方案:
Query q = new Query("Person");
q.addFilter("name", FilterOperator.GREATER_THAN_OR_EQUAL, nameFilter);
q.addFilter("name", FilterOperator.LESS_THEN, nameFilter + "\uFFFD");
q.addSort("name", SortDirection.ASCENDING);
q.addSort("age", SortDirection.ASCENDING);
我以为这会回来:
- 汤姆2 18
- 汤姆1 20
不幸的是,这会返回
- 汤姆1 20
- 汤姆2 18
因为查询首先按名称过滤,然后按年龄作为辅助键。
我能想到的唯一解决方案是将整个过滤器结果放入 Java 结构中,使用比较器进行排序,然后选择我想要显示的记录。但这还有一个问题是我的光标逻辑消失了。这有点意味着我有 2 条逻辑路径来解决分页问题。这可能是最终的解决方案,但我想知道是否有更聪明的人有更好的主意。
欢迎任何想法。
谢谢, 马蒂亚斯