4 * Created on: Nov 7, 2010
16 #include "DataReader.hh"
17 #include "DeviceConfig.hh"
18 #include "FileUtil.hh"
19 #include "StoreDay.hh"
20 #include "StoreCache.hh"
25 template <class NumberDataType>
26 bool string_to_number(NumberDataType& result,
27 const std::string& string_param,
28 std::ios_base& (*format)(std::ios_base&))
30 istringstream iss(string_param);
31 return !(iss >> format >> result).fail();
34 DataReader::DataReader(string device_id_param) {
38 device_id = device_id_param;
39 base_dir = DeviceConfig::get_base_dir_name();
40 device_dir = FileUtil::concat_paths(base_dir, device_id);
41 device_ch_dir = FileUtil::concat_paths(base_dir, "cache");
42 device_ch_dir = FileUtil::concat_paths(device_ch_dir, device_id);
45 DataReader::~DataReader() {
46 if (device_config != NULL) {
47 delete(device_config);
52 Data *DataReader::find_latest_data(vector<string> year_name_vector_param) {
60 size = year_name_vector_param.size();
62 // dirs are alphabetically sorted
63 year_name = year_name_vector_param.at(size - 1);
64 string_to_number<int>(val_int, year_name, dec);
66 ret_val = StoreCache::get_latest_data(&date, device_id, PERIOD_YEARLY);
71 Data *DataReader::get_latest_data() {
72 vector<string> y_list;
76 y_list = FileUtil::get_subdirectories(device_dir);
77 if (y_list.size() > 0) {
78 ret_val = find_latest_data(y_list);
83 Data *DataReader::find_oldest_data(vector<string> year_name_vector_param) {
91 size = year_name_vector_param.size();
93 // dirs are alphabetically sorted
94 year_name = year_name_vector_param.at(0);
95 string_to_number<int>(val_int, year_name, dec);
97 ret_val = StoreCache::get_oldest_data(&date, device_id, PERIOD_YEARLY);
102 DataRange *DataReader::get_data_range() {
104 vector<string> y_list;
109 y_list = FileUtil::get_subdirectories(device_dir);
110 o_data = find_oldest_data(y_list);
111 if (o_data != NULL) {
112 n_data = find_latest_data(y_list);
113 if (n_data != NULL) {
114 ret_val = new DataRange(o_data);
115 ret_val->add(n_data);
123 EnumSummaryPeriod get_period_type(Date *start_date,
126 EnumSummaryPeriod ret_val;
128 ret_val = PERIOD_YEARLY;
129 diff = end_date->year - start_date->year;
131 ret_val = PERIOD_YEARLY;
134 diff = end_date->month - start_date->month;
136 ret_val = PERIOD_MONTHLY;
139 diff = end_date->day - start_date->day;
141 ret_val = PERIOD_DAILY;
144 diff = end_date->hour - start_date->hour;
146 ret_val = PERIOD_HOURLY;
149 diff = end_date->min - start_date->min;
151 ret_val = PERIOD_MINUTELY;
154 ret_val = PERIOD_SECONDLY;
163 DataRange *DataReader::get_summary(Date *date_param,
164 EnumSummaryCalculationType calc_type_param,
165 EnumSummaryPeriod period_type_param) {
170 //store = new StoreDay(device_id, date_param);
171 store = new StoreCache(device_id, date_param);
173 switch(calc_type_param) {
175 ret_val = store->get_sum(period_type_param);
178 ret_val = store->get_delta(period_type_param);
181 ret_val = store->get_max(period_type_param);
184 ret_val = store->get_min(period_type_param);
188 ret_val = store->get_mean(period_type_param);
191 if (ret_val != NULL) {
195 log_error("Could not read data log for device: %s\n", device_id.c_str());
199 log_error("Could not read data log for device: %s\n", device_id.c_str());
205 DataRange *DataReader::get_yearly_summary(Date *date,
206 EnumSummaryCalculationType calc_type_param) {
207 return get_summary(date, calc_type_param, PERIOD_YEARLY);
210 DataRange *DataReader::get_yearly_summary(Date *date) {
213 if (device_config == NULL) {
214 device_config = DeviceConfig::get_device_config(device_id);
215 summary_calc_type = device_config->get_summary_calculation_type();
217 ret_val = get_yearly_summary(date, summary_calc_type);
221 DataRange *DataReader::get_yearly_summary(Date *start_date,
228 date = start_date->clone();
229 while(date->before_or_equal_year(end_date)) {
230 data = get_yearly_summary(date);
232 if (ret_val == NULL) {
233 ret_val = new DataRange(data);
246 DataRange *DataReader::get_monthly_summary(Date *date,
247 EnumSummaryCalculationType calc_type_param) {
248 return get_summary(date, calc_type_param, PERIOD_MONTHLY);
251 DataRange *DataReader::get_monthly_summary(Date *date) {
254 if (device_config == NULL) {
255 device_config = DeviceConfig::get_device_config(device_id);
256 summary_calc_type = device_config->get_summary_calculation_type();
258 ret_val = get_monthly_summary(date, summary_calc_type);
262 DataRange *DataReader::get_monthly_summary(Date *start_date,
269 date = start_date->clone();
270 while(date->before_or_equal_month(end_date)) {
271 data = get_monthly_summary(date);
273 if (ret_val == NULL) {
274 ret_val = new DataRange(data);
288 * Get Daily summary from the latest date
290 DataRange *DataReader::get_daily_summary() {
291 if (device_config == NULL) {
292 device_config = DeviceConfig::get_device_config(device_id);
293 summary_calc_type = device_config->get_summary_calculation_type();
295 return get_daily_summary(summary_calc_type);
299 * Get Daily summary specified by the calc_type from the latest date.
301 DataRange *DataReader::get_daily_summary(EnumSummaryCalculationType calc_type_param) {
307 data = get_latest_data();
309 date = data->get_date();
310 ret_val = get_daily_summary(&date, calc_type_param);
315 DataRange *DataReader::get_daily_summary(Date *date,
316 EnumSummaryCalculationType calc_type_param) {
317 return get_summary(date, calc_type_param, PERIOD_DAILY);
320 DataRange *DataReader::get_daily_summary(Date *date) {
323 if (device_config == NULL) {
324 device_config = DeviceConfig::get_device_config(device_id);
325 summary_calc_type = device_config->get_summary_calculation_type();
327 ret_val = get_daily_summary(date, summary_calc_type);
331 DataRange *DataReader::get_daily_summary(Date *start_date,
338 date = start_date->clone();
339 while(date->before_or_equal_day(end_date)) {
340 data = get_daily_summary(date);
342 if (ret_val == NULL) {
343 ret_val = new DataRange(data);
356 DataRange *DataReader::get_hourly_summary(Date *date,
357 EnumSummaryCalculationType calc_type_param) {
358 return get_summary(date, calc_type_param, PERIOD_HOURLY);
361 DataRange *DataReader::get_hourly_summary(Date *date) {
364 if (device_config == NULL) {
365 device_config = DeviceConfig::get_device_config(device_id);
366 summary_calc_type = device_config->get_summary_calculation_type();
368 ret_val = get_hourly_summary(date, summary_calc_type);
372 DataRange *DataReader::get_hourly_summary(Date *start_date,
382 date = start_date->clone();
383 while(date->before_or_equal_hour(end_date)) {
384 dta_lst = get_hourly_summary(date);
385 cnt = dta_lst->get_count();
386 for(ii = 0; ii < cnt; ii++) {
387 data = dta_lst->get(ii);
389 if (ret_val == NULL) {
390 ret_val = new DataRange(data);
404 DataRange *DataReader::get_data(Date *start_date,
407 EnumSummaryPeriod period;
410 period = get_period_type(start_date, end_date);
413 log_debug("get yearly summary: %s - %s\n", start_date->to_string().c_str(), end_date->to_string().c_str());
414 ret_val = get_yearly_summary(start_date, end_date);
417 log_debug("get monthly summary\n");
418 ret_val = get_monthly_summary(start_date, end_date);
421 log_debug("get daily summary\n");
422 ret_val = get_daily_summary(start_date, end_date);
425 log_debug("get hourly summary\n");
426 ret_val = get_hourly_summary(start_date, end_date);
428 case PERIOD_MINUTELY:
429 log_debug("get minute summary data\n");
431 case PERIOD_SECONDLY:
433 log_debug("get second summary data\n");
439 string DataReader::get_device_id() {
444 * Read device type from the device specific config file
446 string DataReader::get_device_type() {
449 if (device_config == NULL) {
450 device_config = DeviceConfig::get_device_config(device_id);
451 ret_val = device_config->get_cfg_value(DEVICE_CONFIG_VALUE_KEY__TYPE);