构建分页光标

2024-03-16

我的活动存储在图形数据库中。在某些情况下,多项活动会被分组并聚合为一项活动。

处理后的活动源可能如下所示:

Activity 1

Activity 2

Grouped Activity
  Activity 3
  Activity 4

Activity 5
  • 活动具有更新的时间戳和唯一的 ID。

  • 活动按其更新时间排序,如果是分组活动,则使用其子活动中的最新更新时间。

  • 活动可以插入列表中的任何位置(例如,如果我们开始关注某人,他们过去的活动将被插入到列表中)。

  • 可以从列表中的任何位置删除活动。

  • 由于数据量的原因,使用微秒的时间戳仍然会导致冲突(2 个项目可以具有相同的时间戳)。

  • 游标标识符应该是唯一且稳定的。添加和删​​除提要项目不应更改标识符。

我想引入基于光标的分页,以允许客户端通过类似于以下内容的提要进行分页推特的 https://dev.twitter.com/docs/working-with-timelines。似乎没有太多关于它们如何构建的信息,因为我只找到了这个博客文章 http://justcramer.com/2011/03/08/building-cursors-for-the-disqus-api/谈论实施它​​们。但是,如果光标的标识符恰好指向已删除的项目,则似乎存在问题。

有了上面的内容,我怎样才能生成一个可以用作上面的光标的标识符呢?最初,我考虑将时间戳与唯一 id 结合起来:1371813798111111.myuniqueid。但是,如果该项目位于1371813798111111.myuniqueid被删除后,我可以通过以下方式获取项目1371813798111111时间戳,但无法确定我应该从哪个带有该时间戳的项目开始。

我采用的另一种方法是为每个提要结果分配一个递增的数字。由于数字是按顺序递增的,如果数字/id 丢失,我可以选择下一个。然而,这样做的问题是,如果我开始在提要中间删除和添加提要项目,光标 ID 将会发生变化。我解决这个问题的一个解决方案是在每个数字之间留出巨大的间隙,但是很难确定如何以确定的方式将新项目添加到每个数字之间的空间中。此外,随着新项目的添加和空白的填补,我们最终会遇到同样的问题。

简单的说,如果我有一个项目列表,其中可以从列表中的任何位置添加和删除项目,那么为每个列表项目生成 id 的最佳方法是什么,这样如果 id 的项目被删除,我仍然可以确定其位置在列表中?


您需要有额外的(或现有的)列,该列对于目标表中每个新添加的行依次增加。我们称此专栏为seq_id.

当客户端第一次请求游标时:

GET /api/v1/items?sort_by={sortingFieldName}&size={count}

其中 sortingFieldName 是我们应用排序的字段名称

幕后发生了什么:

SELECT * FROM items
WHERE ...            // apply search params
ORDER BY sortingFieldName, seq_id
LIMIT :count

回复:

{
    "data": [...],
    "cursor": {
        "prev_field_name": "{result[0].sortingFieldName}",
        "prev_id": "{result[0].seq_id}",
        "nextFieldName": "{result[count-1].sortingFieldName}",
        "next_id": "{result[count-1].seq_id}",
        "prev_results_link": "/api/v1/items?size={count}&cursor=bw_{prevFieldName}_{prevId}",
        "next_results_link": "/api/v1/items?size={count}&cursor=fw_{nextFieldName}_{nextId}"       
    }
}

如果我们检索的行数少于 count 行,则游标的下一个不会出现在响应中。

如果请求中没有游标或没有要返回的数据,游标的前一部分将不会出现在响应中。

当客户端再次执行请求时 - 他需要使用游标。向前光标:

GET /api/v1/items?size={count}&cursor=fw_{nextFieldName}_{nextId}

幕后发生了什么:

SELECT * FROM items
WHERE ...            // apply search params
AND ((fieldName = :cursor.nextFieldName AND seq_id > :cursor.nextId) OR 
      fieldName > :cursor.nextFieldName)
ORDER BY sortingFieldName, seq_id
LIMIT :count

或向后光标:

GET /api/v1/items?size={count}&cursor=fw_{prevFieldName}_{prevId}

幕后发生了什么:

