diff --git a/libsaria/library/file.cpp b/libsaria/library/file.cpp index dbfcb725..16b75f70 100644 --- a/libsaria/library/file.cpp +++ b/libsaria/library/file.cpp @@ -48,7 +48,6 @@ static void do_load() libsaria::library::rebuild_list(); libsaria::library::refresh(); - libsaria::library::reindex(); } LoadTask::LoadTask() {} diff --git a/libsaria/library/index.cpp b/libsaria/library/index.cpp deleted file mode 100644 index 6a22861f..00000000 --- a/libsaria/library/index.cpp +++ /dev/null @@ -1,210 +0,0 @@ - -#include -#include -#include -using namespace std; - -#include - -#include -#include -#include "library.h" - -#define MAX_TRACKS 100 - -static map > substr_index; -static set results; -static string cur_filter; -static bool filtered; - -static void add_to_index(sid_t &inode, string &key) -{ - map >::iterator it; - - it = substr_index.find(key); - if (it != substr_index.end()) - it->second.insert(inode); - else { - set to_insert; - to_insert.insert(inode); - substr_index.insert(pair >(key, to_insert)); - } -} - -static void index_word(sid_t &inode, string &word) -{ - string substr, key; - - for (unsigned int i = 0; i < word.size(); i++) { - substr = word.substr(i, word.size()); - for (unsigned int j = 1; j < substr.size() + 1; j++) { - key = substr.substr(0, j); - add_to_index(inode, key); - } - } -} - -static void index_tag(sid_t &inode, string tag) -{ - list *word_list; - list::iterator it; - word_list = libsaria::format_text(tag); - for (it = word_list->begin(); it != word_list->end(); it++) - index_word(inode, *it); -} - -IndexTask::IndexTask() {}; -IndexTask::~IndexTask() {}; - -void IndexTask::index_track(libsaria::Track *tag) -{ - track_list.push_back(tag); -} - -void IndexTask::run_task() -{ - list::iterator it; - sid_t inode; - - for (it = track_list.begin(); it != track_list.end(); it++) { - inode = (*it)->get_songid(); - index_tag(inode, (*it)->get_title()); - index_tag(inode, (*it)->get_artist()); - index_tag(inode, (*it)->get_album()); - } - if (cur_filter != "") - libsaria::library::filter(cur_filter); -} - -static void reindex_path(list *tag_list) -{ - list::iterator it; - unsigned int i = 0, j = 0; - IndexTask *task = new IndexTask(); - - for (it = tag_list->begin(); it != tag_list->end(); it++) { - task->index_track(&(*it)); - i++; - if (i == MAX_TRACKS) { - task->queue(); - task = new IndexTask(); - i = 0; - j++; - } - } - task->queue(); -} - -/* - * Thanks to: http://stackoverflow.com/questions/1773526/in-place-c-set-intersection - * for the set intersection algorithm! - */ -static void inplace_intersect(set *inodes) -{ - set::iterator it1 = results.begin(); - set::iterator it2 = inodes->begin(); - - while ( (it1 != results.end()) && (it2 != inodes->end()) ) { - if (*it1 < *it2) - results.erase(it1++); - else if (*it2 < *it1) - it2++; - else { /* *it1 == *it2 */ - it1++; - it2++; - } - } - - /* Remove everything in results that wasn't in inodes */ - results.erase(it1, results.end()); - -} - -static void do_filter(list *terms) -{ - list::iterator it; - map >::iterator index_iter; - - for (it = terms->begin(); it != terms->end(); it++) { - index_iter = substr_index.find(*it); - /* - * Key not found means we don't need to filter anymore - * just clear the results set and return - */ - if (index_iter == substr_index.end()) { - results.clear(); - return; - } - /* - * This is the first result, so the result set is empty. - * Taking an intersection will always give us an empty set - */ - if (it == terms->begin()) - results = index_iter->second; - else - inplace_intersect(&index_iter->second); - } - - -} - -namespace libsaria -{ - - void library::reindex() - { - list *path_list = get_path_list(); - list::iterator it; - - for (it = path_list->begin(); it != path_list->end(); it++) - reindex_path(it->get_list()); - } - - void library::filter(string &text) - { - list *key_list; - - key_list = format_text(text); - results.clear(); - - if (key_list->size() == 0) - filtered = false; - else { - do_filter(key_list); - filtered = true; - } - cur_filter = text; - trigger_callback(REFILTER); - } - - bool library::is_filtered() - { - return filtered; - } - - bool library::is_visible(sid_t &inode) - { - set::iterator it; - - if (filtered == false) - return true; - it = results.find(inode); - return it != results.end(); - } - - unsigned int library::filter_size() - { - return results.size(); - } - - sid_t library::index_rand() - { - set::iterator it = results.begin(); - unsigned int index = rand() % filter_size(); - - for (unsigned int i = 0; i < index; i++) - it++; - return *it; - } - -}; /* Namespace: libsaria */ diff --git a/libsaria/library/library.cpp b/libsaria/library/library.cpp index ef14910b..a13615ab 100644 --- a/libsaria/library/library.cpp +++ b/libsaria/library/library.cpp @@ -44,7 +44,6 @@ namespace libsaria void library::refresh() { rebuild_list(); - reindex(); trigger_callback(LIBRARY_REFRESH); } diff --git a/libsaria/library/library.h b/libsaria/library/library.h index 74e0f76d..fcec2aa5 100644 --- a/libsaria/library/library.h +++ b/libsaria/library/library.h @@ -54,18 +54,6 @@ class ScanTask : public IdleTask void run_task(); }; -class IndexTask : public IdleTask -{ - private: - list track_list; - - public: - IndexTask(); - ~IndexTask(); - void index_track(libsaria::Track *); - void run_task(); -}; - namespace libsaria { namespace library @@ -73,10 +61,6 @@ namespace libsaria list *get_path_list(); LibraryPath *get_path(string); void rebuild_list(); - void reindex(); - bool is_filtered(); - unsigned int filter_size(); - sid_t index_rand(); } } diff --git a/libsaria/library/list.cpp b/libsaria/library/list.cpp index 08cf4417..b4a8a46a 100644 --- a/libsaria/library/list.cpp +++ b/libsaria/library/list.cpp @@ -94,7 +94,7 @@ static void random_next() cur_track = play_list.begin(); if (libsaria::index::is_filtered()) { println("Picking random track from index"); - sid_t inode = libsaria::library::index_rand(); + sid_t inode = libsaria::index::rand(); libsaria::library::play_id(inode); } else { unsigned int index = rand() % play_list.size();