use index for sorting

This commit is contained in:
Andris Reinman 2017-04-04 13:30:38 +03:00
parent 3ad81e4fa9
commit e42a128ee6
4 changed files with 32 additions and 29 deletions

28
api.js
View file

@ -732,9 +732,10 @@ server.get('/mailbox/:id', (req, res, next) => {
mailbox: mailbox._id
};
let reverse = false;
let sort = {
uid: -1
};
let sort = [
['mailbox', 1],
['uid', -1]
];
if (req.params.before) {
query.uid = {
@ -744,9 +745,10 @@ server.get('/mailbox/:id', (req, res, next) => {
query.uid = {
$gt: after
};
sort = {
uid: 1
};
sort = [
['mailbox', 1],
['uid', 1]
];
reverse = true;
}
@ -756,9 +758,10 @@ server.get('/mailbox/:id', (req, res, next) => {
fields: {
uid: true
},
sort: {
uid: -1
}
sort: [
['mailbox', 1],
['uid', -1]
]
}, (err, entry) => {
if (err) {
res.json({
@ -790,9 +793,10 @@ server.get('/mailbox/:id', (req, res, next) => {
fields: {
uid: true
},
sort: {
uid: 1
}
sort: [
['mailbox', 1],
['uid', 1]
]
}, (err, entry) => {
if (err) {
res.json({

View file

@ -319,6 +319,7 @@ server.onOpen = function (path, session, callback) {
}).project({
uid: true
}).sort([
['mailbox', 1],
['uid', 1]
]).toArray((err, messages) => {
if (err) {
@ -476,6 +477,7 @@ server.onStore = function (path, update, session, callback) {
uid: true,
flags: true
}).sort([
['mailbox', 1],
['uid', 1]
]);
@ -661,6 +663,7 @@ server.onExpunge = function (path, update, session, callback) {
uid: true,
size: true
}).sort([
['mailbox', 1],
['uid', 1]
]);
@ -781,6 +784,7 @@ server.onCopy = function (path, update, session, callback) {
$in: update.messages
}
}).sort([
['mailbox', 1],
['uid', 1]
]); // no projection as we need to copy the entire message
@ -925,6 +929,7 @@ server.onMove = function (path, update, session, callback) {
}).project({
uid: 1
}).sort([
['mailbox', 1],
['uid', 1]
]);
@ -1064,6 +1069,7 @@ server.onFetch = function (path, options, session, callback) {
}
let cursor = db.database.collection('messages').find(query).project(projection).sort([
['mailbox', 1],
['uid', 1]
]);
@ -1429,6 +1435,7 @@ server.onSearch = function (path, options, session, callback) {
let cursor = db.database.collection('messages').find(query).
project(projection).
sort([
['mailbox', 1],
['uid', 1]
]);

View file

@ -279,12 +279,12 @@ class ImapNotifier extends EventEmitter {
modseq: {
$gt: modifyIndex
}
}).sort({
modseq: 1
}).toArray(callback);
}).sort([
['mailbox', 1],
['modseq', 1]
]).toArray(callback);
});
}
}
module.exports = ImapNotifier;

View file

@ -122,8 +122,7 @@ class MessageHandler {
_id: mailbox.user
}, {
$inc: {
storageUsed: size,
messages: 1
storageUsed: size
}
}, err => {
if (err) {
@ -136,8 +135,7 @@ class MessageHandler {
_id: mailbox.user
}, {
$inc: {
storageUsed: -size,
messages: -1
storageUsed: -size
}
}, () => {
this.redlock.releaseLock(lock, () => callback(err));
@ -253,24 +251,19 @@ class MessageHandler {
updateQuota(mailbox, inc, callback) {
inc = inc || {};
if (!inc.messages) {
return callback();
}
this.database.collection('mailboxes').findOneAndUpdate({
_id: mailbox._id
}, {
$inc: {
storageUsed: Number(inc.storageUsed) || 0,
messages: Number(inc.messages) || 0
storageUsed: Number(inc.storageUsed) || 0
}
}, () => {
this.database.collection('users').findOneAndUpdate({
_id: mailbox.user
}, {
$inc: {
storageUsed: Number(inc.storageUsed) || 0,
messages: Number(inc.messages) || 0
storageUsed: Number(inc.storageUsed) || 0
}
}, callback);
});
@ -305,8 +298,7 @@ class MessageHandler {
}
this.updateQuota(mailbox, {
storageUsed: -message.size,
messages: -1
storageUsed: -message.size
}, () => {
// remove link to message from attachments (if any exist)
this.database.collection('attachments.files').updateMany({