class CTXOldRegistry(CTXPropRegistry): """In charge of binding an old collection (not generated from the Storage project) to context entities. Such old collections contain all entity fields. """ def __init__(self, table=None, *args, **kwargs): """ :param Storage storage: event storage to use. """ super(CTXOldRegistry, self).__init__(*args, **kwargs) self.storage = MongoStorage(table=table) def _do(self, command, ids, query, queryname, *args, **kwargs): """Execute storage command related to input ids and query. :param command: storage command. :param list ids: entity id(s). :param dict query: storage command query. :param str queryname: storage command query parameter. :return: storage command execution documents. :rtype: list """ result = [] # initialize query query = deepcopy(query) if query else {} # get entity id field name ctx_id_field = self._ctx_id_field() if ids is None: # get all existing entity ids ids = [] events = self.storage.find_elements() for event in events: entity = self.context.get_entity(event) entity_id = self.context.get_entity_id(entity) ids.append(entity_id) for entity_id in ids: # get entity entity = self.context.get_entity_by_id(entity_id) cleaned_entity = self.context.clean(entity) cleaned_entity['source_type'] = cleaned_entity.pop('type') for ctx in self.context.context[1:]: if ctx in cleaned_entity: continue else: cleaned_entity[ctx] = cleaned_entity.pop(Context.NAME) break # update query with entity information _query = deepcopy(query) _query.setdefault('$and', []).append(cleaned_entity) # update kwargs with query and queryname kwargs[queryname] = _query # execute the storage command documents = command(*args, **kwargs) if isinstance(documents, Cursor): documents = list(documents) # update entity_id in documents for document in documents: document[ctx_id_field] = entity_id else: documents = [ {ctx_id_field: entity_id, 'result': documents} ] # add all documents into the result result += documents return result def _get(self, ids, query, *args, **kwargs): return self._do( command=self.storage.find_elements, ids=ids, query=query, queryname='query', *args, **kwargs ) def _count(self, ids, query, *args, **kwargs): return self._do( command=self.storage.count_elements, ids=ids, query=query, queryname='query', *args, **kwargs ) def _delete(self, ids, query, *args, **kwargs): return self._do( command=self.storage.remove_elements, ids=ids, query=query, queryname='_filter', *args, **kwargs ) def ids(self, query=None, *args, **kwargs): result = [] events = self.storage.find_elements(query=query) for event in events: entity = self.context.get_entity(event) entity_id = self.context.get_entity_id(entity) result.append(entity_id) return result
class CTXLinklistRegistry(CTXPropRegistry): """In charge of ctx linklist information. """ __datatype__ = 'linklist' #: default datatype name def __init__(self, *args, **kwargs): super(CTXLinklistRegistry, self).__init__(*args, **kwargs) self.manager = Linklist() self.events = MongoStorage(table='events') self.context = Context() def _get_documents(self, ids, query): """Get documents related to input ids and query. :param list ids: entity ids. If None, get all documents. :param dict query: additional selection query. :return: list of documents. :rtype: list """ result = [] # get entity id field name ctx_id_field = self._ctx_id_field() # get a set of entity ids for execution speed reasons if ids is not None: ids = set(ids) # get documents docs = self.manager.find(_filter=query) for doc in docs: try: mfilter = loads(doc['mfilter']) except Exception: pass else: # get entities from events events = self.events.find_elements(query=mfilter) for event in events: entity = self.context.get_entity(event) entity_id = self.context.get_entity_id(entity) if ids is None or entity_id in ids: doc[ctx_id_field] = entity_id # add eid to the doc result.append(doc) return result def _get(self, ids, query, *args, **kwargs): return self._get_documents(ids=ids, query=query) def _delete(self, ids, query, *args, **kwargs): result = self._get_documents(ids=ids, query=query) ids = [doc['_id'] for doc in result] self.manager.remove(ids=ids) return result def ids(self, query=None): result = [] documents = self.manager.find(_filter=query) for document in documents: try: mfilter = loads(document['mfilter']) except Exception: pass else: # get entities from events events = self.events.find_elements(query=mfilter) for event in events: entity = self.context.get_entity(event) entity_id = self.context.get_entity_id(entity) result.append(entity_id) return result