]> pilppa.org Git - lib1wire.git/blobdiff - src/DeviceData.cc
Optimization for year and monthly data calculation.
[lib1wire.git] / src / DeviceData.cc
index d47eb005692ef6498ee0159a572bbc4976a00532..c564377a146d747b9c051092e3ef55bae5664fa1 100644 (file)
@@ -4,6 +4,8 @@
  *  Created on: Nov 7, 2010
  *      Author: lamikr
  */
+#include <sstream>
+
 #include <dirent.h>
 #include <malloc.h>
 #include <errno.h>
@@ -22,89 +24,67 @@ using namespace w1;
 using namespace std;
 using namespace plp;
 
+template <class NumberDataType>
+bool string_to_number(NumberDataType& result,
+                 const std::string& string_param,
+                 std::ios_base& (*format)(std::ios_base&))
+{
+       istringstream iss(string_param);
+       return !(iss >> format >> result).fail();
+}
+
 DeviceData::DeviceData(string device_id_param) {
        string  base_dir;
 
-       device_config           = Factory::get_device_config(device_id_param);
-       summary_calc_type       = device_config->get_summary_calculation_type();
-       device_id               = device_id_param;
-       base_dir                = DeviceConfig::get_base_dir_name();
-       device_dir              = W1Util::concat_paths(base_dir, device_id);
-       device_ch_dir           = W1Util::concat_paths(base_dir, "cache");
-       device_ch_dir           = W1Util::concat_paths(device_ch_dir, device_id);
+       device_config   = NULL;
+       device_id       = device_id_param;
+       base_dir        = DeviceConfig::get_base_dir_name();
+       device_dir      = W1Util::concat_paths(base_dir, device_id);
+       device_ch_dir   = W1Util::concat_paths(base_dir, "cache");
+       device_ch_dir   = W1Util::concat_paths(device_ch_dir, device_id);
 }
 
 DeviceData::~DeviceData() {
-       delete(device_config);
+       if (device_config != NULL) {
+               delete(device_config);
+               device_config   = NULL;
+       }
 }
 
