浏览代码

Add postgres tests to nodejs

Zane Kansil 10 年之前
父节点
当前提交
7f8d6c5c21

+ 21 - 0
frameworks/JavaScript/nodejs/benchmark_config.json

@@ -124,6 +124,27 @@
       "display_name": "nodejs",
       "notes": "",
       "versus": "nodejs"
+    },
+    "postgres": {
+      "setup_file": "setup",
+      "db_url": "/sequelize-pg/db",
+      "query_url": "/sequelize-pg/queries?queries=",
+      "update_url": "/sequelize-pg/updates?queries=",
+      "fortune_url": "/sequelize-pg/fortunes",
+      "port": 8080,
+      "approach": "Realistic",
+      "classification": "Platform",
+      "database": "Postgres",
+      "framework": "nodejs",
+      "language": "JavaScript",
+      "orm": "Full",
+      "platform": "nodejs",
+      "webserver": "None",
+      "os": "Linux",
+      "database_os": "Linux",
+      "display_name": "nodejs",
+      "notes": "",
+      "versus": "nodejs"
     }
   }]
 }

+ 110 - 0
frameworks/JavaScript/nodejs/handlers/sequelize-postgres.js

@@ -0,0 +1,110 @@
+var h = require('../helper');
+var Promise = require('bluebird');
+
+var Sequelize = require('sequelize');
+var sequelize = new Sequelize('hello_world', 'benchmarkdbuser', 'benchmarkdbpass', {
+  host: '127.0.0.1',
+  dialect: 'postgres',
+  logging: false
+});
+
+var Worlds = sequelize.define('World', {
+  id:           { type: 'Sequelize.INTEGER' },
+  randomnumber: { type: 'Sequelize.INTEGER' }
+}, {
+  timestamps: false,
+  freezeTableName: true
+});
+
+var Fortunes = sequelize.define('Fortune', {
+  id:      { type: 'Sequelize.INTEGER' },
+  message: { type: 'Sequelize.STRING' }
+}, {
+  timestamps: false,
+  freezeTableName: true
+});
+
+var randomWorldPromise = function() {
+  return Worlds.findOne({
+    where: { id: h.randomTfbNumber() }
+  }).then(function (results) {
+    return results;
+  }).catch(function (err) {
+    process.exit(1);
+  });
+}
+
+module.exports = {
+
+  SingleQuery: function (req, res) {
+    randomWorldPromise().then(function (world) {
+      h.addTfbHeaders(res, 'json');
+      res.end(JSON.stringify(world));
+    });
+  },
+
+  MultipleQueries: function (queries, req, res) {
+    var worldPromises = [];
+
+    for (var i = 0; i < queries; i++) {
+      worldPromises.push(randomWorldPromise());
+    } 
+
+    Promise.all(worldPromises).then(function (worlds) {
+      h.addTfbHeaders(res, 'json');
+      res.end(JSON.stringify(worlds));
+    });
+  },
+
+  Fortunes: function (req, res) {
+    Fortunes.findAll().then(function (fortunes) {
+      fortunes.push(h.ADDITIONAL_FORTUNE);
+      fortunes.sort(function (a, b) {
+        return a.message.localeCompare(b.message);
+      });
+
+      h.addTfbHeaders(res, 'html');
+      res.end(h.fortunesTemplate({
+        fortunes: fortunes
+      }));
+    }).catch(function (err) {
+      console.log(err.stack);
+      process.exit(1);
+    });
+  },
+
+  Updates: function (queries, req, res) {
+    var worldPromises = [];
+
+    for (var i = 0; i < queries; i++) {
+      worldPromises.push(randomWorldPromise());
+    }
+
+    var worldUpdate = function(world) {
+      world.randomNumber = h.randomTfbNumber();
+
+      return Worlds.update({
+        randomNumber: world.randomNumber
+      },
+      {
+        where: { id: world.id }
+      }).then(function (results) {
+        return world;
+      }).catch(function (err) {
+        process.exit(1);
+      });
+    }
+
+    Promise.all(worldPromises).then(function (worlds) {
+      var updates = worlds.map(function (e) {
+        return worldUpdate(e);
+      });
+
+      Promise.all(updates).then(function (updated) {
+        h.addTfbHeaders(res, 'json');
+        res.end(JSON.stringify(updated));
+      });
+    });
+  }
+
+}

+ 2 - 0
frameworks/JavaScript/nodejs/package.json

@@ -11,6 +11,8 @@
     "mongoose": "4.0.4",
     "mysql": "2.7.0",
     "parseurl": "^1.3.0",
+    "pg": "^4.3.0",
+    "pg-hstore": "^2.3.2",
     "redis": "^0.12.1",
     "sequelize": "3.1.1"
   },

+ 9 - 2
frameworks/JavaScript/nodejs/routing.js

@@ -7,6 +7,7 @@ var MySQLRawHandler = require('./handlers/mysql-raw');
 var MongooseHandler = require('./handlers/mongoose');
 var SequelizeHandler = require('./handlers/sequelize');
 var HiredisHandler = require('./handlers/redis');
+var SequelizePgHandler = require('./handlers/sequelize-postgres');
 
 var h = require('./helper');
 
@@ -30,7 +31,10 @@ module.exports.BasicHandler = (function() {
     '/mysql/fortunes':     MySQLRawHandler.Fortunes,
 
     '/hiredis/db':         HiredisHandler.SingleQuery,
-    '/hiredis/fortunes':   HiredisHandler.Fortunes
+    '/hiredis/fortunes':   HiredisHandler.Fortunes,
+
+    '/sequelize-pg/db':       SequelizePgHandler.SingleQuery,
+    '/sequelize-pg/fortunes': SequelizePgHandler.Fortunes
   }
 
   self.has = function(path) {
@@ -61,7 +65,10 @@ module.exports.QueryHandler = (function () {
     '/mysql/updates':     MySQLRawHandler.Updates,
 
     '/hiredis/queries':   HiredisHandler.MultipleQueries,
-    '/hiredis/updates':   HiredisHandler.Updates
+    '/hiredis/updates':   HiredisHandler.Updates,
+
+    '/sequelize-pg/queries': SequelizePgHandler.MultipleQueries,
+    '/sequelize-pg/updates': SequelizePgHandler.Updates
   }
 
   self.has = function(path) {