JS实现的在线推荐逻辑
import _ from 'lodash';
import cfg from '../cfg/cfg';
import {Response} from '../shared/lib/response';
import {RecDB} from '../lib/mongo.js';
import {timed} from '../utils/metrics';
let config = cfg.recommend.mongo;
// getUserPrefer 获得用户看过和不喜欢看的视频 userprefer
let getUserPrefer = async (opts) => {
opts = opts || {};
let macId = opts.macId;
let resList = [];
// let res = await RecDB.read({
// query: {
// mac: macId
// },
// collection: 'userprefer'
// });
let read = timed('personalRec.readUserPreferVideos', async () => {
let doRead = await RecDB.read({
query: {
mac: macId
},
collection: 'userprefer'
});
return doRead;
});
let res = await read();
_.forEach(res, (val) => {
let notLike = [];
let seen = [];
if (!val.isNotLike) {
notLike = _.split(val.isNotLike, ':');
}
if (!val.isSeen) {
seen = _.split(val.isSeen, ':');
}
resList = _.concat(notLike, seen);
});
return resList;
};
let getUserRecords = async(opts) => {
opts = opts || {};
let macId = opts.macId;
if (!macId) {
return {
total: 0,
data: []
};
}// userrecord
let readRecords = timed('personRec.readRecords', async() => {
let doRead = await RecDB.findOne({
query: {
mac: opts.macId
},
collection: 'temp'
});
return doRead;
});
let res = await readRecords();
let result = res ? res.vv : null;
result = result || [];
let videos = _.map(result, 'id');
return videos;
};
// 获取在线用户推荐数据
let getRealtimeVideos = async(opts) => {
opts = opts || {};
let videoId = opts.videoId;
if (!videoId) {
return {
total: 0,
data: []
};
}
let read = timed('personRec.realtimeVideos', async() => {
let doRead = await RecDB.findOne({
query: {
videoId: opts.videoId,
group: opts.group
},
collection: 'related'
});
return doRead;
});
let res = await read();
res = res ? res.result : null;
//console.log(JSON.stringify(res));
res = res || [];
let videos = _.chain(res)
.forEach((val) => {
val.group = opts.group;
val.type = 'realtime';
})
.value();
return videos;
};
let getPersonalVideos = async (opts) => {
opts = opts || {};
let videos = [];
let page = opts.page;
let pageSize = opts.pageSize;
let userPrefers = await getUserPrefer({macId: opts.macId });
let record = await getUserRecords({macId: opts.macId });
let realtime = [];
for (let video of record) {
//console.log(video)
let append = await getRealtimeVideos({videoId: video, group: 'B' });
console.log(JSON.stringify(append));
realtime = _.concat(realtime, append);
}
userPrefers = _.concat(userPrefers, record);
let real = _.chain(realtime).map((val) => {
let temp = {
id: val.id,
group: val.group,
type: val.type
};
// console.log(JSON.stringify(temp));
return temp;
}).filter(val => !_.includes(userPrefers, val.videoId))
.value();
let group = opts.group || 'a';
// 获取分组对应的 collection
let collectionName = _.get(config.groupMapping, group);
if (!collectionName) {
return {
total: 0,
data: []
};
}
// let res = await RecDB.read({
// query: {
// mac: opts.macId
// },
// collection: collectionName
// });
let readVideos = timed('personalRec.readPersonalVideos', async () => {
let doRead = await RecDB.read({
query: {
mac: opts.macId
},
collection: collectionName
});
return doRead;
});
let res = await readVideos();
_.forEach(res, (doc) => {
_.forEach(_.split(doc.result, ','), (val) => {
let arr = _.split(val, ':');
if (!_.includes(userPrefers, arr[0])) {
let result = {
id: arr[0],
alg: _.concat(arr.slice(1, 4), group).join(':')
};
videos = _.concat(videos, result);
}
});
});
//console.log(JSON.stringify(real));
videos = _.uniq(_.concat(real, videos), 'id');
return {
total: videos.length,
data: videos.slice((page - 1) * pageSize, pageSize)
};
};
let realtimeRecHandler = async (ctx) => {
let query = ctx.query;
// let page = query.page;
let page = parseInt(query.page, 10) || 1;
let pageSize = parseInt(query.pageSize, 10) || 10;
let macId = query.macId;
let group = query.group;
let res = await getPersonalVideos({
page,
pageSize,
macId,
group
});
let pageCount = _.ceil(_.divide(res.total, pageSize));
return new Response({
data: {
page,
pageSize,
pageCount,
macId,
total: res.total,
videos: res.data
}
});
};
export {
realtimeRecHandler,
};
JS实现的在线推荐逻辑的更多相关文章
- 研究分析JS中的三种逻辑语句
JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10; ...
- Js/html格式化在线工具
Js/html格式化在线工具 Js/html格式化在线工具:http://tool.chinaz.com/Tools/jsformat.aspx
- js 动态添加元素 删除元素逻辑
js 动态添加元素 删除元素逻辑 var obox=document.getElementById("box"); oadd.onclick=function(){ var odi ...
- 基于ArcGIS JS API的在线专题地图实现
0 引言 专题地图是突出而深入的表示一种或几种要素或现象,即按照地图主题的要求,集中表示与主题有关内容的地图.专题地图的专题要素多种多样,分类方法也多种多样,根据专题地图表现数据的特点可分为定 ...
- js学习心得之思维逻辑与对象上下文环境(一)
html5 canvas矩形绘制实例(绘图有js 实现) html: <canvas id="myCanvas" width="200" height=& ...
- #js#简单的在线计算器
啊因为懒得去找素材了,所以做了一个仿win10计算器的灰白色计算器. 参考:http://www.html5tricks.com/jquery-calculator.html HTML源码: < ...
- impress.js 一个创建在线幻灯的js库
真的好奇怪,我居然会写前端技术的博客.没有办法的,最近实习,看的大多是前端.所以今天就用这个来练练手了. Impress.js 是一个非常棒的用来创建在线演示的Javascript库.它基于CSS3转 ...
- pdf.js实现图片在线预览
项目需求 前段时间项目中遇到了一个模块,是关于在线预览word文档(PDF文件)的,所以,找了很多插件,例如,pdf.js,pdfobject.js框架,但是pdfobject.js框架对于IE浏览器 ...
- kxbdSuperMarquee.js滚动的神器-推荐
http://code.ciaoca.com/jquery/kxbdmarquee/ 版本:jQuery v1.3.2+ 查看 Demo 下载 jQuery kxbdMarquee 文档目录 使用方法 ...
随机推荐
- C#将XML转换成JSON转换XML
原文:C#将XML转换成JSON转换XML using System; using System.Collections.Generic; using System.Linq; using Syste ...
- android 布局属性大全---初学者必备
Android功能强大,界面华丽,但是众多的布局属性就害苦了开发者,下面这篇文章结合了网上不少资料,花费本人一个下午搞出来的,希望对其他人有用. 第一类:属性值为true或false android: ...
- Hypeiron Planning/Essbase修改规划类型名称
1.修改planning关系库 1.1--修改Plan_type,例如将type_name “Plan1”修改为”Plan1ts”,提交 SELECT * FROM hsp_plan_type FOR ...
- Asp.Net MVC5入门学习
添加一个Controller(控制器) 因为我们用的是Asp.Net MVC,MVC最终还是一套框架,所以我们还是需要遵循它才能玩下去,或者说是更好的利用来便于我们的开发,要是对MVC概念还有点模糊的 ...
- WCF订阅替换轮训
使用WCF订阅替换轮训 之前因为某些特定岗位的人不知道是不方便还是什么的原因,所以随便做了个独立于所有系统之外的邮件审批服务,功能是那些人在邮件里给待审批单据发个“同意”就自动审批通过,大致分为3部分 ...
- Effective C++(15) 在资源管理类中提供对原始资源的访问
问题聚焦: 资源管理类是为了对抗资源泄露. 如果一些函数需要访问原始资源,资源管理类应该怎么做呢? 关于资源管理的概念总是显得那么的高大上,其实只是抽象一点. 下面用 ...
- SPFA和FLOYD算法如何打印路径
早晨碰到了一题挺裸的最短路问题需要打印路径:vijos1635 1.首先说说spfa的方法: 其实自己之前打的最多的spfa是在网格上的那种,也就是二维的 一维的需要邻接表+queue 以及对于que ...
- 业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份
业务类接口在TCP,HTTP,BLL模式下的实例 设计模式混搭 附源码一份 WinForm酒店管理软件--框架这篇随笔可以说是我写的最被大家争议的随笔,一度是支持和反对是一样的多.大家对我做的这个行业 ...
- 7z文件格式及其源码
7z文件格式及其源码的分析(四) 这是7z文件格式及其源码的分析系列的第四篇. 上一篇讲到了7z文件静态结构的尾header部分.这一篇开始,将从7z实际压缩流程开始详细介绍7z文件尾header的详 ...
- iOS UWebView详解
有时在项目中我们需要嵌入一些web相关的内容,这时你就要用到一个叫UIWebView的东西(UIWebView还可以打开一些文件等,如pdf等),在android和iOS中都有这个东西,使用起来也很方 ...