def __add_element_class__(self, element_class): """Generates ``QueryVertex`` and ``QueryVertex`` for elements registered with the corresponding graph and attach them the GraphitiRexQuery class so that it's possible to query for this objects""" class_name = element_class.__name__ element_instance_name = generate_instance_name(class_name) properties = element_class.properties # We don't need to filter by ``klass`` because that is # already what we do with all this stuff # otherwise said, we don't need automatic filtering # created for ``klass`` property because the purpose # of this code is to do exactly that class_dict = {} # both edge and vertex element classes share properties filter filters = {} for property in properties: if property.name == 'klass': continue def filter_by_property(self, value): return self.filter(property.name, value) method_name = generate_instance_name(property.name) filters[method_name] = filter_by_property class_dict.update(filters) # Build the new query class # inherit from the parent query class if any SuperClass = element_class.mro()[1] if SuperClass in self.element_query_class: bases = (self.element_query_class[SuperClass],) else: if issubclass(element_class, Vertex): bases = (Operator, ) else: bases = (Operator, ) query_name = '%sQuery' % class_name QueryKlass = type(query_name, bases, class_dict) QueryKlass.graph = self QueryKlass.element_class = element_class # add it to element_query_class for reference self.element_query_class[element_class] = QueryKlass # Add proper filtering on Operator base class so that it's always # accessible # FIXME: make it more fine grained because this operation must not # be accessible everywhere we rely on user smartness def filter_by_element(self, **kwargs): return self.filter(klass=class_name, **kwargs) filter_by_element = MethodType(filter_by_element, None, Operator) setattr(Operator, element_instance_name, filter_by_element)
def all(cls, **filters): instance_name = generate_instance_name(cls.__name__) query = cls.graph.query().edges() query = getattr(query, instance_name)(**filters) return query