package br.com.dextra.dextranet.indexacao;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import br.com.dextra.dextranet.conteudo.Conteudo;
import br.com.dextra.dextranet.conteudo.ConteudoIndexavel;
import br.com.dextra.dextranet.persistencia.EntidadeRepository;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.search.Document;
import com.google.appengine.api.search.GetRequest;
import com.google.appengine.api.search.GetResponse;
import com.google.appengine.api.search.Index;
import com.google.appengine.api.search.IndexSpec;
import com.google.appengine.api.search.Query;
import com.google.appengine.api.search.ScoredDocument;
import com.google.appengine.api.search.SearchServiceFactory;
public class IndexacaoRepository extends EntidadeRepository {
private Logger logger = LoggerFactory.getLogger(IndexacaoRepository.class);
public void indexar(ConteudoIndexavel conteudo) {
IndexFacade.getIndex(conteudo.getClass().getName()).put(conteudo.toDocument());
}
public void removeIndexacao(String indexKey, String id) {
IndexFacade.getIndex(indexKey).delete(id);
}
public <T extends Conteudo> List<T> buscar(Class<T> clazz, Query query) {
Index idx = IndexFacade.getIndex(clazz.getName());
List<T> ret = new ArrayList<T>();
Collection<ScoredDocument> results = idx.search(query).getResults();
try {
Constructor<T> constructor = clazz.getDeclaredConstructor(Entity.class);
for (ScoredDocument doc : results) {
String id = doc.getFields("id").iterator().next().getText();
Entity entity = obtemPorId(id, clazz);
ret.add(constructor.newInstance(entity));
}
} catch (Exception e) {
logger.error(e.getMessage(), e);
throw new RuntimeException(e);
}
return ret;
}
public <T extends Conteudo> List<T> buscar(Class<T> clazz, String query) {
return buscar(clazz, Query.newBuilder().build(query));
}
public void apagaIndices(Class nomeIndice){
try {
while (true) {
List<String> docIds = new ArrayList<String>();
// Return a set of document IDs.
GetRequest request = GetRequest.newBuilder().setReturningIdsOnly(true).build();
GetResponse<Document> response = getIndex(nomeIndice).getRange(request);
if (response.getResults().isEmpty()) {
break;
}
for (Document doc : response) {
docIds.add(doc.getId());
}
getIndex(nomeIndice).delete(docIds);
}
} catch (RuntimeException e) {
}
}
public Index getIndex(Class nomeIndice) {
IndexSpec indexSpec = IndexSpec.newBuilder().setName(nomeIndice.getName()).build();
return SearchServiceFactory.getSearchService().getIndex(indexSpec);
}
}