/* * DrakkarKeel - An Enterprise Collaborative Search Platform * * The contents of this file are subject under the terms described in the * DRAKKARKEEL_LICENSE file included in this distribution; you may not use this * file except in compliance with the License. * * 2013-2014 DrakkarKeel Platform. */ package drakkar.mast.retrieval.improves; import drakkar.oar.DocumentMetaData; import drakkar.oar.ResultSetMetaData; import drakkar.oar.util.KeySearchable; import drakkar.mast.SearchException; import drakkar.mast.SearchableException; import java.util.ArrayList; import java.util.List; import java.util.Map; /** * Esta clase maneja todos los métodos de búsqueda colaborativa para un solo * buscador, que pueden ser invocados por los clientes */ public class CollaborativeSingleSearch extends SearchFactory { private DefaultSingleSearch dSingleSearch; /** * Constructor de la clase * * @param searchers lista buscadores * @param dSingleSearch objeto DefaultSingleSearch */ public CollaborativeSingleSearch(DefaultSingleSearch dSingleSearch) { super(dSingleSearch.getSearchersHash(), dSingleSearch.getSearchableList()); this.dSingleSearch = dSingleSearch; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param field campo del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, int field, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, field, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, int[] fields, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, fields, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param docType tipo de documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, String docType, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, docType, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param docTypes tipo de documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, String[] docTypes, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, docTypes, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param docType tipo de documento * @param field campo del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, String docType, int field, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, docType, field, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param docType tipo de documento * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, String docType, int[] fields, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, docType, fields, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param docTypes tipo de documento * @param field campo del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, String[] docTypes, int field, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, docTypes, field, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Invoca una búsqueda a partir de los parámetros de entrada, aplicando * mecanismos de división del trabajo * * @param searcher buscador * @param query consulta de la búsqueda * @param docTypes tipo de documento * @param fields campos del documento * @param caseSensitive tener en cuenta mayúsculas y minísculas * @param members número de miembros de la sesión * * @return lista de documentos encontrados * * @throws SearchException si ocurre alguna excepción durante el proceso de búsqueda * @throws SearchableException si el buscador no se encuentra disponible * <br> * <br> * <b>Nota:</b> * <br> * Las constantes que representan los diferentes buscadores soportados, se encuentran * definidas en la clase <code>KeySearchable</code>, del paquete drakkar.oar.util * <br> * <br> * * @see KeySearchable * */ public List<ResultSetMetaData> search(int searcher, String query, String[] docTypes, int[] fields, boolean caseSensitive, int members) throws SearchException, SearchableException { ResultSetMetaData temp = this.dSingleSearch.search(query, docTypes, fields, searcher, caseSensitive); List<ResultSetMetaData> results = this.divideSearchResults(query, temp, searcher, members); return results; } /** * Este método es empleado internamente por los métodos de búsqueda que aplican * mecanismos de división del trabajo, para distribuir los resultados obtenidos * de todos los motores de búsquedas entre los miembros de la sesión * * @param ResultSetMetaData resultados de la búsqueda * @param members número de miembros de la sesión * * @return lista con los resultados a enviar a cada miembro de la sesión */ private List<ResultSetMetaData> divideSearchResults(String query, ResultSetMetaData results, int searcher, int members) { List<DocumentMetaData> values = results.getAllResultList(); List<ResultSetMetaData> list = this.getResultsList(query, searcher, members); DocumentMetaData doc = null; List<DocumentMetaData> valueTemp; ResultSetMetaData itemList; Map<Integer, List<DocumentMetaData>> itemHash = null; int size = values.size(); int x = size / members; int r = members * x; int a = size - r; int count = 0; for (int i = 0; i < r; i += members) { count = i; for (int j = 0; j < members; j++) { itemList = list.get(j); itemHash = itemList.getResultsMap(); valueTemp = itemHash.get(searcher); doc = values.get(count); valueTemp.add(doc); count++; } } for (int j = 0; j < a; j++) { itemList = list.get(j); itemHash = itemList.getResultsMap(); valueTemp = itemHash.get(searcher); doc = values.get(count); valueTemp.add(doc); count++; } return list; } /** * Este método es empleado internamente por el método * <code>divideSearchResults(ResultSetMetaData ResultSetMetaData, int members)</code> * para obtener una lista que almacenará la lista de documentos por cada usuario * de la sesión * * @param members número de miembros de la sesión * * @return lista de documentos. */ private List<ResultSetMetaData> getResultsList(String query, int searcher, int members) { List<ResultSetMetaData> list = new ArrayList<ResultSetMetaData>(members); for (int i = 0; i < members; i++) { list.add(new ResultSetMetaData(query, searcher)); } return list; } }