Example #1
0
//根据表达式计算id
set<int> ExprCache::Expr2Ids(string & inputExpr, int actor) {

  //删除空格
  if (inputExpr.find(" ") != inputExpr.npos) {
    MCE_WARN("ExprCache::Expr2Ids --> The expression contains whitespace: " << inputExpr);
    inputExpr.erase(remove(inputExpr.begin(), inputExpr.end(), ' '),
        inputExpr.end());
  }
  set<int> result;
  bool in_cache = false;
  {
    IceUtil::Mutex::Lock lock(mutex_);
    ExprIndex & index = expr_evictor_.get<1> ();
    ExprIndex::iterator eit = index.find(inputExpr);//用表达式来查找
    if (eit != index.end()) {
      in_cache = true;
      SeqIndex::iterator sit = expr_evictor_.project<0> (eit);//转换到顺序排序
      expr_evictor_.relocate(expr_evictor_.get<0> ().begin(), sit);
      ++hit_count_;
      ++find_count_;
      result = (*eit)->ids();
      MCE_DEBUG("ExprCache::Expr2Ids --> this expression = " << inputExpr << " is in expression-cache. ids size = " << result.size() );
    }
    MCE_DEBUG("ExprCache::Expr2Ids --> this expression = " << inputExpr << " is Not in expression-cache");
  }
  if(in_cache && result.size()>0){
   FiltFriend(actor, result);//过滤不接受的id
   return result;
  }


  //cache中没有这个表达式,计算id。
  Parser parser;
  parser.Init(inputExpr);
  vector<FactorPtr> factors = parser.Tokenize(); //解析成Factor
  result = parser.CalculateIds(); //计算表达式

  MCE_DEBUG("ExprCache::Expr2Ids --> After parser.CalculatedIds, the target size = " << result.size());

  //将表达式和因子加入各自的cache
  {
    IceUtil::Mutex::Lock lock(mutex_);
    //判断表达式含有的factor是否全部是user factor
    bool AllU = true;
    for (vector<FactorPtr>::iterator itr = factors.begin(); itr
        != factors.end(); ++itr) {
      if ((*itr)->type() != 'u') {
        AllU = false;
      }
    }
    if (AllU == false) {//不全为user,要cache
      ++expr_total_count;
      ExprEntryPtr exprEntry = new ExprEntry(inputExpr, result); //构造表达式entry
      for (vector<FactorPtr>::iterator itr = factors.begin(); itr
          != factors.end(); ++itr) {
        if ((*itr)->type() != 'u') { //如果不是ufactor,则存入cache
          FactorEntryPtr fp = FactorFactory(*itr);//由factor构造factorEntry,这个factorEntry有可能已经存在
          fp->AddExprEntry(exprEntry);//在factor中加入对应的表达式entry
          exprEntry->AddFactorEntry(fp); //将因子entry的引用加入其属于的表达式entry
        }
      }
      AddExprToEvictor(exprEntry);//将计算的新表达式放入Evictor
      ++find_count_;
    }
  }
  FiltFriend(actor, result);//过滤不接受的id
  return result;
}