KFuzzyMatcher

KFuzzyMatcher Namespace Reference

Classes

struct  Result
 

Functions

KCOREADDONS_EXPORT Result match (QStringView pattern, QStringView str)
 
KCOREADDONS_EXPORT bool matchSimple (QStringView pattern, QStringView str)
 

Detailed Description

This namespace contains functions for fuzzy matching a list of strings against a pattern.

This code is ported to Qt from lib_fts: https://github.com/forrestthewoods/lib_fts which tries to replicate SublimeText like fuzzy matching.

Note
All character matches will happen sequentially. That means that this function is not typo tolerant i.e., "gti" will not match "git", but "gt" will. All methods in here are stateless i.e., the input string will not be modified. Also note that strings in all the functions in this namespace will be matched case-insensitively.

Limitations:

  • Currently this will match only strings with length < 256 correctly. This is because we intend on matching a pattern against words / short strings and not paragraphs.
  • No more than 256 matches will happen.

If you are using this with QSortFilterProxyModel, you need to override both QSortFilterProxyModel::lessThan and QSortFilterProxyModel::filterAcceptsRow. A simple example:

bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override
{
int score = 0;
const auto idx = sourceModel()->index(sourceRow, 0, sourceParent);
const auto actionName = idx.data().toString().splitRef(QLatin1Char(':')).at(1);
const bool res = kfts::fuzzy_match_sequential(m_pattern, actionName, score);
// store the score in the source model
sourceModel()->setData(idx, score, ScoreRole);
return res;
}
bool lessThan(const QModelIndex &sourceLeft, const QModelIndex &sourceRight) const override
{
// use the score here to sort
const int l = sourceLeft.data(ScoreRole).toInt();
const int r = sourceRight.data(ScoreRole).toInt();
return l < r;
}

Additionally you must not use invalidateFilter() if you go with the above approach. Instead use beginResetModel()/endResetModel():

Q_SLOT void setFilterString(const QString &string)
{
beginResetModel();
m_pattern = string;
endResetModel();
}

Namespace for fuzzy matching of strings

Author
Waqar Ahmed waqar[email protected].17a[email protected]@gmai[email protected]l.co[email protected]m

Function Documentation

KFuzzyMatcher::Result KFuzzyMatcher::match ( QStringView  pattern,
QStringView  str 
)

This is the main function which does scored fuzzy matching.

The return value of this function contains Result::score which should be used to sort the results. Without sorting of the results this function won't very effective.

If pattern is empty, the function will return true

Parameters
patternto search for. For e.g., text entered by a user to filter a list or model
strthe current string from your list of strings
Returns
A Result type with score of this match and whether the match was successful. If there is no match, score is zero. If the match is successful, score must be used to sort the results.
Since
5.79

Simple substring matching to flush out non-matching strings

Definition at line 232 of file kfuzzymatcher.cpp.

bool KFuzzyMatcher::matchSimple ( QStringView  pattern,
QStringView  str 
)

Simple fuzzy matching of chars in pattern with chars in str sequentially.

If there is a match, it will return true and false otherwise. There is no scoring. You should use this if score is not important for you and only matching is important.

If pattern is empty, the function will return true

Parameters
patternto search for. For e.g., text entered by a user to filter a list
strthe current string from your list of strings
Returns
true on sucessful match
Since
5.79

Instead of doing

 strIt.toLower() == patternIt.toLower()

we convert patternIt to Upper / Lower as needed and compare with strIt. This saves us from calling toLower() on both strings, making things a little bit faster

Definition at line 206 of file kfuzzymatcher.cpp.

This file is part of the KDE documentation.
Documentation copyright © 1996-2021 The KDE developers.
Generated on Thu Apr 22 2021 23:02:15 by doxygen 1.8.11 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.