#include "query.h" #include using namespace std; WhereClause::WhereClause(void):col(0){} WhereClause::WhereClause(const int _c,const RowItem &_v):col(_c),value(_v){} QueryResult::QueryResult(void):res(0){} QueryResult::QueryResult(int _res):res(_res){} QueryResult::QueryResult(int _res,const vector &_rows):res(_res),rows(_rows){} Query::Query(void):limit(-1){} QueryResult Query::execute(const map &tables){return QueryResult(-1);} FindQuery::FindQuery(void):sort(0){}; QueryResult FindQuery::execute(const map &tables){ if(limit==0)return QueryResult(0); int i,j; /*for(i=0;i<(int)tables.size();i++){ if(tables[i].name==from)break; } if(i==(int)tables.size())return QueryResult(0); const Table &table=tables[i];*/ const map::const_iterator tit=tables.find(from); if(tit==tables.cend())return QueryResult(0); const Table &table=tit->second; for(i=0;i<(int)where.size();i++){ if(where[i].col==0)break; } if(i!=(int)where.size()){ const map::const_iterator rit=table.rows.find(serialise(table.header[0],where[i].value)); if(rit==table.rows.cend())return QueryResult(0); const Row &row=rit->second; for(j=0;j<(int)where.size();j++){ if(j==i)continue; const int col=where[j].col; if(riCompare(table.header[col],row.items[col],where[j].value)!=0)break; } if(j!=(int)where.size())return QueryResult(0); else return QueryResult(1,{row}); } typedef map::const_iterator cit_t; cit_t end=table.rows.cend(); QueryResult ret; for(cit_t it=table.rows.cbegin();it!=end;it++){ //if(serialise(it->second.table->header[0],it->second.items[0])==key) // ret.emplace_back(it->second); for(i=0;i<(int)where.size();i++){ const int col=where[i].col; if(riCompare(table.header[col],it->second.items[col],where[i].value)!=0)break; } if(i==(int)where.size()){ ret.res++; ret.rows.emplace_back(it->second); } } return ret; }