Mike Culver的An Introduction to Amazon SimpleDB网络研讨会提到使用了面包屑,但他并没有在视频中实现它们.
解决方法
SELECT title,summary,Votecount FROM posts WHERE userid = '000022656' LIMIT 25
您已经知道如何处理NextToken,但是如果您使用这种策略,则可以通过存储下一个令牌的导航痕迹(例如在Web会话中)来支持“上一页”,并使用以前的NextToken重新发出查询,而不是接下来的一个.
然而,在SimpleDB中处理任意分页的一般情况与前一个和下一个相同.在一般情况下,用户可以点击任意页面号码,如5,而不用访问第4页或第6页.
您可以在SimpleDB中使用NextToken仅需要WHERE子句才能正常工作的事实来处理此问题.所以,而不是按顺序查询每个页面,拉下所有的插入项,通常可以分两步进行.
>发出您的查询,并以所需页面开始的极限值和SELECT count(*)代替所需的实际属性.
>使用第一步中的NextToken使用所需的属性和页面大小作为LIMIT来获取实际页面数据
所以在伪代码中:
int targetPage,pageSize; ... int jumpLimit = pageSize * (targetPage - 1); String query = "SELECT %1 FROM posts WHERE userid = '000022656' LIMIT %2"; String output = "title,Votecount"; Result temp = sdb.select(query,"count(*)",jumpLimit); Result data = sdb.select(query,output,pageSize,temp.getToken());
其中%1和%2是String替换,“sdb.select()”是一个虚构的方法,包括String替换代码以及SimpleDB调用.
您是否可以在对SimpleDB的两次调用(如代码中所示)中完成此操作将取决于WHERE子句的复杂性和数据集的大小.上述代码简化为,如果查询花费超过5秒钟运行,临时结果可能已返回部分计数.你真的想把这一行放在一个循环中,直到达到正确的数值.为了使代码更加现实,我将其放在方法中,并摆脱String替换:
private Result fetchPage(String query,int targetPage) { int pageSize = extractLimitValue(query); int skipLimit = pageSize * (targetPage - 1); String token = skipAhead(query,skipLimit); return sdb.select(query,token); } private String skipAhead(String query,int skipLimit) { String tempQuery = replaceClause(query,"SELECT","count(*)"); int accumulatedCount = 0; String token = ""; do { int tempLimit = skipLimit - accumulatedCount; tempQuery = replaceClause(tempQuery,"LIMIT",tempLimit + ""); Result tempResult = sdb.select(query,token); token = tempResult.getToken(); accumulatedCount += tempResult.getCount(); } while (accumulatedCount < skipLimit); return token; } private int extractLimitValue(String query) {...} private String replaceClause(String query,String clause,String value){...}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。