Esempio n. 1
0
    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)
Esempio n. 2
0
 def all(cls, **filters):
     instance_name = generate_instance_name(cls.__name__)
     query = cls.graph.query().edges()
     query = getattr(query, instance_name)(**filters)
     return query