Source code for soweego.importer.models.discogs_entity

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""`Discogs <https://www.discogs.com/>`_
`SQLAlchemy <https://www.sqlalchemy.org/>`_ ORM entities."""

__author__ = 'Marco Fossati'
__email__ = 'fossati@spaziodati.eu'
__version__ = '1.0'
__license__ = 'GPL-3.0'
__copyright__ = 'Copyleft 2018, Hjfocs'

from sqlalchemy import Column, String, Text
from sqlalchemy.ext.declarative import declarative_base

from soweego.importer.models.base_entity import BaseEntity, BaseRelationship
from soweego.importer.models.base_link_entity import BaseLinkEntity
from soweego.importer.models.base_nlp_entity import BaseNlpEntity

BASE = declarative_base()

ARTIST_TABLE = 'discogs_artist'  # Abstract table

MASTER_TABLE = 'discogs_master'
MUSICIAN_TABLE = 'discogs_musician'
MUSICIAN_LINK_TABLE = 'discogs_musician_link'
MUSICIAN_NLP_TABLE = 'discogs_musician_nlp'
GROUP_TABLE = 'discogs_group'
GROUP_LINK_TABLE = 'discogs_group_link'
GROUP_NLP_TABLE = 'discogs_group_nlp'

MASTER_ARTIST_RELATIONSHIP_TABLE = 'discogs_master_artist_relationship'


[docs]class DiscogsArtistEntity(BaseEntity): """A Discogs *artist*: either a musician or a band. It comes from the ``_artists.xml.gz`` dataset. See the `download page <https://data.discogs.com/>`_. All ORM entities describing Discogs people should inherit this class. **Attributes:** - **real_name** (text) - a name in real life - **data_quality** (string(20)) - an indicator of data quality """ __tablename__ = ARTIST_TABLE # Name in real life real_name = Column(Text) # Discogs-specific indicator of data quality data_quality = Column(String(20)) __abstract__ = True
[docs]class DiscogsMasterEntity(BaseEntity): """A Discogs *master*: a musical work, which can have multiple *releases*. It comes from the ``_masters.xml.gz`` dataset. See the `download page <https://data.discogs.com/>`_. **Attributes:** - **main_release_id** (string(50)) - a Discogs identifier of the main release for this musical work - **genres** (text) - a string list of musical genres """ __tablename__ = MASTER_TABLE __mapper_args__ = {'polymorphic_identity': __tablename__, 'concrete': True} main_release_id = Column(String(50)) genres = Column(Text) # Discogs-specific indicator of data quality data_quality = Column(String(20))
[docs]class DiscogsMusicianEntity(DiscogsArtistEntity): """A Discogs musician.""" __tablename__ = MUSICIAN_TABLE __mapper_args__ = {'polymorphic_identity': __tablename__, 'concrete': True}
[docs]class DiscogsMusicianLinkEntity(BaseLinkEntity): """A Discogs musician Web link (URL).""" __tablename__ = MUSICIAN_LINK_TABLE __mapper_args__ = {'polymorphic_identity': __tablename__, 'concrete': True}
[docs]class DiscogsMusicianNlpEntity(BaseNlpEntity, BASE): """A Discogs musician textual description.""" __tablename__ = MUSICIAN_NLP_TABLE __mapper_args__ = {'polymorphic_identity': __tablename__, 'concrete': True}
[docs]class DiscogsGroupEntity(DiscogsArtistEntity): """A Discogs *group*, namely a band.""" __tablename__ = GROUP_TABLE __mapper_args__ = {'polymorphic_identity': __tablename__, 'concrete': True}
[docs]class DiscogsGroupLinkEntity(BaseLinkEntity): """A Discogs band Web link (URL).""" __tablename__ = GROUP_LINK_TABLE __mapper_args__ = {'polymorphic_identity': __tablename__, 'concrete': True}
[docs]class DiscogsGroupNlpEntity(BaseNlpEntity, BASE): """A Discogs band textual description.""" __tablename__ = GROUP_NLP_TABLE __mapper_args__ = {'polymorphic_identity': __tablename__, 'concrete': True}
[docs]class DiscogsMasterArtistRelationship(BaseRelationship): """A relationship between a Discogs musical work and the Discogs musician or band who made it.""" __tablename__ = MASTER_ARTIST_RELATIONSHIP_TABLE __mapper_args__ = {'polymorphic_identity': __tablename__, 'concrete': True} def __repr__(self): return super().__repr__()