spee.ch/server/models/trending.js
2018-12-16 01:27:08 -06:00

98 lines
2.5 KiB
JavaScript

const chainquery = require('chainquery').default;
module.exports = (sequelize, { BOOLEAN, DATE, FLOAT, INTEGER, STRING }) => {
const Trending = sequelize.define(
'Trending',
{
time: { /* TODO: Historical analysis and log roll */
type : DATE(6),
defaultValue: sequelize.NOW,
},
isChannel: {
type : BOOLEAN,
defaultValue: false,
},
claimId: {
type : STRING,
defaultValue: null,
},
publisherId: {
type : STRING,
defaultValue: null,
},
intervalViews: {
type : INTEGER,
defaultValue: 0,
},
weight: {
type : FLOAT,
defaultValue: 0,
},
zScore: {
type : FLOAT,
defaultValue: 0,
},
pValue: {
type : FLOAT,
defaultValue: 0,
},
// TODO: Calculate t-statistics
},
{
freezeTableName: true,
timestamps : false, // don't use default timestamps columns
indexes : [
{
fields: ['claimId'],
},
{
fields: ['time', 'isChannel', 'claimId', 'publisherId', 'weight'],
},
],
}
);
Trending.getTrendingWeightData = async ({
hours = 2,
minutes = 0,
limit = 20,
} = {}) => {
let time = new Date();
time.setHours(time.getHours() - hours);
time.setMinutes(time.getMinutes() - minutes);
const sqlTime = time.toISOString().slice(0, 19).replace('T', ' ');
const selectString = 'DISTINCT(claimId), weight';
const whereString = `isChannel = false and time > '${sqlTime}'`;
const query = `SELECT ${selectString} FROM Trending WHERE ${whereString} ORDER BY weight DESC LIMIT ${limit}`;
return sequelize.query(query, { type: sequelize.QueryTypes.SELECT });
};
Trending.getTrendingClaims = async () => {
const trendingWeightData = await Trending.getTrendingWeightData();
const trendingClaimIds = [];
const trendingClaims = trendingWeightData.reduce((claims, trendingData) => {
trendingClaimIds.push(trendingData.claimId);
claims[trendingData.claimId] = {
...trendingData,
};
return claims;
}, {});
const claimData = await chainquery.claim.findAll({
where: {
claim_id: { [sequelize.Op.in]: trendingClaimIds },
},
});
return claimData.map((claimData) => {
return Object.assign(trendingClaims[claimData.claim_id], claimData.dataValues);
});
};
return Trending;
};