]> pilppa.org Git - lib1wire.git/blobdiff - src/DeviceData.cc
Implemented yearly calculations for min, max, mean, delta and sum
[lib1wire.git] / src / DeviceData.cc
index d13287c3c087796da6a654b7e14090a4071f1211..790bcaef7140cbbc1abf1e186cc81f87ec7dc3a4 100644 (file)
@@ -25,86 +25,111 @@ using namespace plp;
 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;
+Data *DeviceData::find_newest_data(string year_name_param) {
+       int             ii;
        string          mon_dr;
        vector<string>  mon_vcr;
-       vector<string>  dta_vcr;
+       vector<string>  d_vcr;
        string          f_name;
        StoreDay        *store;
        Data            *ret_val;
+       string          year_dr;
+       int             size;
 
        ret_val = NULL;
-       if (year_vector.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_dr = W1Util::concat_paths(device_dir, year_name_param);
+       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;
                }
        }
        return ret_val;
 }
 
-Data *DeviceData::find_newest_data(vector<string> year_vector) {
-       int             ii;
+Data *DeviceData::find_newest_data(vector<string> year_name_vector_param) {
+       string  year_name;
+       int     size;
+       Data    *ret_val;
+
+       ret_val = NULL;
+       size    = year_name_vector_param.size();
+       if (size > 0) {
+               // dirs are alphabetically sorted
+               year_name       = year_name_vector_param.at(size - 1);
+               ret_val         = find_newest_data(year_name);
+       }
+       return ret_val;
+}
+
+Data *DeviceData::find_oldest_data(string year_name_param) {
+       int             size;
+       unsigned int    ii;
        string          year_dr;
        string          mon_dr;
        vector<string>  mon_vcr;
-       vector<string>  d_vcr;
+       vector<string>  dta_vcr;
        string          f_name;
+       StoreDay        *store;
        Data            *ret_val;
-       int             size;
-       StoreDay                *store;
 
        ret_val = NULL;
-       size    = year_vector.size();
+       year_dr = W1Util::concat_paths(device_dir, year_name_param);
+       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);
+               size    = dta_vcr.size();
+               if (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;
+               }
+       }
+       return ret_val;
+}
+
+Data *DeviceData::find_oldest_data(vector<string> year_name_vector_param) {
+       int     size;
+       string  year_name;
+       Data    *ret_val;
+
+       ret_val = NULL;
+       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);
+               ret_val         = find_oldest_data(year_name);
        }
        return ret_val;
 }
@@ -212,6 +237,47 @@ 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);
@@ -220,6 +286,10 @@ DataRange *DeviceData::get_monthly_summary(Date *date,
 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;
 }
@@ -257,6 +327,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;
 }
@@ -294,6 +368,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;
 }
@@ -342,7 +420,7 @@ 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_monthly_summary(start_date, end_date);
+                       ret_val = get_yearly_summary(start_date, end_date);
                        break;
                case PERIOD_MONTHLY:
                        log_debug("get monthly summary\n");