wrap messages from non-stored sources in a collection object that supports filtering constraints

This commit is contained in:
Myk Melez 2009-06-18 18:50:24 -07:00
Родитель a1b13393a9
Коммит 09fcf2a73a
2 изменённых файлов: 65 добавлений и 34 удалений

Просмотреть файл

@ -895,44 +895,38 @@ let Sources = {
let source = this._list.selectedItem.source;
this._log.info("selected " + source.name + " with ID " + source.id);
let messages = source.messages;
if (!messages) {
if (source.id) {
let constraints = [];
constraints.push({ name: "source.id",
operator: "==",
value: source.id });
let constraints = [];
// FIXME: use a left join here once the SQLite bug breaking left joins to
// virtual tables has been fixed (i.e. after we upgrade to SQLite 3.5.7+).
// FIXME: reimplement this using the new non-storage-specific collections model.
//if (SnowlMessageView._filter.value) {
// constraints.push({ expression: "messages.id IN (SELECT messageID FROM parts JOIN partsText ON parts.id = partsText.docid WHERE partsText.content MATCH :filter)",
// parameters: { filter: SnowlUtils.appendAsterisks(SnowlMessageView._filter.value) } });
//}
// FIXME: reimplement this using the new non-storage-specific collections model.
//if (SnowlMessageView._periodMenu.selectedItem) {
// constraints.push({ expression: "received >= :startTime AND received < :endTime",
// parameters: { startTime: SnowlMessageView._periodStartTime,
// endTime: SnowlMessageView._periodEndTime } });
//}
// XXX replace this with a SnowlSource::retrieve method that handles
// constraints (and ultimately multiple source IDs)?
messages = new StorageCollection({ constraints: constraints,
constraints.push({ name: "source.id", operator: "==", value: source.id });
// FIXME: use a left join here once the SQLite bug breaking left joins to
// virtual tables has been fixed (i.e. after we upgrade to SQLite 3.5.7+).
// FIXME: reimplement this using the new non-storage-specific collections model.
//if (SnowlMessageView._filter.value) {
// constraints.push({ expression: "messages.id IN (SELECT messageID FROM parts JOIN partsText ON parts.id = partsText.docid WHERE partsText.content MATCH :filter)",
// parameters: { filter: SnowlUtils.appendAsterisks(SnowlMessageView._filter.value) } });
//}
// FIXME: reimplement this using the new non-storage-specific collections model.
//if (SnowlMessageView._periodMenu.selectedItem) {
// constraints.push({ expression: "received >= :startTime AND received < :endTime",
// parameters: { startTime: SnowlMessageView._periodStartTime,
// endTime: SnowlMessageView._periodEndTime } });
//}
let collection;
if (source.id) {
collection = new StorageCollection({ constraints: constraints,
order: "messages.id DESC" });
}
else {
// This source is not stored, but we haven't retrieved its messages yet,
// so retrieve them now.
}
else {
if (!source.messages)
source.refresh();
messages = source.messages;
}
collection = new MessageCollection({ constraints: constraints,
messages: source.messages });
}
SnowlMessageView._collection = messages;
SnowlMessageView._collection = collection;
SnowlMessageView._rebuildView();
},

Просмотреть файл

@ -34,7 +34,7 @@
*
* ***** END LICENSE BLOCK ***** */
let EXPORTED_SYMBOLS = ["StorageCollection"];
let EXPORTED_SYMBOLS = ["StorageCollection", "MessageCollection"];
const Cc = Components.classes;
const Ci = Components.interfaces;
@ -307,3 +307,40 @@ StorageCollection.prototype = {
}
};
function MessageCollection(args) {
// Extract values from arguments and assign them to member properties.
this.constraints = "constraints" in args ? args.constraints : [];
this._messages = "messages" in args ? args.messages : [];
}
MessageCollection.prototype = {
constraints: null,
get _log() {
let log = Log4Moz.repository.getLogger("Snowl.MessageCollection");
this.__defineGetter__("_log", function() log);
return this._log;
},
/**
* An iterator across the messages in the collection. Allows callers
* to iterate messages via |for each... in|, i.e.:
*
* let collection = new MessageCollection();
* for each (let message in collection) ...
*/
__iterator__: function(wantKeys) {
MESSAGES: for each (let message in this._messages) {
for each (let { name: name, operator: operator, value: value } in this.constraints) {
with (message)
if (!eval(name + operator + value))
continue MESSAGES;
}
yield message;
}
}
};