Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Rodrigo Pinto #66

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 36 additions & 0 deletions .classpath
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" output="target/classes" path="src/main/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="src" output="target/test-classes" path="src/test/java">
<attributes>
<attribute name="optional" value="true"/>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="con" path="org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER">
<attributes>
<attribute name="maven.pomderived" value="true"/>
</attributes>
</classpathentry>
<classpathentry kind="output" path="target/classes"/>
</classpath>
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/target/
23 changes: 23 additions & 0 deletions .project
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>buscausuario</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
<buildCommand>
<name>org.eclipse.m2e.core.maven2Builder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
<nature>org.eclipse.m2e.core.maven2Nature</nature>
</natures>
</projectDescription>
6 changes: 6 additions & 0 deletions .settings/org.eclipse.core.resources.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
eclipse.preferences.version=1
encoding//src/main/java=UTF-8
encoding//src/main/resources=UTF-8
encoding//src/test/java=UTF-8
encoding//src/test/resources=UTF-8
encoding/<project>=UTF-8
5 changes: 5 additions & 0 deletions .settings/org.eclipse.jdt.core.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
eclipse.preferences.version=1
org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.8
org.eclipse.jdt.core.compiler.compliance=1.8
org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning
org.eclipse.jdt.core.compiler.source=1.8
4 changes: 4 additions & 0 deletions .settings/org.eclipse.m2e.core.prefs
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
activeProfiles=
eclipse.preferences.version=1
resolveWorkspaceProjects=true
version=1
9 changes: 9 additions & 0 deletions Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
FROM openjdk:8-jre
MAINTAINER Rodrigo Vieira <rodrigovieirapinto@gmail.com>

ENTRYPOINT ["/usr/bin/java", "-jar", "/usr/share/app/app.jar"]

ARG JAR_FILE
ADD target/${JAR_FILE} /usr/share/app/app.jar
ADD target/classes/relevantes/lista_relevancia_1.txt /usr/share/app/relevantes/lista_relevancia_1.txt
ADD target/classes/relevantes/lista_relevancia_2.txt /usr/share/app/relevantes/lista_relevancia_2.txt
26 changes: 26 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,29 @@
O processo de confecção da solução teve como princípios os conceitos de separação de responsabilidades, DDD e TDD. Isso fez com que o sistema ficasse com 87,8% de cobertura de código.

Inicialmente realizou-se a migração dos usuários presentes do arquivo CSV para uma base relacional (H2). Essa migração passou por problemas sérios de desempenho. Tanto que, no melhor cenário, as previsões de término da migração seriam de 19h após seu início. Tomei então a decisão de utilizar o MongoDB, e após alguns testes visando performance no desempenho, chegou-se ao máximo de 50 minutos de tempo de migração. O código utilizado para essa tarefa encontra-se na classe CarregadorDeBase (que contém um método main) e demais classes auxiliares.

Após a migração, realizei a escrita de código para a solução, efetivamente.

Busquei atingir os seguintes diferenciais:

* desempenho;
* utilização do Docker;

Para isso, foi necessário estudar as formas de indexação de documentos oferecidas pelo MongoDB. Inicialmente tentei utilizar indexação composta simples, que fez com que o desempenho das consultas levasse em torno de 15 segundos. Depois tentei indexação simples nos campos username e nome, separadamente. O desempenho ficou excelente para buscas exatas (onde a palava-chave é exatamente igual ao username ou ao nome) mas continuou ruim para outras formas de consulta. Por último, utilizei o índice por wildcard, da seguinte forma:

db.usuarios.createIndex({"$**": "text"})

e fiz com que o UsuariosService fizesse a busca na base de acordo com a palavra-chave utilizada, com base nos padrões de usuário e username. Todas essas alterações fizeram com que tanto buscas por palavras exatas quanto por parte das palavras levasse entre 1 e 4 segundos. A aplicação em si está realizando sua tarefa de forma muito rápida, sendo o gargalo, portanto, no banco.

por último, incluí um plugin do maven (que já utilizei em outras empresas) para geração de imagem docker.

Outras informações importantes:

* utilizei a ferramenta lombok para escrever menos código. É necessário instalá-lo na IDE onde o sistema for aberto. Para entender seu funcionamento, bem como instalá-lo na IDE acesse o link http://blog.caelum.com.br/java-menos-verboso-com-lombok/
* um exemplo de busca: http://localhost:8080/usuarios/diether.be/pagina/0 onde diether.be é a palavra chave, e o 0 (zero) é a página



![PicPay](https://user-images.githubusercontent.com/1765696/26998603-711fcf30-4d5c-11e7-9281-0d9eb20337ad.png)

# Teste Backend
Expand Down
Loading