optimizelayout.cc

Go to the documentation of this file.
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 //   cerr<<"Reading..."<<endl;
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       //New row
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 //   cerr<<"Writing..."<<endl;
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       //No need to do anything
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 }

Generated on Fri Jul 17 20:19:29 2009 for ngsview by  doxygen 1.5.1