Skip to content

Commit

Permalink
src/dict: abstract out deconjugators from dictionary code
Browse files Browse the repository at this point in the history
Create a new class called QueryGenerator that defines a class that can
generate queries from a string of text. ExactQueryGenerator implements
this for searching exact text, and MeCabQueryGenerator implements this
for deconjuating text with MeCab. This makes it so these two methods of
generating queries can share all the same code for filtering duplicates,
generating cloze info, and searching the database. This also makes it
easier to implement new query generators in the future such as the
deconjuator in #210 or the proposed MeCab with UniDic option in #211.

This commit removes all multithreading from searches. I have known for
a while that it provides little to no performance imporvement due to
most time being spent querying a synchronized database. It may also harm
performance on Windows. I don't see any need to add it back, but it can
be if there is a compelling reason to. Queries seem plenty fast with
this change.
  • Loading branch information
ripose-jp committed Apr 14, 2024
1 parent afea401 commit a7aec83
Show file tree
Hide file tree
Showing 12 changed files with 741 additions and 510 deletions.
48 changes: 47 additions & 1 deletion src/dict/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,3 +1,47 @@
add_library(searchquery INTERFACE searchquery.h)
target_compile_features(searchquery INTERFACE cxx_std_17)
target_compile_options(searchquery INTERFACE ${MEMENTO_COMPILER_FLAGS})
target_include_directories(searchquery INTERFACE ${MEMENTO_INCLUDE_DIRS})
target_link_libraries(searchquery INTERFACE Qt6::Core)

add_library(querygenerator INTERFACE querygenerator.h)
target_compile_features(querygenerator INTERFACE cxx_std_17)
target_compile_options(querygenerator INTERFACE ${MEMENTO_COMPILER_FLAGS})
target_include_directories(querygenerator INTERFACE ${MEMENTO_INCLUDE_DIRS})
target_link_libraries(
querygenerator
INTERFACE Qt6::Core
INTERFACE searchquery
)

add_library(
exactquerygenerator STATIC
exactquerygenerator.cpp
exactquerygenerator.h
)
target_compile_features(exactquerygenerator PRIVATE cxx_std_17)
target_compile_options(exactquerygenerator PRIVATE ${MEMENTO_COMPILER_FLAGS})
target_include_directories(exactquerygenerator PRIVATE ${MEMENTO_INCLUDE_DIRS})
target_link_libraries(
exactquerygenerator
PUBLIC querygenerator
)

add_library(
mecabquerygenerator STATIC
mecabquerygenerator.cpp
mecabquerygenerator.h
)
target_compile_features(mecabquerygenerator PRIVATE cxx_std_17)
target_compile_options(mecabquerygenerator PRIVATE ${MEMENTO_COMPILER_FLAGS})
target_include_directories(mecabquerygenerator PRIVATE ${MEMENTO_INCLUDE_DIRS})
target_link_libraries(
mecabquerygenerator
PRIVATE utils
PUBLIC MeCab::MeCab
PUBLIC querygenerator
)

