зеркало из https://github.com/mozilla/snowl.git
wrap messages from non-stored sources in a collection object that supports filtering constraints
This commit is contained in:
Родитель
a1b13393a9
Коммит
09fcf2a73a
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
};
|
||||
|
|
Загрузка…
Ссылка в новой задаче