models/stats.js

const Updater = require("../helpers/update");

/**
 * @namespace Stats
 */

/**
 * Finds number users that reviewed something until 2010
 * @function getDatabaseStats
 * @memberof Stats
 * 
 * @param {Object} sessions - Neo4j context session
 * 
 * @return {Object} Object with different statistics (number of users/reviews ...)
 */
exports.getDatabaseStats = (session) => {
  vYears = {};
  return session
    .run('MATCH (u:User)-[v:review]->() WHERE v.year >= 2010 RETURN v.year AS YEAR, count(*) as NB, count(distinct u.id) AS NBU')
    .then(function (result) {
      result.records.forEach(record => {
        y = record.get("YEAR").low;
        vYears[y] = {
          "year": y,
          "users": Updater.formatNumber(record.get("NBU")),
          "?": 0,
          "reviews": Updater.formatNumber(record.get("NB"))
        };
      });
      session.close();
      return vYears;
    })
    .catch(error => {
      console.log("Erreur : " + error);
      return null;
    })
}

/**
 * Finds users that reviews something for a given year and a specific country
 * @function getDatabaseCountryStats
 * @memberof Stats
 * 
 * @param {Object} sessions - Neo4j context session
 * @param {Object} params - Query's parameters
 * @param {Object[]} [vYears] - Found object array to concatenate different year stat 
 * 
 * @return {Object} Object with the year and number of users found
 */
exports.getDatabaseCountryStats = (session, params, vYears) => {
  var vYears = vYears || {};
  return session
    .run('MATCH (u:User)-[v:review]->() WHERE u.country = {COUNTRY} AND v.year >= 2010 RETURN v.year AS YEAR, count(distinct u.id) AS NB', params)
    .then(result =>{
      result.records.forEach(record=>{
        y = record.get("YEAR").low;
        !(y in vYears) && (vYears[y]={})
        vYears[y][params.COUNTRY] = Updater.formatNumber(record.get("NB"));
      })
      session.close();
      return vYears;
    })
    .catch(error => {
      console.log("Erreur : " + error);
      throw {username: 'This field is required.', status: 400};
    })
}

/**
 * Finds users that reviews something for a given year and a specific department
 * @function getDatabaseDepStats
 * @memberof Stats
 * 
 * @param {Object} sessions - Neo4j context session
 * @param {Object} params - Query's parameters
 * @param {Object[]} [vYears] - Found object array to concatenate different year stat 
 * 
 * @return {Object} Object with the year and number of users found
 */
exports.getDatabaseDepStats = (session, params, vYears) => {
  var vYears = vYears || {};
  return session
    .run('MATCH ()-[v:review]->(l:Location{dep:{DEP}}) WHERE v.year >= 2010 RETURN v.year AS YEAR, count(*) AS NB', params)
    .then(result =>{
      result.records.forEach(record=>{
        y = record.get("YEAR").low;
        !(y in vYears) && (vYears[y]={})
        vYears[y][params.DEP] = Updater.formatNumber(record.get("NB"));
      })
      session.close();
      return vYears;
    })
    .catch(error => {
      console.log("Erreur : " + error);
      return null;
    })
}