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
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()