add_library(
yomidbbuilder STATIC
yomidbbuilder.c
Expand Down Expand Up @@ -34,8 +78,10 @@ target_compile_options(dictionary_db PRIVATE ${MEMENTO_COMPILER_FLAGS})
target_include_directories(dictionary_db PRIVATE ${MEMENTO_INCLUDE_DIRS})
target_link_libraries(
dictionary_db
PRIVATE MeCab::MeCab
PRIVATE exactquerygenerator
PRIVATE mecabquerygenerator
PRIVATE Qt6::Widgets
PRIVATE querygenerator
PRIVATE SQLite::SQLite3
PRIVATE yomidbbuilder
PUBLIC Qt6::Core
Expand Down
22 changes: 12 additions & 10 deletions src/dict/databasemanager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ int DatabaseManager::disableDictionaries(const QStringList &dicts)

#define QUERY "SELECT title FROM directory;"

QStringList DatabaseManager::getDictionaries()
QStringList DatabaseManager::getDictionaries() const
{
m_dbLock.lockForRead();

Expand Down Expand Up @@ -249,7 +249,7 @@ QStringList DatabaseManager::getDictionaries()

#define QUERY "SELECT dic_id FROM dict_disabled;"

QStringList DatabaseManager::getDisabledDictionaries()
QStringList DatabaseManager::getDisabledDictionaries() const
{
m_dbLock.lockForRead();

Expand Down Expand Up @@ -302,7 +302,7 @@ QStringList DatabaseManager::getDisabledDictionaries()
#define COLUMN_EXPRESSION 0
#define COLUMN_READING 1

QString DatabaseManager::queryTerms(const QString &query, QList<SharedTerm> &terms)
QString DatabaseManager::queryTerms(const QString &query, QList<SharedTerm> &terms) const
{
if (m_db == nullptr)
{
Expand Down Expand Up @@ -439,7 +439,7 @@ QString DatabaseManager::queryTerms(const QString &query, QList<SharedTerm> &ter
#define TAG_NAME_CODE "code"
#define TAG_NAME_INDEX "index"

QString DatabaseManager::queryKanji(const QString &query, Kanji &kanji)
QString DatabaseManager::queryKanji(const QString &query, Kanji &kanji) const
{
if (m_db == nullptr)
{
Expand Down Expand Up @@ -497,29 +497,31 @@ QString DatabaseManager::queryKanji(const QString &query, Kanji &kanji)
it != map.constKeyValueEnd();
++it)
{
const Tag *tag = &m_tagCache[id][it->first];
Tag tag = m_tagCache[id][it->first];
QList<QPair<Tag, QString>> *list = nullptr;
if (tag->category == TAG_NAME_INDEX)
if (tag.category == TAG_NAME_INDEX)
{
list = &def.index;
}
else if (tag->category == TAG_NAME_STATS)
else if (tag.category == TAG_NAME_STATS)
{
list = &def.stats;
}
else if (tag->category == TAG_NAME_CLAS)
else if (tag.category == TAG_NAME_CLAS)
{
list = &def.clas;
}
else if (tag->category == TAG_NAME_CODE)
else if (tag.category == TAG_NAME_CODE)
{
list = &def.code;
}
else
{
continue;
}
list->append(QPair<Tag, QString>(*tag, it->second.toString()));
list->append(
QPair<Tag, QString>(std::move(tag), it->second.toString())
);
}

kanji.definitions.append(def);
Expand Down
10 changes: 5 additions & 5 deletions src/dict/databasemanager.h
Original file line number Diff line number Diff line change
Expand Up @@ -78,13 +78,13 @@ class DatabaseManager
* Gets a list of dictionary names in the database in arbitrary order.
* @return A list of dictionary names.
*/
QStringList getDictionaries();
QStringList getDictionaries() const;

/**
* Gets the list of disabled dictionaries.
* @return The names of all disabled dictionaries.
*/
QStringList getDisabledDictionaries();
QStringList getDisabledDictionaries() const;

/**
* Searches for terms that exactly match the query. Does automatic
Expand All @@ -93,15 +93,15 @@ class DatabaseManager
* @param[out] terms A list of matching terms. Belongs to the caller.
* @return Empty string on success, error string on error.
*/
QString queryTerms(const QString &query, QList<SharedTerm> &terms);
QString queryTerms(const QString &query, QList<SharedTerm> &terms) const;

/**
* Searches for kanji that exactly match the query.
* @param query The kanji to look for. Should be a single character.
* @param[out] kanji The Kanji struct to populate.
* @return Empty string on success, error string on error.
*/
QString queryKanji(const QString &query, Kanji &kanji);
QString queryKanji(const QString &query, Kanji &kanji) const;

private:
/**
Expand Down Expand Up @@ -203,7 +203,7 @@ class DatabaseManager
sqlite3 *m_db;

/* Locks the database for reading and writing. */
QReadWriteLock m_dbLock;
mutable QReadWriteLock m_dbLock;

/* Saved path to the database. */
const QByteArray m_dbpath;
Expand Down
Loading

0 comments on commit a7aec83

Please sign in to comment.