zoukankan      html  css  js  c++  java
  • 实时推荐部分代码

    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;
    // 获取用户的观看电影的卡片
    let getreadCards = async(opts) => {
      opts = opts || {};
      let id = opts.id;
      if (!id) {
        return {
          total: 0,
          data: []
        };
      }
      let readCards = timed('personRec.readCards', async() => {
        let doRead = await RecDB.findOne({
          query: {
            id: opts.id
          },
          collection: 'label'
        });
        return doRead;
      });
      let res = await readCards();
      let results = res ? res.result : null;
      results = results || [];
      let videos = _.map(results, 'cards');
      return videos;
    };
    // 获取每个卡片对应的电影
    let getRealtimeCardVideos = async(opts) => {
      opts = opts || {};
      let cards = opts.cards;
      if (!cards) {
        return {
          total: 0,
          data: []
        };
      }
      let read = timed('personRec.realtimeCardVideos', async() => {
        let doRead = await RecDB.findOne({
          query: {
            cards: opts.cards
          },
          collection: 'label1'
        });
        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.type = 'realtimeCard';
      })
      .value();
      return videos;
    };
    // 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 getoldRecords = async(opts) => {
      opts = opts || {};
      let macId = opts.macId;
      if (!macId) {
        return {
          total: 0,
          data: []
        };
      }
      // oldrecord
      let readOldRecords = timed('personRec.readOldRecords', async() => {
        let doRead = await RecDB.findOne({
          query: {
            mac: opts.macId
          },
          collection: 'userrecord'
        });
        return doRead;
      });
      let res = await readOldRecords();
      let record = res ? res.result : null;
      record = record || [];
      let videos = _.map(record, '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 page = opts.page;
      let pageSize = opts.pageSize;
      let realtime = [];
      let realtimeCard = [];
      let group = opts.group || config.defaultGroup;
      // console.log(group+'11111');
       // 获取分组对应的 collection
      let collectionName = config.groupMapping[group];
      console.log(collectionName);
      let macId = opts.macId;
      if (!macId || !collectionName) {
        return {
          total: 0,
          data: []
        };
      }
      let readVideos = timed('personalRec.readPersonalVideos', async () => {
        let doRead = await RecDB.read({
          query: {
            mac: macId
          },
          collection: collectionName
        });
        return doRead;
      });
      let [userPrefers, res, record, oldrecord] = await Promise.all([
        getUserPrefer({macId}),
        readVideos(),
        getUserRecords({macId}),
        getoldRecords({macId})
      ]);
      // console.log('----------------');
      // console.log(oldrecord);
      // console.log('----------------');
      // console.log(macId, collectionName, res)
      for (let video of record) {
      // console.log(video)
        let append = await getRealtimeVideos({videoId: video, group: 'B' });
        let appendLabel = await getreadCards({id: video});
        realtimeCard = _.uniq(_.concat(realtimeCard, appendLabel));
        // console.log(JSON.stringify(append));
        realtime = _.concat(realtime, append);
      }
      // 将获取的卡片转换成电影
      let cardVideos = [];
      for (let labe of realtimeCard) {
        let card = await getRealtimeCardVideos({cards: labe});
        cardVideos = _.uniq(_.concat(cardVideos, card), 'id');
      }
      console.log(cardVideos);
      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.id))
      .value();
      // res = res ? res.result : null;
      res = res ? res[0].result : null;
      // console.log(res);
      res = res ? res.split(',') : [];
      let videos = _.chain(res)
      .map((val) => {
        let [id, weight] = val.split(':');
        return {
          id,
          weight,
          group,
          type: 'personal'
        };
      })
    .filter(val => !_.includes(userPrefers, val.id))
    .value();
    
    // console.log(JSON.stringify(real));
    // videos = _.uniq(_.concat(real, videos), 'id');
      videos = _.uniq(_.concat(cardVideos, _.concat(real, videos)), 'id');
      let start = (page - 1) * pageSize;
      let end = page * pageSize;
      let returnVideos = _.slice(videos, start, end);
      return {
        total: videos.length,
        data: returnVideos
      };
    };
    
    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 = Math.ceil(res.total / pageSize);
      return new Response({
        data: {
          page,
          pageSize,
          pageCount,
          macId,
          total: res.total,
          videos: res.data
        }
      });
    };
    
    export {
      realtimeRecHandler,
    };
    

      

  • 相关阅读:
    PointToPointNetDevice doesn't support TapBridgeHelper
    NS3系列—10———NS3 NodeContainer
    NS3系列—9———NS3 IP首部校验和
    NS3系列—8———NS3编译运行
    【习题 7-6 UVA
    【Good Bye 2017 C】 New Year and Curling
    【Good Bye 2017 B】 New Year and Buggy Bot
    【Good Bye 2017 A】New Year and Counting Cards
    【Educational Codeforces Round 35 D】Inversion Counting
    【Educational Codeforces Round 35 C】Two Cakes
  • 原文地址:https://www.cnblogs.com/peizhe123/p/6290958.html
Copyright © 2011-2022 走看看