コード例 #1
0
def get_entities_by_ids(query,
                        entity_type,
                        ids,
                        unknown_entities_for_missing=False):
    """Get entities using their IDs.

    Note that the query may be modified before passing it to this
    function in order to save queries made to the database.

    Args:
        query (Query): SQLAlchemy Query object.
        entity_type (str): Type of entity being queried.
        ids (list): IDs of the target entities.
        unknown_entities_for_missing (bool): If set, NoDataFoundException is suppressed and unknown entities are returned instead.

    Returns:
        Dictionary of objects of target entities keyed by their ID.
    """
    entity_model = ENTITY_MODELS[entity_type]
    results = query.filter(entity_model.id.in_(ids)).all()
    remaining_ids = list(set(ids) - {entity.id for entity in results})
    entities = {entity.id: entity for entity in results}

    if remaining_ids:
        if unknown_entities_for_missing:
            for entity_id in remaining_ids:
                entities[entity_id] = unknown_entity_by_id(
                    entity_id, entity_type)
        else:
            raise mb_exceptions.NoDataFoundException(
                "Couldn't find entities with IDs: {ids}".format(
                    ids=remaining_ids))

    return entities
コード例 #2
0
def get_releases_using_recording_mbid(recording_mbid):
    """Returns a list of releases that contain the recording with
       the given recording MBID.

       Args:
           recording_mbid (UUID): recording MBID for which releases are to be fetched.

       Returns:
           serial_releases (list): list with dictionary elements of following format:
           {
               'id': <release MBID>,
               'name': <release Title>,
           }
    """

    # First fetch the recording so that redirects don't create any problem
    recording_redirect = recording.get_recording_by_mbid(recording_mbid)
    recording_mbid = recording_redirect['id']
    with mb_session() as db:
        releases = db.query(models.Release).\
                    join(models.Medium).\
                    join(models.Track).\
                    join(models.Recording).\
                    filter(models.Recording.gid == recording_mbid).all()

        serial_releases = [serialize_releases(release) for release in releases]
        if not serial_releases:
            raise mb_exceptions.NoDataFoundException("Couldn't find release for recording with MBID: %s." % str(recording_mbid))

        return serial_releases
コード例 #3
0
ファイル: utils.py プロジェクト: spellew/brainzutils-python
def get_entities_by_gids(query, entity_type, mbids):
    """Get entities using their MBIDs.

    An entity can have multiple MBIDs. This function may be passed another
    MBID of an entity, in which case, it is redirected to the original entity.

    Note that the query may be modified before passing it to this
    function in order to save queries made to the database.

    Args:
        query (Query): SQLAlchemy Query object.
        entity_type (str): Type of entity being queried.
        mbids (list): IDs of the target entities.

    Returns:
        Dictionary of objects of target entities keyed by their MBID.
    """
    entity_model = ENTITY_MODELS[entity_type]
    results = query.filter(entity_model.gid.in_(mbids)).all()
    remaining_gids = list(set(mbids) - {entity.gid for entity in results})
    entities = {str(entity.gid): entity for entity in results}
    if remaining_gids:
        redirect_model = REDIRECT_MODELS[entity_type]
        query = query.add_entity(redirect_model).join(redirect_model)
        results = query.filter(redirect_model.gid.in_(remaining_gids))
        for entity, redirect_obj in results:
            entities[redirect_obj.gid] = entity
        remaining_gids = list(set(remaining_gids) - {redirect_obj.gid for entity, redirect_obj in results})

    if remaining_gids:
        raise mb_exceptions.NoDataFoundException("Couldn't find entities with IDs: {mbids}".format(mbids=remaining_gids))
    
    return entities