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 > >& ranges, RDB& ordbtable,
bool grouped ) {
52 int status = RDB::REOL;
55 for(
const auto& range : ranges ) {
59 while( line_number < range.first &&
60 RDB::REOF != (status = irdbtable.read( ))
64 if ( status == RDB::REOF )
68 for ( ; line_number <= range.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( );
83 stats_result.calculate_statistics( );
89 void rdbstats( Options& options ) {
100 : RDB( options.input );
108 options.output.empty()
110 : RDB( options.output, std::ios::out );
113 ordbtable.setComment( irdbtable );
118 options.include_exact.clear();
121 options.include_exact,
123 options.exclude_exact,
125 options.group, options.override_defn );
127 const std::vector< std::string >& colnames = selected_cols.get_selected_cols( );
129 if ( colnames.empty() )
130 throw Exception(
"no columns were selected or specified" );
133 bool grouped = ! options.group.empty();
134 for (
const auto& colname : options.group ) {
135 ordbtable.setColumn( irdbtable.getColumn( colname ) );
136 irdbtable.setGroup( colname );
139 Row row( options.rows );
141 if ( ! options.percentiles.empty() ) {
143 switch( options.normalize ) {
144 case Normalize::Average:
146 std::vector< RdbStatsPercentilesAve > rdb_stats_columns;
148 for (
const auto& colname : colnames )
149 rdb_stats_columns.emplace_back( irdbtable, colname, options.percentiles );
150 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ), ordbtable, grouped );
153 case Normalize::Median:
155 std::vector< RdbStatsPercentilesMed > rdb_stats_columns;
156 for (
const auto& colname : colnames )
157 rdb_stats_columns.emplace_back( irdbtable, colname, options.percentiles );
158 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ), ordbtable, grouped );
161 case Normalize::None:
163 std::vector< RdbStatsPercentiles > rdb_stats_columns;
164 for (
const auto& colname : colnames )
165 rdb_stats_columns.emplace_back( irdbtable, colname, options.percentiles );
166 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ), ordbtable, grouped );
173 switch( options.normalize ) {
174 case Normalize::Average:
176 std::vector< RdbStatsAve > rdb_stats_columns;
177 for (
const auto& colname : colnames )
178 rdb_stats_columns.emplace_back( irdbtable, colname );
179 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ), ordbtable, grouped );
182 case Normalize::Median:
184 std::vector< RdbStatsPercentilesMed > rdb_stats_columns;
185 for (
const auto& colname : colnames )
186 rdb_stats_columns.emplace_back( irdbtable, colname );
187 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ), ordbtable, grouped );
190 case Normalize::None:
192 std::vector< RdbStats > rdb_stats_columns;
193 for (
const auto& colname : colnames )
194 rdb_stats_columns.emplace_back( irdbtable, colname );
195 rdbstats( irdbtable, rdb_stats_columns, row.get_range( ), ordbtable, grouped );
202 int main(
int argc,
char* argv[] ) {
205 TraceFct tf( argv[0], 1, -1 );
210 Options options( argc, argv );
212 if ( options.exit_requested )
213 return options.exit_value;
219 }
catch( Exception& E ) {
221 std::cerr << E << std::endl;
224 }
catch( std::exception &e ) {
226 std::cerr << e.what() << std::endl;
231 std::cerr <<
"Unknown exception caught" << std::endl;
A class to figure out the name of the columns for which the statistics are to be calculated.
A container class to hold the relevant data for the rdb data columns.