package br.com.dextra.dextranet.indexacao; import java.util.ArrayList; import java.util.Date; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.QueryParam; import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import br.com.dextra.dextranet.conteudo.Conteudo; import br.com.dextra.dextranet.conteudo.post.Post; import br.com.dextra.dextranet.conteudo.post.PostFields; import br.com.dextra.dextranet.conteudo.post.PostRepository; import br.com.dextra.dextranet.conteudo.post.comentario.Comentario; import br.com.dextra.dextranet.excecoes.HttpException; import br.com.dextra.dextranet.rest.config.Application; import br.com.dextra.dextranet.utils.ConteudoHTML; import com.google.appengine.api.datastore.EntityNotFoundException; import com.google.appengine.api.search.Query; import com.google.appengine.api.search.QueryOptions; import com.google.appengine.api.search.SearchQueryException; import com.google.appengine.api.search.SortExpression; import com.google.appengine.api.search.SortOptions; import com.google.appengine.api.search.SortOptions.Builder; @Path("/indexacao") public class IndexacaoRS { private PostRepository repositorioDePosts = new PostRepository(); private IndexacaoRepository repositorioDeIndex = new IndexacaoRepository(); @GET @Path("/") @Produces(Application.JSON_UTF8) public Response buscarConteudo(@QueryParam("query") String query) throws HttpException { try { List<Post> ret = new ArrayList<Post>(); ConteudoHTML conteudoHTML = new ConteudoHTML(query); query = conteudoHTML.removeJavaScript(); Query postQuery = criarOpcoesOrdenacaoPosts(query); List<Post> posts = repositorioDeIndex.buscar(Post.class, postQuery); for (Conteudo post : posts) { ret.add(repositorioDePosts.obtemPorId(post.getId())); } List<Comentario> comentarios = repositorioDeIndex.buscar(Comentario.class, query); for (Comentario comentario : comentarios) { Post post = repositorioDePosts.obtemPorId(comentario.getPostId()); if(!ret.contains(post)) { ret.add(post); } } return Response.ok().entity(ret).build(); } catch (SearchQueryException e) { throw new HttpException(Status.INTERNAL_SERVER_ERROR); } catch (EntityNotFoundException e) { throw new HttpException(Status.NOT_FOUND); } } private Query criarOpcoesOrdenacaoPosts(String query) { Builder sortOptions = SortOptions.newBuilder(); sortOptions .addSortExpression( SortExpression.newBuilder().setExpression(PostFields.dataDeCriacao.name()).setDirection(SortExpression.SortDirection.DESCENDING) .setDefaultValueDate(new Date())).setLimit(Application.LIMITE_REGISTROS_FULL_TEXT_SEARCH).build(); QueryOptions options = QueryOptions.newBuilder().setLimit(Application.LIMITE_REGISTROS_FULL_TEXT_SEARCH).setSortOptions(sortOptions).build(); return Query.newBuilder().setOptions(options).build(query); } @GET @Path("/delete") public void apagarIndicesFTS(){ repositorioDeIndex.apagaIndices(Post.class); repositorioDeIndex.apagaIndices(Comentario.class); } }