Ppchelko has submitted this change and it was merged.
Change subject: Use Map for storing trending information
..
Use Map for storing trending information
It's better suited to this job.
Change-Id: I41f21fb26b96176b05eb196ef7632e4c3d72f1ed
---
M lib/processor.js
1 file changed, 25 insertions(+), 25 deletions(-)
Approvals:
Ppchelko: Looks good to me, approved
jenkins-bot: Verified
diff --git a/lib/processor.js b/lib/processor.js
index 8c7edab..a11e99f 100644
--- a/lib/processor.js
+++ b/lib/processor.js
@@ -1,15 +1,14 @@
"use strict";
// Capture the status of the wiki
-var pages = {};
-var totalPages = 0;
+var pages = new Map();
/**
* Return unsorted array of objects representing edit activity on pages
* @return {Array} of all pages that have been processed
*/
function getPages() {
-return Object.values(pages);
+return Array.from(pages.values());
}
/**
@@ -19,10 +18,7 @@
* @param {Number} id
*/
function remove(id) {
-if (pages[id]) {
-delete pages[id];
-totalPages--;
-}
+pages.delete(id);
}
/**
@@ -37,19 +33,20 @@
var time = date.getTime();
var maxAgeDate = new Date(time - options.max_age * 6);
var maxInactivityDate = new Date(time - options.max_inactivity * 6);
-Object.entries(pages).forEach((entry) => {
-var page = entry[1];
+pages.forEach((page) => {
var timePassed = (date - page.from) / 6;
var speed = timePassed > 0 ? page.edits / timePassed : page.edits;
if (page.updated < maxInactivityDate || page.from < maxAgeDate ||
speed < options.min_speed) {
remove(page.id);
}
});
+
+var size = pages.size;
// Only do this if we have to
-if (totalPages > options.max_pages) {
+if (size > options.max_pages) {
getPages().sort(function(a, b) {
return a.from < b.from ? -1 : 1;
-}).slice(0, totalPages - options.max_pages).forEach(function(page) {
+}).slice(0, size - options.max_pages).forEach(function(page) {
remove(page.id);
});
}
@@ -59,8 +56,7 @@
* Reset all previous processing of edits
*/
function reset() {
-pages = {};
-totalPages = 0;
+pages.clear();
}
/**
@@ -70,6 +66,7 @@
*/
function process(edit) {
var contributors;
+var page;
var id = edit.page_id;
var ts = new Date(edit.rev_timestamp);
var performer = edit.performer;
@@ -79,18 +76,19 @@
if (topic === 'mediawiki.page-delete') {
remove(id);
-} else if (topic === 'mediawiki.page-move' && pages[id]) {
-pages[id].title = edit.page_title;
+} else if (topic === 'mediawiki.page-move' && pages.has(id)) {
+page = pages.get(id);
+page.title = edit.page_title;
// assumption here made that anons cannot move pages so we do not
touch anonEdits
-pages[id].edits -= 1;
+page.edits -= 1;
} else if (topic === 'mediawiki.revision-create' && !edit.page_is_redirect
&&
!performer.user_is_bot && edit.page_namespace === 0) {
-if (pages[id]) {
-pages[id].edits++;
-pages[id].updated = ts;
+if (pages.has(id)) {
+page = pages.get(id);
+page.edits++;
+page.updated = ts;
} else {
-totalPages++;
-pages[id] = {
+page = {
id: id,
isNew: edit.rev_parent_id === undefined,
edits: 1,
@@ -107,9 +105,9 @@
title: edit.page_title
};
}
-contributors = pages[id].contributors;
+contributors = page.contributors;
if (isAnon) {
-pages[id].anonEdits += 1;
+page.anonEdits += 1;
if (!contributors.names[username]) {
contributors.anons++;
}
@@ -125,8 +123,10 @@
if (contributors.names[username].edits >
contributors.names[contributors.main].edits) {
contributors.main = username;
}
-pages[id].bytes = edit.rev_len - pages[id].rev_len;
-pages[id].bias = contributors.names[contributors.main].edits /
pages[id].edits;
+page.bytes = edit.rev_len - page.rev_len;
+page.bias = contributors.names[contributors.main].edits / page.edits;
+// update
+pages.set(id,page);
}
}
--
To view, visit https://gerrit.wikimedia.org/r/323489
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: merged
Gerrit-Change-Id: I41f21fb26b96176b05eb196ef7632e4c3d72f1ed
Gerrit-PatchSet: 6
Gerrit-Project: mediawiki/services/trending-edits
Gerrit-Branch: master
Gerrit-Owner: Jdlrobson
Gerrit-Reviewer: Jdlrobson
Gerrit-Reviewer: Mobrovac
Gerrit-Reviewer: Pmiazga
Gerrit-Reviewer: Ppchelko