File indexing completed on 2024-05-19 04:49:16
0001 /**************************************************************************************** 0002 * Copyright (c) 2009 Maximilian Kossick <maximilian.kossick@googlemail.com> * 0003 * * 0004 * This program is free software; you can redistribute it and/or modify it under * 0005 * the terms of the GNU General Public License as published by the Free Software * 0006 * Foundation; either version 2 of the License, or (at your option) any later * 0007 * version. * 0008 * * 0009 * This program is distributed in the hope that it will be useful, but WITHOUT ANY * 0010 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A * 0011 * PARTICULAR PURPOSE. See the GNU General Public License for more details. * 0012 * * 0013 * You should have received a copy of the GNU General Public License along with * 0014 * this program. If not, see <http://www.gnu.org/licenses/>. * 0015 ****************************************************************************************/ 0016 0017 #include "MemoryCustomValue.h" 0018 0019 #include "core/meta/Meta.h" 0020 #include "core/meta/Statistics.h" 0021 0022 #include <QSet> 0023 0024 class SumReturnFunction : public CustomReturnFunction 0025 { 0026 public: 0027 SumReturnFunction( CustomReturnValue * rv ) : returnValue( rv ) {} 0028 ~SumReturnFunction() override { delete returnValue; } 0029 0030 QString value( const Meta::TrackList &tracks ) const override 0031 { 0032 if( !returnValue ) 0033 return QString::number( 0 ); 0034 0035 double sum = 0.0; 0036 foreach( const Meta::TrackPtr &track, tracks ) 0037 sum += returnValue->value( track ).toDouble(); 0038 0039 return QString::number( sum ); 0040 } 0041 0042 private: 0043 CustomReturnValue *returnValue; 0044 }; 0045 0046 class MinimumReturnFunction : public CustomReturnFunction 0047 { 0048 public: 0049 MinimumReturnFunction( CustomReturnValue * rv ) : returnValue( rv ) {} 0050 ~MinimumReturnFunction() override { delete returnValue; } 0051 0052 QString value( const Meta::TrackList &tracks ) const override 0053 { 0054 if( tracks.empty() || !returnValue ) 0055 return QString::number( 0 ); 0056 0057 double min = returnValue->value( tracks.first() ).toDouble(); 0058 foreach( const Meta::TrackPtr &track, tracks ) 0059 min = qMin( min, returnValue->value( track ).toDouble() ); 0060 0061 return QString::number( min ); 0062 } 0063 0064 private: 0065 CustomReturnValue *returnValue; 0066 }; 0067 0068 class MaximumReturnFunction : public CustomReturnFunction 0069 { 0070 public: 0071 MaximumReturnFunction( CustomReturnValue * rv ) : returnValue( rv ) {} 0072 ~MaximumReturnFunction() override { delete returnValue; } 0073 0074 QString value( const Meta::TrackList &tracks ) const override 0075 { 0076 if( tracks.empty() || !returnValue ) 0077 return QString::number( 0 ); 0078 0079 double max = returnValue->value( tracks.first() ).toDouble(); 0080 foreach( const Meta::TrackPtr &track, tracks ) 0081 max = qMax( max, returnValue->value( track ).toDouble() ); 0082 0083 return QString::number( max ); 0084 } 0085 0086 private: 0087 CustomReturnValue *returnValue; 0088 }; 0089 0090 CustomReturnFunction* 0091 CustomValueFactory::returnFunction( Collections::QueryMaker::ReturnFunction function, qint64 value ) 0092 { 0093 switch( function ) 0094 { 0095 case Collections::QueryMaker::Count: 0096 { 0097 switch( value ) 0098 { 0099 case Meta::valUrl: 0100 case Meta::valTitle: 0101 { 0102 return new TrackCounter(); 0103 } 0104 case Meta::valArtist: 0105 { 0106 return new ArtistCounter(); 0107 } 0108 case Meta::valAlbum: 0109 { 0110 return new AlbumCounter(); 0111 } 0112 case Meta::valGenre: 0113 { 0114 return new GenreCounter(); 0115 } 0116 case Meta::valComposer: 0117 { 0118 return new ComposerCounter(); 0119 } 0120 case Meta::valYear: 0121 { 0122 return new YearCounter(); 0123 } 0124 default: 0125 return nullptr; 0126 } 0127 } 0128 case Collections::QueryMaker::Sum: 0129 { 0130 CustomReturnValue *crv = CustomValueFactory::returnValue( value ); 0131 return crv ? new SumReturnFunction( crv ) : nullptr; 0132 } 0133 case Collections::QueryMaker::Min: 0134 { 0135 CustomReturnValue *crv = CustomValueFactory::returnValue( value ); 0136 return crv ? new MinimumReturnFunction( crv ) : nullptr; 0137 } 0138 case Collections::QueryMaker::Max: 0139 { 0140 CustomReturnValue *crv = CustomValueFactory::returnValue( value ); 0141 return crv ? new MaximumReturnFunction( crv ) : nullptr; 0142 } 0143 default: 0144 return nullptr; 0145 } 0146 } 0147 0148 CustomReturnFunction::CustomReturnFunction() 0149 { 0150 } 0151 0152 CustomReturnFunction::~CustomReturnFunction() 0153 { 0154 } 0155 0156 CustomReturnValue::CustomReturnValue() 0157 { 0158 } 0159 0160 CustomReturnValue::~CustomReturnValue() 0161 { 0162 } 0163 0164 TrackCounter::TrackCounter() 0165 { 0166 } 0167 0168 TrackCounter::~TrackCounter() 0169 { 0170 } 0171 0172 QString 0173 TrackCounter::value( const Meta::TrackList &tracks ) const 0174 { 0175 return QString::number( tracks.count() ); 0176 } 0177 0178 ArtistCounter::ArtistCounter() 0179 { 0180 } 0181 0182 ArtistCounter::~ArtistCounter() 0183 { 0184 } 0185 0186 QString 0187 ArtistCounter::value( const Meta::TrackList &tracks ) const 0188 { 0189 QSet<Meta::ArtistPtr> artists; 0190 foreach( const Meta::TrackPtr &track, tracks ) 0191 { 0192 if( track->artist() ) 0193 artists.insert( track->artist() ); 0194 } 0195 return QString::number( artists.count() ); 0196 } 0197 0198 GenreCounter::GenreCounter() 0199 { 0200 } 0201 0202 GenreCounter::~GenreCounter() 0203 { 0204 } 0205 0206 QString 0207 GenreCounter::value( const Meta::TrackList &tracks ) const 0208 { 0209 QSet<Meta::GenrePtr> genres; 0210 foreach( const Meta::TrackPtr &track, tracks ) 0211 { 0212 if( track->genre() ) 0213 genres.insert( track->genre() ); 0214 } 0215 return QString::number( genres.count() ); 0216 } 0217 0218 AlbumCounter::AlbumCounter() 0219 { 0220 } 0221 0222 AlbumCounter::~AlbumCounter() 0223 { 0224 } 0225 0226 QString 0227 AlbumCounter::value( const Meta::TrackList &tracks ) const 0228 { 0229 QSet<Meta::AlbumPtr> albums; 0230 foreach( const Meta::TrackPtr &track, tracks ) 0231 { 0232 if( track->album() ) 0233 albums.insert( track->album() ); 0234 } 0235 return QString::number( albums.count() ); 0236 } 0237 0238 ComposerCounter::ComposerCounter() 0239 { 0240 } 0241 0242 ComposerCounter::~ComposerCounter() 0243 { 0244 } 0245 0246 QString 0247 ComposerCounter::value( const Meta::TrackList &tracks ) const 0248 { 0249 QSet<Meta::ComposerPtr> composers; 0250 foreach( const Meta::TrackPtr &track, tracks ) 0251 { 0252 if( track->composer() ) 0253 composers.insert( track->composer() ); 0254 } 0255 return QString::number( composers.count() ); 0256 } 0257 0258 YearCounter::YearCounter() 0259 { 0260 } 0261 0262 YearCounter::~YearCounter() 0263 { 0264 } 0265 0266 QString 0267 YearCounter::value( const Meta::TrackList &tracks ) const 0268 { 0269 QSet<Meta::YearPtr> years; 0270 foreach( const Meta::TrackPtr &track, tracks ) 0271 { 0272 if( track->year() ) 0273 years.insert( track->year() ); 0274 } 0275 return QString::number( years.count() ); 0276 } 0277 0278 0279 //CustomReturnValues 0280 0281 TitleReturnValue::TitleReturnValue() 0282 { 0283 } 0284 0285 TitleReturnValue::~TitleReturnValue() 0286 { 0287 } 0288 0289 QString 0290 TitleReturnValue::value( const Meta::TrackPtr &track ) const 0291 { 0292 return track->name(); 0293 } 0294 0295 UrlReturnValue::UrlReturnValue() 0296 { 0297 } 0298 0299 UrlReturnValue::~UrlReturnValue() 0300 { 0301 } 0302 0303 QString 0304 UrlReturnValue::value( const Meta::TrackPtr &track ) const 0305 { 0306 return track->playableUrl().url(); 0307 } 0308 0309 class ArtistReturnValue : public CustomReturnValue 0310 { 0311 public: 0312 ArtistReturnValue() {} 0313 ~ArtistReturnValue() override {} 0314 QString value( const Meta::TrackPtr &track ) const override { return track->artist() ? track->artist()->name() : QString(); } 0315 }; 0316 0317 class AlbumReturnValue : public CustomReturnValue 0318 { 0319 public: 0320 AlbumReturnValue() {} 0321 ~AlbumReturnValue() override {} 0322 QString value( const Meta::TrackPtr &track ) const override { return track->album() ? track->album()->name() : QString(); } 0323 }; 0324 0325 class ComposerReturnValue : public CustomReturnValue 0326 { 0327 public: 0328 ComposerReturnValue() {} 0329 ~ComposerReturnValue() override {} 0330 QString value( const Meta::TrackPtr &track ) const override { return track->composer() ? track->composer()->name() : QString(); } 0331 }; 0332 0333 class GenreReturnValue : public CustomReturnValue 0334 { 0335 public: 0336 GenreReturnValue() {} 0337 ~GenreReturnValue() override {} 0338 QString value( const Meta::TrackPtr &track ) const override { return track->genre() ? track->genre()->name() : QString(); } 0339 }; 0340 0341 class YearReturnValue : public CustomReturnValue 0342 { 0343 public: 0344 YearReturnValue() {} 0345 ~YearReturnValue() override {} 0346 QString value( const Meta::TrackPtr &track ) const override { return track->year() ? track->year()->name() : QString(); } 0347 }; 0348 0349 class CommentReturnValue : public CustomReturnValue 0350 { 0351 public: 0352 CommentReturnValue() {} 0353 ~CommentReturnValue() override {} 0354 QString value( const Meta::TrackPtr &track ) const override { return track->comment(); } 0355 }; 0356 0357 class TrackNrReturnValue : public CustomReturnValue 0358 { 0359 public: 0360 TrackNrReturnValue() {} 0361 ~TrackNrReturnValue() override {} 0362 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->trackNumber() ); } 0363 }; 0364 0365 class DiscNrReturnValue : public CustomReturnValue 0366 { 0367 public: 0368 DiscNrReturnValue() {} 0369 ~DiscNrReturnValue() override {} 0370 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->discNumber() ); } 0371 }; 0372 0373 class ScoreReturnValue : public CustomReturnValue 0374 { 0375 public: 0376 ScoreReturnValue() {} 0377 ~ScoreReturnValue() override {} 0378 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->statistics()->score() ); } 0379 }; 0380 0381 class RatingReturnValue : public CustomReturnValue 0382 { 0383 public: 0384 RatingReturnValue() {} 0385 ~RatingReturnValue() override {} 0386 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->statistics()->rating() ); } 0387 }; 0388 0389 class PlaycountReturnValue : public CustomReturnValue 0390 { 0391 public: 0392 PlaycountReturnValue() {} 0393 ~PlaycountReturnValue() override {} 0394 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->statistics()->playCount() ); } 0395 }; 0396 0397 class LengthReturnValue : public CustomReturnValue 0398 { 0399 public: 0400 LengthReturnValue() {} 0401 ~LengthReturnValue() override {} 0402 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->length() / 1000 ); } 0403 }; 0404 0405 class BitrateReturnValue : public CustomReturnValue 0406 { 0407 public: 0408 BitrateReturnValue() {} 0409 ~BitrateReturnValue() override {} 0410 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->bitrate() ); } 0411 }; 0412 0413 class FileSizeReturnValue : public CustomReturnValue 0414 { 0415 public: 0416 FileSizeReturnValue() {} 0417 ~FileSizeReturnValue() override {} 0418 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->filesize() ); } 0419 }; 0420 0421 class SampleRateReturnValue : public CustomReturnValue 0422 { 0423 public: 0424 SampleRateReturnValue() {} 0425 ~SampleRateReturnValue() override {} 0426 QString value( const Meta::TrackPtr &track ) const override { return QString::number( track->sampleRate() ); } 0427 }; 0428 0429 CustomReturnValue* 0430 CustomValueFactory::returnValue( qint64 value ) 0431 { 0432 switch( value ) 0433 { 0434 case Meta::valTitle: 0435 { 0436 return new TitleReturnValue(); 0437 } 0438 case Meta::valUrl: 0439 { 0440 return new UrlReturnValue(); 0441 } 0442 case Meta::valArtist: 0443 { 0444 return new ArtistReturnValue(); 0445 } 0446 case Meta::valAlbum: 0447 { 0448 return new AlbumReturnValue(); 0449 } 0450 case Meta::valGenre: 0451 { 0452 return new GenreReturnValue(); 0453 } 0454 case Meta::valComposer: 0455 { 0456 return new ComposerReturnValue(); 0457 } 0458 case Meta::valYear: 0459 { 0460 return new YearReturnValue(); 0461 } 0462 case Meta::valComment: 0463 { 0464 return new CommentReturnValue(); 0465 } 0466 case Meta::valTrackNr: 0467 { 0468 return new TrackNrReturnValue(); 0469 } 0470 case Meta::valDiscNr: 0471 { 0472 return new DiscNrReturnValue(); 0473 } 0474 case Meta::valScore: 0475 { 0476 return new ScoreReturnValue(); 0477 } 0478 case Meta::valRating: 0479 { 0480 return new RatingReturnValue(); 0481 } 0482 case Meta::valPlaycount: 0483 { 0484 return new PlaycountReturnValue(); 0485 } 0486 case Meta::valLength: 0487 { 0488 return new LengthReturnValue(); 0489 } 0490 case Meta::valBitrate: 0491 { 0492 return new BitrateReturnValue(); 0493 } 0494 case Meta::valFilesize: 0495 { 0496 return new FileSizeReturnValue(); 0497 } 0498 case Meta::valSamplerate: 0499 { 0500 return new SampleRateReturnValue(); 0501 } 0502 default: 0503 return nullptr; 0504 } 0505 }