jenkins-bot has submitted this change and it was merged.

Change subject: Cache db query results for 5 minutes
......................................................................


Cache db query results for 5 minutes

TODO: sync auto-refresh interval with cache duration

Change-Id: I7565c5ef21659bcaa63b61603117cae285fd273d
---
M defaults.js
M node_modules
M routes/data.js
M src/components/boards/bigEnglish/bigEnglishBoard.js
4 files changed, 43 insertions(+), 12 deletions(-)

Approvals:
  Awight: Looks good to me, approved
  jenkins-bot: Verified



diff --git a/defaults.js b/defaults.js
index 016acde..4c93e6b 100644
--- a/defaults.js
+++ b/defaults.js
@@ -12,5 +12,6 @@
     // given in providerBackendURL.  This can be useful for SSL behind 
firewalls
     consumerKey:  'kKq6LbU4ctDUzubSUdHJ7Pn9NvVWwQ2f',
     consumerSecret: 'JfGs4nnfyoRQ9i9JQeTYP7geCEKQrenX',
-    sessionSecret: 'ds87naowiy3icaywri73tcin7eyyeI8634I71NYFIEA764'
+    sessionSecret: 'ds87naowiy3icaywri73tcin7eyyeI8634I71NYFIEA764',
+    cacheDuration: 300000 // 5 min in ms
 };
diff --git a/node_modules b/node_modules
index 9f71c38..f7d9d58 160000
--- a/node_modules
+++ b/node_modules
-Subproject commit 9f71c38597921daa0b926f4044f5a49a1a13e56a
+Subproject commit f7d9d58629d35f63eb5a4a8380fa246475be8340
diff --git a/routes/data.js b/routes/data.js
index 423a3b0..a063c94 100644
--- a/routes/data.js
+++ b/routes/data.js
@@ -2,7 +2,11 @@
        odataParser = require( 'odata-parser' ),
        mysql = require ( 'mysql'),
        config = require( '../config.js' ),
-       util = require( 'util');
+       util = require( 'util'),
+       cache = require( 'memory-cache' ),
+       urlParser = require( 'url' ),
+       querystringParser = require( 'querystring' ),
+       logger = require( '../logger.js' );
 
 /**
  * Throws an error if an value is invalid for the given column
@@ -168,7 +172,8 @@
 
 module.exports = function(req, res) {
        var widget = widgets[req.params.widget],
-               qs = require( 'url' ).parse(req.url).query,
+               qs = urlParser.parse( req.url ).query,
+               parsedQs = querystringParser.parse( qs ),
                connection,
                sqlQuery = '',
                parsedFilters,
@@ -177,7 +182,9 @@
                values = [],
                joins = [],
                joinClause = '',
-               i;
+               i,
+               result,
+               cacheKey;
 
        if ( !config.debug &&
                        ( !req.session || !req.session.passport || 
!req.session.passport.user )
@@ -191,6 +198,19 @@
                return;
        }
 
+       cacheKey = '/data/' + req.params.widget;
+       if ( parsedQs.$filter ) {
+               cacheKey += '-' + parsedQs.$filter;
+       }
+
+       if ( !parsedQs.cache || parsedQs.cache === 'false' ) {
+               result = cache.get( cacheKey );
+               if ( result ) {
+                       logger.debug( 'Serving results from cache key ' + 
cacheKey );
+                       res.json( result );
+                       return;
+               }
+       }
        sqlQuery = widget.query;
        if ( widget.defaultFilter || ( qs && qs !== '' ) ) {
                try {
@@ -229,11 +249,14 @@
                        return;
                }
        });
-       connection.query( sqlQuery, values, function( error, results ) {
+       connection.query( sqlQuery, values, function( error, dbResults ) {
                if ( error ) {
                        res.json( { error: 'Query error: ' + error } );
                        return;
                }
-               res.json( { results: results, sqlQuery: sqlQuery } );
+               result = { results: dbResults, sqlQuery: sqlQuery };
+               logger.debug( 'Storing results at cache key ' + cacheKey );
+               cache.put( req.url, result, config.cacheDuration );
+               res.json( result );
        });
 };
diff --git a/src/components/boards/bigEnglish/bigEnglishBoard.js 
b/src/components/boards/bigEnglish/bigEnglishBoard.js
index 9c0b106..114b6b7 100644
--- a/src/components/boards/bigEnglish/bigEnglishBoard.js
+++ b/src/components/boards/bigEnglish/bigEnglishBoard.js
@@ -83,16 +83,23 @@
                        self.raised(runningTotal);
                };
 
-               // Reload the data
-               self.reloadBigEnglish = function(){
-                       $.get( '/data/big-english' , function ( dataget ) {
+               // Reload the data.  For the automatic reload, we're fine 
getting
+               // something from the cache.
+               self.reloadBigEnglish = function( automatic ){
+                       var url = '/data/big-english';
+                       if ( !automatic ) {
+                               url += '/?cache=false';
+                       }
+                       $.get( url , function ( dataget ) {
                                self.loadData( dataget.results );
                        });
+                       // Do it every 5 minutes as well
+                       setTimeout( function () {
+                               self.reloadBigEnglish( true );
+                       }, 300000 );
                };
-               // Do it every 5 minutes as well
-               setTimeout(self.reloadBigEnglish, 300000);
 
-               self.reloadBigEnglish();
+               self.reloadBigEnglish( true );
     }
 
     return { viewModel: BigEnglishBoardViewModel, template: template };

-- 
To view, visit https://gerrit.wikimedia.org/r/177455
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: merged
Gerrit-Change-Id: I7565c5ef21659bcaa63b61603117cae285fd273d
Gerrit-PatchSet: 2
Gerrit-Project: wikimedia/fundraising/dash
Gerrit-Branch: master
Gerrit-Owner: Ejegg <[email protected]>
Gerrit-Reviewer: Awight <[email protected]>
Gerrit-Reviewer: Ejegg <[email protected]>
Gerrit-Reviewer: Reedy <[email protected]>
Gerrit-Reviewer: jenkins-bot <>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to