29 #include "SelectedCols.h" 31 SelectedCols::SelectedCols( RDB& rdbtable,
32 const std::vector< std::string >& columns,
33 const std::vector<std::string>& group,
34 const std::vector<std::string>&
override 38 if ( columns.empty() ) {
41 std::vector< std::string > groupies;
42 std::vector< std::string >::const_iterator current_group( group.begin( ) ),
43 end_group( group.end( ) );
44 for ( ; current_group != end_group; ++current_group ) {
46 suplib::tok( groupies, *current_group,
"," );
52 size_t num = rdbtable.nColumns( );
54 for (
size_t ii = 0; ii < num; ii++ ) {
56 std::string name = rdbtable.getColumn( ii )->getName( );
58 if (
true == is_column_numeric( name, rdbtable,
override ) &&
59 false == is_groupie( name, groupies ) )
60 selected_cols.push_back( name );
68 for (
int ii = 0; ii < columns.size( ); ii++ )
69 if (
true == is_column_numeric( columns[ ii ], rdbtable,
override ) )
70 selected_cols.push_back( columns[ ii ] );
74 bool SelectedCols::is_column_numeric(
const std::string& colname,
77 RDBColumn::Type mytype = rdbtable.getColumn( colname )->getType( );
79 if ( RDBColumn::NUMERIC == mytype )
85 bool SelectedCols::is_column_numeric(
const std::string& colname,
87 const std::vector<std::string>&
override ) {
89 bool is_numeric(
false );
91 RDBColumn::Type mytype = rdbtable.getColumn( colname )->getType( );
93 if ( RDBColumn::NUMERIC == mytype )
96 std::vector< std::string >::const_iterator
97 current_override(
override.begin( ) ),
98 end_override(
override.end( ) );
100 for ( ; current_override != end_override; ++current_override ) {
102 std::string str( *current_override );
107 std::vector< std::string > container;
109 suplib::tok( container, str,
"," );
111 if ( 0 == colname.compare( container[ 0 ] ) ) {
113 switch( container.size( ) ) {
121 toggle_column_definition( colname, rdbtable );
122 return is_column_numeric( colname, rdbtable );
129 rdbtable.getColumn( colname )->setDef( container[ 1 ] );
130 return is_column_numeric( colname, rdbtable );
134 throw Exception(
"Too many options for column " + colname );
146 bool SelectedCols::is_groupie(
const std::string& name,
147 const std::vector<std::string>& groupies ) {
149 std::vector< std::string >::const_iterator current_group( groupies.begin( ) ),
150 end_group( groupies.end( ) );
151 for ( ; current_group != end_group; ++current_group )
152 if ( 0 == name.compare( *current_group ) )
159 void SelectedCols::print( std::ostream& os )
const {
161 copy( selected_cols.begin( ), selected_cols.end( ),
162 std::ostream_iterator< std::string >( os,
" " ) );
166 void SelectedCols::toggle_column_definition(
const std::string& colname,
170 RDBColumn::Type mytype = rdbtable.getColumn( colname )->getType( );
171 if ( RDBColumn::NUMERIC == mytype )
172 rdbtable.getColumn( colname )->setDef(
"S" );
174 rdbtable.getColumn( colname )->setDef(
"N" );