vector<row> database::refine(const query &q, const vector<row> &rows) { vector<row> results; for (int i=0;i<rows.size();i++) { if (q.eval(rows[i]) && !rows[i].is_empty()) results.push_back(rows[i]); } return results; }
vector<row> table::select(const query &q) { vector<row> results; row temp_row; // perform key-search if (q.singularity(_key)) { for (int i=0;i<_keys.size();i++) { temp_row.add((*_keys[i].col), _keys[i].data); if (q.partial_eval(_key, temp_row)) { results.push_back(read_row(_keys[i].fpos/_row_size)); //if (results.back().is_empty()) results.pop_back(); if (results.back().is_empty() || !q.eval(results.back())) { results.erase(results.end()-1); } } temp_row.clear(); if (q._limit > -1 && results.size() >= q._limit) break; //results.erase(results.end()-1); } /* for (int i=0;i<results.size();i++) { if (results[i].is_empty() || !q.eval(results[i])) { results.erase(results.begin()+i); --i; } }*/ // truncate results to q._limit /*if (q._limit > -1) while (results.size() > q._limit) { if (results.size() == 0) break; results.erase(results.end()-1); }*/ } // perform full search: else { for (int i=0;i<_row_count;i++) { results.push_back(read_row(i)); if (results.back().is_empty() || !q.eval(results.back())) results.pop_back(); // limit results size to q._limit if (results.size() >= q._limit) break; } } return results; }