diff options
author | Michal Hruby <michal.mhr@gmail.com> | 2012-03-26 17:09:54 +0200 |
---|---|---|
committer | Michal Hruby <michal.mhr@gmail.com> | 2012-03-26 17:09:54 +0200 |
commit | c2426f94f10699bbc94a1b0496e9fcf3574f6bbf (patch) | |
tree | 14b1b7edebf1f7638a39b854bb9d903e0bc3ca66 | |
parent | d79366bde94b5b8e00b7ad2e8e5763c5305a6aaf (diff) | |
download | zeitgeist-c2426f94f10699bbc94a1b0496e9fcf3574f6bbf.tar.gz |
Don't use single find_events call during reindex, instead do find_event_ids + get_events
-rw-r--r-- | extensions/fts++/controller.cpp | 39 | ||||
-rw-r--r-- | extensions/fts++/controller.h | 1 | ||||
-rw-r--r-- | extensions/fts++/task.cpp | 32 | ||||
-rw-r--r-- | extensions/fts++/task.h | 7 |
4 files changed, 63 insertions, 16 deletions
diff --git a/extensions/fts++/controller.cpp b/extensions/fts++/controller.cpp index d945a327..b849d819 100644 --- a/extensions/fts++/controller.cpp +++ b/extensions/fts++/controller.cpp @@ -37,19 +37,21 @@ void Controller::Run () void Controller::RebuildIndex () { GError *error = NULL; - GPtrArray *events; + guint32 *event_ids; + gint event_ids_size; GPtrArray *templates = g_ptr_array_new (); ZeitgeistTimeRange *time_range = zeitgeist_time_range_new_anytime (); g_debug ("asking reader for all events"); - events = zeitgeist_db_reader_find_events (zg_reader, - time_range, - templates, - ZEITGEIST_STORAGE_STATE_ANY, - 0, - ZEITGEIST_RESULT_TYPE_MOST_RECENT_EVENTS, - NULL, - &error); + event_ids = zeitgeist_db_reader_find_event_ids (zg_reader, + time_range, + templates, + ZEITGEIST_STORAGE_STATE_ANY, + 0, + ZEITGEIST_RESULT_TYPE_MOST_RECENT_EVENTS, + NULL, + &event_ids_size, + &error); if (error) { @@ -58,10 +60,10 @@ void Controller::RebuildIndex () } else { - g_debug ("reader returned %u events", events->len); + g_debug ("reader returned %d events", event_ids_size); - IndexEvents (events); - g_ptr_array_unref (events); + IndexEvents (event_ids, event_ids_size); + g_free (event_ids); // Set the db metadata key only once we're done PushTask (new MetadataTask ("fts_index_version", INDEX_VERSION)); @@ -81,6 +83,19 @@ void Controller::IndexEvents (GPtrArray *events) } } +void Controller::IndexEvents (guint *event_ids, int event_ids_size) +{ + const int CHUNK_SIZE = 64; + // Break down index tasks into suitable chunks + for (int i = 0; i < event_ids_size; i += CHUNK_SIZE) + { + int num_ids = i + CHUNK_SIZE > event_ids_size ? + event_ids_size - i : CHUNK_SIZE; + PushTask (new IndexEventsTask (zg_reader, + std::vector<guint> (&event_ids[i], &event_ids[i + num_ids]))); + } +} + void Controller::DeleteEvents (guint *event_ids, int event_ids_size) { // FIXME: Should we break the task here as well? diff --git a/extensions/fts++/controller.h b/extensions/fts++/controller.h index b62c2918..e6dd0603 100644 --- a/extensions/fts++/controller.h +++ b/extensions/fts++/controller.h @@ -49,6 +49,7 @@ public: void RebuildIndex (); void IndexEvents (GPtrArray *events); + void IndexEvents (guint *event_ids, int event_ids_size); void DeleteEvents (guint *event_ids, int event_ids_size); void PushTask (Task* task); diff --git a/extensions/fts++/task.cpp b/extensions/fts++/task.cpp index 67346ac6..caa17ced 100644 --- a/extensions/fts++/task.cpp +++ b/extensions/fts++/task.cpp @@ -23,10 +23,36 @@ namespace ZeitgeistFTS { void IndexEventsTask::Process (Indexer *indexer) { - unsigned end_index = MIN (start_index + event_count, events->len); - for (unsigned i = start_index; i < end_index; i++) + if (events) { - indexer->IndexEvent ((ZeitgeistEvent*) g_ptr_array_index (events, i)); + unsigned end_index = MIN (start_index + event_count, events->len); + for (unsigned i = start_index; i < end_index; i++) + { + indexer->IndexEvent ((ZeitgeistEvent*) g_ptr_array_index (events, i)); + } + } + else if (!event_ids.empty ()) + { + GError *error = NULL; + GPtrArray *results = zeitgeist_db_reader_get_events (zg_reader, + &event_ids[0], + event_ids.size (), + NULL, + &error); + if (error) + { + g_warning ("Unable to get events: %s", error->message); + return; + } + else + { + for (unsigned i = 0; i < results->len; i++) + { + indexer->IndexEvent ((ZeitgeistEvent*) g_ptr_array_index (results, i)); + } + } + + g_ptr_array_unref (results); } } diff --git a/extensions/fts++/task.h b/extensions/fts++/task.h index 3d4b3dd9..630503a6 100644 --- a/extensions/fts++/task.h +++ b/extensions/fts++/task.h @@ -49,16 +49,21 @@ public: IndexEventsTask (GPtrArray *event_arr, unsigned index, unsigned count) : events (event_arr), start_index (index), event_count (count) {} + + IndexEventsTask (ZeitgeistDbReader *reader, std::vector<unsigned> const &ids) + : events (NULL), zg_reader (reader), event_ids (ids) {} virtual ~IndexEventsTask () { - g_ptr_array_unref (events); + if (events) g_ptr_array_unref (events); } private: GPtrArray *events; unsigned start_index; unsigned event_count; + ZeitgeistDbReader *zg_reader; + std::vector<unsigned> event_ids; }; class DeleteEventsTask : public Task |