Source code for gpi.catalog

#    Copyright (C) 2014  Dignity Health
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Lesser General Public License as published by
#    the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program 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 Lesser General Public License for more details.
#
#    You should have received a copy of the GNU Lesser General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
#    NO CLINICAL USE.  THE SOFTWARE IS NOT INTENDED FOR COMMERCIAL PURPOSES
#    AND SHOULD BE USED ONLY FOR NON-COMMERCIAL RESEARCH PURPOSES.  THE
#    SOFTWARE MAY NOT IN ANY EVENT BE USED FOR ANY CLINICAL OR DIAGNOSTIC
#    PURPOSES.  YOU ACKNOWLEDGE AND AGREE THAT THE SOFTWARE IS NOT INTENDED FOR
#    USE IN ANY HIGH RISK OR STRICT LIABILITY ACTIVITY, INCLUDING BUT NOT
#    LIMITED TO LIFE SUPPORT OR EMERGENCY MEDICAL OPERATIONS OR USES.  LICENSOR
#    MAKES NO WARRANTY AND HAS NO LIABILITY ARISING FROM ANY USE OF THE
#    SOFTWARE IN ANY HIGH RISK OR STRICT LIABILITY ACTIVITIES.

# Brief: A simple data mapping structure.

# gpi
from .logger import manager

# start logger for this module
log = manager.getLogger(__name__)


[docs]class CatalogObj(object): '''An abstract object to be used with the Catalog indexing object. ''' def __init__(self): # save relevant info pass def key(self): # -used in dict and held for reverse lookup # -sorted against # -unique identifier (collisions will cause a merge) # -should be the most likely search for the contained data since it # will be the fasted lookup # return a string pass def merge(self, e): # collisions can be used to add extra data pass def __str__(self): # stringify internal data for printing # return a string pass
[docs]class Catalog(object): '''A generic catalog object for referencing/indexing/sorting a list of descriptions based on their content. Mostly just an extra interface to a dictionary that allows information merges. Keys are determined by the appended object. ''' def __init__(self): self._db = {} # a hash of objects def __len__(self): return len(self._db) def append(self, elem): # merge data if this id already exists if elem.key() in self._db: self._db[elem.key()].merge(elem) else: self._db[elem.key()] = elem def keys(self): return list(self._db.keys()) def values(self): return list(self._db.values()) def iteritems(self): return iter(list(self._db.items())) def d(self): return self._db def __str__(self): o = '\n' for k,v in list(self._db.items()): o += k +': '+str(v) + '\n' return o def get(self, key): return self._db[key] def find(self, attr, value): # return the first object with the given attribute and value for k,v in list(self._db.items()): if hasattr(v, attr): if getattr(v, attr) == value: return v def list(self, attr, value): o = [] # return a list of objects with the given attribute and value for k,v in list(self._db.items()): if hasattr(v, attr): if getattr(v, attr) == value: o.append(v) if len(o) > 0: return o else: return None def intrafind(self, finder, key): # Return the first object with a True internal finder() result. # The finder() function is a method contained within the CatalogObj() # subclass that returns True or False given the passed key for comparison. for k,v in list(self._db.items()): if hasattr(v, finder): if getattr(v, finder)(key): return v def intralist(self, finder, key): # Return a list of objects with a True internal finder() result. # The finder() function is a method contained within the CatalogObj() # subclass that returns True or False given the passed key for comparison. o = [] for k,v in list(self._db.items()): if hasattr(v, finder): if getattr(v, finder)(key): o.append(v) if len(o) > 0: return o else: return None