Skip to content
Snippets Groups Projects
model.py 4.18 KiB
from statistics import Statistics
from utils import Utils as ut

class Model:
    """Internal data representation and processing."""
    def __init__(self):
        self._stats = Statistics(None)
        self._data_source = None
        self._multi_data_shadow = {}  # dict because fast and indexing
        self._multi_data_source = {}
        self._data_shadow = None
        self._analysis_results = {}
        self._multi_results = {}
        self._save_pref = None
        self._id = "" # this is a string

    @property
    def multi_results(self):
        return self._multi_results

    @multi_results.setter
    def multi_results(self, results):
        self._multi_results = results

    @property
    def analysis_results(self):
        return self._analysis_results

    @analysis_results.setter
    def analysis_results(self, results):
        self._analysis_results = results

    @property
    def data_shadow(self):
        return self._data_shadow

    @data_shadow.setter
    def data_shadow(self, data):
        self._data_shadow = data

    @property
    def multi_data_shadow(self):
        return self._multi_data_shadow

    @multi_data_shadow.setter
    def multi_data_shadow(self, data):
        self._multi_data_shadow = data

    @property
    def id(self):
        return self._id

    @id.setter # TODO: DO we still use this? As far as I have seen, we do not. Also, change name of id here.
    def id(self, id):
        self._id = id

    @property
    def save_pref(self):
        return self._save_pref

    @save_pref.setter
    def save_pref(self, save_pref_code):
        self._save_pref = save_pref_code

    @property
    def data_source(self):
        return self._data_source

    @data_source.setter
    def data_source(self, data):
        self._data_source = data

    @property
    def multi_data_source(self):
        return self._multi_data_source

    @multi_data_source.setter
    def multi_data_source(self, data):
        self._multi_data_source = data

    def has_source(self):
        """Check whether self._data_source has a value."""
        return self._data_source is not None \
            or self._multi_data_source is not None

    def has_shadow(self):
        """Check whether self._data_shadow has a value."""
        return self._data_shadow is not None  \
            or self._multi_data_shadow is not None

    def analysis_complete(self):
        """Check whether self._analysis_results has a value."""
        return self._analysis_results or self._multi_results

    def get_multi_data(self, data_type): #TODO: Why do we have this as well when you can also just get multi_data_source itself?
        """Get data according to type

        Args:
            data_type: the type of data to get (either source or shadow)
        """
        if data_type == "source":
            return self._multi_data_source
        else:
            return self._multi_data_shadow

    def compare(self):
        """"Run the analyses and saves the results."""
        if self.has_source() and self.has_shadow():
            if self._multi_data_shadow and not self._multi_data_source:
                for key, data in self._multi_data_shadow.items():
                    if self._id is ut.filter_key(key):
                        result = self._stats.analyze(self._data_source, data)
                        ut.add_to_dict(key+"_res", result, self._multi_results)
                    else:
                        pass
            elif self._multi_data_shadow and self._multi_data_source:

                for key, source in self._multi_data_source.items():
                    for key2, shadow in self._multi_data_shadow.items():
                        if key == ut.filter_key(key2):

                            result = self._stats.analyze(source, shadow)
                            ut.add_to_dict(key+"_res",
                                                result, self._multi_results)
                        else:
                            pass

            elif self._data_source and self._data_shadow:
                self._analysis_results = \
                    self._stats.analyze(self._data_source, self._data_shadow)

            else:
                print("cannot do this yet")
        else:
            pass