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实现的在线推荐逻辑的更多相关文章

  1. 研究分析JS中的三种逻辑语句

    JS中的三种逻辑语句:顺序.分支和循环语句. 一.顺序语句 代码规范如下:1. <script type="text/javascript"> var a = 10;  ...

  2. Js/html格式化在线工具

    Js/html格式化在线工具 Js/html格式化在线工具:http://tool.chinaz.com/Tools/jsformat.aspx

  3. js 动态添加元素 删除元素逻辑

    js 动态添加元素 删除元素逻辑 var obox=document.getElementById("box"); oadd.onclick=function(){ var odi ...

  4. 基于ArcGIS JS API的在线专题地图实现

    0 引言     专题地图是突出而深入的表示一种或几种要素或现象,即按照地图主题的要求,集中表示与主题有关内容的地图.专题地图的专题要素多种多样,分类方法也多种多样,根据专题地图表现数据的特点可分为定 ...

  5. js学习心得之思维逻辑与对象上下文环境(一)

    html5 canvas矩形绘制实例(绘图有js 实现) html: <canvas id="myCanvas" width="200" height=& ...

  6. #js#简单的在线计算器

    啊因为懒得去找素材了,所以做了一个仿win10计算器的灰白色计算器. 参考:http://www.html5tricks.com/jquery-calculator.html HTML源码: < ...

  7. impress.js 一个创建在线幻灯的js库

    真的好奇怪,我居然会写前端技术的博客.没有办法的,最近实习,看的大多是前端.所以今天就用这个来练练手了. Impress.js 是一个非常棒的用来创建在线演示的Javascript库.它基于CSS3转 ...

  8. pdf.js实现图片在线预览

    项目需求 前段时间项目中遇到了一个模块,是关于在线预览word文档(PDF文件)的,所以,找了很多插件,例如,pdf.js,pdfobject.js框架,但是pdfobject.js框架对于IE浏览器 ...

  9. kxbdSuperMarquee.js滚动的神器-推荐

    http://code.ciaoca.com/jquery/kxbdmarquee/ 版本:jQuery v1.3.2+ 查看 Demo 下载 jQuery kxbdMarquee 文档目录 使用方法 ...

随机推荐

  1. 实例学习SSIS(四)--使用日志记录和错误流重定向

    原文:实例学习SSIS(四)--使用日志记录和错误流重定向 导读: 实例学习SSIS(一)--制作一个简单的ETL包 实例学习SSIS(二)--使用迭代 实例学习SSIS(三)--使用包配置 实例学习 ...

  2. RMAN duplicate from active 时遭遇 ORA-17627 ORA-12154

    最近在从活动数据库进行异机克隆时碰到了ORA-17629,ORA-17627,ORA-12154的错误,起初以为是一个Bug呢.Oracle Bug着实太多了,已经成了习惯性思维了.汗!错误提示是无法 ...

  3. 大量Javascript/JQuery学习教程电子书合集

    [推荐分享]大量Javascript/JQuery学习教程电子书合集,送给有需要的人   不收藏是你的错^_^. 经证实,均可免费下载. 资源名称 资源大小   15天学会jQuery(完整版).pd ...

  4. Html 导航

    首页,来一个比较简单的例子热热身,相信有点css基础的人都可以看懂的.自所以,写一些教程,或许这样的教程已经泛滥啦,但是,还是想理理自己的思想来帮助自己及引导初学者更好的理解css. 1.竖直排列导航 ...

  5. [转]iOS IPC via NSFileCoordinator and NSFilePresenter

    Source:http://mjtsai.com/blog/2014/11/21/ios-ipc-via-nsfilecoordinator-and-nsfilepresenter/ 为什么每次我想到 ...

  6. [转]How to create an anonymous IDA PRO database (.IDB)

    Source: http://www.0xebfe.net/blog/2013/01/13/how-to-create-an-anonymous-ida-pro-database-dot-idb/ P ...

  7. C++指针数组和指向指针的指针

    指针数组 定义: 如果一个 数组,其元素均为指针型数据,该数组为指针数组,也就是说,指针数组中的每一个元素相当于一个指针变量,它的值都是地址. 形式: 一维指针数组的定义形式为: int[类型名] * ...

  8. 对 Linux 新手有用的 20 个命令

    你打算从Windows换到Linux上来,还是你刚好换到Linux上来?哎哟!!!我说什么呢,是什么原因你就出现在我的世界里了.从我以往的经验来说,当我刚使用Linux,命令,终端啊什么的,吓了我一跳 ...

  9. IE回车的怪异行为

    问题 IE浏览器在input中回车,会触发button按钮的click事件. 原因分析 IE浏览器中在input中回车相当于提交form,而button标签默认的类型是submit, 所以如果没有指定 ...

  10. Objective-C Blocks测试题与解析

    Objective-C Blocks测试 你真的理解blocks在objective-c中是如何工作的了吗,做个测试检验一下吧. 所有的测试结果已被以下版本的LLVM验证: Apple clang v ...