Review Request: Track statistics refactor (intended to be merged ASAP)
Phalgun Guduthur
phalgun.guduthur at gmail.com
Sun Sep 23 02:35:41 UTC 2012
-----------------------------------------------------------
This is an automatically generated e-mail. To reply, visit:
http://git.reviewboard.kde.org/r/106494/#review19346
-----------------------------------------------------------
Ship it!
I went through the Nepomuk collection code that was changed. It looks good.
After I implement Resource Watcher to watch the Nepomuk resources, I had to implement a variant of these functions myself. So its good that I already have them now.
- Phalgun Guduthur
On Sept. 22, 2012, 3:31 p.m., Matěj Laitl wrote:
>
> -----------------------------------------------------------
> This is an automatically generated e-mail. To reply, visit:
> http://git.reviewboard.kde.org/r/106494/
> -----------------------------------------------------------
>
> (Updated Sept. 22, 2012, 3:31 p.m.)
>
>
> Review request for Amarok, Bart Cerneels, Ralf Engels, and Phalgun Guduthur.
>
>
> Description
> -------
>
> MetaFile::Track: prevent crash with the new statistics design
>
> Following happened:
> 1. MetaFile::Track constuctor calls readMetaData()
> 2. if readMetaData() detects statistics in file tags, it calls
> PersistentStatisticsStore->set{Rating,...}()
> 3. set{Rating,...}() calls notifyObservers, which constructs
> KSharedPtr to the track. When the KSharedPtr is destroyed
> (probably right after the call), it destroys the Track being
> constructed as its refcount drops to zero. Booo!
>
> Prevent this by increasing the refcount temporarily. This is a special
> case where PersistentStatisticsStore setter methods are called in
> linked track's constructor, other code is safe.
>
> Meta::NepomukTrack: organize header file, implement finishedPlaying()
>
> ...and don't actually lie about what methods are Meta::Track and what
> are Nepomuk-specific.
>
> Meta::Statistics and subclasses: add docs and asserts wrt thread safety
>
>
> {Tag,Url}StatisticsStore: fix dates not read/saved due to wrong format used in sql
>
> ...we should really use some kind of db abstraction.
>
> No need to mention PersistentStatisticsStore explicitly now
>
>
> Implement Meta::Track::finishedPlaying(), ditch redundant implementations
>
> code sharing++! Also harmonize the logic, it is now:
>
> Raise play count if one of these hold:
> * song is shorter than 30s and it has been played fully
> * song is longer than 30s and at least 50% was played
> * at least 5 minutes of the song was played
>
> Meta::SqlTrack: use {begin,end}Update() for both Statistics and EditCapability
>
> and make it thread-safe by changing m_batchUpdate from bool to int.
> Also rename some methods to match other implementations and real
> purpose. Add some docs.
>
> Add set{First,Last}Played(), setPlayCount() to Meta::Statistics, ditch StatisticsCapability
>
> ..and adapt IpodMeta::Track to the new scheme.
>
> Adapt StatisticsProvider & co. to Meta::Statistics, rename
>
> ...and use directly in Track implementations, which saves some code.
> Also move all to core-impl/suppor - it is just an implementation
> detail.
>
> Also modify PersistentStatisticsStore (legacy StatisticsProvider) to
> call notifyObservers() as appropriate, which needs some friend
> declarations in Meta.h. Use new Observer functionality to track
> linked tracks without holding a reference to them. (to avoid circular
> reference counting)
>
> Meta::Statistics: note about thread-safety
>
>
> Meta::Track: move statistics methods into statistics() interface
>
> * introduce Meta::Statistics, an interface to statistics-related
> methods. Memory manager using KSharedPtr.
> * remove (set)score(), (set)rating(), first/lastPlayed(), playCount()
> from Meta::Track and move it to Meta::Statistics
> * Because Meta::Statistics uses KSharedPtrs, existing track
> implementations can just inherit Statistics and return this; in
> Track::Statistics()
> * Existing Track subclasses with dummy implementations of (set)score(),
> (set)rating(), first/lastPlayed(), playCount() have it removed.
> * Existing Track subclasses with meaningful implementations of
> (set)score(), (set)rating(), first/lastPlayed(), playCount() turned
> into Meta::Statistics and statistics() method is added for them.
>
> Next steps:
> * Make StatisticsProvider an implementation of Meta::Statistics, which
> will in turn immensely simplify all tracks that use them.
> * Add setPlaycount(), setFirst/LastPlayed() to Meta::Statistics and
> ditch StatisticsCapability.
> * Implement trackPlayed() in Meta::Track, ditch custom implementations.
>
> Heavily based on Ralf's idea and patch in
> https://git.reviewboard.kde.org/r/106276/ it is just attribute vs. the
> subclass pattern + some minor details like notifyObservers() in
> StatisticsStore, circular refcounting avoidance etc.
>
> I want to deal with other track Capabilities in similar way in future,
> the next one being EditCapability: I'd like to introduce Meta::Editable
> and Meta::Track::editable() and rename {begin,end}MetaDataUpdate() to
> just {begin,end}Update() to share even greater portion of code in Track
> implementations.
>
>
> Diffs
> -----
>
> ChangeLog fa64799c18702ff777ec013e3b8726a9b8703b45
> playground/src/context/applets/coverbling/CoverBlingApplet.cpp 5ef376a93a23b3a0c6f3323b31d8ddc82947b670
> src/CMakeLists.txt 8596144087709d9baab19b63c35f0c8169dca427
> src/MainWindow.cpp 0530fd725f41d00ce5f5b3aed68ab6e06a5c86b3
> src/TrayIcon.cpp 51b2afd528234a3e2f01f2f02f6c496c08249d9b
> src/context/applets/currenttrack/CurrentTrack.cpp aa83a66f39a970b6927d0b63928c79ae55eeec9b
> src/context/widgets/RecentlyPlayedListWidget.cpp 3b7bd7207b6a69be468bc241083abe67fb7f3b2d
> src/core-impl/collections/audiocd/AudioCdMeta.h d2ef5dbfab54a965bd66731fc921cc787d40264a
> src/core-impl/collections/audiocd/AudioCdMeta.cpp b24cd1bda95f14d9c5be06c64985f303784be72f
> src/core-impl/collections/daap/DaapMeta.h e0cf9f3ae1952fb0b0ec8632b5645b340c3ac7bd
> src/core-impl/collections/daap/DaapMeta.cpp 2b01ebf37ebccb6ae2fcec630638fed262b0eebf
> src/core-impl/collections/db/sql/CapabilityDelegateImpl.cpp e344e0f8a8f26450b4340a64188cab72fa1a755c
> src/core-impl/collections/db/sql/SqlCollectionLocation.cpp c55d3986e43bf52f88016e4f353b71c84478c139
> src/core-impl/collections/db/sql/SqlMeta.h 4450dabcd6947341de035c53b2e6998280355ef9
> src/core-impl/collections/db/sql/SqlMeta.cpp c05e563120ccda2d957ba5c1de507e73e50cbfc4
> src/core-impl/collections/db/sql/SqlScanResultProcessor.cpp 8d4b5852ee867e9698fb92e086c43d1cab4e429f
> src/core-impl/collections/ipodcollection/IpodMeta.h 5d54d8ce8586c7b7c715abb7bfb748403355fb6d
> src/core-impl/collections/ipodcollection/IpodMeta.cpp 13b9d913f744ebef9ac572c782193f0f9a532394
> src/core-impl/collections/ipodcollection/IpodMetaEditCapability.h a19691e3dfc7fbb20befefc19dbd9c2a00c8af47
> src/core-impl/collections/ipodcollection/IpodMetaEditCapability.cpp bc62412923ebf6c90de7b0c180a18c238d2fd0b8
> src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.h 2d0706e03a80d0f182c4dc9613751ef731385bcc
> src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.cpp 3946b8ffd4e75ba5e5bc259a60a683883abefa31
> src/core-impl/collections/mediadevicecollection/handler/MediaDeviceHandler.cpp 98e751f363f983b2857d9702414d150412c5dce7
> src/core-impl/collections/nepomukcollection/meta/NepomukTrack.h 8b04f26081126809ceaf51d60898955848f28584
> src/core-impl/collections/nepomukcollection/meta/NepomukTrack.cpp 40b413fb8302c1f93fa55e8ec462ebb25375ce81
> src/core-impl/collections/playdarcollection/PlaydarMeta.h 93d1c2e103a737682eb05f70fc1db43245d6e313
> src/core-impl/collections/playdarcollection/PlaydarMeta.cpp c9b07f37abc3a0c40dea0a0642e9120249b4efb6
> src/core-impl/collections/playdarcollection/support/Query.cpp 98a1eb51479236d85e384dcc989be2660f20d6d1
> src/core-impl/collections/proxycollection/ProxyCollectionMeta.h e5d7266840ca244c884e1c397258e9d4d1a961de
> src/core-impl/collections/proxycollection/ProxyCollectionMeta.cpp 091f5f6b484c8a8f66111d8a251c76f08ed2e632
> src/core-impl/collections/support/MemoryCustomValue.cpp f21ac9f8cfde8846a43007f2f355596c1a93fd5a
> src/core-impl/collections/support/MemoryMeta.h 675cf425d43dc9d812af0bfabd2c01b2053d2852
> src/core-impl/collections/upnpcollection/UpnpMeta.h f4a62db7d71a38054ba61bb0c690e1cb2a12661a
> src/core-impl/collections/upnpcollection/UpnpMeta.cpp 708bfb8c5682bd4fd003eab70869df1daecddccb
> src/core-impl/meta/file/File.h df96a2a1d74a11f6b559a1d89d27d2535df1107c
> src/core-impl/meta/file/File.cpp 3ee6080df7eeb3810438f7405913f42336407521
> src/core-impl/meta/file/File_p.h 57131f452a92cc2940d93c8535975a5131d16f7e
> src/core-impl/meta/multi/MultiTrack.h 63a8651628eb6335cd0a3e635150bfae95e83235
> src/core-impl/meta/proxy/MetaProxy.h d6dc8f21a5978a362c8005fa4816183bb6ae1090
> src/core-impl/meta/proxy/MetaProxy.cpp 0ba84e6d1ef2aad2d1624e1c4898768f8c2f3b22
> src/core-impl/meta/stream/Stream.h 8b64d89f79752e0b8d67c78a2438c42e0edc2611
> src/core-impl/meta/stream/Stream.cpp 3eb54c74fd77240a3da3cc92b4072c9dae7468f3
> src/core-impl/meta/stream/Stream_p.h 390109ab276608768e1a78cb2e4ef1063527b49e
> src/core-impl/meta/timecode/TimecodeMeta.h ceb4d66f43fb21648aa7c0f12c9f33ea4d4e4ad6
> src/core-impl/meta/timecode/TimecodeMeta.cpp f85476d0af2a80b97de795bf557a3eca369c1d6a
> src/core-impl/statistics/providers/tag/TagStatisticsProvider.h df79a00726aee5d05b45847a1db515c291b8ee0f
> src/core-impl/statistics/providers/tag/TagStatisticsProvider.cpp 7754b8ae4069775eaa417b87a4bb4e22b1535c1f
> src/core-impl/statistics/providers/url/PermanentUrlStatisticsProvider.h 7b6b3bb891b0b968f8402ffd05c9af1dfe7f8998
> src/core-impl/statistics/providers/url/PermanentUrlStatisticsProvider.cpp 9855954813b95c6036ab7eda9f1cd7c794dfbad4
> src/core-impl/support/PersistentStatisticsStore.h PRE-CREATION
> src/core-impl/support/PersistentStatisticsStore.cpp PRE-CREATION
> src/core-impl/support/TagStatisticsStore.h PRE-CREATION
> src/core-impl/support/TagStatisticsStore.cpp PRE-CREATION
> src/core-impl/support/UrlStatisticsStore.h PRE-CREATION
> src/core-impl/support/UrlStatisticsStore.cpp PRE-CREATION
> src/core/CMakeLists.txt 667f2bc2d6e45838efce91c7f47c33a110d77330
> src/core/capabilities/Capability.h 3d3354711c4a3d289e704c0ca957d11e25e62092
> src/core/capabilities/StatisticsCapability.h 690ef1242a5dc6b0e218b5df3f7464c2182670f7
> src/core/capabilities/StatisticsCapability.cpp 34af392070569040814153795d3d5310ce6d2824
> src/core/meta/Meta.h b9045f567fdb386fbc78b5ca35545e2f91cc3f8f
> src/core/meta/Meta.cpp cb0e5c9f337fc781daa3b0038f7e941932a40f3f
> src/core/meta/Statistics.h PRE-CREATION
> src/core/meta/Statistics.cpp PRE-CREATION
> src/core/meta/support/MetaConstants.cpp 079fd22016b2c340cad6a42578826add1226df6a
> src/core/meta/support/MetaUtility.cpp 133076b6163bee5f5d2c92f3c86b6514d1719665
> src/core/podcasts/PodcastMeta.h 0cfaea1e708828a35c3a68f14ff0375e5a7f7509
> src/core/statistics/StatisticsProvider.h 6f5491209df3dd64bcb0398f7054df2b47d7036f
> src/core/statistics/StatisticsProvider.cpp 0b5a788626fb4620740893dda68022c32abb8cd7
> src/core/support/Amarok.h d8c91e789d02b204202c8a99b9459b8d10b3d90d
> src/databaseimporter/amarok14/FastForwardWorker.cpp 56e319b24b2544489d9e9491f3e3c037ec7b63b2
> src/databaseimporter/itunes/ITunesImporterWorker.cpp e5ad5e6194547b91b57920a8692e5bbf9a14fea7
> src/dialogs/TagDialog.cpp a448458984c3920e510be9d4693c2e469765079a
> src/dialogs/TrackOrganizer.cpp 331f1ef088fd4e6c69eade85ae9ed485faed90b4
> src/playlist/PlaylistModel.cpp 700c9096a1810c89106638a27aee2260439def55
> src/playlist/navigators/FavoredRandomTrackNavigator.cpp 3d57a8261695a46e4d7545068e9a0b9a89382aec
> src/playlist/proxymodels/GroupingProxy.cpp 1e32d9ca44f6d5e8bc955f8b54718fe766027ff8
> src/playlist/proxymodels/ProxyBase.cpp 06306adee1f41100a8bff489845e4b3eea9b271d
> src/playlist/proxymodels/SortAlgorithms.cpp d6a395dab2845e41c461037c8d00ea22446e7934
> src/playlist/view/listview/PrettyItemDelegate.cpp d3c2c55de12c0078cf9bed0b2974c91c96e93149
> src/playlistgenerator/constraints/TagMatch.cpp 01c09e55d83c6512a9da6626a6ca218bb3753941
> src/scriptengine/MetaTypeExporter.cpp b944c8e72471a6d66956df938b2c94e248cb9f37
> src/services/ServiceMetaBase.h 793eb9ebbd35495984734ed04bd159c2ff1b7bb5
> src/services/ServiceMetaBase.cpp 039146b29d648557c6b1960e84b23872b4da823e
> src/services/lastfm/meta/LastFmMeta.h 6d93cad50fba629a4a278e3380b56859dde5616a
> src/services/lastfm/meta/LastFmMeta.cpp 0e7659bd570d0dff18e6555b772228937bb9269b
> src/services/lastfm/meta/LastFmMeta_p.h 33f3b73b18fef3227811011fa3900ed5fbe50fcf
> src/services/magnatune/MagnatuneMeta.cpp 523617be763834927d685fb070778e39c20b114f
> src/widgets/Osd.cpp 423be4a009c82f71f23a364c16a170a24db2f8ac
> tests/core-impl/collections/db/sql/TestSqlScanManager.cpp 2dbed81808989b96361b99cf0650699b53fc28fa
> tests/core-impl/collections/db/sql/TestSqlTrack.cpp cb789f71350b8acf7aa6272846d36e7b6c505308
> tests/core-impl/meta/file/TestMetaFileTrack.h a7759e0703301870d22791eb9a4c5b60368fc637
> tests/core-impl/meta/file/TestMetaFileTrack.cpp 7549a585e25e2e552d633df2fd9174aeaf7813b1
> tests/core/meta/TestMetaTrack.cpp 0adb7633538533202c50487b1eaff8e4ead150e9
> tests/mocks/MetaMock.h 6a706a4472b127fa38f596cb2c780e3ef2278dba
>
> Diff: http://git.reviewboard.kde.org/r/106494/diff/
>
>
> Testing
> -------
>
> Everything works as before in my testing and something better: first/last date is correctly read/saved to file tracks, stats are newly preserved for streams.
>
> Individual commits should be available at http://quickgit.kde.org/index.php?p=clones%2Famarok%2Flaitl%2Famarok.git&a=shortlog&h=refs/heads/statistics-refactor in a few moments
>
>
> Thanks,
>
> Matěj Laitl
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.kde.org/pipermail/amarok-devel/attachments/20120923/24801130/attachment-0001.html>
More information about the Amarok-devel
mailing list