Как я могу сравнить структурные данные в двух упорядоченных массивах? - PullRequest
0 голосов
/ 27 мая 2011

У меня интересная проблема. Я создаю систему ревизий для моего приложения. Это работает так, что каждый раз, когда создается новый объект post, объект post пытается создать запись истории для каждого из его атрибутов, которые изменились.

Так, если post.subject был отредактирован, новая запись ревизии создается в таблице истории. Он будет хранить только новый текст темы (а также связанный пост и пользователя, который его сделал). Если изменено более одного атрибута, они передаются в массиве, и каждый атрибут будет храниться в отдельной записи, сгруппированной по UUID.

Чтобы сократить избыточные записи, объект истории попытается найти любые существующие ревизии и обновить их if the existing revisions are younger than a certain time limit. Таким образом, мы можем сохранить изменения, внесенные за короткий промежуток времени в той же ревизии. Если они не моложе, то создаются новые ревизии.

Сценарий:

  1. Пользователь Foo меняет тему сообщения (создается ревизия темы).
  2. Пользователь Foo возвращается и меняет тело и тему (существующая ревизия субъекта обновляется; создается новая ревизия тела). Обе версии должны иметь одинаковый UUID.

Каждый объект записи имеет три атрибута subject, body, footer. Я уже выполнил простую часть: создавал новые ревизии, если их не было, зацикливая массив аргументов, содержащий данные ревизии.

// Find existing revisions younger than some time value
local.revisions = this.findAll(where="rules go here", returnAs="struct");

// If no revisions are found create new ones
if (! arrayLen(local.revisions))
{
    // Create UUID to group revisions
    local.revisionGUID = createUUID();

    // loop over the arguments array (contains revision data) and create new revisions
    for (local.i in arguments.data)
        local.history = this.new(properties=local.i, revisionGUID=local.revisionGUID);
        local.histroy.save();
}

// If some revision data does exist, update existing ones, and create the new ones; the UUID for new revisions should use the UUID of existing revisions
else
{
   logic goes here
}

Теперь о сложной части. Если массив ревизий возвращается, мне нужно сделать следующее:

  1. Сравните его с массивом в области args.
  2. Для каждой ревизии в области args, которая не существует в существующем массиве ревизий, мне нужно его создать. Для ревизии в области аргументов args, которая существует (имеется в виду, что у нее есть совпадающая ревизия в соответствии с возрастным пределом), мне нужно обновить ее данные данными соответствующей ревизии в области args.

Это не может быть так просто, как arrayContains (), потому что данные, хранящиеся в массивах, являются структурами ... Я не знаю, как сравнивать массивы, содержащие структуры!

Вопрос:

  1. Правильно ли я подхожу к проблеме?
  2. Какие методы доступны мне для выполнения функций, упомянутых выше?

1 Ответ

1 голос
/ 27 мая 2011

Предупреждение: Это очень экспериментально ...

<cfset x1 = {a=1,b=2}>
<cfset x2 = {b=2,a=1}>

<cfdump var="#x1.hashCode()#">
<cfdump var="#x2.hashCode()#">

Они возвращают одно и то же значение. Так что вы можете, если хотите, использовать hashCode() для сравнения структур с использованием базового метода Java public int hashCode() из java.lang.Object

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...