//根据表达式计算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; }