diff --git a/libsearch/CMakeLists.txt b/libsearch/CMakeLists.txt index e1d113e..9215979 100644 --- a/libsearch/CMakeLists.txt +++ b/libsearch/CMakeLists.txt @@ -11,8 +11,8 @@ set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) -find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus Widgets Xml Concurrent Sql LinguistTools REQUIRED) -find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus Widgets Xml Concurrent Sql LinguistTools REQUIRED) +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core DBus Widgets Xml Concurrent Sql LinguistTools RemoteObjects REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core DBus Widgets Xml Concurrent Sql LinguistTools RemoteObjects REQUIRED) find_package(PkgConfig REQUIRED) find_package(KF5WindowSystem) find_package(qt5xdg) @@ -74,6 +74,9 @@ set(LIBUKUI_SEARCH_SRC index/search-manager.cpp index/search-manager.h index/ukui-search-qdbus.cpp index/ukui-search-qdbus.h index/writable-database.cpp index/writable-database.h + index/file-extraction-result.cpp + index/file-extraction-result.h + index/index-monitor.cpp libsearch.cpp libsearch.h libsearch_global.h log-utils.cpp log-utils.h @@ -104,9 +107,9 @@ set(LIBUKUI_SEARCH_SRC icon-loader.cpp icon-loader.h data-collecter.cpp data-collecter.h - index/file-extraction-result.cpp - index/file-extraction-result.h + ) +qt5_generate_repc(LIBUKUI_SEARCH_SRC index/monitor.rep REPLICA) set(QRC_FILES resource1.qrc) file(GLOB TS_FILES ${CMAKE_CURRENT_SOURCE_DIR}/../translations/libukui-search/*.ts) set_source_files_properties(${TS_FILES} PROPERTIES OUTPUT_LOCATION ${CMAKE_BINARY_DIR}/libsearch/.qm) @@ -136,6 +139,7 @@ set(HEADERS development-files/header-files/UkuiSearchTask development-files/header-files/UkuiSearchPluginIface development-files/header-files/FileSystemWatcher + index/index-monitor.h ) include_directories( @@ -170,6 +174,7 @@ target_link_libraries(${PROJECT_NAME} PRIVATE Qt${QT_VERSION_MAJOR}::Sql Qt${QT_VERSION_MAJOR}::Widgets Qt${QT_VERSION_MAJOR}::Xml + Qt${QT_VERSION_MAJOR}::RemoteObjects chinese-segmentation quazip5 uchardet @@ -219,3 +224,6 @@ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/pkgconfig/ukui-search.pc DESTINATION $ install(FILES ${CMAKE_CURRENT_BINARY_DIR}/ukui-search-config.cmake ${CMAKE_CURRENT_BINARY_DIR}/ukui-search-config-version.cmake DESTINATION ${CMAKE_CONFIG_INSTALL_DIR}) +if(BUILD_TEST) + add_subdirectory(test) +endif () \ No newline at end of file diff --git a/libsearch/index/batch-indexer.cpp b/libsearch/index/batch-indexer.cpp index e300e07..cc419ce 100644 --- a/libsearch/index/batch-indexer.cpp +++ b/libsearch/index/batch-indexer.cpp @@ -60,14 +60,17 @@ void BatchIndexer::run() fetch(); if(m_target & Target::Basic) { + Q_EMIT basicIndexStart(m_mode); basicIndex(); Q_EMIT basicIndexDone(m_mode); } if(m_target & Target::Content) { + Q_EMIT contentIndexStart(m_mode); contentIndex(); Q_EMIT contentIndexDone(m_mode); } if(m_target & Target::Ocr) { + Q_EMIT ocrContentIndexStart(m_mode); ocrIndex(); Q_EMIT ocrContentIndexDone(m_mode); } diff --git a/libsearch/index/batch-indexer.h b/libsearch/index/batch-indexer.h index 637245c..5b7cec1 100644 --- a/libsearch/index/batch-indexer.h +++ b/libsearch/index/batch-indexer.h @@ -71,6 +71,9 @@ public: Q_SIGNALS: void progress(IndexType type, uint all, uint finished); + void basicIndexStart(WorkMode); + void contentIndexStart(WorkMode); + void ocrContentIndexStart(WorkMode); void basicIndexDone(WorkMode); void contentIndexDone(WorkMode); void ocrContentIndexDone(WorkMode); diff --git a/libsearch/index/index-monitor.cpp b/libsearch/index/index-monitor.cpp new file mode 100644 index 0000000..7780500 --- /dev/null +++ b/libsearch/index/index-monitor.cpp @@ -0,0 +1,162 @@ +/* + * Copyright (C) 2024, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: iaom + * + */ + +#include "index-monitor.h" +#include +#include "rep_monitor_replica.h" + +static UkuiSearch::IndexMonitor *globalInstance = nullptr; +namespace UkuiSearch { +class IndexMonitorPrivate { +public: + ~IndexMonitorPrivate(); + QRemoteObjectNode m_qroNode; + MonitorReplica *m_monitorReplica = nullptr; + static QUrl nodeUrl(); +}; + +IndexMonitorPrivate::~IndexMonitorPrivate() +{ + if(m_monitorReplica) { + m_monitorReplica->disconnect(); + delete m_monitorReplica; + m_monitorReplica = nullptr; + } +} + +QUrl IndexMonitorPrivate::nodeUrl() +{ + QString displayEnv = (qgetenv("XDG_SESSION_TYPE") == "wayland") ? QLatin1String("WAYLAND_DISPLAY") : QLatin1String("DISPLAY"); + QString display(qgetenv(displayEnv.toUtf8().data())); + return QUrl(QStringLiteral("local:ukui-search-service-monitor-") + QString(qgetenv("USER")) + display); +} + +IndexMonitor *IndexMonitor::self() +{ + if(!globalInstance) + globalInstance = new IndexMonitor; + return globalInstance; +} + +void IndexMonitor::stopMonitor() +{ + globalInstance->deleteLater(); + globalInstance = nullptr; +} + +void IndexMonitor::startMonitor() +{ + IndexMonitor::self(); +} + +IndexMonitor::IndexMonitor(QObject *parent) : QObject(parent), d(new IndexMonitorPrivate) +{ + d->m_qroNode.connectToNode(IndexMonitorPrivate::nodeUrl()); + d->m_monitorReplica = d->m_qroNode.acquire(); + //转发信号 + connect(d->m_monitorReplica, &MonitorReplica::currentIndexPathsChanged, this, &IndexMonitor::currentIndexPathsChanged); + connect(d->m_monitorReplica, &MonitorReplica::indexStateChanged, this, &IndexMonitor::indexStateChanged); + connect(d->m_monitorReplica, &MonitorReplica::basicIndexSizeChanged, this, &IndexMonitor::basicIndexSizeChanged); + connect(d->m_monitorReplica, &MonitorReplica::contentIndexSizeChanged, this, &IndexMonitor::contentIndexSizeChanged); + connect(d->m_monitorReplica, &MonitorReplica::ocrContentIndexSizeChanged, this, &IndexMonitor::ocrContentIndexSizeChanged); + connect(d->m_monitorReplica, &MonitorReplica::basicIndexProgressChanged, this, &IndexMonitor::basicIndexProgressChanged); + connect(d->m_monitorReplica, &MonitorReplica::contentIndexProgressChanged, this, &IndexMonitor::contentIndexProgressChanged); + connect(d->m_monitorReplica, &MonitorReplica::ocrContentIndexProgressChanged, this, &IndexMonitor::ocrContentIndexProgressChanged); + connect(d->m_monitorReplica, &MonitorReplica::basicIndexDocNumChanged, this, &IndexMonitor::basicIndexDocNumChanged); + connect(d->m_monitorReplica, &MonitorReplica::contentIndexDocNumChanged, this, &IndexMonitor::contentIndexDocNumChanged); + connect(d->m_monitorReplica, &MonitorReplica::ocrContentIndexDocNumChanged, this, &IndexMonitor::ocrContentIndexDocNumChanged); + connect(d->m_monitorReplica, &MonitorReplica::basicIndexStart, this, &IndexMonitor::basicIndexStart); + connect(d->m_monitorReplica, &MonitorReplica::contentIndexStart, this, &IndexMonitor::contentIndexStart); + connect(d->m_monitorReplica, &MonitorReplica::ocrContentIndexStart, this, &IndexMonitor::ocrContentIndexStart); + connect(d->m_monitorReplica, &MonitorReplica::basicIndexDone, this, &IndexMonitor::basicIndexDone); + connect(d->m_monitorReplica, &MonitorReplica::contentIndexDone, this, &IndexMonitor::contentIndexDone); + connect(d->m_monitorReplica, &MonitorReplica::ocrContentIndexDone, this, &IndexMonitor::ocrContentIndexDone); + + connect(d->m_monitorReplica, &QRemoteObjectReplica::initialized, this, &IndexMonitor::serviceReady); + connect(d->m_monitorReplica, &QRemoteObjectReplica::stateChanged, this, [&](QRemoteObjectReplica::State state, QRemoteObjectReplica::State oldState){ + if(state == QRemoteObjectReplica::State::Suspect && oldState == QRemoteObjectReplica::State::Valid) { + Q_EMIT serviceOffline(); + } + }); +} + +IndexMonitor::~IndexMonitor() +{ + if(d) { + delete d; + d = nullptr; + } +} + +QStringList IndexMonitor::currentIndexPaths() const +{ + return d->m_monitorReplica->currentIndexPaths(); +} + +QString IndexMonitor::indexState() const +{ + return d->m_monitorReplica->indexState(); +} + +uint IndexMonitor::basicIndexSize() const +{ + return d->m_monitorReplica->basicIndexSize(); +} + +uint IndexMonitor::contentIndexSize() const +{ + return d->m_monitorReplica->contentIndexSize(); +} + +uint IndexMonitor::ocrContentIndexSize() const +{ + return d->m_monitorReplica->ocrContentIndexSize(); +} + +uint IndexMonitor::basicIndexProgress() const +{ + return d->m_monitorReplica->basicIndexProgress(); +} + +uint IndexMonitor::contentIndexProgress() const +{ + return d->m_monitorReplica->contentIndexProgress(); +} + +uint IndexMonitor::basicIndexDocNum() const +{ + return d->m_monitorReplica->basicIndexDocNum(); +} + +uint IndexMonitor::ocrContentIndexProgress() const +{ + return d->m_monitorReplica->ocrContentIndexProgress(); +} + +uint IndexMonitor::contentIndexDocNum() const +{ + return d->m_monitorReplica->contentIndexDocNum(); +} + +uint IndexMonitor::ocrContentIndexDocNum() const +{ + return d->m_monitorReplica->ocrContentIndexDocNum(); +} +} // UkuiSearch \ No newline at end of file diff --git a/libsearch/index/index-monitor.h b/libsearch/index/index-monitor.h new file mode 100644 index 0000000..5b56a76 --- /dev/null +++ b/libsearch/index/index-monitor.h @@ -0,0 +1,135 @@ +/* + * Copyright (C) 2024, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: iaom + * + */ +#ifndef UKUI_SEARCH_INDEX_MONITOR_H +#define UKUI_SEARCH_INDEX_MONITOR_H + +#include + +namespace UkuiSearch { +/** + * 索引状态和进度信息查询 + */ +class IndexMonitorPrivate; +class IndexMonitor : public QObject +{ + Q_OBJECT + Q_PROPERTY(QStringList currentIndexPaths READ currentIndexPaths NOTIFY currentIndexPathsChanged) + Q_PROPERTY(QString indexState READ indexState NOTIFY indexStateChanged) + Q_PROPERTY(uint basicIndexSize READ basicIndexSize NOTIFY basicIndexSizeChanged) + Q_PROPERTY(uint contentIndexSize READ contentIndexSize NOTIFY contentIndexSizeChanged) + Q_PROPERTY(uint ocrContentIndexSize READ ocrContentIndexSize NOTIFY ocrContentIndexSizeChanged) + Q_PROPERTY(uint basicIndexProgress READ basicIndexProgress NOTIFY basicIndexProgressChanged) + Q_PROPERTY(uint contentIndexProgress READ contentIndexProgress NOTIFY contentIndexProgressChanged) + Q_PROPERTY(uint ocrContentIndexProgress READ ocrContentIndexProgress NOTIFY ocrContentIndexProgressChanged) + Q_PROPERTY(uint basicIndexDocNum READ basicIndexDocNum NOTIFY basicIndexDocNumChanged) + Q_PROPERTY(uint contentIndexDocNum READ contentIndexDocNum NOTIFY contentIndexDocNumChanged) + Q_PROPERTY(uint ocrContentIndexDocNum READ ocrContentIndexDocNum NOTIFY ocrContentIndexDocNumChanged) + +public: + static IndexMonitor *self(); + static void stopMonitor(); + static void startMonitor(); + /** + * @brief currentIndexPaths + * @return 当前索引的所有目录 + */ + QStringList currentIndexPaths() const; + /** + * @brief indexState + * @return 当前索引调度器的状态 + */ + QString indexState() const; + /** + * @brief basicIndexSize + * @return 当前需要处理的基础索引数量 + */ + uint basicIndexSize() const; + /** + * @brief contentIndexSize + * @return 当前需要处理的内容索引数量 + */ + uint contentIndexSize() const; + /** + * @brief ocrContentIndexSize + * @return 当前需要处理的OCR索引数量 + */ + uint ocrContentIndexSize() const; + /** + * @brief basicIndexProgress + * @return 基础索引进度 + */ + uint basicIndexProgress() const; + /** + * @brief contentIndexProgress + * @return 内容索引进度 + */ + uint contentIndexProgress() const; + /** + * @brief ocrContentIndexProgress + * @return ocr索引进度 + */ + uint ocrContentIndexProgress() const; + /** + * @brief basicIndexDocNum + * @return 基础索引完成的总文档数 + */ + uint basicIndexDocNum() const; + /** + * @brief contentIndexDocNum + * @return 内容索引完成的总文档数 + */ + uint contentIndexDocNum() const; + /** + * @brief contentIndexDocNum + * @return ocr内容索引完成的总文档数 + */ + uint ocrContentIndexDocNum() const; + +Q_SIGNALS: + void currentIndexPathsChanged(QStringList currentIndexPaths); + void indexStateChanged(QString indexState); + void basicIndexSizeChanged(uint basicIndexSize); + void contentIndexSizeChanged(uint contentIndexSize); + void ocrContentIndexSizeChanged(uint ocrIndexSize); + void basicIndexProgressChanged(uint basicIndexProgress); + void contentIndexProgressChanged(uint contentIndexProgress); + void ocrContentIndexProgressChanged(uint ocrIndexProgress); + void basicIndexDocNumChanged(uint basicIndexDocNum); + void contentIndexDocNumChanged(uint contentIndexDocNum); + void ocrContentIndexDocNumChanged(uint ocrContentIndexDocNum); + void basicIndexStart(); + void contentIndexStart(); + void ocrContentIndexStart(); + void basicIndexDone(bool success); + void contentIndexDone(bool success); + void ocrContentIndexDone(bool success); + + void serviceReady(); + void serviceOffline(); + +private: + explicit IndexMonitor(QObject *parent = nullptr); + ~IndexMonitor(); + IndexMonitorPrivate *d = nullptr; +}; + +} // UkuiSearch + +#endif //UKUI_SEARCH_INDEX_MONITOR_H diff --git a/libsearch/index/index-scheduler.cpp b/libsearch/index/index-scheduler.cpp index 1fbd2eb..ed11180 100644 --- a/libsearch/index/index-scheduler.cpp +++ b/libsearch/index/index-scheduler.cpp @@ -243,12 +243,15 @@ void IndexScheduler::startIndexJob(const QStringList& folders,const QStringList& m_state = Running; Q_EMIT stateChange(m_state); - BatchIndexer *indexer = new BatchIndexer(folders, blackList, m_indexStop, m_contentIndexStop, m_ocrContentIndexStop, mode, target); + auto *indexer = new BatchIndexer(folders, blackList, m_indexStop, m_contentIndexStop, m_ocrContentIndexStop, mode, target); connect(indexer, &BatchIndexer::done, this, &IndexScheduler::batchIndexerFinished, Qt::QueuedConnection); connect(indexer, &BatchIndexer::progress, this, &IndexScheduler::process, Qt::QueuedConnection); connect(indexer, &BatchIndexer::basicIndexDone, this, &IndexScheduler::onBasicIndexDone, Qt::QueuedConnection); connect(indexer, &BatchIndexer::contentIndexDone, this, &IndexScheduler::onContentIndexDone, Qt::QueuedConnection); connect(indexer, &BatchIndexer::ocrContentIndexDone, this, &IndexScheduler::onOcrContentIndexDone, Qt::QueuedConnection); + connect(indexer, &BatchIndexer::basicIndexStart, this, &IndexScheduler::basicIndexStart, Qt::QueuedConnection); + connect(indexer, &BatchIndexer::contentIndexStart, this, &IndexScheduler::contentIndexStart, Qt::QueuedConnection); + connect(indexer, &BatchIndexer::ocrContentIndexStart, this, &IndexScheduler::ocrContentIndexStart, Qt::QueuedConnection); m_threadPool.start(indexer); } } @@ -344,6 +347,8 @@ void IndexScheduler::onBasicIndexDone(BatchIndexer::WorkMode mode) m_statusRecorder->getStatus(INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Updating) { m_statusRecorder->setStatus(INDEX_DATABASE_STATE_KEY, IndexStatusRecorder::State::Ready); success = true; + } else if (m_statusRecorder->getStatus(INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::RealTimeUpdating ) { + success = true; } Q_EMIT basicIndexDone(success); checkIfStartsWaiting(); @@ -359,6 +364,8 @@ void IndexScheduler::onContentIndexDone(BatchIndexer::WorkMode mode) m_statusRecorder->getStatus(CONTENT_INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Updating) { m_statusRecorder->setStatus(CONTENT_INDEX_DATABASE_STATE_KEY, IndexStatusRecorder::State::Ready); success = true; + } else if (m_statusRecorder->getStatus(CONTENT_INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::RealTimeUpdating ) { + success = true; } Q_EMIT contentIndexDone(success); checkIfStartsWaiting(); @@ -374,8 +381,10 @@ void IndexScheduler::onOcrContentIndexDone(BatchIndexer::WorkMode mode) m_statusRecorder->getStatus(OCR_CONTENT_INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::Updating) { m_statusRecorder->setStatus(OCR_CONTENT_INDEX_DATABASE_STATE_KEY, IndexStatusRecorder::State::Ready); success = true; + } else if (m_statusRecorder->getStatus(OCR_CONTENT_INDEX_DATABASE_STATE_KEY).toInt() == IndexStatusRecorder::State::RealTimeUpdating ) { + success = true; } - Q_EMIT contentIndexDone(success); + Q_EMIT ocrContentIndexDone(success); checkIfStartsWaiting(); } diff --git a/libsearch/index/index-scheduler.h b/libsearch/index/index-scheduler.h index 41eb616..fbeea95 100644 --- a/libsearch/index/index-scheduler.h +++ b/libsearch/index/index-scheduler.h @@ -55,8 +55,12 @@ public: Q_SIGNALS: void stateChange(IndexerState); void process(IndexType type, uint all, uint finished); + void basicIndexStart(); + void contentIndexStart(); + void ocrContentIndexStart(); void basicIndexDone(bool success); void contentIndexDone(bool success); + void ocrContentIndexDone(bool success); void done(); private Q_SLOTS: diff --git a/ukui-search-service/monitor.rep b/libsearch/index/monitor.rep similarity index 56% rename from ukui-search-service/monitor.rep rename to libsearch/index/monitor.rep index ccc33b5..f48646a 100644 --- a/ukui-search-service/monitor.rep +++ b/libsearch/index/monitor.rep @@ -5,11 +5,17 @@ class Monitor PROP(QString indexState READONLY); PROP(uint basicIndexSize READONLY); PROP(uint contentIndexSize READONLY); - PROP(uint ocrIndexSize READONLY); + PROP(uint ocrContentIndexSize READONLY); PROP(uint basicIndexProgress READONLY); PROP(uint contentIndexProgress READONLY); - PROP(uint ocrIndexProgress READONLY); + PROP(uint ocrContentIndexProgress READONLY); PROP(uint basicIndexDocNum READONLY); PROP(uint contentIndexDocNum READONLY); PROP(uint ocrContentIndexDocNum READONLY); + SIGNAL(basicIndexStart()); + SIGNAL(contentIndexStart()); + SIGNAL(ocrContentIndexStart()); + SIGNAL(basicIndexDone(bool success)); + SIGNAL(contentIndexDone(bool success)); + SIGNAL(ocrContentIndexDone(bool success)); }; \ No newline at end of file diff --git a/libsearch/test/CMakeLists.txt b/libsearch/test/CMakeLists.txt new file mode 100644 index 0000000..2b41e14 --- /dev/null +++ b/libsearch/test/CMakeLists.txt @@ -0,0 +1,20 @@ +cmake_minimum_required(VERSION 3.14) +project(ukui-search-test) + +find_package(QT NAMES Qt6 Qt5 COMPONENTS Core Widgets REQUIRED) +find_package(Qt${QT_VERSION_MAJOR} COMPONENTS Core Widgets REQUIRED) + +set(PROJECT_SOURCES + main.cpp + index-monitor-test.cpp +) +add_executable(${PROJECT_NAME} ${PROJECT_SOURCES}) +target_include_directories(${PROJECT_NAME} PRIVATE + ../index +) +target_link_libraries(${PROJECT_NAME} + PRIVATE + Qt${QT_VERSION_MAJOR}::Core + Qt${QT_VERSION_MAJOR}::Widgets + ukui-search +) \ No newline at end of file diff --git a/libsearch/test/index-monitor-test.cpp b/libsearch/test/index-monitor-test.cpp new file mode 100644 index 0000000..6f151e5 --- /dev/null +++ b/libsearch/test/index-monitor-test.cpp @@ -0,0 +1,100 @@ +/* + * Copyright (C) 2024, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: iaom + * + */ + +#include "index-monitor-test.h" +#include + +IndexMonitorTest::IndexMonitorTest(QObject *parent) : QObject(parent) +{ + m_monitor = UkuiSearch::IndexMonitor::self(); + connect(m_monitor, &UkuiSearch::IndexMonitor::serviceReady, this, [&](){ + qDebug() << "==serviceReady=="; + qDebug() << "==currentIndexPaths==" << m_monitor->currentIndexPaths(); + qDebug() << "==indexState==" << m_monitor->indexState(); + qDebug() << "==basicIndexSize==" << m_monitor->basicIndexSize(); + qDebug() << "==contentIndexSize==" << m_monitor->contentIndexSize(); + qDebug() << "==ocrContentIndexSize==" << m_monitor->ocrContentIndexSize(); + qDebug() << "==basicIndexProgress==" << m_monitor->basicIndexProgress(); + qDebug() << "==contentIndexProgress==" << m_monitor->contentIndexProgress(); + qDebug() << "==ocrContentIndexProgress==" << m_monitor->ocrContentIndexProgress(); + qDebug() << "==basicIndexDocNum==" << m_monitor->basicIndexDocNum(); + qDebug() << "==contentIndexDocNum==" << m_monitor->contentIndexDocNum(); + qDebug() << "==ocrContentIndexDocNum==" << m_monitor->ocrContentIndexDocNum(); + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::serviceOffline, this, [&](){ + qDebug() << "==serviceReady=="; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::currentIndexPathsChanged, this, [&](const QStringList& currentIndexPaths){ + qDebug() << "==currentIndexPathsChanged==" << currentIndexPaths; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::indexStateChanged, this, [&](const QString& indexState){ + qDebug() << "==indexStateChanged==" << indexState; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::basicIndexSizeChanged, this, [&](uint basicIndexSize){ + qDebug() << "==basicIndexSizeChanged==" << basicIndexSize; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::contentIndexSizeChanged, this, [&](uint contentIndexSize){ + qDebug() << "==contentIndexSizeChanged==" << contentIndexSize; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::ocrContentIndexSizeChanged, this, [&](uint ocrIndexSize){ + qDebug() << "==ocrContentIndexSizeChanged==" << ocrIndexSize; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::basicIndexProgressChanged, this, [&](uint basicIndexProgress){ + qDebug() << "==basicIndexProgressChanged==" << basicIndexProgress; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::contentIndexProgressChanged, this, [&](uint contentIndexProgress){ + qDebug() << "==contentIndexProgressChanged==" << contentIndexProgress; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::ocrContentIndexProgressChanged, this, [&](uint ocrIndexProgress){ + qDebug() << "==ocrContentIndexProgressChanged==" << ocrIndexProgress; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::basicIndexDocNumChanged, this, [&](uint basicIndexDocNum){ + qDebug() << "==basicIndexDocNumChanged==" << basicIndexDocNum; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::contentIndexDocNumChanged, this, [&](uint contentIndexDocNum){ + qDebug() << "==contentIndexDocNumChanged==" << contentIndexDocNum; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::ocrContentIndexDocNumChanged, this, [&](uint ocrContentIndexDocNum){ + qDebug() << "==ocrContentIndexDocNumChanged==" << ocrContentIndexDocNum; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::basicIndexStart, this, [&](){ + qDebug() << "==basicIndexStart=="; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::contentIndexStart, this, [&](){ + qDebug() << "==contentIndexStart=="; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::ocrContentIndexStart, this, [&](){ + qDebug() << "==ocrContentIndexStart=="; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::basicIndexDone, this, [&](bool success){ + qDebug() << "==basicIndexDone==" << success; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::contentIndexDone, this, [&](bool success){ + qDebug() << "==contentIndexDone==" << success; + }); + connect(m_monitor, &UkuiSearch::IndexMonitor::ocrContentIndexDone, this, [&](bool success){ + qDebug() << "==ocrContentIndexDone==" << success; + }); +} + +IndexMonitorTest::~IndexMonitorTest() +{ + UkuiSearch::IndexMonitor::stopMonitor(); +} diff --git a/libsearch/test/index-monitor-test.h b/libsearch/test/index-monitor-test.h new file mode 100644 index 0000000..f1e5c43 --- /dev/null +++ b/libsearch/test/index-monitor-test.h @@ -0,0 +1,40 @@ +/* + * Copyright (C) 2024, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: iaom + * + */ + +#ifndef UKUI_SEARCH_INDEX_MONITOR_TEST_H +#define UKUI_SEARCH_INDEX_MONITOR_TEST_H + +#include +#include "index-monitor.h" + +class IndexMonitorTest : public QObject +{ + Q_OBJECT +public: + explicit IndexMonitorTest(QObject *parent = nullptr); + ~IndexMonitorTest(); + +private: + UkuiSearch::IndexMonitor *m_monitor = nullptr; + +}; + + +#endif //UKUI_SEARCH_INDEX_MONITOR_TEST_H diff --git a/libsearch/test/main.cpp b/libsearch/test/main.cpp new file mode 100644 index 0000000..076226e --- /dev/null +++ b/libsearch/test/main.cpp @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2024, KylinSoft Co., Ltd. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + * + * Authors: iaom + * + */ + +#include +#include "index-monitor-test.h" + +int main(int argc, char *argv[]) +{ + QApplication app(argc, argv); + IndexMonitorTest test; + return QApplication::exec(); +} \ No newline at end of file diff --git a/ukui-search-service/CMakeLists.txt b/ukui-search-service/CMakeLists.txt index 0633a09..8acba30 100644 --- a/ukui-search-service/CMakeLists.txt +++ b/ukui-search-service/CMakeLists.txt @@ -34,8 +34,7 @@ set(UKUI_SEARCH_SERVICE_SRC monitor.cpp monitor.h ) -qt5_generate_repc(UKUI_SEARCH_SERVICE_SRC monitor.rep SOURCE) -qt5_generate_repc(UKUI_SEARCH_SERVICE_SRC monitor.rep REPLICA) +qt5_generate_repc(UKUI_SEARCH_SERVICE_SRC ../libsearch/index/monitor.rep SOURCE) add_executable(ukui-search-service ${UKUI_SEARCH_SERVICE_SRC} ${QRC_FILES} diff --git a/ukui-search-service/monitor.cpp b/ukui-search-service/monitor.cpp index 31ca871..bcba357 100644 --- a/ukui-search-service/monitor.cpp +++ b/ukui-search-service/monitor.cpp @@ -31,6 +31,10 @@ Monitor::Monitor(IndexScheduler *scheduler, QObject *parent) : MonitorSource(par connect(scheduler, &IndexScheduler::process, this, &Monitor::processUpdate); connect(scheduler, &IndexScheduler::basicIndexDone, this, &Monitor::basicIndexDone); connect(scheduler, &IndexScheduler::contentIndexDone, this, &Monitor::contentIndexDone); + connect(scheduler, &IndexScheduler::ocrContentIndexDone, this, &Monitor::ocrContentIndexDone); + connect(scheduler, &IndexScheduler::basicIndexStart, this, &Monitor::basicIndexStart); + connect(scheduler, &IndexScheduler::contentIndexStart, this, &Monitor::contentIndexStart); + connect(scheduler, &IndexScheduler::ocrContentIndexStart, this, &Monitor::ocrContentIndexStart); connect(FileIndexerConfig::getInstance(), &FileIndexerConfig::appendIndexDir, this, [&](){ m_currentIndexPaths = FileIndexerConfig::getInstance()->currentIndexableDir(); Q_EMIT currentIndexPathsChanged(m_currentIndexPaths); @@ -62,7 +66,7 @@ uint Monitor::contentIndexSize() const return m_contentIndexSize; } -uint Monitor::ocrIndexSize() const +uint Monitor::ocrContentIndexSize() const { return m_ocrIndexSize; } @@ -77,7 +81,7 @@ uint Monitor::contentIndexProgress() const return m_contentIndexProgress; } -uint Monitor::ocrIndexProgress() const +uint Monitor::ocrContentIndexProgress() const { return m_ocrIndexProgress; } @@ -114,30 +118,54 @@ void Monitor::onIndexStateChanged(IndexScheduler::IndexerState state) void Monitor::processUpdate(IndexType type, uint all, uint finished) { switch (type) { - case IndexType::Basic: - m_basicIndexSize = all; - Q_EMIT basicIndexSizeChanged(m_basicIndexSize); - m_basicIndexProgress = finished; - Q_EMIT basicIndexProgressChanged(m_basicIndexProgress); - m_basicIndexDocNum = m_basicDatabase.getIndexDocCount(); - Q_EMIT basicIndexDocNumChanged(m_basicIndexDocNum); + case IndexType::Basic: { + if(m_basicIndexSize != all) { + m_basicIndexSize = all; + Q_EMIT basicIndexSizeChanged(m_basicIndexSize); + } + if(m_basicIndexProgress != finished) { + m_basicIndexProgress = finished; + Q_EMIT basicIndexProgressChanged(m_basicIndexProgress); + } + uint count = m_basicDatabase.getIndexDocCount(); + if(m_basicIndexDocNum != count) { + m_basicIndexDocNum = count; + Q_EMIT basicIndexDocNumChanged(m_basicIndexDocNum); + } break; - case IndexType::Contents: - m_contentIndexSize = all; - Q_EMIT contentIndexSizeChanged(m_contentIndexSize); - m_contentIndexProgress = finished; - Q_EMIT contentIndexProgressChanged(m_contentIndexProgress); - m_contentIndexDocNum = m_contentDatabase.getIndexDocCount(); - Q_EMIT contentIndexDocNumChanged(m_contentIndexDocNum); + } + case IndexType::Contents: { + if(m_contentIndexSize != all) { + m_contentIndexSize = all; + Q_EMIT contentIndexSizeChanged(m_contentIndexSize); + } + if(m_contentIndexProgress != finished) { + m_contentIndexProgress = finished; + Q_EMIT contentIndexProgressChanged(m_contentIndexProgress); + } + uint count = m_contentDatabase.getIndexDocCount(); + if(m_contentIndexDocNum != count) { + m_contentIndexDocNum = count; + Q_EMIT contentIndexDocNumChanged(m_contentIndexDocNum); + } break; - case IndexType::OCR: - m_ocrIndexSize = all; - Q_EMIT ocrIndexSizeChanged(m_ocrIndexSize); - m_ocrIndexProgress = finished; - Q_EMIT ocrIndexProgressChanged(m_ocrIndexProgress); - m_ocrContentIndexDocNum = m_ocrContentDatabase.getIndexDocCount(); - Q_EMIT ocrContentIndexDocNumChanged(m_ocrContentDatabase.getIndexDocCount()); + } + case IndexType::OCR: { + if(m_ocrIndexSize != all) { + m_ocrIndexSize = all; + Q_EMIT ocrContentIndexSizeChanged(m_ocrIndexSize); + } + if(m_ocrIndexProgress != finished) { + m_ocrIndexProgress = finished; + Q_EMIT ocrContentIndexProgressChanged(m_ocrIndexProgress); + } + uint count = m_contentDatabase.getIndexDocCount(); + if(m_ocrContentIndexDocNum != count) { + m_ocrContentIndexDocNum = count; + Q_EMIT ocrContentIndexDocNumChanged(m_ocrContentDatabase.getIndexDocCount()); + } break; + } default: break; } diff --git a/ukui-search-service/monitor.h b/ukui-search-service/monitor.h index df338eb..cdc1d77 100644 --- a/ukui-search-service/monitor.h +++ b/ukui-search-service/monitor.h @@ -56,10 +56,10 @@ public: */ uint contentIndexSize() const override; /** - * @brief ocrIndexSize + * @brief ocrContentIndexSize * @return 当前需要处理的OCR索引数量 */ - uint ocrIndexSize() const override; + uint ocrContentIndexSize() const override; /** * @brief basicIndexProgress * @return 基础索引进度 @@ -71,10 +71,10 @@ public: */ uint contentIndexProgress() const override; /** - * @brief ocrIndexProgress + * @brief ocrContentIndexProgress * @return ocr索引进度 */ - uint ocrIndexProgress() const override; + uint ocrContentIndexProgress() const override; /** * @brief basicIndexDocNum * @return 基础索引完成的总文档数 @@ -91,22 +91,6 @@ public: */ uint ocrContentIndexDocNum() const override; -Q_SIGNALS: - /** - * @brief basicIndexDone - * 基础索引数据库建立完成或完成增量更新 - */ - void basicIndexDone(); - /** - * @brief contentIndexDone - * 内容索引数据库建立完成或完成增量更新 - */ - void contentIndexDone(); - - void basicIndexDocNumChanged(uint); - void contentIndexDocNumChanged(uint); - void ocrContentIndexDocNumChanged(uint); - private Q_SLOTS: void onIndexStateChanged(IndexScheduler::IndexerState); void processUpdate(UkuiSearch::IndexType type, uint all, uint finished); diff --git a/ukui-search-service/qml/IndexMonitor.qml b/ukui-search-service/qml/IndexMonitor.qml index f0c9983..b955ce0 100644 --- a/ukui-search-service/qml/IndexMonitor.qml +++ b/ukui-search-service/qml/IndexMonitor.qml @@ -30,19 +30,24 @@ Rectangle { StatusKeyValue { id: basicIndexDocumentNum keyText: qsTr("Basic index document number") - valueText: "--" + valueText: monitor.basicIndexDocNum } StatusKeyValue { id: contentIndexDocumentNum keyText: qsTr("Content index document number") - valueText: "--" + valueText: monitor.contentIndexDocNum + } + StatusKeyValue { + id: ocrContentIndexDocumentNum + keyText: qsTr("OCR content index document number") + valueText: monitor.ocrContentIndexDocNum } StatusKeyValue { id: indexState keyText: qsTr("Index state") - valueText: "--" + valueText: monitor.indexState } IndexProgressBar { @@ -50,7 +55,9 @@ Rectangle { width: parent.width; name: "Basic index progress" from: 0 - visible: false + to: monitor.basicIndexSize + value: monitor.basicIndexProgress + visible: true } IndexProgressBar { @@ -58,80 +65,45 @@ Rectangle { width: parent.width; name: "Content index progress" from: 0 - visible: false + to: monitor.contentIndexSize + value: monitor.contentIndexProgress + visible: true } IndexProgressBar { - id: ocrIndexProgress + id: ocrContentIndexProgress name: "OCR index progress" width: parent.width; from: 0 - visible: false - } - - Component.onCompleted: { - basicIndexDocumentNum.valueText = monitor.basicIndexDocNum - contentIndexDocumentNum.valueText = monitor.contentIndexDocNum - indexState.valueText = monitor.indexState - monitor.basicIndexDocNumUpdate.connect(onBasicIndexDocNumUpdate); - monitor.contentIndexDocNumUpdate.connect(onContentIndexDocumentNum); - monitor.indexStateChanged.connect(onIndexStateChanged); - monitor.basicIndexSizeChange.connect(onBasicIndexSizeChange); - monitor.basicIndexProgressUpdate.connect(onBasicIndexProgressUpdate); - monitor.contentIndexSizeChange.connect(onContentIndexSizeChange); - monitor.contentIndexProgressUpdate.connect(onContentIndexProgressUpdate); - monitor.ocrIndexSizeChange.connect(onOcrIndexSizeChange); - monitor.onOcrIndexProgressUpdate.connect(onOcrIndexProgressUpdate); - monitor.basicIndexDone.connect(onBasicIndexDone); - monitor.contentIndexDone.connect(onContentIndexDone); - } - function onBasicIndexDocNumUpdate(num) { - var numStr = "%1"; - basicIndexDocumentNum.valueText = numStr.arg(num); - } - function onContentIndexDocumentNum(num) { - var numStr = "%1"; - contentIndexDocumentNum.valueText = numStr.arg(num); - } - function onIndexStateChanged(state) { - indexState.valueText = state; - } - function onBasicIndexSizeChange(num) { - if(!basicIndexProgress.visible) { - basicIndexProgress.visible = true; - } - basicIndexProgress.to = num; - } - function onBasicIndexProgressUpdate(num) { - basicIndexProgress.value = num; - basicIndexProgress.state = "Running" - } - function onContentIndexSizeChange(num) { - if(!contentIndexProgress.visible) { - contentIndexProgress.visible = true; - } - contentIndexProgress.to = num; - } - function onContentIndexProgressUpdate(num) { - contentIndexProgress.value = num; - contentIndexProgress.state = "Running" - } - function onOcrIndexSizeChange(num) { - if(!ocrIndexProgress.visible) { - ocrIndexProgress.visible = true; - } - ocrIndexProgress.to = num; - } - function onOcrIndexProgressUpdate(num) { - ocrIndexProgress.value = num; - ocrIndexProgress.state = "Running" - } - function onBasicIndexDone() { - basicIndexProgress.state = "Done" - } - function onContentIndexDone() { - contentIndexProgress.state = "Done" - ocrIndexProgress.state = "Done" + to: monitor.ocrContentIndexSize + value: monitor.ocrContentIndexProgress + visible: true } } + Component.onCompleted: { + monitor.basicIndexDone.connect(onBasicIndexDone); + monitor.contentIndexDone.connect(onContentIndexDone); + monitor.ocrContentIndexDone.connect(onOcrContentIndexDone); + monitor.basicIndexStart.connect(onBasicIndexStart); + monitor.contentIndexStart.connect(onContentIndexStart); + monitor.ocrContentIndexStart.connect(onOcrContentIndexStart); + } + function onBasicIndexStart() { + basicIndexProgress.state = "Running" + } + function onContentIndexStart() { + contentIndexProgress.state = "Running" + } + function onOcrContentIndexStart() { + ocrContentIndexProgress.state = "Running" + } + function onBasicIndexDone() { + basicIndexProgress.state = "Done" + } + function onContentIndexDone() { + contentIndexProgress.state = "Done" + } + function onOcrContentIndexDone() { + ocrContentIndexProgress.state = "Done" + } } diff --git a/ukui-search-service/ukui-search-service.cpp b/ukui-search-service/ukui-search-service.cpp index 981f3d2..473fb6b 100644 --- a/ukui-search-service/ukui-search-service.cpp +++ b/ukui-search-service/ukui-search-service.cpp @@ -18,17 +18,11 @@ * */ #include -#include #include -#include - #include #include #include "ukui-search-service.h" -#include "dir-watcher.h" #include "file-utils.h" -#include "file-indexer-config.h" -#include "rep_monitor_replica.h" using namespace UkuiSearch; UkuiSearchService::UkuiSearchService(int &argc, char *argv[], const QString &applicationName) @@ -143,26 +137,24 @@ void UkuiSearchService::loadMonitorWindow() void UkuiSearchService::showMonitorState() { - m_qroNode.connectToNode(nodeUrl()); - auto *m = m_qroNode.acquire(); + auto indexMonitor = IndexMonitor::self(); - connect(m, &QRemoteObjectReplica::initialized, [&, m](){ + connect(indexMonitor, &IndexMonitor::serviceReady, [&, indexMonitor](){ qDebug() << "QRemoteObjectReplica initialized"; - QString state = m->indexState(); - QString message = "Current index path: " + m->currentIndexPaths().join(",") + "\n" - + "Current index scheduler state: " + m->indexState() + "\n"; + QString state = indexMonitor->indexState(); + QString message = "Current index path: " + indexMonitor->currentIndexPaths().join(",") + "\n" + + "Current index scheduler state: " + indexMonitor->indexState() + "\n"; if(state == "Idle" || state == "Stop") { - message += "Basic index size: " + QString::number(m->basicIndexDocNum()) + " \n" - + "Content index size: " + QString::number(m->contentIndexDocNum()) + " \n" - + "Ocr index size: " + QString::number(m->ocrContentIndexDocNum()) + " \n"; + message += "Basic index size: " + QString::number(indexMonitor->basicIndexDocNum()) + " \n" + + "Content index size: " + QString::number(indexMonitor->contentIndexDocNum()) + " \n" + + "Ocr index size: " + QString::number(indexMonitor->ocrContentIndexDocNum()) + " \n"; } else { - message += "Basic index progress: " + QString::number(m->basicIndexProgress()) + " of " + QString::number(m->basicIndexSize())+ " finished\n" - + "Content index progress: " + QString::number(m->contentIndexProgress()) + " of " + QString::number(m->contentIndexSize())+ " finished\n" - + "Ocr content index progress: " + QString::number(m->ocrIndexProgress()) + " of " + QString::number(m->ocrIndexSize())+ " finished\n"; + message += "Basic index progress: " + QString::number(indexMonitor->basicIndexProgress()) + " of " + QString::number(indexMonitor->basicIndexSize())+ " finished\n" + + "Content index progress: " + QString::number(indexMonitor->contentIndexProgress()) + " of " + QString::number(indexMonitor->contentIndexSize())+ " finished\n" + + "Ocr content index progress: " + QString::number(indexMonitor->ocrContentIndexProgress()) + " of " + QString::number(indexMonitor->ocrContentIndexSize())+ " finished\n"; } - - delete m; + IndexMonitor::stopMonitor(); fputs(qPrintable(message), stdout); qApp->quit(); }); diff --git a/ukui-search-service/ukui-search-service.h b/ukui-search-service/ukui-search-service.h index e27d28c..d58de03 100644 --- a/ukui-search-service/ukui-search-service.h +++ b/ukui-search-service/ukui-search-service.h @@ -24,11 +24,11 @@ #include #include #include -#include #include "qtsingleapplication.h" #include "common.h" #include "index-scheduler.h" #include "monitor.h" +#include "index-monitor.h" namespace UkuiSearch { @@ -49,7 +49,6 @@ private: IndexScheduler *m_indexScheduler = nullptr; Monitor *m_monitor = nullptr; QRemoteObjectHost m_qroHost; - QRemoteObjectNode m_qroNode; QQuickView *m_quickView = nullptr; QUrl m_qmlPath = QString("qrc:/qml/IndexMonitor.qml");