コード例 #1
0
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
コード例 #2
0
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))