有挑战性的算法的问题

时间:2011-08-04 19:59:01

标签: java coldfusion cfquery

我很难过。我需要在查询循环中访问下一个nth row以显示帖子之间的版本差异。

我正在使用<cfquery>按组输出修订版,这是我预期的输出:

Rev4
    diff(rev4.title, original.title)
    diff(rev4.brief, rev2.brief)
Rev3
    diff(rev3.body, rev2.body)
Rev2
    diff(rev2.brief, original.brief)
    diff(rev2.body, original.body)
Original
    query.title
    query.brief
    query.body

我最初想到use Java methods来获取下一个查询行。这不起作用:

  • Rev4 需要显示其自己的简要行与简要行的最新修订版之间的差异;在这种情况下,发生在 Rev2 ;所以它需要跳一行。
  • 为了显示 title 行的差异, Rev4 需要跳转到原始帖子,因为第一次更改为< em> title 行出现在 Rev4 本身。

需要考虑的一些事项:

  1. 每个已编辑的帖子列的修订架构为一行;因此,如果您加载帖子并编辑其标题正文,则会在修订架构中创建两条记录;一个用于标题,另一个用于 body ,位于相同的 revisionGUID 下。
  2. 查询按 revisionGUID 分组。
  3. 按修订日期排序,最新到最旧;然后按修订类型(标题简要正文)。
  4. 我用Java标记了这个,因为ColdFusion允许我们use Java methods on queries objects,但它没有记录,因此只知道它的存在对我没有帮助。

    任何人都可以告诉我[更好]这样做的方法吗?

    我想到的代码结构:

    <cfoutput query="revisions" group="revisionGUID">
        #revision.revisionGUID#
        <cfoutput>
            // conditional logic to get diff();
        <cfoutput>
    </cfoutput>
    

2 个答案:

答案 0 :(得分:1)

很抱歉我不知道Coldfusion,但听起来(Java)可滚动的resultSet可能很有用。

来自oracle信息页面:

  

5.1滚动
  通过执行语句创建的结果集可以   支持通过它向后移动(从最后到第一个)的能力   内容,以及前进(从头到尾)。支持的结果集   此功能称为可滚动结果集。结果设置了   可滚动也支持相对和绝对定位。   绝对定位是指直接移动到行的能力   指定其在结果集中的绝对位置,而相对   定位通过指定a来提供移动到行的能力   相对于当前行的位置。 (link: result set enhancements)

结果集api在顶部简要提到它:

  

默认的ResultSet对象不可更新,并且有一个游标   只向前迈进。因此,您只需迭代一次即可   仅从第一行到最后一行。有可能生产   可滚动和/或可更新的ResultSet对象。下列   代码片段,其中con是有效的Connection对象,说明了   如何创建可滚动且对更新不敏感的结果集   由其他人,这是可更新的。请参阅其他的ResultSet字段   选项。

http://download.oracle.com/javase/1.4.2/docs/api/java/sql/ResultSet.html

希望这可以帮助您找到您要找的东西=)

答案 1 :(得分:1)

如果您让数据库帮助您并使用以下查询来查找字段的先前值,那该怎么样:

SELECT TITLE AS PREVIOUSTITLE
FROM REVISIONS
WHERE ID < #query.id# AND TITLE <> '#query.title#'
ORDER BY ID DESC

SELECT BRIEF AS PREVIOUSBRIEF
FROM REVISIONS
WHERE ID < #query.id# AND BRIEF <> '#query.brief#'
ORDER BY ID DESC

SELECT BODY AS PREVIOUSBODY
FROM REVISIONS
WHERE ID < #query.id# AND BODY <> '#query.body#'
ORDER BY ID DESC

如果recordcount为0,则表示该字段从未更改过。