Ejemplo n.º 1
0
    def find_by_syntax(cls, syntax, strict=True):
        """`
        Formulates and executes the SQL necessary to retrieve
        level data from the database given a complete syntax.

        If the syntax refers to levels that do not exist, the function
        returns None unless "strict" is set to False in which case
        placeholder levels are returned for any not found in the 
        database.
        """

        segments = syntax.split(":")

        query = session.query(Level)
        ors = []

        for i in range(len(segments)-1, -1, -1):

            name = segments[i].replace("+", "%")
            if name.count("%"):
                name_condition = Level.name.like(name)
            else:
                name_condition = Level.name==segments[i]

            if i == len(segments)-1:
                query = query.filter(and_(name_condition, Level.depth==i))
            if i == len(segments) - 2:
                query = query.join('parent', aliased=True).filter(and_(name_condition, Level.depth==i))
            if i < len(segments) - 2:
                query = query.join('parent', aliased=True, from_joinpoint=True).filter(and_(name_condition, Level.depth==i))

        # sys.stderr.write("Query: " + str(query) + "\n")
        results = query.all()

        return results
Ejemplo n.º 2
0
    def destroy_children(self):
        """ 
        Destroys all child levels of the instance.
        """

        if self.depth == pipeline.settings.depth():
            # Level is a terminal level and has no children
            return

        query = session.query(Level)

        #  subquery = select([Taggable.c.id], query._criterion,
        #                           from_obj= query._from_obj).as_scalar()

        # query = query.filter( )
        filters = []
        subquery = Level.parent_id == self.id
        final = subquery

        # Somehow this shit works!
        # for i in range(self.depth, len(pipeline.settings.hierarchy()) - 1, 1):
        #     alias = Level._table.alias()
        #     subquery = Level.parent_id.in_(select([alias.c.parent_id], subquery))
        #     final = final | subquery

        for i in range(self.depth, len(pipeline.settings.hierarchy()) - 1, 1):
            alias = Level._table.alias()
            subquery = alias.c.parent_id == self.id
            for j in range(self.depth, i, 1):
                next_alias = Level._table.alias()
                subquery = next_alias.c.parent_id.in_(select([alias.c.id], subquery))
                alias = next_alias
            subquery = Level.parent_id.in_(select([alias.c.id], subquery))
            final = final | subquery

        # alias = Level._table.alias()
        # # alias2 = Level._table.alias()
        # subquery = alias.c.parent_id == self.id
        # subquery = Level.parent_id.in_(select([alias.c.id], subquery))
        # final = final | subquery

        # alias2 = Level._table.alias()
        # subquery = alias2.c.parent_id == self.id
        # subquery = alias.c.parent_id.in_(select([alias2.c.id], subquery))
        # subquery = Level.parent_id.in_(select([alias.c.id], subquery))
        # final = final | subquery
        # 
        # alias3 = Level._table.alias()
        # subquery = alias3.c.parent_id == self.id
        # subquery = alias2.c.parent_id.in_(select([alias3.c.id], subquery))
        # subquery = alias.c.parent_id.in_(select([alias2.c.id], subquery))
        # subquery = Level.parent_id.in_(select([alias.c.id], subquery))
        # final = final | subquery
 
        query = query.filter(final)

        # sys.stderr.write(str(query) + "\n\n")

        level_list = query.all()

        # Must be a better way of doing this!
        for level in level_list:
            session.delete(level)

        session.flush()