File indexing completed on 2024-05-19 04:49:18
0001 /**************************************************************************************** 0002 * Copyright (c) 2010 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 "MemoryQueryMakerInternal.h" 0018 0019 #include "MemoryCollection.h" 0020 #include "MemoryCustomValue.h" 0021 #include "MemoryFilter.h" 0022 #include "MemoryMatcher.h" 0023 #include "MemoryQueryMakerHelper.h" 0024 0025 #include "core/meta/Meta.h" 0026 0027 #include <QSharedPointer> 0028 0029 #include <KSortableList> 0030 0031 namespace Collections { 0032 0033 MemoryQueryMakerInternal::MemoryQueryMakerInternal( const QWeakPointer<MemoryCollection> &collection ) 0034 : QObject() 0035 , m_collection( collection ) 0036 , m_matchers( nullptr ) 0037 , m_filters( nullptr ) 0038 , m_maxSize( 0 ) 0039 , m_type( QueryMaker::None ) 0040 , m_albumQueryMode( QueryMaker::AllAlbums ) 0041 , m_orderDescending( false ) 0042 , m_orderByNumberField( false ) 0043 , m_orderByField( 0 ) 0044 { 0045 0046 } 0047 0048 MemoryQueryMakerInternal::~MemoryQueryMakerInternal() 0049 { 0050 delete m_filters; 0051 delete m_matchers; 0052 qDeleteAll( m_returnFunctions ); 0053 qDeleteAll( m_returnValues ); 0054 } 0055 0056 void 0057 MemoryQueryMakerInternal::runQuery() 0058 { 0059 QSharedPointer<MemoryCollection> coll = m_collection.toStrongRef(); 0060 if( coll ) 0061 coll->acquireReadLock(); 0062 //naive implementation, fix this 0063 if ( m_matchers ) 0064 { 0065 Meta::TrackList result = coll ? m_matchers->match( coll.data() ) : Meta::TrackList(); 0066 if ( m_filters ) 0067 { 0068 Meta::TrackList filtered; 0069 foreach( Meta::TrackPtr track, result ) 0070 { 0071 if( m_filters->filterMatches( track ) ) 0072 filtered.append( track ); 0073 } 0074 handleResult( filtered ); 0075 } 0076 else 0077 handleResult( result ); 0078 } 0079 else if ( m_filters ) 0080 { 0081 Meta::TrackList tracks = coll ? coll->trackMap().values() : Meta::TrackList(); 0082 Meta::TrackList filtered; 0083 foreach( const Meta::TrackPtr &track, tracks ) 0084 { 0085 if ( m_filters->filterMatches( track ) ) 0086 filtered.append( track ); 0087 } 0088 handleResult( filtered ); 0089 } 0090 else 0091 handleResult(); 0092 if( coll ) 0093 coll->releaseLock(); 0094 } 0095 0096 template<typename T> 0097 static inline QList<T> reverse(const QList<T> &l) 0098 { 0099 QList<T> ret; 0100 for (int i=l.size() - 1; i>=0; --i) 0101 ret.append(l.at(i)); 0102 return ret; 0103 } 0104 0105 void 0106 MemoryQueryMakerInternal::handleResult() 0107 { 0108 QSharedPointer<MemoryCollection> coll = m_collection.toStrongRef(); 0109 //this gets called when we want to return all values for the given query type 0110 switch( m_type ) 0111 { 0112 case QueryMaker::Custom : 0113 { 0114 QStringList result; 0115 Meta::TrackList tmpTracks = coll ? coll->trackMap().values() : Meta::TrackList(); 0116 Meta::TrackList tracks; 0117 foreach( const Meta::TrackPtr &track, tmpTracks ) 0118 { 0119 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0120 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && track->album()->isCompilation() ) 0121 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && !track->album()->isCompilation()) ) && 0122 ( m_labelQueryMode == QueryMaker::NoConstraint 0123 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0124 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0125 { 0126 tracks.append( track ); 0127 } 0128 } 0129 0130 if( !m_returnFunctions.empty() ) 0131 { 0132 //no sorting necessary 0133 foreach( CustomReturnFunction *function, m_returnFunctions ) 0134 { 0135 result.append( function->value( tracks ) ); 0136 } 0137 } 0138 else if( !m_returnValues.empty() ) 0139 { 0140 if( m_orderByField ) 0141 { 0142 if( m_orderByNumberField ) 0143 tracks = MemoryQueryMakerHelper::orderListByNumber( tracks, m_orderByField, m_orderDescending ); 0144 else 0145 tracks = MemoryQueryMakerHelper::orderListByString( tracks, m_orderByField, m_orderDescending ); 0146 } 0147 0148 int count = 0; 0149 foreach( const Meta::TrackPtr &track, tracks ) 0150 { 0151 if ( m_maxSize >= 0 && count == m_maxSize ) 0152 break; 0153 0154 foreach( CustomReturnValue *value, m_returnValues ) 0155 { 0156 result.append( value->value( track ) ); 0157 } 0158 count++; 0159 } 0160 } 0161 Q_EMIT newResultReady( result ); 0162 break; 0163 } 0164 case QueryMaker::Track : 0165 { 0166 Meta::TrackList tracks; 0167 0168 Meta::TrackList tmpTracks = coll ? coll->trackMap().values() : Meta::TrackList(); 0169 foreach( Meta::TrackPtr track, tmpTracks ) 0170 { 0171 Meta::AlbumPtr album = track->album(); 0172 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0173 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && (!album || album->isCompilation()) ) 0174 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && (album && !album->isCompilation()) ) ) && 0175 ( m_labelQueryMode == QueryMaker::NoConstraint 0176 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0177 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0178 { 0179 tracks.append( track ); 0180 } 0181 } 0182 0183 if( m_orderByField ) 0184 { 0185 if( m_orderByNumberField ) 0186 tracks = MemoryQueryMakerHelper::orderListByNumber( tracks, m_orderByField, m_orderDescending ); 0187 else 0188 tracks = MemoryQueryMakerHelper::orderListByString( tracks, m_orderByField, m_orderDescending ); 0189 } 0190 0191 Q_EMIT newTracksReady( tracks ); 0192 break; 0193 } 0194 case QueryMaker::Album : 0195 { 0196 Meta::AlbumList albums; 0197 Meta::AlbumList tmp = coll ? coll->albumMap().values() : Meta::AlbumList(); 0198 foreach( Meta::AlbumPtr album, tmp ) 0199 { 0200 Meta::TrackList tracks = album->tracks(); 0201 foreach( Meta::TrackPtr track, tracks ) 0202 { 0203 Meta::AlbumPtr album = track->album(); 0204 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0205 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && (!album || album->isCompilation()) ) 0206 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && (album && !album->isCompilation()) ) ) && 0207 ( m_labelQueryMode == QueryMaker::NoConstraint 0208 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0209 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0210 { 0211 albums.append( album ); 0212 break; 0213 } 0214 } 0215 } 0216 0217 albums = MemoryQueryMakerHelper::orderListByName<Meta::AlbumPtr>( albums, m_orderDescending ); 0218 0219 Q_EMIT newAlbumsReady( albums ); 0220 break; 0221 } 0222 case QueryMaker::Artist : 0223 { 0224 Meta::ArtistList artists; 0225 Meta::ArtistList tmp = coll ? coll->artistMap().values() : Meta::ArtistList(); 0226 foreach( Meta::ArtistPtr artist, tmp ) 0227 { 0228 Meta::TrackList tracks = artist->tracks(); 0229 foreach( Meta::TrackPtr track, tracks ) 0230 { 0231 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0232 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && track->album()->isCompilation() ) 0233 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && !track->album()->isCompilation()) ) && 0234 ( m_labelQueryMode == QueryMaker::NoConstraint 0235 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0236 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0237 { 0238 artists.append( artist ); 0239 break; 0240 } 0241 } 0242 } 0243 artists = MemoryQueryMakerHelper::orderListByName<Meta::ArtistPtr>( artists, m_orderDescending ); 0244 Q_EMIT newArtistsReady( artists ); 0245 break; 0246 } 0247 case QueryMaker::AlbumArtist : 0248 { 0249 Meta::ArtistList artists; 0250 Meta::AlbumList tmp = coll ? coll->albumMap().values() : Meta::AlbumList(); 0251 foreach( Meta::AlbumPtr album, tmp ) 0252 { 0253 if( !album->hasAlbumArtist() ) 0254 continue; 0255 0256 Meta::TrackList tracks = album->tracks(); 0257 foreach( Meta::TrackPtr track, tracks ) 0258 { 0259 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0260 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && album->isCompilation() ) 0261 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && !album->isCompilation()) ) && 0262 ( m_labelQueryMode == QueryMaker::NoConstraint 0263 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0264 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0265 { 0266 artists.append( album->albumArtist() ); 0267 break; 0268 } 0269 } 0270 } 0271 artists = MemoryQueryMakerHelper::orderListByName<Meta::ArtistPtr>( artists, m_orderDescending ); 0272 Q_EMIT newArtistsReady( artists ); 0273 break; 0274 } 0275 case QueryMaker::Composer : 0276 { 0277 Meta::ComposerList composers; 0278 Meta::ComposerList tmp = coll ? coll->composerMap().values() : Meta::ComposerList(); 0279 foreach( Meta::ComposerPtr composer, tmp ) 0280 { 0281 Meta::TrackList tracks = composer->tracks(); 0282 foreach( Meta::TrackPtr track, tracks ) 0283 { 0284 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0285 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && track->album()->isCompilation() ) 0286 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && !track->album()->isCompilation()) ) && 0287 ( m_labelQueryMode == QueryMaker::NoConstraint 0288 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0289 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0290 { 0291 composers.append( composer ); 0292 break; 0293 } 0294 } 0295 } 0296 composers = MemoryQueryMakerHelper::orderListByName<Meta::ComposerPtr>( composers, m_orderDescending ); 0297 0298 Q_EMIT newComposersReady( composers ); 0299 break; 0300 } 0301 case QueryMaker::Genre : 0302 { 0303 Meta::GenreList genres; 0304 Meta::GenreList tmp = coll ? coll->genreMap().values() : Meta::GenreList(); 0305 foreach( Meta::GenrePtr genre, tmp ) 0306 { 0307 Meta::TrackList tracks = genre->tracks(); 0308 foreach( Meta::TrackPtr track, tracks ) 0309 { 0310 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0311 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && track->album()->isCompilation() ) 0312 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && !track->album()->isCompilation()) ) && 0313 ( m_labelQueryMode == QueryMaker::NoConstraint 0314 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0315 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0316 { 0317 genres.append( genre ); 0318 break; 0319 } 0320 } 0321 } 0322 0323 genres = MemoryQueryMakerHelper::orderListByName<Meta::GenrePtr>( genres, m_orderDescending ); 0324 0325 Q_EMIT newGenresReady( genres ); 0326 break; 0327 } 0328 case QueryMaker::Year : 0329 { 0330 Meta::YearList years; 0331 Meta::YearList tmp = coll ? coll->yearMap().values() : Meta::YearList(); 0332 foreach( Meta::YearPtr year, tmp ) 0333 { 0334 Meta::TrackList tracks = year->tracks(); 0335 foreach( Meta::TrackPtr track, tracks ) 0336 { 0337 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0338 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && track->album()->isCompilation() ) 0339 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && !track->album()->isCompilation()) ) && 0340 ( m_labelQueryMode == QueryMaker::NoConstraint 0341 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0342 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0343 { 0344 years.append( year ); 0345 break; 0346 } 0347 } 0348 } 0349 0350 //this a special case which requires a bit of code duplication 0351 //years have to be ordered as numbers, but orderListByNumber does not work for Meta::YearPtrs 0352 if( m_orderByField == Meta::valYear ) 0353 { 0354 years = MemoryQueryMakerHelper::orderListByYear( years, m_orderDescending ); 0355 } 0356 0357 Q_EMIT newYearsReady( years ); 0358 break; 0359 } 0360 case QueryMaker::Label: 0361 { 0362 Meta::LabelList labels; 0363 Meta::LabelList tmp = coll ? coll->labelMap().values() : Meta::LabelList(); 0364 foreach( const Meta::LabelPtr &label, tmp ) 0365 { 0366 Meta::TrackList tracks = coll ? coll->labelToTrackMap().value( label ) : Meta::TrackList(); 0367 foreach( const Meta::TrackPtr &track, tracks ) 0368 { 0369 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0370 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && track->album()->isCompilation() ) 0371 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && !track->album()->isCompilation()) ) && 0372 ( m_labelQueryMode == QueryMaker::NoConstraint 0373 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0374 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0375 { 0376 labels.append( label ); 0377 break; 0378 } 0379 } 0380 } 0381 0382 labels = MemoryQueryMakerHelper::orderListByName<Meta::LabelPtr>( labels, m_orderDescending ); 0383 0384 Q_EMIT newLabelsReady( labels ); 0385 break; 0386 } 0387 case QueryMaker::None : 0388 //nothing to do 0389 break; 0390 } 0391 } 0392 0393 void 0394 MemoryQueryMakerInternal::handleResult( const Meta::TrackList &tmpTracks ) 0395 { 0396 Meta::TrackList tracks; 0397 foreach( const Meta::TrackPtr &track, tmpTracks ) 0398 { 0399 if( ( m_albumQueryMode == QueryMaker::AllAlbums 0400 || ( m_albumQueryMode == QueryMaker::OnlyCompilations && track->album()->isCompilation() ) 0401 || ( m_albumQueryMode == QueryMaker::OnlyNormalAlbums && !track->album()->isCompilation()) ) && 0402 ( m_labelQueryMode == QueryMaker::NoConstraint 0403 || ( m_labelQueryMode == QueryMaker::OnlyWithLabels && track->labels().count() > 0 ) 0404 || ( m_labelQueryMode == QueryMaker::OnlyWithoutLabels && track->labels().isEmpty()) ) ) 0405 { 0406 tracks.append( track ); 0407 } 0408 } 0409 0410 switch( m_type ) 0411 { 0412 case QueryMaker::Custom : 0413 { 0414 QStringList result; 0415 if( !m_returnFunctions.empty() ) 0416 { 0417 //no sorting necessary 0418 foreach( CustomReturnFunction *function, m_returnFunctions ) 0419 { 0420 result.append( function->value( tracks ) ); 0421 } 0422 } 0423 else if( !m_returnValues.empty() ) 0424 { 0425 Meta::TrackList resultTracks = tracks; 0426 if( m_orderByField ) 0427 { 0428 if( m_orderByNumberField ) 0429 resultTracks = MemoryQueryMakerHelper::orderListByNumber( resultTracks, m_orderByField, m_orderDescending ); 0430 else 0431 resultTracks = MemoryQueryMakerHelper::orderListByString( resultTracks, m_orderByField, m_orderDescending ); 0432 } 0433 0434 int count = 0; 0435 foreach( const Meta::TrackPtr &track, resultTracks ) 0436 { 0437 if ( m_maxSize >= 0 && count == m_maxSize ) 0438 break; 0439 0440 foreach( CustomReturnValue *value, m_returnValues ) 0441 { 0442 result.append( value->value( track ) ); 0443 } 0444 count++; 0445 } 0446 } 0447 Q_EMIT newResultReady( result ); 0448 break; 0449 } 0450 case QueryMaker::Track : 0451 { 0452 Meta::TrackList newResult; 0453 0454 if( m_orderByField ) 0455 { 0456 if( m_orderByNumberField ) 0457 newResult = MemoryQueryMakerHelper::orderListByNumber( tracks, m_orderByField, m_orderDescending ); 0458 else 0459 newResult = MemoryQueryMakerHelper::orderListByString( tracks, m_orderByField, m_orderDescending ); 0460 } 0461 else 0462 newResult = tracks; 0463 0464 Q_EMIT newTracksReady( newResult ); 0465 break; 0466 } 0467 case QueryMaker::Album : 0468 { 0469 QSet<Meta::AlbumPtr> albumSet; 0470 foreach( Meta::TrackPtr track, tracks ) 0471 { 0472 albumSet.insert( track->album() ); 0473 } 0474 Meta::AlbumList albumList = albumSet.values(); 0475 albumList = MemoryQueryMakerHelper::orderListByName<Meta::AlbumPtr>( albumList, m_orderDescending ); 0476 Q_EMIT newAlbumsReady( albumList ); 0477 break; 0478 } 0479 case QueryMaker::Artist : 0480 { 0481 QSet<Meta::ArtistPtr> artistSet; 0482 foreach( Meta::TrackPtr track, tracks ) 0483 { 0484 artistSet.insert( track->artist() ); 0485 } 0486 Meta::ArtistList list = artistSet.values(); 0487 list = MemoryQueryMakerHelper::orderListByName<Meta::ArtistPtr>( list, m_orderDescending ); 0488 Q_EMIT newArtistsReady( list ); 0489 break; 0490 } 0491 case QueryMaker::AlbumArtist : 0492 { 0493 QSet<Meta::ArtistPtr> artistSet; 0494 foreach( Meta::TrackPtr track, tracks ) 0495 { 0496 if( !track->album().isNull() && track->album()->hasAlbumArtist() ) 0497 artistSet.insert( track->album()->albumArtist() ); 0498 } 0499 Meta::ArtistList list = artistSet.values(); 0500 list = MemoryQueryMakerHelper::orderListByName<Meta::ArtistPtr>( list, m_orderDescending ); 0501 Q_EMIT newArtistsReady( list ); 0502 break; 0503 } 0504 case QueryMaker::Genre : 0505 { 0506 QSet<Meta::GenrePtr> genreSet; 0507 foreach( Meta::TrackPtr track, tracks ) 0508 { 0509 genreSet.insert( track->genre() ); 0510 } 0511 Meta::GenreList list = genreSet.values(); 0512 list = MemoryQueryMakerHelper::orderListByName<Meta::GenrePtr>( list, m_orderDescending ); 0513 Q_EMIT newGenresReady( list ); 0514 break; 0515 } 0516 case QueryMaker::Composer : 0517 { 0518 QSet<Meta::ComposerPtr> composerSet; 0519 foreach( Meta::TrackPtr track, tracks ) 0520 { 0521 composerSet.insert( track->composer() ); 0522 } 0523 Meta::ComposerList list = composerSet.values(); 0524 list = MemoryQueryMakerHelper::orderListByName<Meta::ComposerPtr>( list, m_orderDescending ); 0525 Q_EMIT newComposersReady( list ); 0526 break; 0527 } 0528 case QueryMaker::Year : 0529 { 0530 QSet<Meta::YearPtr> yearSet; 0531 foreach( Meta::TrackPtr track, tracks ) 0532 { 0533 yearSet.insert( track->year() ); 0534 } 0535 Meta::YearList years = yearSet.values(); 0536 if( m_orderByField == Meta::valYear ) 0537 { 0538 years = MemoryQueryMakerHelper::orderListByYear( years, m_orderDescending ); 0539 } 0540 0541 Q_EMIT newYearsReady( years ); 0542 break; 0543 } 0544 case QueryMaker::Label: 0545 { 0546 QSet<Meta::LabelPtr> labelSet; 0547 foreach( const Meta::TrackPtr &track, tracks ) 0548 { 0549 Meta::LabelList tracklabels=track->labels(); 0550 QSet<Meta::LabelPtr> addLabelsSet(tracklabels.begin(), tracklabels.end()); 0551 labelSet.unite( addLabelsSet ); 0552 } 0553 Meta::LabelList labels = labelSet.values(); 0554 if( m_orderByField == Meta::valLabel ) 0555 { 0556 labels = MemoryQueryMakerHelper::orderListByName<Meta::LabelPtr>( labels, m_orderDescending ); 0557 } 0558 Q_EMIT newLabelsReady( labels ); 0559 break; 0560 } 0561 case QueryMaker::None: 0562 //should never happen, but handle error anyway 0563 break; 0564 } 0565 } 0566 0567 void 0568 MemoryQueryMakerInternal::setMatchers( MemoryMatcher *matchers ) 0569 { 0570 m_matchers = matchers; 0571 } 0572 0573 void 0574 MemoryQueryMakerInternal::setFilters( MemoryFilter *filters ) 0575 { 0576 m_filters = filters; 0577 } 0578 0579 void 0580 MemoryQueryMakerInternal::setMaxSize( int maxSize ) 0581 { 0582 m_maxSize = maxSize; 0583 } 0584 0585 void 0586 MemoryQueryMakerInternal::setType( QueryMaker::QueryType type ) 0587 { 0588 m_type = type; 0589 } 0590 0591 void 0592 MemoryQueryMakerInternal::setCustomReturnFunctions( const QList<CustomReturnFunction *> &functions ) 0593 { 0594 m_returnFunctions = functions; 0595 } 0596 0597 void 0598 MemoryQueryMakerInternal::setCustomReturnValues( const QList<CustomReturnValue *> &values ) 0599 { 0600 m_returnValues = values; 0601 } 0602 0603 } //namespace Collections 0604