-Data *DeviceData::find_oldest_data(vector<string> year_vector) {
-       unsigned int    ii;
-       string          year_dr;
-       string          mon_dr;
-       vector<string>  mon_vcr;
-       vector<string>  dta_vcr;
-       string          f_name;
-       StoreDay        *store;
-       Data            *ret_val;
+Data *DeviceData::find_newest_data(vector<string> year_name_vector_param) {
+       string  year_name;
+       int     size;
+       Data    *ret_val;
+       Date    date;
+       int     val_int;
 
        ret_val = NULL;
-       if (year_vector.size() > 0) {
+       size    = year_name_vector_param.size();
+       if (size > 0) {
                // dirs are alphabetically sorted
-               year_dr = year_vector.at(0);
-               year_dr = W1Util::concat_paths(device_dir, year_dr);
-               mon_vcr = W1Util::get_subdirectories(year_dr);
-               for (ii = 0; ii < mon_vcr.size(); ii++) {
-                       mon_dr  = mon_vcr.at(ii);
-                       mon_dr  = W1Util::concat_paths(year_dr, mon_dr);
-                       // scan data files from month dir
-                       dta_vcr = W1Util::get_data_files(mon_dr);
-                       if (dta_vcr.size() > 0) {
-                               f_name  = dta_vcr.at(0);
-                               f_name  = W1Util::concat_paths(mon_dr, f_name);
-                               store   = new StoreDay(f_name);
-                               ret_val = store->get_oldest_data();
-                               delete(store);
-                               break;
-                       }
-               }
+               year_name       = year_name_vector_param.at(size - 1);
+               string_to_number<int>(val_int, year_name, dec);
+               date.year       = val_int;
+               ret_val         = StoreCache::get_newest_data(&date, device_id, PERIOD_YEARLY);
        }
        return ret_val;
 }
 
-Data *DeviceData::find_newest_data(vector<string> year_vector) {
-       int             ii;
-       string          year_dr;
-       string          mon_dr;
-       vector<string>  mon_vcr;
-       vector<string>  d_vcr;
-       string          f_name;
-       Data            *ret_val;
-       int             size;
-       StoreDay                *store;
+Data *DeviceData::find_oldest_data(vector<string> year_name_vector_param) {
+       int     size;
+       string  year_name;
+       Data    *ret_val;
+       Date    date;
+       int     val_int;
 
        ret_val = NULL;
-       size    = year_vector.size();
+       size    = year_name_vector_param.size();
        if (size > 0) {
                // dirs are alphabetically sorted
-               year_dr = year_vector.at(size - 1);
-               year_dr = W1Util::concat_paths(device_dir, year_dr);
-               mon_vcr = W1Util::get_subdirectories(year_dr);
-               for (ii = mon_vcr.size() - 1; ii >= 0; ii--) {
-                       mon_dr  = mon_vcr.at(ii);
-                       mon_dr  = W1Util::concat_paths(year_dr, mon_dr);
-                       // scan data files from month dir
-                       d_vcr   = W1Util::get_data_files(mon_dr);
-                       size    = d_vcr.size();
-                       if (size > 0) {
-                               f_name  = d_vcr.at(size - 1);
-                               f_name  = W1Util::concat_paths(mon_dr, f_name);
-                               store   = new StoreDay(f_name);
-                               ret_val = store->get_newest_data();
-                               delete(store);
-                               break;
-                       }
-               }
+               year_name       = year_name_vector_param.at(0);
+               string_to_number<int>(val_int, year_name, dec);
+               date.year       = val_int;
+               ret_val         = StoreCache::get_oldest_data(&date, device_id, PERIOD_YEARLY);
        }
        return ret_val;
 }
@@ -212,6 +192,88 @@ DataRange *DeviceData::get_summary(Date *date_param,
        return ret_val;
 }
 
+DataRange *DeviceData::get_yearly_summary(Date *date,
+                               EnumSummaryCalculationType calc_type_param) {
+       return get_summary(date, calc_type_param, PERIOD_YEARLY);
+}
+
+DataRange *DeviceData::get_yearly_summary(Date *date) {
+       DataRange       *ret_val;
+
+       if (device_config == NULL) {
+               device_config           = Factory::get_device_config(device_id);
+               summary_calc_type       = device_config->get_summary_calculation_type();
+       }
+       ret_val = get_yearly_summary(date, summary_calc_type);
+       return ret_val;
+}
+
+DataRange *DeviceData::get_yearly_summary(Date *start_date,
+                                       Date *end_date) {
+       DataRange       *ret_val;
+       DataRange       *data;
+       Date            *date;
+
+       ret_val = NULL;
+       date    = start_date->clone();
+       while(date->before_or_equal_year(end_date)) {
+               data    = get_yearly_summary(date);
+               if (data != NULL) {
+                       if (ret_val == NULL) {
+                               ret_val = new DataRange(data);
+                       }
+                       else {
+                               ret_val->add(data);
+                       }
+                       delete(data);
+               }
+               date->next_year();
+       }
+       delete(date);
+       return ret_val;
+}
+
+DataRange *DeviceData::get_monthly_summary(Date *date,
+                               EnumSummaryCalculationType calc_type_param) {
+       return get_summary(date, calc_type_param, PERIOD_MONTHLY);
+}
+
+DataRange *DeviceData::get_monthly_summary(Date *date) {
+       DataRange       *ret_val;
+
+       if (device_config == NULL) {
+               device_config           = Factory::get_device_config(device_id);
+               summary_calc_type       = device_config->get_summary_calculation_type();
+       }
+       ret_val = get_monthly_summary(date, summary_calc_type);
+       return ret_val;
+}
+
+DataRange *DeviceData::get_monthly_summary(Date *start_date,
+                                       Date *end_date) {
+       DataRange       *ret_val;
+       DataRange       *data;
+       Date            *date;
+
+       ret_val = NULL;
+       date    = start_date->clone();
+       while(date->before_or_equal_month(end_date)) {
+               data    = get_monthly_summary(date);
+               if (data != NULL) {
+                       if (ret_val == NULL) {
+                               ret_val = new DataRange(data);
+                       }
+                       else {
+                               ret_val->add(data);
+                       }
+                       delete(data);
+               }
+               date->next_month();
+       }
+       delete(date);
+       return ret_val;
+}
+
 DataRange *DeviceData::get_daily_summary(Date *date,
                                EnumSummaryCalculationType calc_type_param) {
        return get_summary(date, calc_type_param, PERIOD_DAILY);
@@ -220,6 +282,10 @@ DataRange *DeviceData::get_daily_summary(Date *date,
 DataRange *DeviceData::get_daily_summary(Date *date) {
        DataRange       *ret_val;
 
+       if (device_config == NULL) {
+               device_config           = Factory::get_device_config(device_id);
+               summary_calc_type       = device_config->get_summary_calculation_type();
+       }
        ret_val = get_daily_summary(date, summary_calc_type);
        return ret_val;
 }
@@ -243,7 +309,7 @@ DataRange *DeviceData::get_daily_summary(Date *start_date,
                        }
                        delete(data);
                }
-               date->tomorrow();
+               date->next_day();
        }
        delete(date);
        return ret_val;
@@ -257,6 +323,10 @@ DataRange *DeviceData::get_hourly_summary(Date *date,
 DataRange *DeviceData::get_hourly_summary(Date *date) {
        DataRange       *ret_val;
 
+       if (device_config == NULL) {
+               device_config           = Factory::get_device_config(device_id);
+               summary_calc_type       = device_config->get_summary_calculation_type();
+       }
        ret_val = get_hourly_summary(date, summary_calc_type);
        return ret_val;
 }
@@ -287,7 +357,7 @@ DataRange *DeviceData::get_hourly_summary(Date *start_date,
                                delete(data);
                        }
                }
-               date->tomorrow();
+               date->next_day();
        }
        delete(date);
        return ret_val;
@@ -305,11 +375,11 @@ DataRange *DeviceData::get_data(Date *start_date,
        switch(period) {
                case PERIOD_YEARLY:
                        log_debug("get yearly summary: %s - %s\n", start_date->to_string().c_str(), end_date->to_string().c_str());
-                       ret_val = get_daily_summary(start_date, end_date);
+                       ret_val = get_yearly_summary(start_date, end_date);
                        break;
                case PERIOD_MONTHLY:
                        log_debug("get monthly summary\n");
-                       ret_val = get_daily_summary(start_date, end_date);
+                       ret_val = get_monthly_summary(start_date, end_date);
                        break;
                case PERIOD_DAILY:
                        log_debug("get daily summary\n");