SELECT * FROM items
WHERE ...            // apply search params
AND ((fieldName = :cursor.prevFieldName AND seq_id < :cursor.prevId) OR 
      fieldName < :cursor.prevFieldName)
ORDER BY sortingFieldName DESC, seq_id DESC
LIMIT :count

响应将与前一个类似

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

构建分页光标 的相关文章

  • Android 分页库不会触发 loadAfter()

    我正在使用新的 Android Paging 库来获取具有无限滚动功能的 RecyclerView 我无法理解为什么当我像这样设置 PagedList 时库不触发 loadAfter 方法 val config PagedList Conf
  • MongoDB:cursor.toArray 返回 Promise { }

    情况 我写了一个查询 var results db collection diseases find ttl txt regex data options i toArray Problem 然后我打印了results到控制台 if res
  • 我需要帮助向 php 实时搜索添加条件

    我刚刚学习 php 最终学习了本教程http www w3schools com php php ajax livesearch asp 到目前为止 我的 PHP 搜索文件看起来与示例中的相同 但我更改了if strlen q gt 0 t
  • Sqlalchemy 不适用于分页

    我对 Flask 和 sqlalchemy 完全陌生 我尝试制作一个网站只是为了更好地了解 Flask 教程有很多 大部分都是使用sqlite 为了我的目的 我使用 postgres 我需要一个可以使用分页的页面 但我一直收到错误 Attr
  • 如何使 T-SQL 游标更快?

    我在 SQL Server 2000 下的存储过程中有一个游标 现在无法更新 它更新所有表 但通常需要几分钟才能完成 我需要让它更快 而 GDEPO 入口仓库 CDEPO 出口仓库 Adet 数量 E CIKAN 已使用的数量 记录说明 2
  • 截断分页中的页数

    这可能是一个非常愚蠢的问题 但我想不出任何可以帮助我走得更远的东西 我希望缩短页面导航中的数字数量 而不是像 1 2 3 4 5 6 7 8 我希望它像 1 2 7 8 当我去2 数字3现在应该可以在数字组中看到 这是我负责页码的代码 di
  • PL/SQL 游标 for 循环

    我相信我需要一个循环游标来浏览表 test data 中的 street1 列 我有一个程序需要测试表中的每一行 这是我到目前为止所拥有的 cursor c1 is street1 from test data Begin If Instr
  • 将分页:限制结果数量

    我正在使用 ruby 的 will paginate gem 我正在使用将分页来获取一群人并在字段上进行排序 我想要的只是其中的前 100 个 本质上都是顶尖人物 我似乎无法做到这一点 我该怎么办呢 谢谢 据我所知 will paginat
  • laravel 在分页中仅显示下一个和上一个链接

    我正在尝试使用 Laravel 分页 我只想显示上一个和下一个链接 而不显示数字 1 2 3 我怎么能那样做呢 我关注了 Laravel 页面 简单分页 如果您在分页视图中仅显示 下一个 和 上一个 链接 则可以选择使用 simplePag
  • Facebook javascript API 中的分页是如何工作的?

    我正在尝试使用 javascript sdk 恢复我的 Facebook 新闻源中上周的帖子 我能够获得第一页 但随后 我不知道如何继续迭代其他页面 我用下面的代码尝试过 loadPosts bind click function FB a
  • Github v3 API 让所有组织超过 100

    我正在尝试让所有组织项目通过 默认大小似乎是 30 而 100 似乎是每个请求的最大限制 但上面的链接仍然只返回前 100 项 即不是第 101 200 项 我也尝试过 http host api v3 organizations page
  • 冷融合和分页

    首先 我对 ColdFusion 很陌生 但学得很快 因此 我正在尝试构建一个大型数据库 最初每页显示 25 行的所有结果 并有一个下一个 上一个链接来浏览页面 这一切都工作正常 但是当我执行搜索时 当新结果显示大约几页时 分页链接不起作用
  • 在 asp.net gridview 中应用引导分页样式的简单脚本

    是否有任何简单的 jquery 脚本 插件可以在 asp net gridview 中应用引导分页样式 我发现了一些关于如何执行此操作的好提示 例如以下链接 here http www programming free com 2013 0
  • 在分页数之间添加点

    我已经用 PHP 和 AJAX 为表格编写了分页代码 每页将显示表格的 8 行 到这里为止一切正常 我现在需要的是使分页看起来像一系列数字和它们之间的点 如下所示 1 2 3 27 28 29 我有两个用于分页的文件 conf php
  • Oracle 12 对 SQL 中的本地集合类型有问题吗?

    长话短说 我建议讨论下面看到的代码 运行时 Oracle 11 编译器引发 PLS 00306 调用 PIPE TABLE 时参数提示的数量或类型错误 PLS 00642 SQL 语句中不允许使用本地集合类型 Oracle 12编译下面的包
  • 迭代 Sqlite-query 中的行

    我有一个表布局 我想用数据库查询的结果填充它 我使用全选 查询返回四行数据 我使用此代码来填充表行内的 TextView Cursor c null c dh getAlternative2 startManagingCursor c th
  • Erlang Mnesia 中的分页搜索

    例如 给定记录 record item id time status 我想搜索 1000 到 1100 个项目 按时间和顺序排序status lt lt finished gt gt 有什么建议么 这取决于您的查询是什么样的 如果您需要按许
  • Python 和 sqlite3.ProgrammingError:不允许递归使用游标

    我写了一个像这样的Python程序 它应该在多线程模式下运行 def Func host cursor db cursor execute SELECT If index Username Version Community Ip traf
  • 如何在没有数据库的情况下创建AJAX分页?

    是否可以在没有 MySQL 帮助的情况下获取 AJAX 分页页面 难道我不能只添加一个包含我需要显示的文本和标记的 PHP 文件 然后通过单击页码将该内容提供给用户吗 那么可以用纯 jQuery 和 PHP 来实现吗 您会使用什么代码方法来
  • Rails 中的字母分页

    我正在寻找 Rails 的宝石用于字母分页 我希望我可以在结果中找到第一个字母的列表 我的意思是 如果没有以 a 开头的行 我不希望 a 显示在分页链接上 这种宝石已经存在了吗 提前致谢 这根本不难创建 例如 如果您有一个find 也许像

