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 }