Проблема со сложным алгоритмом - PullRequest
4 голосов
/ 04 августа 2011

Я в тупике.Мне нужно получить доступ к следующему 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

Сначала я подумал использовать методы Java для получения следующей строки запроса.Это не работает:

  • Rev4 необходимо показать разницу между собственной строкой краткое и последней ревизией, сделанной для краткое ряд;что в данном случае произошло в Rev2 ;поэтому ему нужно прыгнуть на одну строку.
  • Чтобы показать разность для его title строки, Rev4 необходимо перейти к original сообщение после первого изменения в строке title произошло в самой Rev4 .

Некоторые моменты, которые следует учитывать:

  1. схема ревизий - одна строка для каждого отредактированного столбца сообщения;поэтому, если вы загрузите сообщение и отредактируете его title и body , в схеме ревизий будут созданы две записи;один для title и один для body , под тем же revisionGUID .
  2. Запрос сгруппирован по revisionGUID .
  3. Упорядочено по дате ревизии, от самой новой до самой старой;затем по типу ревизии ( title , краткое , body ).

Я отметил это с помощью Java, поскольку ColdFusion позволяет нам использовать методы Java для объектов запросов , но это не задокументировано, поэтому простое знание о его существовании не поможет мне.

Кто-нибудь может показать мне [лучший] способ сделать это?

Структура кода, о которой я подумал:

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

Ответы [ 2 ]

1 голос
/ 05 августа 2011

Как насчет того, чтобы позволить базе данных вам помочь и использовать следующие запросы, чтобы выяснить предыдущие значения ваших полей:

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

Если количество записей равно 0, это означает, что поле никогда не менялось.

1 голос
/ 05 августа 2011

Извините, что я не знаю Coldfusion, но это звучит как прокручиваемый (Java) результат.

со страницы информации о оракуле:

5.1 Прокрутка
Результирующий набор, созданный выполнением оператора, может поддерживать способность двигаться назад (в последнюю очередь) через его содержание, а также вперед (от начала до конца). Наборы результатов, которые поддерживают эта возможность называется прокручиваемыми наборами результатов . Результат устанавливает, что прокручиваемые также поддерживают относительное и абсолютное позиционирование. Абсолютное позиционирование - это способность двигаться прямо в ряд указав его абсолютную позицию в наборе результатов, в то время как относительный позиционирование дает возможность перейти к строке, указав позиция относительно текущей строки. (ссылка: улучшения набора результатов)

И API ResultSet кратко упоминает его вверху:

Объект ResultSet по умолчанию не обновляется и имеет курсор, который движется только вперед. Таким образом, вы можете перебирать его только один раз и только от первого ряда до последнего ряда. Можно изготовить ResultSet объекты, которые можно прокручивать и / или обновлять. Следующие фрагмент кода, в котором con является допустимым объектом Connection, иллюстрирует как сделать набор результатов, который можно прокручивать и нечувствителен к обновлениям другими, и это обновляемо. Смотрите поля ResultSet для других опции.

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

Надеюсь, это поможет вам найти то, что вы ищете =)

...