29 #include <rdbxx/RDB.h> 30 #include <Exception/Exception.h> 34 #include "RdbStatsAve.h" 35 #include "RdbStatsPercentiles.h" 36 #include "RdbStatsPercentilesAve.h" 37 #include "RdbStatsPercentilesMed.h" 39 #include "SelectedCols.h" 40 #include "StatsResult.h" 47 void rdbstats( RDB& irdbtable, Type& rdb_stats_columns,
48 const std::vector< std::pair< long, long > >& range, RDB& ordbtable,
bool grouped ) {
52 size_t mysize = range.size( );
53 int status = RDB::REOF;
55 for (
int ii = 0, line_number = 1; ii < mysize; ++ii, ++line_number ) {
59 for ( ; line_number < range[ ii ].first; ++line_number ) {
60 if ( RDB::REOF == (status = irdbtable.read( )) ) {
61 stats_result.calculate_statistics( );
68 for ( ; line_number <= range[ ii ].second; ++line_number ) {
69 if ( RDB::REOF == (status = irdbtable.read( )) ) {
71 stats_result.calculate_statistics( );
75 stats_result.update_statistics( );
77 if ( RDB::REOG & status )
78 stats_result.calculate_statistics( );
87 void rdbstats( Options& options ) {
98 : RDB( options.input );
106 options.output.empty()
108 : RDB( options.output );
111 ordbtable.setComment( irdbtable );
116 options.columns.clear();
118 SelectedCols selected_cols( irdbtable, options.columns, options.group, options.override );
120 const std::vector< std::string >& col_name = selected_cols.get_selected_cols( );
122 if ( col_name.empty() )
126 bool grouped =
false;
127 std::vector< std::string >::const_iterator current_group( options.group.begin( ) ),
128 end_group( options.group.end( ) );
129 for ( ; current_group != end_group; ++current_group ) {
131 std::vector< std::string > groupies;
132 suplib::tok( groupies, *current_group,
"," );
134 for (
unsigned int ii = 0; ii < groupies.size( ); ii++ ) {
135 ordbtable.setColumn( irdbtable.getColumn( groupies[ ii ] ) );
136 irdbtable.setGroup( groupies[ ii ] );
141 Row row( options.rows );
144 if ( ! options.percentiles.empty() ) {
146 std::string percentiles( options.percentiles );
151 bool iq = options.quartiles;
153 switch( options.normalize ) {
154 case Normalize::Average:
156 std::vector< RdbStatsPercentilesAve > rdb_stats_columns;
158 for (
unsigned int ii = 0; ii < col_name.size( ); ii++ )
163 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
164 ordbtable, grouped );
167 case Normalize::Median:
169 std::vector< RdbStatsPercentilesMed > rdb_stats_columns;
170 for (
unsigned int ii = 0; ii < col_name.size( ); ii++ )
175 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
176 ordbtable, grouped );
179 case Normalize::None:
181 std::vector< RdbStatsPercentiles > rdb_stats_columns;
182 for (
int ii = 0; ii < col_name.size( ); ii++ )
187 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
188 ordbtable, grouped );
193 }
else if ( options.quartiles ) {
195 switch( options.normalize ) {
196 case Normalize::Average:
198 std::vector< RdbStatsPercentilesAve > rdb_stats_columns;
199 for (
unsigned int ii = 0; ii < col_name.size( ); ii++ )
203 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
204 ordbtable, grouped );
207 case Normalize::Median:
209 std::vector< RdbStatsPercentilesMed > rdb_stats_columns;
210 for (
unsigned int ii = 0; ii < col_name.size( ); ii++ )
214 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
215 ordbtable, grouped );
218 case Normalize::None:
220 std::vector< RdbStatsPercentiles > rdb_stats_columns;
221 for (
unsigned int ii = 0; ii < col_name.size( ); ii++ )
225 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
226 ordbtable, grouped );
233 switch( options.normalize ) {
234 case Normalize::Average:
236 std::vector< RdbStatsAve > rdb_stats_columns;
238 for (
unsigned int ii = 0; ii < col_name.size( ); ii++ )
239 rdb_stats_columns.push_back(
RdbStatsAve( irdbtable,
241 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
242 ordbtable, grouped );
245 case Normalize::Median:
248 std::vector< RdbStatsPercentilesMed > rdb_stats_columns;
249 for (
unsigned int ii = 0; ii < col_name.size( ); ii++ )
253 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
254 ordbtable, grouped );
257 case Normalize::None:
259 std::vector< RdbStats > rdb_stats_columns;
260 for (
unsigned int ii = 0; ii < col_name.size( ); ii++ )
261 rdb_stats_columns.push_back(
RdbStats( irdbtable, col_name[ ii ]
263 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ),
264 ordbtable, grouped );
272 int main(
int argc,
char* argv[] ) {
275 TraceFct tf( argv[0], 1, -1 );
280 Options options( argc, argv );
282 if ( options.exit_requested )
283 return options.exit_value;
289 }
catch( Exception& E ) {
291 std::cerr << E << std::endl;
294 }
catch( std::exception &e ) {
296 std::cerr << e.what() << std::endl;
301 std::cerr <<
"Unknown exception caught" << std::endl;
The base class to calculate : average, maximum, minimum, num, stddev and sum.
A class to calculate the percentiles, RdbStatsPercentilesAve isA special case of the class RdbStatsPe...
A class to figure out the name of the columns for which the statistics are to be calculated.
To normalize the results wrt to the average.
A class to calculate the percentiles, RdbStatsPercentiles isA special case of the class RdbStats.
A container class to hold the relevant data for the rdb data columns.
A class to calculate the percentiles, RdbStatsPercentilesMed isA special case of the class RdbStatsPe...