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#多线程--仓库问题引发的故事
			假设有这么个场景,一个仓库,里面有N件货物,现有六个搬运工(用线程模拟),其中2个向仓库放东西,4个往外搬东西.假设1秒能向里放2件货物,同时可向外搬3件货物(线程休眠),现在需要往里放M件货物,一旦 ... 
- MVC TO LINQ
			// // GET: /Home/ TestTryEntities Db = new TestTryEntities(); public ActionResult Index() { return V ... 
- (翻译) Android Accounts Api使用指南
			本文翻译自Udinic的文章Write your own Android Authenticator,可能需要FQ才能阅读.这是译者目前能找到的介绍如何使用Android的Accounts Api最好 ... 
- jquery选择器之层级过滤选择器
			$("ancestor descendant"):选取parent元素后所有的child元素 $("parent > child"):选取parent元素 ... 
- java 的sigola orm 的开发,第一次学写java,可以用在play上面
			当然还是开源:https://github.com/xiaose1205/sigola 初学者有用,高手可以给点建议,勿喷啊.net转java,有些思想还没有那么快转.希望得到大家的支持啊 使 ... 
- 软件快速开发平台 WebBuilder 6.8
			WebBuilder是一款开源的跨平台.数据库和浏览器的可视化Web应用快速开发平台.WebBuilder使用了多项最新的技术,使Web应用的开发更快捷和简单. 作为一款高效的Web开发工具,WebB ... 
- Go语言Web框架gwk介绍4
			Go语言Web框架gwk介绍 (四) 事件 gwk支持事件系统,但并没有硬编码有哪些事件,而是采用了比较松散的定义方式. 订阅事件有两种方式: 调用On函数或者OnFunc函数 func On(m ... 
- 一步一步深入spring(3)--spring的依赖注入方式
			对于spring配置一个bean时,如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程,sprin ... 
- gsoap:实现线程池处理时获取到客户端的ip
			问题: 在使用线程池处理客户端请求时发现不能获取到客户端的ip! 原因: 由于在server_loop注循环中只把连接字sock加到queue队列中,并没有客户端IP,所以每一次queue回调 ... 
- j2ee面试宝典翻译(1)
			q1:给出一些使用Java的理由? a1:java是一个有趣的编程语言,让我找出一些理由来: 内建的多线程机制.套接字.内存管理(自动垃圾回收) 面向对象 跨平台 通过对标准API的扩展来支持基于we ... 
