From fbd8213a6c3eca6a5c2d7c2bf29be18e85807a7f Mon Sep 17 00:00:00 2001 From: bookug Date: Sun, 18 Sep 2016 20:22:45 +0800 Subject: [PATCH] fix bug in distributed gstore, Join::preFilter --- Database/Join.cpp | 252 +++++++++++----------------------------------- 1 file changed, 58 insertions(+), 194 deletions(-) diff --git a/Database/Join.cpp b/Database/Join.cpp index 8447f86..e18ab93 100644 --- a/Database/Join.cpp +++ b/Database/Join.cpp @@ -2421,205 +2421,69 @@ Join::filterBySatellites(int _var) // //we build a new idlist with all valid ones, and update to the original idlist //(consider in current_table is not good, too many duplicates) - IDList* valid_list = NULL; - int *list = NULL; - int len = 0; - //TODO+BETTER:o2p and s2p may duplicate many times - - if (!in_edge_pre_id.empty()) + vector valid_idlist; + for(int i = 0; i < size; ++i) { - int size2 = in_edge_pre_id.size(); - for (int i = 0; i < size2; ++i) - { - int preid = in_edge_pre_id[i]; - this->kvstore->getobjIDlistBypreID(preid, list, len); - if (i == 0) - { - if (size > len) - { - valid_list = IDList::intersect(cans, list, len); - } - else - { - valid_list = new IDList; - int* list2 = NULL; - int len2 = 0; - for (int j = 0; j < size; ++j) - { - this->kvstore->getpreIDlistByobjID(cans[j], list2, len2); - if (Util::bsearch_int_uporder(preid, list2, len2) != -1) - { - valid_list->addID(cans[j]); - } - delete[] list2; - } - } - } - else - { - if (valid_list->size() > len) - { - valid_list->intersectList(list, len); - } - else - { - int* list2 = NULL; - int len2 = 0; - IDList* new_list = new IDList; - int size3 = valid_list->size(); - for (int j = 0; j < size3; ++j) - { - this->kvstore->getpreIDlistByobjID(valid_list->getID(j), list2, len2); - if (Util::bsearch_int_uporder(preid, list2, len2) != -1) - { - new_list->addID(valid_list->getID(j)); - } - delete[] list2; - } - delete valid_list; - valid_list = new_list; - } - } - delete[] list; - } + int ele = cans[i]; + int* list = NULL; + int list_len = 0; + bool exist_preid = true; + + if(exist_preid && !in_edge_pre_id.empty()) + { + //(this->kvstore)->getpreIDsubIDlistByobjID(entity_id, pair_list, pair_len); + (this->kvstore)->getpreIDlistByobjID(ele, list, list_len); + + for(vector::iterator itr_pre = in_edge_pre_id.begin(); itr_pre != in_edge_pre_id.end(); itr_pre++) + { + int pre_id = (*itr_pre); + //the return value is pos, -1 if not found + if(Util::bsearch_int_uporder(pre_id, list, list_len) == -1) + exist_preid = false; + if(!exist_preid) + { + break; + } + } + delete[] list; + } + + //NOTICE:we do not use intersect here because the case is a little different + //first the pre num is not so much in a query + //second once a pre in query is not found, break directly + + if(exist_preid && !out_edge_pre_id.empty()) + { + //(this->kvstore)->getpreIDobjIDlistBysubID(entity_id, pair_list, pair_len); + (this->kvstore)->getpreIDlistBysubID(ele, list, list_len); + + for(vector::iterator itr_pre = out_edge_pre_id.begin(); itr_pre != out_edge_pre_id.end(); itr_pre++) + { + int pre_id = (*itr_pre); + if(Util::bsearch_int_uporder(pre_id, list, list_len) == -1) + exist_preid = false; + if(!exist_preid) + { + break; + } + } + delete[] list; + } + + //result sequence is illegal when there exists any missing filter predicate id. + if(exist_preid) + { + valid_idlist.push_back(ele); + } } - if (!is_literal_var(_var) && valid_list != NULL && valid_list->empty()) + //this is a core vertex, so if not literal var, exit when empty + if(!is_literal_var(_var) && valid_idlist.empty()) { - //cerr << "quit when empty in edge"<kvstore->getsubIDlistBypreID(preid, list, len); - //cerr<<"p2s len "< len) - { - valid_list = IDList::intersect(cans, list, len); - } - else - { - valid_list = new IDList; - int* list2 = NULL; - int len2 = 0; - for (int j = 0; j < size; ++j) - { - this->kvstore->getpreIDlistBysubID(cans[j], list2, len2); - if (Util::bsearch_int_uporder(preid, list2, len2) != -1) - { - valid_list->addID(cans[j]); - } - delete[] list2; - } - } - } - else - { - if (valid_list->size() > len) - { - valid_list->intersectList(list, len); - } - else - { - int* list2 = NULL; - int len2 = 0; - IDList* new_list = new IDList; - int size3 = valid_list->size(); - for (int j = 0; j < size3; ++j) - { - this->kvstore->getpreIDlistBysubID(valid_list->getID(j), list2, len2); - if (Util::bsearch_int_uporder(preid, list2, len2) != -1) - { - new_list->addID(valid_list->getID(j)); - } - delete[] list2; - } - delete valid_list; - valid_list = new_list; - } - } - delete[] list; - } - } - - if (!is_literal_var(_var) && valid_list->empty()) - { - //cerr << "quit when empty out edge"< valid_idlist; - //for(int i = 0; i < size; ++i) - //{ - // int ele = cans[i]; - // int* list = NULL; - // int list_len = 0; - // bool exist_preid = true; - - // if(exist_preid && !in_edge_pre_id.empty()) - // { - // //(this->kvstore)->getpreIDsubIDlistByobjID(entity_id, pair_list, pair_len); - // (this->kvstore)->getpreIDlistByobjID(ele, list, list_len); - - // for(vector::iterator itr_pre = in_edge_pre_id.begin(); itr_pre != in_edge_pre_id.end(); itr_pre++) - // { - // int pre_id = (*itr_pre); - // //the return value is pos, -1 if not found - // if(Util::bsearch_int_uporder(pre_id, list, list_len) == -1) - // exist_preid = false; - // if(!exist_preid) - // { - // break; - // } - // } - // delete[] list; - // } - - // //NOTICE:we do not use intersect here because the case is a little different - // //first the pre num is not so much in a query - // //second once a pre in query is not found, break directly - - // if(exist_preid && !out_edge_pre_id.empty()) - // { - // //(this->kvstore)->getpreIDobjIDlistBysubID(entity_id, pair_list, pair_len); - // (this->kvstore)->getpreIDlistBysubID(ele, list, list_len); - - // for(vector::iterator itr_pre = out_edge_pre_id.begin(); itr_pre != out_edge_pre_id.end(); itr_pre++) - // { - // int pre_id = (*itr_pre); - // if(Util::bsearch_int_uporder(pre_id, list, list_len) == -1) - // exist_preid = false; - // if(!exist_preid) - // { - // break; - // } - // } - // delete[] list; - // } - - // //result sequence is illegal when there exists any missing filter predicate id. - // if(exist_preid) - // { - // valid_idlist.push_back(ele); - // } - //} - - ////this is a core vertex, so if not literal var, exit when empty - //if(!is_literal_var(_var) && valid_idlist.empty()) - //{ - // return false; - //} - //cans.copy(valid_idlist); + cans.copy(valid_idlist); cerr << "var " << _var << "size after pre_filter " << cans.size() << endl; return true; @@ -3170,4 +3034,4 @@ Join::join(string &internal_tag_str) } return ret; -} \ No newline at end of file +}