随机推荐

  • 加载时时区返回 Uncaught TypeError 的时刻

    我正在努力将 Moment Timezone 实现到 Django 应用程序中 以便纠正从不同时区访问它的用户 并且在通过 Require js 导入文件时遇到错误 moment js moment timezone js 和 moment
  • 如何在 coinbase api 中导入转换?

    目前 Coinbase 支持所谓的 转换 允许从一种货币转换为另一种货币 例如 您可以将部分 BTC 转换为 XRP 在 CSV 中 它们在备注字段中返回买入和卖出金额 笔记 将 0 27235696 BTC 转换为 3 731 32313
  • HTML 名称标签

    是否可以使用标签for元素的属性name代替id 我们的应用程序存在一个错误 两个复选框具有相同的 id 单击一个复选框的标签会检查另一个复选框 由于 HTML 生成逻辑丑陋且复杂 更改 id 会很痛苦 但是 这两个复选框都有唯一的名称属性
  • javascript 中的 Math.random 如何实现随机性?

    javascript 中的 Math random 如何实现随机性 我做了一个可以从大约 50 个不同选项中随机选择的东西 我想知道使用 Math random 来获得随机性应该有多舒服 从规格来看 随机的 返回一个正数数值 符号 大于或等
  • 在容器中心添加面板

    我有一个JPanel这是一个BorderLayout我在顶部和容器中设置了一个新面板 JDesktopPane 位于中心 另一个面板位于底部 现在我想在容器中心动态设置面板 卡片布局 因为我在下面显示层次结构 top gt panel pa
  • jQuery html() 和换行符

    我使用 jQuery 和 Rails 并有以下代码 related html 我在浏览器中遇到问题 只有当部分中没有换行符时 才会替换 lated 元素的内容 这没什么大不了的 我可以将所有内容放在一行上 但这使代码非常难以阅读 有没有办法
  • 使用重命名替换文件名

    我想通过替换从 开始的所有字符后跟八个大写字母来重命名文件名 并仅保留扩展名 4585 10 148 H2A119Ub GTCTGTCA S51 mcdf mdup ngsFlt fm 4585 10 148 H3K27me3 TCTTCA
  • 通过 chrome.runtime.sendMessage 发送带有函数的对象

    我正在开发一个 chrome 扩展 我想用 chrome runtime sendMessage 发送一个对象 带有一些函数 现在做这样的事情 chrome runtime sendMessage something Funny 工作得很好
  • wget 只下载一个 index.html 文件,而不是其他大约 500 个 html 文件

    使用 Wget 我通常只收到一个 index html 文件 我输入以下字符串 wget e robots 关闭 rhttp www korpora org kant aa03 http www korpora org kant aa03
  • 在 maven-plugin-testing-harness 中注入 DefaultRepositorySystem 时出错

    我正在尝试基于现有 2 0 插件创建一个新的 Maven 3 0 3 插件 并促进 aether 获取一些依赖项 我尝试创建一个简单的测试来使用 maven plugin testing harness 版本 2 0 1 加载 mojo 但
  • Chrome 扩展:无法使 chrome.desktopCapture.chooseDesktopMedia 捕获窗口音频

    我正在尝试使用chrome desktopCapture chooseDesktopMediaAPI 用于从扩展窗口捕获音频 我从 popup js 页面发送捕获请求 显现 background scripts background js
  • 哪里与有

    为什么需要放置您自己创建的列 例如select 1 as number after HAVING并不是WHERE在 MySQL 中 不这样做有什么缺点吗WHERE 1 写出整个定义而不是列名 其他关于这个问题的回答都没有说到重点 假设我们有
  • 如何告诉继承类不要调用其基类的无参数构造函数?

    我惊讶地发现我的基类的无参数构造函数在我每次调用时都会被调用any派生类中的构造函数 我以为就是这样 base 是为了 为了明确地如果需要的话 可以调用基本构造函数 当我实例化派生类时 如何防止调用基构造函数 using System na
  • 使用 PHP 在 Mongo DB 文档中添加数据

    我想插入数据Mongo database使用 PHP 脚本 在year明智的文件 使其看起来像这样 所有年份都在一份文件中 cars 2017 car Motorolla color blue 2016 car Toyota color g
  • 自动完成未按预期渲染材质 UI

    我的自动完成组件正在从 API 中提取书籍列表 我将它们呈现为自动完成组件中的选项 并将它们输出为页面底部的列表以进行调试 还从 API 输出 JSON 两个问题似乎是交织在一起的 首先 自动完成选项似乎并不全是渲染 最多有 10 个结果
  • FileNotFoundException(未找到 DLL)

    我在一台客户的机器上遇到了奇怪的错误 它抛出 FileNotFoundException 但该 DLL 肯定就在 Executable 文件夹中 为什么找不到它 请指教 由于您没有包含完整的异常详细信息 心理调试是 32 位与 64 位不匹
  • jQuery 验证文本区域最大长度错误

    我正在使用 jQuery validate v 1 6 0 来验证我的表单 我的数据库字段之一限制为 1000 个字符 我向相应的文本区域添加了验证 如下所示 在我的页面标题中 我添加 form validate validate 在我的页
  • 将 JSON ID 密钥插入 ng-click 指令,然后将其传递到另一个控制器

    应用程序的这一部分显示用户任务的最少信息 当他们单击 查看详细信息 按钮时 他们将进入一个页面 该页面包含有关基于 ID 的特定 CAR 的更多信息 这是一张图片来帮助解释我正在谈论的第一部分 这是我的角度代码 EDIT 添加了 ui ro
  • 如何获取大表的计数?

    样本表 id col1 col2 col3 col4 col5 modifiedTime 1 temp1 temp2 temp3 temp4 temp5 1554459626708 上表有5000万条记录 col1 col2 col3 co
  • 构建分页光标

    我的活动存储在图形数据库中 在某些情况下 多项活动会被分组并聚合为一项活动 处理后的活动源可能如下所示 Activity 1 Activity 2 Grouped Activity Activity 3 Activity 4 Activit