vector<pair<ClauseType,int>> Optimizer::optimize(QueryData qd){ vector<pair<ClauseType,int>> tempSequence = qd.GetClauseSequence(); vector<SuchThatClause> tempSuchThats = qd.GetSuchThats(); vector<PatternClause> tempPatterns = qd.GetPatterns(); vector<WithClause> tempWiths = qd.GetWiths(); vector<pair<pair<ClauseType,int>,int>> weightMap; for(vector<pair<ClauseType,int>>::iterator iter=tempSequence.begin();iter!=tempSequence.end();++iter) { switch((*iter).first){ case SUCHTHAT:{ int weight = weightSuchThat(tempSuchThats[(*iter).second]); weightMap.push_back(pair<pair<ClauseType,int>,int>((*iter),weight)); break; } case WITH:{ int weight = weightWith(tempWiths[(*iter).second]); weightMap.push_back(pair<pair<ClauseType,int>,int>((*iter),weight)); break; } case PATTERN:{ int weight = weightPattern(tempPatterns[(*iter).second]); weightMap.push_back(pair<pair<ClauseType,int>,int>((*iter),weight)); break; } default:{ cout << "wrong clausetype./n"; break; } } } sort(weightMap.begin(), weightMap.end(), strict_weak_ordering); vector<pair<ClauseType,int>> finalSequence; for(vector<pair<pair<ClauseType,int>,int>>::iterator iter=weightMap.begin();iter!=weightMap.end();++iter) { cout << (*iter).first.second; finalSequence.push_back((*iter).first); } return finalSequence; }