Fixed search that may add infinite stuff

This commit is contained in:
emeric
2023-11-02 14:27:14 +01:00
parent 3697c809d3
commit e78f436d9a
7 changed files with 75 additions and 68 deletions
@@ -46,7 +46,7 @@ namespace Database
{ {
Range range; Range range;
std::vector<T> results; std::vector<T> results;
bool moreResults; bool moreResults{};
RangeResults getSubRange(Range subRange) RangeResults getSubRange(Range subRange)
{ {
+6 -3
View File
@@ -38,9 +38,12 @@ namespace UserInterface
Feedback::IFeedbackService& feedbackService{ *Service<Feedback::IFeedbackService>::get() }; Feedback::IFeedbackService& feedbackService{ *Service<Feedback::IFeedbackService>::get() };
Scrobbling::IScrobblingService& scrobblingService{ *Service<Scrobbling::IScrobblingService>::get() }; Scrobbling::IScrobblingService& scrobblingService{ *Service<Scrobbling::IScrobblingService>::get() };
range = getActualRange(range);
RangeResults<ArtistId> artists; RangeResults<ArtistId> artists;
range = getActualRange(range);
if (range.size == 0)
return artists;
switch (getMode()) switch (getMode())
{ {
case Mode::Random: case Mode::Random:
@@ -76,11 +79,11 @@ namespace UserInterface
case Mode::Search: case Mode::Search:
{ {
// do not sort results as we search in both name and sort names, sorting may be very long
Artist::FindParameters params; Artist::FindParameters params;
params.setClusters(getFilters().getClusterIds()); params.setClusters(getFilters().getClusterIds());
params.setKeywords(getSearchKeywords()); params.setKeywords(getSearchKeywords());
params.setLinkType(_linkType); params.setLinkType(_linkType);
params.setSortMethod(ArtistSortMethod::BySortName);
params.setRange(range); params.setRange(range);
{ {
+25 -24
View File
@@ -23,34 +23,35 @@
namespace UserInterface namespace UserInterface
{ {
DatabaseCollectorBase::DatabaseCollectorBase(Filters& filters, Mode defaultMode, std::size_t maxCount) DatabaseCollectorBase::DatabaseCollectorBase(Filters& filters, Mode defaultMode, std::size_t maxCount)
: _filters {filters} : _filters{ filters }
, _mode {defaultMode} , _mode{ defaultMode }
, _maxCount {maxCount} , _maxCount{ maxCount }
{ {
} }
DatabaseCollectorBase::Range DatabaseCollectorBase::Range DatabaseCollectorBase::getActualRange(Range range) const
DatabaseCollectorBase::getActualRange(Range range) const {
{ assert(range.size > 0);
assert(range.offset < _maxCount);
range.size = std::min(_maxCount - range.offset, range.size);
return range; if (range.offset < _maxCount)
} range.size = std::min(_maxCount - range.offset, range.size);
else
range.size = 0;
std::size_t return range;
DatabaseCollectorBase::getMaxCount() const }
{
return _maxCount;
}
void std::size_t DatabaseCollectorBase::getMaxCount() const
DatabaseCollectorBase::setSearch(std::string_view searchText) {
{ return _maxCount;
_searchText = searchText; }
_searchKeywords = StringUtils::splitString(_searchText, " ");
} void DatabaseCollectorBase::setSearch(std::string_view searchText)
{
_searchText = searchText;
_searchKeywords = StringUtils::splitString(_searchText, " ");
}
} // ns UserInterface } // ns UserInterface
+32 -33
View File
@@ -29,44 +29,43 @@
namespace UserInterface namespace UserInterface
{ {
class Filters; class Filters;
class DatabaseCollectorBase class DatabaseCollectorBase
{ {
public: public:
using Range = Database::Range; using Range = Database::Range;
virtual ~DatabaseCollectorBase() {} virtual ~DatabaseCollectorBase() {}
enum class Mode enum class Mode
{ {
Random, Random,
Starred, Starred,
RecentlyPlayed, RecentlyPlayed,
RecentlyAdded, RecentlyAdded,
MostPlayed, MostPlayed,
Search, Search,
All All
}; };
DatabaseCollectorBase(Filters& filters, Mode defaultMode, std::size_t maxCount); DatabaseCollectorBase(Filters& filters, Mode defaultMode, std::size_t maxCount);
Mode getMode() const { return _mode; } Mode getMode() const { return _mode; }
void setMode(Mode mode) { _mode = mode; } void setMode(Mode mode) { _mode = mode; }
void setSearch(std::string_view search); void setSearch(std::string_view search);
protected: protected:
Range getActualRange(Range range) const; Range getActualRange(Range range) const;
std::size_t getMaxCount() const; std::size_t getMaxCount() const;
Filters& getFilters() { return _filters; } Filters& getFilters() { return _filters; }
const std::vector<std::string_view>& getSearchKeywords() const { return _searchKeywords; } const std::vector<std::string_view>& getSearchKeywords() const { return _searchKeywords; }
private: private:
Filters& _filters; Filters& _filters;
std::string _searchText; std::string _searchText;
std::vector<std::string_view> _searchKeywords; std::vector<std::string_view> _searchKeywords;
Mode _mode; Mode _mode;
std::size_t _maxCount; std::size_t _maxCount;
}; };
} // ns UserInterface } // ns UserInterface
+4 -2
View File
@@ -41,9 +41,11 @@ namespace UserInterface
Feedback::IFeedbackService& feedbackService{ *Service<Feedback::IFeedbackService>::get() }; Feedback::IFeedbackService& feedbackService{ *Service<Feedback::IFeedbackService>::get() };
Scrobbling::IScrobblingService& scrobblingService{ *Service<Scrobbling::IScrobblingService>::get() }; Scrobbling::IScrobblingService& scrobblingService{ *Service<Scrobbling::IScrobblingService>::get() };
range = getActualRange(range);
RangeResults<ReleaseId> releases; RangeResults<ReleaseId> releases;
range = getActualRange(range);
if (range.size == 0)
return releases;
switch (getMode()) switch (getMode())
{ {
case Mode::Random: case Mode::Random:
+3 -3
View File
@@ -62,9 +62,9 @@ namespace UserInterface
}; };
static inline std::unordered_map<Mode, std::size_t> _maxCounts static inline std::unordered_map<Mode, std::size_t> _maxCounts
{ {
{Mode::Artist, 8000}, {Mode::Artist, 1000},
{Mode::Release, 4000}, {Mode::Release, 504},
{Mode::Track, 4000}, {Mode::Track, 500},
}; };
std::size_t getBatchSize(Mode mode) const; std::size_t getBatchSize(Mode mode) const;
std::size_t getMaxCount(Mode mode) const; std::size_t getMaxCount(Mode mode) const;
+4 -2
View File
@@ -41,9 +41,11 @@ namespace UserInterface
Feedback::IFeedbackService& feedbackService{*Service<Feedback::IFeedbackService>::get()}; Feedback::IFeedbackService& feedbackService{*Service<Feedback::IFeedbackService>::get()};
Scrobbling::IScrobblingService& scrobblingService {*Service<Scrobbling::IScrobblingService>::get()}; Scrobbling::IScrobblingService& scrobblingService {*Service<Scrobbling::IScrobblingService>::get()};
range = getActualRange(range);
RangeResults<TrackId> tracks; RangeResults<TrackId> tracks;
range = getActualRange(range);
if (range.size == 0)
return tracks;
switch (getMode()) switch (getMode())
{ {
case Mode::Random: case Mode::Random: