00001 #include "optimizelayout.h"
00002 #include "generaldata.h"
00003 #include "readdata.h"
00004 #include <vector>
00005 #include <cassert>
00006
00007 using namespace std;
00008
00009
00010 void optimize_layout(int start_row, set< db_recno_t >& selectedReads, TrapperDoc* pDoc)
00011 {
00012 if ( selectedReads.empty()) {
00013 return;
00014 }
00015 cerr<<" Optimizing layout... "<<endl;
00016
00017 int row = start_row;
00018
00019 multiset<sort_struct, compBeg> set_begin;
00020
00021 for (set< db_recno_t >::iterator it = selectedReads.begin(); it != selectedReads.end(); it++ ){
00022
00023 Database::PrimaryIterator<ReadData> read_it(pDoc, "ReadData");
00024 int ret_read = read_it.setFromRecno(*it);
00025 ReadData* r_test = (ret_read != DB_NOTFOUND) ? read_it.answer() : 0;
00026 assert( r_test );
00027 assert( ret_read == 0 );
00028
00029 sort_struct s;
00030 s.begin = r_test->startPos();
00031 s.end = r_test->endPos() + 1;
00032 s.ID = *it;
00033
00034 set_begin.insert(s);
00035
00036 }
00037
00038
00039 multiset<sort_struct, compBeg>::iterator it = set_begin.begin();
00040 sort_struct tmp(*it);
00041 tmp.begin = tmp.end;
00042 vector<sort_struct> row_vec;
00043 row_vec.push_back(tmp);
00044
00045 vector<sort_struct> result_vec;
00046 tmp.row = row;
00047 result_vec.push_back(tmp);
00048 set_begin.erase( set_begin.begin() );
00049
00050 while ( !set_begin.empty() ) {
00051 it = set_begin.lower_bound( row_vec[ row_vec.size() - 1 ] );
00052
00053 if ( it == set_begin.end() ) {
00054
00055
00056 row_vec.clear();
00057 ++row;
00058 it = set_begin.begin();
00059 }
00060
00061 tmp = *it;
00062 tmp.begin = tmp.end;
00063 row_vec.push_back(tmp);
00064
00065 tmp.row = row;
00066 result_vec.push_back(tmp);
00067 set_begin.erase(it);
00068 }
00069
00070
00071 for( size_t i = 0; i < result_vec.size(); i++ ) {
00072 Database::PrimaryIterator<ReadData>* read_it = new Database::PrimaryIterator<ReadData>(pDoc, "ReadData");
00073 int ret_read = read_it->setFromRecno(result_vec[i].ID);
00074 ReadData* r_test = (ret_read != DB_NOTFOUND) ? read_it->answer() : 0;
00075 assert( r_test );
00076 assert( ret_read == 0 );
00077
00078 if ( r_test->row() == result_vec[i].row ) {
00079
00080 delete read_it;
00081 continue;
00082 }
00083
00084 Database::Creator<ReadData> a_creator(pDoc, "ReadData");
00085
00086 a_creator.data()->copy(r_test);
00087 a_creator.data()->setRecno(result_vec[i].ID);
00088 a_creator.data()->setRow(result_vec[i].row);
00089
00090 delete read_it;
00091 a_creator.create(true);
00092
00093 }
00094 cerr<<" Done optimizing layout"<<endl;
00095 }