#include "optimizelayout.h"
#include "generaldata.h"
#include "readdata.h"
#include <vector>
#include <cassert>
Include dependency graph for optimizelayout.cc:
Go to the source code of this file.
Functions | |
void | optimize_layout (int start_row, set< db_recno_t > &selectedReads, TrapperDoc *pDoc) |
void optimize_layout | ( | int | start_row, | |
set< db_recno_t > & | selectedReads, | |||
TrapperDoc * | pDoc | |||
) |
Definition at line 10 of file optimizelayout.cc.
References sort_struct::begin, GeneralData::copy(), Database::Creator< T >::create(), Database::Creator< T >::data(), sort_struct::end, ReadData::endPos(), sort_struct::ID, ReadData::row(), sort_struct::row, GeneralData::setRecno(), ReadData::setRow(), and ReadData::startPos().
Referenced by TrapperParser::endElement(), OptimizeLayoutAlgo::start(), and TrapperParser::startElement().
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 }