本文整理汇总了C++中Relation::addrelation方法的典型用法代码示例。如果您正苦于以下问题:C++ Relation::addrelation方法的具体用法?C++ Relation::addrelation怎么用?C++ Relation::addrelation使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Relation
的用法示例。
在下文中一共展示了Relation::addrelation方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: join
Relation::Atom join(Relation *r1, Relation *r2, std::vector<std::string> list1,
std::vector<std::string> list2){
using namespace std;
int size1 = r1->size();
int size2 = r2->size();
Relation* finalr = new Relation();
vector<string> commonvar;
if (size1 == 0 || size2 == 0){ //TO DO use assert or raise exceptions?
cerr << "No relations yet!" << endl;
} else if (list1.size()!=r1->arity() || list2.size() != r2->arity()){
cerr << "Number of variables don't match arity!" <<endl;
} else {
int arity1 = r1->arity();
int arity2 = r2->arity();
//1. Find common variables
vector<int>::iterator it;
vector<vector<int> > temp = commonOrder(list1,list2);
vector<int> order1 = temp[0];
vector<int> order2 = temp[1];
int ncommonvar = temp[2][0];
//2. Order R and R', such that restrictions to X have same order
r1->sortrelations(order1);
r2->sortrelations(order2);
//r1->write("testoutput1");
//r2->write("testoutput2");
//3. Iterate over R and R', call t and t'
int istart = 0;
int jstart = 0;
int iend = 0;
int jend = 0;
while (istart<size1 && jstart < size2){
//load t and t'
vector<int> v1 = r1->getindex(istart);
vector<int> v2 = r2->getindex(jstart);
int flag = compare_vect(v1, v2, order1, order2, ncommonvar);
switch(flag){
case 0:
//find all i equal v1
iend = istart+1;
while(iend<size1 && compare_vect(v1,
r1->getindex(iend),order1,order1,ncommonvar)==0){
iend++;
}
//find all j equals v2
jend = jstart+1;
while(jend<size2 && compare_vect(v2,
r2->getindex(jend),order2,order2,ncommonvar)==0){
jend++;
}
//for loop over istart, iend, jstart, jend
for (int i = istart; i<iend; i++){
for (int j = jstart; j<jend; j++){
//copy from list 1
vector<int> newrel1(r1->getindex(i));
//add unrepeated from list 2
vector<int> newrel2(r2->getindex(j));
for (int k = 0; k<(order2.size()-ncommonvar);k++){
newrel1.push_back(newrel2[order2[k+ncommonvar]]);
}
//insert into finalr
finalr->addrelation(newrel1);
}
}
//4. Jump to first tuples that disag w t and t'
istart=iend;
jstart=jend;
break;
//projX t =/= projXt' -> if go to t or t' depending if projX t or projXt' is smaller
case 1: //v2 smaller
jstart++;
break;
case -1: //v1 smaller
istart++;
break;
default:
cerr<<"Wrong comparison"<<endl;
}
}
//Return variables and relation
//fill in rest of variables to final string vector to return
commonvar.insert(commonvar.end(),list1.begin(),list1.end());
for (it = order2.begin()+ncommonvar;it != order2.end();++it){
commonvar.push_back(list2[*it]);
}
vector<string>::iterator itstring;
//.........这里部分代码省略.........