def get_image_data(cls, tag_names): from catsnap.table.image import Image from catsnap.table.image_tag import ImageTag session = Client().session() image_data = session.query(func.max(Image.filename), Image.image_id, func.max(Image.title), func.array_agg(Tag.name)).\ join(ImageTag).\ filter(ImageTag.image_id == Image.image_id).\ filter(ImageTag.tag_id == Tag.tag_id).\ filter(Image.image_id.in_( session.query(ImageTag.image_id).\ join(Tag).\ filter(ImageTag.tag_id == Tag.tag_id).\ filter(Tag.name.in_(tag_names)))).\ group_by(Image.image_id).\ order_by(Image.filename) for image_struct in image_data: caption = Image.make_caption(title=image_struct[2], filename=image_struct[0], tags=image_struct[3]) yield (image_struct[0], image_struct[1], caption)