2018-10-24 10:43:30 +02:00
|
|
|
const chainquery = require('chainquery');
|
|
|
|
|
|
|
|
module.exports = (sequelize, { BOOLEAN, DATE, FLOAT, INTEGER, STRING }) => {
|
|
|
|
const Trending = sequelize.define(
|
|
|
|
'Trending',
|
|
|
|
{
|
|
|
|
time: { /* TODO: Historical analysis and log roll */
|
2018-11-11 01:11:12 +01:00
|
|
|
type : DATE(6),
|
2018-10-24 10:43:30 +02:00
|
|
|
defaultValue: sequelize.NOW,
|
|
|
|
},
|
|
|
|
isChannel: {
|
2018-11-11 01:11:12 +01:00
|
|
|
type : BOOLEAN,
|
2018-10-24 10:43:30 +02:00
|
|
|
defaultValue: false,
|
|
|
|
},
|
|
|
|
claimId: {
|
2018-11-11 01:11:12 +01:00
|
|
|
type : STRING,
|
2018-10-24 10:43:30 +02:00
|
|
|
defaultValue: null,
|
|
|
|
},
|
|
|
|
publisherId: {
|
2018-11-11 01:11:12 +01:00
|
|
|
type : STRING,
|
2018-10-24 10:43:30 +02:00
|
|
|
defaultValue: null,
|
|
|
|
},
|
|
|
|
intervalViews: {
|
2018-11-11 01:11:12 +01:00
|
|
|
type : INTEGER,
|
2018-10-24 10:43:30 +02:00
|
|
|
defaultValue: 0,
|
|
|
|
},
|
|
|
|
weight: {
|
2018-11-11 01:11:12 +01:00
|
|
|
type : FLOAT,
|
2018-10-24 10:43:30 +02:00
|
|
|
defaultValue: 0,
|
|
|
|
},
|
|
|
|
zScore: {
|
2018-11-11 01:11:12 +01:00
|
|
|
type : FLOAT,
|
2018-10-24 10:43:30 +02:00
|
|
|
defaultValue: 0,
|
|
|
|
},
|
|
|
|
pValue: {
|
2018-11-11 01:11:12 +01:00
|
|
|
type : FLOAT,
|
2018-10-24 10:43:30 +02:00
|
|
|
defaultValue: 0,
|
|
|
|
},
|
|
|
|
// TODO: Calculate t-statistics
|
|
|
|
},
|
|
|
|
{
|
|
|
|
freezeTableName: true,
|
2018-11-11 01:11:12 +01:00
|
|
|
timestamps : false, // don't use default timestamps columns
|
|
|
|
indexes : [
|
2018-10-24 10:43:30 +02:00
|
|
|
{
|
|
|
|
fields: ['claimId'],
|
|
|
|
},
|
|
|
|
{
|
|
|
|
fields: ['time', 'isChannel', 'claimId', 'publisherId', 'weight'],
|
|
|
|
},
|
|
|
|
],
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
Trending.getTrendingWeightData = async ({
|
|
|
|
hours = 2,
|
|
|
|
minutes = 0,
|
2018-11-11 01:11:12 +01:00
|
|
|
limit = 20,
|
2018-10-24 10:43:30 +02:00
|
|
|
} = {}) => {
|
|
|
|
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}'`;
|
2018-11-11 01:11:12 +01:00
|
|
|
const query = `SELECT ${selectString} FROM Trending WHERE ${whereString} ORDER BY weight DESC LIMIT ${limit}`;
|
2018-10-24 10:43:30 +02:00
|
|
|
|
2018-11-11 01:32:43 +01:00
|
|
|
return sequelize.query(query, { type: sequelize.QueryTypes.SELECT });
|
2018-10-24 10:43:30 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
Trending.getTrendingClaims = async () => {
|
|
|
|
const trendingWeightData = await Trending.getTrendingWeightData();
|
|
|
|
|
|
|
|
const trendingClaimIds = [];
|
|
|
|
const trendingClaims = trendingWeightData.reduce((claims, trendingData) => {
|
|
|
|
trendingClaimIds.push(trendingData.claimId);
|
|
|
|
claims[trendingData.claimId] = {
|
2018-11-11 01:11:12 +01:00
|
|
|
...trendingData,
|
2018-10-24 10:43:30 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
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;
|
|
|
|
};
|