def get_related_entities_by_query(conn, minerva_query, relation_group_name, target_entitytype_id): # Quick Hack: get_entities_by_query -> get_related_entities on result entities = get_entities_by_query(conn, minerva_query, relation_group_name) attr_names = ("id", "dn", "entitytype_id") related_entities = [] target_entitytype = get_entitytype_by_id(conn, target_entitytype_id) for entity in entities: if entity["entitytype_id"] == target_entitytype_id: related_entities.append(entity) else: source_entitytype = get_entitytype_by_id(conn, entity["entitytype_id"]) relationtype_name = "{}->{}".format(source_entitytype.name, target_entitytype.name) try: get_relationtype_id(conn, relationtype_name) except NoSuchRelationTypeError: continue else: query = ( " SELECT target_id, e.dn, e.entitytype_id" " FROM relation.\"{0}\"" " JOIN directory.entity e ON e.id = target_id" " AND e.entitytype_id = %s" " WHERE source_id = %s").format(relationtype_name) with closing(conn.cursor()) as cursor: cursor.execute(query, (target_entitytype_id, entity["id"])) rows = cursor.fetchall() if rows is not None: related_entities.extend([dict(zip(attr_names, row)) for row in rows]) return related_entities
def add_relations(conn, relations, relationtype_name, relationtype_cardinality=None): """ Update relation.<relationtype_name> table :param conn: Minerva database connection :param relations: iterable of with items like (source_id, target_id) :param relationtype_name :param relationtype_cardinality """ try: relationtype_id = get_relationtype_id(conn, relationtype_name) except NoSuchRelationTypeError: relationtype_id = create_relationtype(conn, relationtype_name, relationtype_cardinality) _f = StringIO.StringIO() for source_id, target_id in relations: _f.write("{0}\t{1}\t{2}\n".format(source_id, target_id, relationtype_id)) _f.seek(0) tmp_table = "tmp_relation" with closing(conn.cursor()) as cursor: query = ( "CREATE TEMPORARY TABLE \"{0}\" " "(LIKE relation.all)".format(tmp_table)) cursor.execute(query) query = ( "COPY \"{0}\" (source_id, target_id, type_id) " "FROM STDIN".format(tmp_table)) cursor.copy_expert(query, _f) query = ( "INSERT INTO relation.\"{0}\" (source_id, target_id, type_id) " "SELECT tmp.source_id, tmp.target_id, tmp.type_id " "FROM \"{1}\" tmp " "LEFT JOIN relation.\"{0}\" r " "ON r.source_id = tmp.source_id " "AND r.target_id = tmp.target_id " "WHERE r.source_id IS NULL ".format(relationtype_name, tmp_table)) cursor.execute(query) cursor.execute("DROP TABLE {0}".format(tmp_table))