diff --git a/src/libs/recommendation/impl/Engine.cpp b/src/libs/recommendation/impl/Engine.cpp index 397a7cda..ca520850 100644 --- a/src/libs/recommendation/impl/Engine.cpp +++ b/src/libs/recommendation/impl/Engine.cpp @@ -169,38 +169,45 @@ Engine::load(bool forceReload, const ProgressCallback& progressCallback) { using namespace Database; - static const std::unordered_map> classifierMappings + LMS_LOG(RECOMMENDATION, INFO) << "Reloading recommendation engines..."; + struct ClassifierWithType { - {ScanSettings::RecommendationEngineType::Features, {ClassifierType::Clusters, ClassifierType::Features}}, - {ScanSettings::RecommendationEngineType::Clusters, {ClassifierType::Clusters}}, + ClassifierType type; + std::unique_ptr classifier; }; - LMS_LOG(RECOMMENDATION, INFO) << "Reloading recommendation engines..."; + std::vector classifiers; + auto addClassifier {[&](ClassifierType type) + { + classifiers.emplace_back(ClassifierWithType {type, createClassifier(type)}); + }}; - const ScanSettings::RecommendationEngineType engineType {getRecommendationEngineType(_db.getTLSSession())}; + switch (getRecommendationEngineType(_db.getTLSSession())) + { + case ScanSettings::RecommendationEngineType::Clusters: + setClassifierPriorities({ClassifierType::Clusters}); + addClassifier(ClassifierType::Clusters); + break; + case ScanSettings::RecommendationEngineType::Features: + setClassifierPriorities({ClassifierType::Features, ClassifierType::Clusters}); + // not same order since clusters is faster to load + addClassifier(ClassifierType::Clusters); + addClassifier(ClassifierType::Features); + break; + } assert(_pendingClassifiers.empty()); clearClassifiers(); - auto itClassifierTypes {classifierMappings.find(engineType)}; - assert(itClassifierTypes != std::cend(classifierMappings)); - const std::vector& classifierTypes {itClassifierTypes->second}; - - setClassifierPriorities(classifierTypes); - - std::vector> classifiers; - for (ClassifierType type : classifierTypes) - classifiers.emplace_back(createClassifier(type)); - { std::scoped_lock lock {_controlMutex}; std::transform(std::cbegin(classifiers), std::cend(classifiers), std::inserter(_pendingClassifiers, std::end(_pendingClassifiers)), - [](auto& classifier) { return classifier.get(); }); + [](auto& classifier) { return classifier.classifier.get(); }); } - for (std::size_t i {}; i < classifiers.size(); ++i) - loadClassifier(std::move(classifiers[i]), classifierTypes[i], forceReload, progressCallback); + for (ClassifierWithType& classifier : classifiers) + loadClassifier(std::move(classifier.classifier), classifier.type, forceReload, progressCallback); LMS_LOG(RECOMMENDATION, INFO) << "Recommendation engines loaded!"; } @@ -254,9 +261,7 @@ Engine::loadClassifier(std::unique_ptr classifier, { std::scoped_lock lock {_controlMutex}; - LMS_LOG(RECOMMENDATION, DEBUG) << "About to erase. _pendingClassifiers size = " << _pendingClassifiers.size(); _pendingClassifiers.erase(rawClassifier); - LMS_LOG(RECOMMENDATION, DEBUG) << "Erased. _pendingClassifiers size = " << _pendingClassifiers.size(); } _pendingClassifiersCondvar.notify_one(); diff --git a/src/libs/scanner/impl/MediaScanner.cpp b/src/libs/scanner/impl/MediaScanner.cpp index 65fd3399..f8759b52 100644 --- a/src/libs/scanner/impl/MediaScanner.cpp +++ b/src/libs/scanner/impl/MediaScanner.cpp @@ -276,7 +276,11 @@ MediaScanner::start() if (_abortScan) return; - _recommendationEngine.load(false); + _recommendationEngine.load(false, + [](const Recommendation::IEngine::Progress& progress) + { + LMS_LOG(DBUPDATER, DEBUG) << "Reloading recommendation : " << progress.processedElems << "/" << progress.totalElems; + }); scheduleNextScan(); });