//--------------------------------------------------------------------------- static void readIndex(istream& in,map<Register,unsigned>& index,Attribute::Type type,unsigned cardinality) // Read an index { unsigned count; in.read(reinterpret_cast<char*>(&count),sizeof(count)); if (count!=cardinality) { cerr << "index corruption encountered, reload the database" << endl; throw; } index.clear(); switch (type) { case Attribute::Type::Int: for (unsigned index2=0;index2<count;++index2) { int val; unsigned pos; in.read(reinterpret_cast<char*>(&val),sizeof(val)); in.read(reinterpret_cast<char*>(&pos),sizeof(pos)); Register r; r.setInt(val); index[r]=pos; } break; case Attribute::Type::Double: for (unsigned index2=0;index2<count;++index2) { double val; unsigned pos; in.read(reinterpret_cast<char*>(&val),sizeof(val)); in.read(reinterpret_cast<char*>(&pos),sizeof(pos)); Register r; r.setDouble(val); index[r]=pos; } break; case Attribute::Type::Bool: for (unsigned index2=0;index2<count;++index2) { bool val; unsigned pos; in.read(reinterpret_cast<char*>(&val),sizeof(val)); in.read(reinterpret_cast<char*>(&pos),sizeof(pos)); Register r; r.setBool(val); index[r]=pos; } break; case Attribute::Type::String: for (unsigned index2=0;index2<count;++index2) { unsigned valLen,pos; string val; in.read(reinterpret_cast<char*>(&valLen),sizeof(valLen)); val.resize(valLen); in.read(const_cast<char*>(val.data()),valLen); in.read(reinterpret_cast<char*>(&pos),sizeof(pos)); Register r; r.setString(val); index[r]=pos; } break; } }
//executes query canonically void Executor::execute(query q){ Database db; db.open("data/uni"); if(q.from.size() >= 1){ unordered_map<string, unordered_map<string, const Register*>> registers; unique_ptr<Operator> crossproduct(nullptr); //Make crossproducts int counter = 0; for(auto it = q.from.begin(); it != q.from.end(); ++it) { unique_ptr<Tablescan> tablescan(new Tablescan(db.getTable(it->first))); //Used for constants push down //Get names of all attributes an populate tables vector<string> names = db.getTable(it->first).getAttributeNames(); populateRegisterTable(®isters, *tablescan, &names, it->second); unique_ptr<Operator> selection(move(tablescan)); //Find pushdowns and execute them for(auto it2 = q.where.begin(); it2 != q.where.end(); it2++){ if((*it2).r_attr.first == "" && (*it2).l_attr.first == it->second){ //See if bindings are the same Register* registertmp = new Register(); //tmpp int attrIndex = db.getTable(it->first).findAttribute((*it2).l_attr.second); if(attrIndex < 0){ throw "NO EXISTENT ATTRIBUTE"; } const Attribute& attr = db.getTable(it->first).getAttribute(attrIndex); Attribute::Type attr_type = attr.getType(); string name = attr.getName(); //Check type for attribute if(attr_type == Attribute::Type::Int) { int tmp; size_t end; tmp = stoi((*it2).r_attr.second, &end); registertmp->setInt(tmp); } else if(attr_type == Attribute::Type::Double) { int tmp; size_t end; tmp = stod((*it2).r_attr.second, &end); registertmp->setInt(tmp); } else if(attr_type == Attribute::Type::Bool) { //TODO } else { registertmp->setString((*it2).r_attr.second); } unique_ptr<Operator> seltmp(new Selection(move(selection), registers[it->second][(*it2).l_attr.second] ,registertmp )); //tmp selection.swap(seltmp); } } if(crossproduct == nullptr){ crossproduct.swap(selection); } else{ unique_ptr<Operator> dummy(new CrossProduct(move(selection), move(crossproduct))); crossproduct.swap(dummy); } } //Find join conditions and execute them for(auto it2 = q.where.begin(); it2 != q.where.end(); it2++){ if((*it2).r_attr.first != ""){ //See if bindings are the string rightTable; string leftTable; for(auto it3 = q.from.begin(); it3 != q.from.end(); ++it3 ){ if(it3->second == (*it2).r_attr.first) { rightTable = it3->second; } else if(it3->second == (*it2).l_attr.first) { leftTable = it3->second; } } unique_ptr<Operator> seltmp(new Selection(move(crossproduct), registers[leftTable][(*it2).l_attr.second] ,registers[rightTable][(*it2).r_attr.second] )); //tmp crossproduct.swap(seltmp); } } //Print the names of the students Printer out(move(crossproduct)); out.open(); while (out.next()); out.close(); } }