Home || Architecture || Video Search || Visual Search || Scripts || Applications || Important Messages || OGL || Src

TableDataSourceCombinedViews.h

Go to the documentation of this file.
00001 #ifndef MediaTable_TableDataSourceCombinedViews_h
00002 #define MediaTable_TableDataSourceCombinedViews_h
00003 
00004 #include "TableDataSource.h"
00005 #include "TableDataView.h"
00006 
00007 namespace Impala {
00008 namespace Application {
00009 namespace MediaTable {
00010 
00011 class TableDataSourceCombinedViews : public TableDataSource, public TableDataViewListener
00012 {
00013 public:
00014 
00015     TableDataSourceCombinedViews() : TableDataSource()
00016     {
00017         Init();
00018     }
00019 
00020     ~TableDataSourceCombinedViews()
00021     {
00022     }
00023 
00024         std::vector<TableColumn*> GetColumns(bool StaticColumns=true, bool ExtraColumns=false)
00025     {
00026                 // TODO: mColumns sorts the columns alphabetically. Maybe loop over mTableViews?
00027                 std::vector<TableColumn*> columns;
00028                 std::set<std::string> columnNames;
00029 
00030                 for (std::vector<TableDataView*>::iterator it=mTableDataViews.begin(); it != mTableDataViews.end(); ++it)
00031                 {
00032                         std::vector<TableColumn*> viewColumns = (*it)->GetColumns(StaticColumns, ExtraColumns);
00033                         for (std::vector<TableColumn*>::iterator iter=viewColumns.begin(); iter!=viewColumns.end(); ++iter)
00034                         {
00035                                 if(columnNames.insert((*iter)->GetName()).second) // Column name is not a duplicate
00036                                         columns.push_back(*iter);
00037                         }
00038                 }
00039                 return columns;
00040     }
00041 
00042         TableColumn* GetColumn(std::string column) {
00043             return mColumns[column]->GetColumn(column);
00044         }
00045 
00046     int GetTotalRows() {
00047         // Returns number of rows if all are equal otherwise return zero
00048         std::vector<TableDataView*>::iterator   mTableDataViewsIterator;
00049 
00050         uint rows = -1;
00051         for(mTableDataViewsIterator = mTableDataViews.begin();
00052                         mTableDataViewsIterator != mTableDataViews.end(); ++mTableDataViewsIterator) {
00053                                 if(rows = -1) rows = (*mTableDataViewsIterator)->GetTotalRows();
00054                 if(rows != (*mTableDataViewsIterator)->GetTotalRows()) rows = 0;
00055                         }
00056 
00057         if(rows == -1) rows = 0;
00058         return rows;
00059     }
00060 
00061     /* get individual row characteristics ************************/
00062     String GetTextDataByID(String column, int row)
00063     {
00064         return mColumns[column]->GetSortedTextData(column, row);
00065     }
00066 
00067     int GetIntDataByID(String column, int row)
00068     {
00069         return mColumns[column]->GetSortedIntData(column, row);
00070     }
00071 
00072     double GetDoubleDataByID(String column, int row)
00073     {
00074         return mColumns[column]->GetSortedDoubleData(column, row);
00075     }
00076 
00077     double GetNormalizedDataByID(String column, int row)
00078     {
00079         return mColumns[column]->GetSortedNormalizedData(column, row);
00080     }
00081 
00082     Array2dVec3UInt8* GetImageDataByID(String column, int row)
00083     {
00084         return mColumns[column]->GetSortedImageData(column, row);
00085     }
00086 
00087     Array2dVec3UInt8* GetVideoDataByID(String column, int row)
00088     {
00089                 if(column == "")
00090                         return 0;
00091         return mColumns[column]->GetSortedVideoData(column, row);
00092     }
00093 
00094     unsigned long long GetQuidByID(String column, int row) {
00095         return mColumns[column]->GetSortedQuid(column, row);
00096     }
00097 
00098     bool AddTableDataView(TableDataView* view, std::string column = "") {
00099         if (column == "") {
00100                 if(mColumn == "") {
00101                         ILOG_WARN("No column provided in AddTableDataView.")
00102                         return false;
00103                 }
00104                 column = mColumn;
00105         }
00106 
00107         view->SetSortColumn(column);
00108         if(mTableDataViews.size() > 0) {
00109                 if(GetTotalRows() == 0) {
00110                         ILOG_WARN("Existing TableDataView has 0 rows.")
00111                         return false;
00112                 }
00113                 if(GetTotalRows() != view->GetTotalRows()) {
00114                         ILOG_WARN("GetTotalRows() does not match with existing TableDataView ("
00115                                           << GetTotalRows() << " != " << view->GetTotalRows() << ").");
00116                         return false;
00117                 }
00118                 for(int i=0; i < GetTotalRows(); i++) {
00119                         // Check values here for each view
00120                         // if type== TYPE_INT
00121                 }
00122         } else {
00123                 mColumn = column;
00124         }
00125 
00126         mTableDataViews.push_back(view);
00127         view->AddTableDataViewListener(this);
00128 
00129         std::vector<TableColumn*> columns = view->GetColumns(true, true);
00130         for(std::vector<TableColumn*>::iterator columnIterator = columns.begin();
00131                         columnIterator != columns.end(); ++columnIterator)
00132                                 mColumns.insert(make_pair((*columnIterator)->GetName(), view));
00133 
00134         /*// Merge marks:
00135         for(std::vector<TableDataView*>::iterator it = mTableDataViews.begin();
00136                                 it != mTableDataViews.end(); it++) {
00137                 map<int, int> markedRowsMap = (*it)->GetMarkedRowsMap();
00138                 for(std::map<int, int>::iterator markIter = markedRowsMap.begin(); markIter != markedRowsMap.end(); markIter++) {
00139                         int sortedrow = (*it)->GetRowForID(markIter->first);
00140                         SetMark(sortedrow, GetMark(sortedrow) | markIter->second);
00141                 }
00142         }*/
00143 
00144         return true;
00145     }
00146 
00147 private:
00148 
00149     void Init()
00150     {
00151     }
00152 
00153     void UpdateRowsEvent()
00154     {
00155         // Can invalidate TableDataSourceCombinedViews
00156         DoUpdateRowsEvent();
00157     }
00158     void UpdateNumberOfRowsEvent()
00159     {
00160         // Can invalidate TableDataSourceCombinedViews
00161         DoUpdateNumberOfRowsEvent();
00162     }
00163 
00164     std::vector<TableDataView*>                         mTableDataViews;
00165     std::map<std::string, TableDataView*>       mColumns;
00166     std::string                                                         mColumn;
00167 
00168     ILOG_VAR_DEC;
00169 };
00170 
00171 ILOG_VAR_INIT(TableDataSourceCombinedViews, Application.MediaTable);
00172 
00173 } // namespace MediaTable
00174 } // namespace Application
00175 } // namespace Impala
00176 
00177 #endif // TableDataSourceCombinedViews_h

Generated on Fri Mar 19 09:30:34 2010 for ImpalaSrc by  doxygen 1.5.1