Source code for timelinelib.canvas.data.memorydb.query

# Copyright (C) 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018  Rickard Lindberg, Roger Lindberg
#
# This file is part of Timeline.
#
# Timeline is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# Timeline is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with Timeline.  If not, see <http://www.gnu.org/licenses/>.


from timelinelib.canvas.data import Category
from timelinelib.canvas.data import Container
from timelinelib.canvas.data import Era
from timelinelib.canvas.data import Event
from timelinelib.canvas.data import Milestone
from timelinelib.canvas.data import Subevent


[docs]class Query:
[docs] def __init__(self, db, immutable_db): self._db = db self._immutable_db = immutable_db self._wrappers = {}
[docs] def container_exists(self, id_): return id_ in self._immutable_db.containers
[docs] def event_exists(self, id_): return id_ in self._immutable_db.events
[docs] def milestone_exists(self, id_): return id_ in self._immutable_db.milestones
[docs] def get_category(self, id_): if id_ not in self._wrappers: self._wrappers[id_] = self._create_category_wrapper(id_) return self._wrappers[id_]
[docs] def get_container(self, id_): if id_ not in self._wrappers: self._wrappers[id_] = self._create_container_wrapper(id_) self._load_subevents(self._wrappers[id_]) return self._wrappers[id_]
[docs] def get_event(self, id_): if id_ not in self._wrappers: self._wrappers[id_] = self._create_event_wrapper(id_) immutable_event = self._immutable_db.events.get(id_) if immutable_event.container_id is not None: # Loading the container will load and populate all subevents self.get_container(immutable_event.container_id) return self._wrappers[id_]
[docs] def get_milestone(self, id_): if id_ not in self._wrappers: self._wrappers[id_] = self._create_milestone_wrapper(id_) return self._wrappers[id_]
[docs] def get_era(self, id_): if id_ not in self._wrappers: self._wrappers[id_] = self._create_era_wrapper(id_) return self._wrappers[id_]
def _load_subevents(self, container): for subevent_id, immutable_event in self._immutable_db.events: if immutable_event.container_id == container.id: self.get_event(subevent_id).container = container def _create_category_wrapper(self, id_): immutable_category = self._immutable_db.categories.get(id_) wrapper = Category( db=self._db, id_=id_, immutable_value=immutable_category, ) wrapper.parent = self._get_maybe_category(immutable_category.parent_id) return wrapper def _create_container_wrapper(self, id_): immutable_container = self._immutable_db.containers.get(id_) wrapper = Container( db=self._db, id_=id_, immutable_value=immutable_container, ) wrapper.category = self._get_maybe_category(immutable_container.category_id) lst = [] for key in immutable_container.category_ids: lst.append(self._get_maybe_category(key)) wrapper.set_categories(lst) return wrapper def _create_event_wrapper(self, id_): immutable_event = self._immutable_db.events.get(id_) if immutable_event.container_id is None: klass = Event else: klass = Subevent wrapper = klass( db=self._db, id_=id_, immutable_value=immutable_event, ) wrapper.category = self._get_maybe_category(immutable_event.category_id) lst = [] for key in immutable_event.category_ids: lst.append(self._get_maybe_category(key)) wrapper.set_categories(lst) return wrapper def _create_milestone_wrapper(self, id_): immutable_milestone = self._immutable_db.milestones.get(id_) wrapper = Milestone( db=self._db, id_=id_, immutable_value=immutable_milestone, ) wrapper.category = self._get_maybe_category(immutable_milestone.category_id) lst = [] for key in immutable_milestone.category_ids: lst.append(self._get_maybe_category(key)) wrapper.set_categories(lst) return wrapper def _create_era_wrapper(self, id_): immutable_era = self._immutable_db.eras.get(id_) return Era( db=self._db, id_=id_, immutable_value=immutable_era, ) def _get_maybe_category(self, category_id): if category_id is None: return None else: return self.get_category(category_id)