Skip to content

Commit d4cc4e4

Browse files
authored
Merge pull request mixxxdj#16703 from ronso0/search-bpm-fuzzy-with-half-double
Search: include half/double for fuzzy BPM search (~bpm:100)
2 parents 572384e + ff41a64 commit d4cc4e4

2 files changed

Lines changed: 14 additions & 6 deletions

File tree

src/library/searchquery.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -664,9 +664,15 @@ BpmFilterNode::BpmFilterNode(
664664
std::tie(m_rangeLower, m_rangeUpper) = rangeFromTrailingDecimal(bpm);
665665
break;
666666
}
667-
case MatchMode::Fuzzy: {
668-
m_rangeLower = floor((1 - s_relativeRange) * bpm);
669-
m_rangeUpper = ceil((1 + s_relativeRange) * bpm);
667+
case MatchMode::Fuzzy: { // 100
668+
m_rangeLower = floor((1 - s_relativeRange) * bpm); // 94
669+
m_rangeUpper = ceil((1 + s_relativeRange) * bpm); // 106
670+
// Also add fuzzy half/double ranges
671+
m_bpmHalfLower = floor((1 - s_relativeRange) * bpm / 2); // 47
672+
m_bpmHalfUpper = ceil((1 + s_relativeRange) * bpm / 2); // 53
673+
m_bpmDoubleLower = floor((1 - s_relativeRange) * bpm * 2); // 188
674+
m_bpmDoubleUpper = ceil((1 + s_relativeRange) * bpm * 2); // 212
675+
qWarning() << toSql();
670676
break;
671677
}
672678
case MatchMode::HalveDouble: {
@@ -732,10 +738,10 @@ bool BpmFilterNode::match(const TrackPointer& pTrack) const {
732738
return value >= m_rangeLower && value < m_rangeUpper;
733739
}
734740
case MatchMode::ExplicitStrict:
735-
case MatchMode::Fuzzy:
736741
case MatchMode::Range: {
737742
return value >= m_rangeLower && value <= m_rangeUpper;
738743
}
744+
case MatchMode::Fuzzy:
739745
case MatchMode::HalveDouble: {
740746
return (value >= m_rangeLower && value <= m_rangeUpper) ||
741747
(value >= m_bpmHalfLower && value <= m_bpmHalfUpper) ||
@@ -783,10 +789,10 @@ QString BpmFilterNode::toSql() const {
783789
QString::number(m_rangeUpper));
784790
}
785791
case MatchMode::ExplicitStrict:
786-
case MatchMode::Fuzzy:
787792
case MatchMode::Range: {
788793
return rangeSqlString(m_rangeLower, m_rangeUpper);
789794
}
795+
case MatchMode::Fuzzy:
790796
case MatchMode::HalveDouble: {
791797
QStringList searchClauses;
792798
searchClauses << rangeUpperExclusiveSqlString(m_rangeLower, m_rangeUpper);
@@ -799,6 +805,7 @@ QString BpmFilterNode::toSql() const {
799805
searchClauses << rangeSqlString(m_rangeLower, m_rangeUpper);
800806
searchClauses << rangeSqlString(m_bpmHalfLower, m_bpmHalfUpper);
801807
searchClauses << rangeSqlString(m_bpmDoubleLower, m_bpmDoubleUpper);
808+
qWarning() << "BpmFilterNode:" << concatSqlClauses(searchClauses, "OR");
802809
return concatSqlClauses(searchClauses, "OR");
803810
}
804811
case MatchMode::Operator: {

src/test/searchqueryparsertest.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -578,7 +578,8 @@ TEST_F(SearchQueryParserTest, BpmFilter) {
578578
EXPECT_TRUE(pQuery->match(pTrack));
579579

580580
EXPECT_STREQ(
581-
qPrintable(QString("bpm BETWEEN 94 AND 106")),
581+
qPrintable(QString("(bpm >= 94 AND bpm < 106) OR (bpm >= 47 AND "
582+
"bpm < 53) OR (bpm >= 188 AND bpm < 212)")),
582583
qPrintable(pQuery->toSql()));
583584

584585
// Test empty BPM (incomplete query)

0 commit comments

Comments
 (0)