Skip to content
This repository has been archived by the owner on Jan 21, 2020. It is now read-only.

Commit

Permalink
Reorganise code to be free of orphan instances
Browse files Browse the repository at this point in the history
  • Loading branch information
ocharles committed Aug 22, 2013
1 parent 26fb0cc commit a14087a
Show file tree
Hide file tree
Showing 125 changed files with 4,179 additions and 4,524 deletions.
99 changes: 48 additions & 51 deletions musicbrainz-data.cabal
Expand Up @@ -30,60 +30,56 @@ Library
text >= 0.11.1.13 && < 0.12,
time >= 1.4,
transformers >= 0.2.2.0 && < 0.4,
uuid >= 1.2.7 && < 1.3
uuid >= 1.2.7 && < 1.3,
vector
exposed-modules:
MusicBrainz
MusicBrainz.Data
MusicBrainz.Data.Add
MusicBrainz.Data.Alias
MusicBrainz.Data.AliasType
MusicBrainz.Data.Annotation
MusicBrainz.Data.Artist
MusicBrainz.Data.ArtistCredit
MusicBrainz.Data.ArtistType
MusicBrainz.Data.Cleanup
MusicBrainz.Data.Country
MusicBrainz.Data.Create
MusicBrainz.Data.Edit
MusicBrainz.Data.Editor
MusicBrainz.Data.FindLatest
MusicBrainz.Data.Gender
MusicBrainz.Data.GetEntity
MusicBrainz.Data.IPI
MusicBrainz.Data.Label
MusicBrainz.Data.LabelType
MusicBrainz.Data.Language
MusicBrainz.Data.MediumFormat
MusicBrainz.Data.Merge
MusicBrainz.Data.Recording
MusicBrainz.Data.Relationship
MusicBrainz.Data.Release
MusicBrainz.Data.ReleaseGroup
MusicBrainz.Data.ReleaseGroupType
MusicBrainz.Data.ReleasePackaging
MusicBrainz.Data.ReleaseStatus
MusicBrainz.Data.Revision
MusicBrainz.Data.Script
MusicBrainz.Data.Tree
MusicBrainz.Data.Update
MusicBrainz.Data.Url
MusicBrainz.Data.Util
MusicBrainz.Data.Work
MusicBrainz.Data.WorkType
MusicBrainz.Monad
MusicBrainz.Alias
MusicBrainz.Annotation
MusicBrainz.Artist
MusicBrainz.ArtistCredit
MusicBrainz.Class.Add
MusicBrainz.Class.Cleanup
MusicBrainz.Class.Create
MusicBrainz.Class.FindLatest
MusicBrainz.Class.GetEntity
MusicBrainz.Class.ResolveReference
MusicBrainz.Class.Update
MusicBrainz.Class.ViewRevision
MusicBrainz.Country
MusicBrainz.Edit
MusicBrainz.Lens
MusicBrainz.Merge
MusicBrainz.Schema
MusicBrainz.Types
MusicBrainz.EditApplication
MusicBrainz.Editor
MusicBrainz.Entity
MusicBrainz.Gender
MusicBrainz.IPI
MusicBrainz.ISNI
MusicBrainz.ISRC
MusicBrainz.ISWC
MusicBrainz.Label
MusicBrainz.Language
MusicBrainz.MBID
MusicBrainz.PartialDate
MusicBrainz.Recording
MusicBrainz.Ref
MusicBrainz.Relationship
MusicBrainz.Relationship.Internal
MusicBrainz.Release
MusicBrainz.ReleaseGroup
MusicBrainz.Revision
MusicBrainz.Revision.Internal
MusicBrainz.Script
MusicBrainz.Tree
MusicBrainz.URL
MusicBrainz.Work
MusicBrainz.Util
other-modules:
MusicBrainz.Data.CoreEntity
MusicBrainz.Data.Generic
MusicBrainz.Data.Relationship.Internal
MusicBrainz.Data.Revision.Internal
MusicBrainz.Monad
MusicBrainz.Types.Internal
MusicBrainz.Generic
MusicBrainz.Merge
MusicBrainz.Class.RealiseTree
MusicBrainz.Lens
ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
-fno-warn-orphans -fno-warn-unused-do-bind
-fno-warn-unused-do-bind
-Werror

Test-Suite integration-tests
Expand All @@ -109,7 +105,8 @@ Test-Suite integration-tests
test-framework-quickcheck2 >= 0.2.12.3 && <0.4,
time >= 1.4,
transformers >= 0.2.2.0 && < 0.4,
uuid >= 1.2.7 && < 1.3
uuid >= 1.2.7 && < 1.3,
vector
ghc-options: -Wall -fwarn-tabs -funbox-strict-fields -O2
-fno-warn-orphans -fno-warn-unused-do-bind
-threaded -Werror
Expand Down
10 changes: 0 additions & 10 deletions src/MusicBrainz.hs

This file was deleted.

136 changes: 136 additions & 0 deletions src/MusicBrainz/Alias.hs
@@ -0,0 +1,136 @@
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeFamilies #-}
module MusicBrainz.Alias where

import Control.Applicative
import Control.Lens
import Control.Monad.IO.Class (MonadIO)
import Data.Maybe (listToMaybe)
import Data.String (fromString)
import Data.Set (Set)
import Data.Tagged (Tagged, untag)
import Data.Text (Text)
import Database.PostgreSQL.Simple (Only(..))
import Database.PostgreSQL.Simple.FromField (FromField(..))
import Database.PostgreSQL.Simple.FromRow (FromRow(..), field)
import Database.PostgreSQL.Simple.ToField (ToField(..))
import Database.PostgreSQL.Simple.ToRow (ToRow(..))
import MusicBrainz.Monad
import MusicBrainz.Class.Add
import MusicBrainz.Class.ResolveReference
import MusicBrainz.Class.RootTable
import MusicBrainz.PartialDate (PartialDate)
import MusicBrainz.Ref (Ref, Referenceable(..), reference, dereference)
import MusicBrainz.Revision (Revision)

import qualified Data.Set as Set

--------------------------------------------------------------------------------
{-| An alias is an alternative name for an entity, along with some information
describing what that name represents, which locale it is for, and when it was
in use.
@a@ is a phantom type describing what type of entity this alias belongs to.-}
data Alias a = Alias
{ aliasName :: !Text
, aliasSortName :: !Text
, aliasBeginDate :: !PartialDate
, aliasEndDate :: !PartialDate
, aliasEnded :: !Bool
, aliasType :: !(Maybe (Ref (AliasType a)))
, aliasLocale :: !(Maybe Text)
, aliasPrimaryForLocale :: !Bool
}
deriving (Eq, Ord, Show)

instance FromRow (Alias a) where
fromRow = Alias <$> field <*> field <*> fromRow <*> fromRow <*> field <*> field
<*> field <*> field

instance ToRow (Alias a) where
toRow Alias{..} = [ toField aliasName
, toField aliasSortName
]
++ toRow aliasBeginDate
++ toRow aliasEndDate
++
[ toField aliasEnded
, toField aliasType
, toField aliasLocale
, toField aliasPrimaryForLocale
]


--------------------------------------------------------------------------------
{-| A description of the type of an alias. @a@ is a phantom type, which should
be one of 'ArtistAlias', 'LabelAlias' or 'WorkAlias'. It is used to signify
exactly which type of alias this is (as each entity has its own distinct
set of possible alias types.) -}
newtype AliasType a = AliasType { aliasTypeName :: Text }
deriving (Eq, Show)

instance Referenceable (AliasType a) where
type RefSpec (AliasType a) = Int

instance FromField (Ref (AliasType a)) where
fromField f v = view reference <$> fromField f v

instance FromRow (AliasType a) where
fromRow = AliasType <$> field

instance ToField (Ref (AliasType a)) where
toField = toField . dereference

instance ToRow (AliasType a) where
toRow AliasType{..} = [ toField aliasTypeName
]

instance RootTable a => Add (AliasType a) where
add type' = head <$>
query sql type'
where
sql = fromString $ unwords
[ "INSERT INTO"
, untag (rootTable :: Tagged a String) ++ "_alias_type"
, "(name) VALUES (?) RETURNING id, name"
]

instance RootTable a => ResolveReference (AliasType a) where
resolveReference aliasTypeId = listToMaybe . map fromOnly <$>
query sql (Only aliasTypeId)
where
sql = fromString $ unwords
[ "SELECT id FROM"
, untag (rootTable :: Tagged a String) ++ "_alias_type"
, "WHERE id = ?"
]


--------------------------------------------------------------------------------
{-| This type class provides functions for working with aliases for specific
entity types. -}
class ViewAliases a where
{-| Fetch all aliases for a given revision of an entity. -}
viewAliases :: (Functor m, MonadIO m) => Ref (Revision a) -> MusicBrainzT m (Set.Set (Alias a))

default viewAliases
:: (Functor m, MonadIO m, RootTable a)
=> Ref (Revision a) -> MusicBrainzT m (Set (Alias a))
viewAliases r = Set.fromList <$> query q (Only r)
where
entityName = untag (rootTable :: Tagged a String)
q = fromString $ unlines
[ "SELECT name.name, sort_name.name,"
, "begin_date_year, begin_date_month, begin_date_day,"
, "end_date_year, end_date_month, end_date_day,"
, "ended, " ++ entityName ++ "_alias_type_id, locale, primary_for_locale "
, "FROM " ++ entityName ++ "_alias alias"
, "JOIN " ++ entityName ++ "_name name ON (alias.name = name.id) "
, "JOIN " ++ entityName ++ "_name sort_name ON (alias.sort_name = sort_name.id) "
, "JOIN " ++ entityName ++ "_tree USING (" ++ entityName ++ "_tree_id) "
, "JOIN " ++ entityName ++ "_revision USING (" ++ entityName ++ "_tree_id) "
, "WHERE revision_id = ?"
]
@@ -1,18 +1,21 @@
{-# LANGUAGE DefaultSignatures #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-| Functions for working with entity annotations. -}
module MusicBrainz.Data.Annotation
( ViewAnnotation(..) ) where
{-# LANGUAGE TypeFamilies #-}
module MusicBrainz.Annotation where

import Control.Applicative
import Control.Monad.IO.Class
import Database.PostgreSQL.Simple (Only(..))
import Control.Monad.IO.Class (MonadIO)
import Data.String (fromString)
import Data.Tagged (Tagged, untag)
import Data.Text (Text)
import Database.PostgreSQL.Simple (Only(..))

import MusicBrainz
import MusicBrainz.Data.CoreEntity
import MusicBrainz.Monad
import MusicBrainz.Class.RootTable
import MusicBrainz.Ref (Ref)
import MusicBrainz.Revision (Revision)

--------------------------------------------------------------------------------
{-| This type class provides functions for working with annotations for specific
Expand All @@ -23,7 +26,7 @@ class ViewAnnotation a where
=> Ref (Revision a) -> MusicBrainzT m Text

default viewAnnotation
:: (Functor m, MonadIO m, CoreEntityTable a)
:: (Functor m, MonadIO m, RootTable a)
=> Ref (Revision a) -> MusicBrainzT m Text
viewAnnotation r = fromOnly . head <$> query q (Only r)
where
Expand All @@ -34,4 +37,3 @@ class ViewAnnotation a where
, "JOIN " ++ entityName ++ "_revision USING (" ++ entityName ++ "_tree_id) "
, "WHERE revision_id = ?"
]

0 comments on commit a14087a

Please sign in to comment.