string Mediator::search(IndexWrapper::indexItem index, string toSearch) { Key* k = NULL; string toReturn; list<int>* bookIds; //string separator; //list<string> wordsToFind; FileParser* fp; map<string, Term*> wordsToFind; list<Word*> words; list<int>* coincidenceDocs = NULL; list<int>* notCoincidenceDocs = NULL; list<BookGlobalWeight*>* bookByGlobalWeight = NULL; bool doSearch = false; int totalBooks; switch(index){ case IndexWrapper::EDITORIAL: k = new Key(toSearch); bookIds = this->indexWrapper->searchAllIds(k, index); break; case IndexWrapper::AUTOR: k = new Key(toSearch); bookIds = this->indexWrapper->searchAllIds(k, index); break; case IndexWrapper::TITULO: k = new Key(toSearch); bookIds = this->indexWrapper->searchAllIds(k, index); break; case IndexWrapper::PALABRAS: { bookIds = new list<int>(); //separator = " "; //wordsToFind = Utility::split(toSearch, separator); fp = new FileParser(); fp->setWords(toSearch); wordsToFind = fp->getTerms(); delete fp; // Se recorre todas las palabras de las busqueda, y se buscan en el hash for(map<string, Term*>::iterator it = wordsToFind.begin(); it != wordsToFind.end(); ++it) { Key* k = new Key((*it).first); list<int>* booksWords = this->indexWrapper->searchAllIds(k, index); Word* newWord = new Word((*it).first, booksWords); words.push_back(newWord); if (newWord->getBooks()->size() > 0) doSearch = true; delete k; } if (wordsToFind.size()>0 && doSearch) { //Obtiene los libros en que se encuentran en todas las palabras coincidenceDocs = this->findCoincidences(words); if (coincidenceDocs->size() > 0) { list<RankingBook>* listRanking; listRanking = findTermProxIdBooks(coincidenceDocs,words); list<RankingBook>::iterator itRanking; cout << "Ids book Encontrados por Terminos Proximos: "; for(itRanking=listRanking->begin();itRanking!=listRanking->end();++itRanking) { int idBook = (*itRanking).getIdBook(); cout << idBook << " "; bookIds->push_back(idBook); } cout << endl; } //Obtiene los libros que se encuentran solo algunas de las palabras notCoincidenceDocs = this->findNotCoincidences(words, coincidenceDocs); if (notCoincidenceDocs->size() > 0) { //Ordena los documentos que no tienen coincidencia total en los terminos segun el peso global totalBooks = coincidenceDocs->size() + notCoincidenceDocs->size(); bookByGlobalWeight = this->orderBookByGlobalWeight(notCoincidenceDocs, words, totalBooks); cout << "Ids book Encontrados por Peso Global: "; for(list<BookGlobalWeight*>::iterator itGW = bookByGlobalWeight->begin(); itGW!=bookByGlobalWeight->end(); ++itGW) { int idBook = (*itGW)->getIdBook(); cout << idBook << " "; bookIds->push_back(idBook); } cout << endl; } } break; } default: break; } if(bookIds->size() > 0){ for (list<int>::iterator it = bookIds->begin(); it != bookIds->end(); ++it) { ByteString bs = this->dataBookManager->getBook(*it); Book b; b.Hidratate(bs); toReturn.append(b.getBookFormatedText()); } }else toReturn = "La busqueda no arrojo resultados"; delete k; return toReturn; }