def get_descendants_query(
cls, root_idea_id=bindparam('root_idea_id', type_=Integer),
inclusive=True):
if cls.using_virtuoso:
sql = text(
"""SELECT transitive t_in (1) t_out (2) T_DISTINCT T_NO_CYCLES
source_id, target_id FROM idea_idea_link
WHERE tombstone_date IS NULL"""
).columns(column('source_id'), column('target_id')).alias()
select_exp = select([sql.c.target_id.label('id')]
).select_from(sql).where(sql.c.source_id==root_idea_id)
else:
link = select(
[IdeaLink.source_id, IdeaLink.target_id]
).select_from(
IdeaLink
).where(
(IdeaLink.tombstone_date == None) &
(IdeaLink.source_id == root_idea_id)
).cte(recursive=True)
source_alias = aliased(link)
targets_alias = aliased(IdeaLink)
parent_link = targets_alias.source_id == source_alias.c.target_id
children = select(
[targets_alias.source_id, targets_alias.target_id]
).select_from(targets_alias).where(parent_link
& (targets_alias.tombstone_date == None))
with_children = link.union(children)
select_exp = select([with_children.c.target_id.label('id')]
).select_from(with_children)
if inclusive:
if isinstance(root_idea_id, int):
root_idea_id = literal_column(str(root_idea_id), Integer)
select_exp = select_exp.union(
select([root_idea_id.label('id')]))
return select_exp.alias()
评论列表
文章目录