diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 000000000..651665bbd --- /dev/null +++ b/.dockerignore @@ -0,0 +1,2 @@ +node_modules +.git diff --git a/.env.dist b/.env.dist new file mode 100644 index 000000000..8deccce2a --- /dev/null +++ b/.env.dist @@ -0,0 +1,45 @@ +###> symfony/framework-bundle ### +APP_ENV=prod +APP_SECRET=ebfb6dfbab639815bc1da66e6bf7509e +###< symfony/framework-bundle ### + +# Configuration of the mysql docker container +# Example: +# MYSQL_ROOT_PASSWORD=rootpass00 +# MYSQL_DATABASE=picpay +# MYSQL_USER=user +# MYSQL_PASSWORD=userpass00 + +MYSQL_ROOT_PASSWORD= +MYSQL_DATABASE= +MYSQL_USER= +MYSQL_PASSWORD= + +###> doctrine/doctrine-bundle ### +# Example: +# DATABASE_URL=mysql://user:userpass00@db:3306/picpay?charset=utf8mb4&serverVersion=5.7 + +DATABASE_URL=mysql://:db:3306/?charset=utf8mb4&serverVersion=5.7 +###< doctrine/doctrine-bundle ### + +# Data files +# Example: +# USERS_FILE_PATH=users.csv +# PRIORITY1_FILE_PATH=lista_relevancia_1.txt +# PRIORITY2_FILE_PATH=lista_relevancia_2.txt + +USERS_FILE_PATH= +PRIORITY1_FILE_PATH= +PRIORITY2_FILE_PATH= + +###> nelmio/cors-bundle ### +# Example: +# CORS_ALLOW_ORIGIN=^https?://localhost:?[0-9]*$ +CORS_ALLOW_ORIGIN=^https?://:?[0-9]*$ +###< nelmio/cors-bundle ### + +# Elasticsearch base URI +# Example: +# ELASTIC_HTTP_CLIENT_BASE_URI=es:9200 + +ELASTIC_HTTP_CLIENT_BASE_URI= diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..886d22b01 --- /dev/null +++ b/.gitignore @@ -0,0 +1,17 @@ +###> Composer ### +composer.phar +###< Composer ### + +###> symfony/framework-bundle ### +/.env.local +/.env.local.php +/.env.*.local +/public/bundles/ +/var/ +/vendor/ +/.idea/ +###< symfony/framework-bundle ### + +.env +*.csv +sync diff --git a/README.md b/README.md index 6fcb5a302..3d7e1c487 100644 --- a/README.md +++ b/README.md @@ -33,3 +33,46 @@ Faça um ***Fork*** deste repositório e abra um ***Pull Request***, **com seu n - Ter um desempenho elevado num conjunto de dados muito grande - Utilizar o Docker +# Solução + +Foi desenvolvido um sistema que disponibiliza via URL http:// um sistema com duas telas. A primeira disponibiliza consulta à base de dados MySQL e a segunda consulta a base de dados do Elasticsearch. É possível visualizar no topo da tela o tempo necessário para a consulta, permitindo ao usuário comparar as duas abordagens. + +Para facilitar a comparação das consultas das duas telas, os resultados podem ser exibidos ordenados por nome. Caso seja escolhido ordenar, será possível testar o impacto da ordenação no tempo de consulta do MySQL e do Elasticsearch. Obs: Não é feita ordenação por username. + +Para a construção da solução foram levadas em consideração algumas das práticas propostas pela metodologia do [The Twelve-Factor App](https://12factor.net/config) + +# Limitação + +O Elasticsearch possui uma limitação no que diz respeito à paginação de conjuntos de dados muito grandes. Se tentarmos, por exemplo, acessar a última página (538545) do conjunto de dados fornecido sem qualquer filtro, o Elasticsearch vai acabar dando timeout, enquanto o MySQL consegue retornar. Não consegui encontrar uma solução para isso até o momento. + +Lembrando apenas que o caso acima é extremo. Para várias consultas, mesmo com a ordenação por nome, o número de páginas se restringe ao número na casa dos milhares, o que mantém o tempo de busca em poucos segundos. + +### Autor +- Nome: Rodrigo Alves Sarmento +- E-mail: rasarmento@gmail.com + +### Tecnologias +- Docker +- Docker Compose +- MySQL 5.7 +- Elasticearch 6.6 +- Symfony 4.2 +- Angular 4.x +- Tema Bootstrap Smartadmin 1.8 ([Visitar](https://wrapbootstrap.com/theme/smartadmin-responsive-webapp-WB0573SK0)) + +### Configuração +- Criar o arquivo ***app/.env*** a partir do ***app/.env.dist*** +- No arquivo ***app/.env*** preencher a URL do servidor que contém a api (servidor do docker): ***API_HTTP_CLIENT_BASE_URI*** +- Criar o arquivo ***.env*** a partir do ***.env.dist*** +- No arquivo ***.env*** preencher os dados de configuração do container docker ***mysql***: ***MYSQL_ROOT_PASSWORD***, ***MYSQL_DATABASE***, ***MYSQL_USER*** e ***MYSQL_PASSWORD*** +- No arquivo ***.env*** preencher os dados da URL de conexão do doctrine: ***DATABASE_URL*** +- No arquivo ***.env*** preencher os locais dos arquivos com os dados de usuários: ***USERS_FILE_PATH***, ***PRIORITY1_FILE_PATH*** e ***PRIORITY2_FILE_PATH*** +- No arquivo ***.env*** preencher o domínio de onde serão enviadas as requisições à API: ***CORS_ALLOW_ORIGIN*** +- No arquivo ***.env*** preencher a URI do Elasticsearch: ***ELASTIC_HTTP_CLIENT_BASE_URI*** +- Obs: Para cada configuração será fornecido um exemplo + +### Instalação +- Construir containers: ```docker-compose -f docker-compose.yml -f app/docker-compose.prod.yml up -d --build``` +- Realizar deploy: ```./cli/deploy``` +- Carregar base de dados MySQL: http://:8080/api/user/import +- Carregar base de dados Elasticsearch: http://:8080/api/user/es/import diff --git a/app/.angular-cli.json b/app/.angular-cli.json new file mode 100644 index 000000000..ffcac073a --- /dev/null +++ b/app/.angular-cli.json @@ -0,0 +1,56 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "project": { + "name": "smartadmin" + }, + "apps": [ + { + "root": "src", + "outDir": "dist", + "assets": [ + "assets" + ], + "index": "index.html", + "main": "main.ts", + "polyfills": "polyfills.ts", + "test": "test.ts", + "tsconfig": "tsconfig.app.json", + "testTsconfig": "tsconfig.spec.json", + "prefix": "app", + "styles": [ + "styles.css" + ], + "scripts": [ + ], + "environmentSource": "environments/environment.ts" + } + ], + "e2e": { + "protractor": { + "config": "./protractor.conf.js" + } + }, + "lint": [ + { + "project": "src/tsconfig.app.json" + }, + { + "project": "src/tsconfig.spec.json" + }, + { + "project": "e2e/tsconfig.e2e.json" + } + ], + "test": { + "karma": { + "config": "./karma.conf.js" + } + }, + "defaults": { + "styleExt": "css", + "component": { + "style": false, + "template": false + } + } +} diff --git a/app/.env.dist b/app/.env.dist new file mode 100644 index 000000000..abae33131 --- /dev/null +++ b/app/.env.dist @@ -0,0 +1,6 @@ +# API server base URI +# Example: +# API_HTTP_CLIENT_BASE_URI=http://localhost:8080 + +API_HTTP_CLIENT_BASE_URI= + diff --git a/app/.gitignore b/app/.gitignore new file mode 100644 index 000000000..de4d1f007 --- /dev/null +++ b/app/.gitignore @@ -0,0 +1,2 @@ +dist +node_modules diff --git a/app/.idea/codeStyles/Project.xml b/app/.idea/codeStyles/Project.xml new file mode 100644 index 000000000..c4f89e813 --- /dev/null +++ b/app/.idea/codeStyles/Project.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.idea/codeStyles/codeStyleConfig.xml b/app/.idea/codeStyles/codeStyleConfig.xml new file mode 100644 index 000000000..79ee123c2 --- /dev/null +++ b/app/.idea/codeStyles/codeStyleConfig.xml @@ -0,0 +1,5 @@ + + + + \ No newline at end of file diff --git a/app/.idea/encodings.xml b/app/.idea/encodings.xml new file mode 100644 index 000000000..15a15b218 --- /dev/null +++ b/app/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/app/.idea/inspectionProfiles/Project_Default.xml b/app/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 000000000..df7825df6 --- /dev/null +++ b/app/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/app/.idea/misc.xml b/app/.idea/misc.xml new file mode 100644 index 000000000..0ecb5c327 --- /dev/null +++ b/app/.idea/misc.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.idea/modules.xml b/app/.idea/modules.xml new file mode 100644 index 000000000..4606e30c2 --- /dev/null +++ b/app/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/app/.idea/painel-frontend.iml b/app/.idea/painel-frontend.iml new file mode 100644 index 000000000..b5aa097d1 --- /dev/null +++ b/app/.idea/painel-frontend.iml @@ -0,0 +1,11 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/app/.idea/vcs.xml b/app/.idea/vcs.xml new file mode 100644 index 000000000..94a25f7f4 --- /dev/null +++ b/app/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app/.idea/workspace.xml b/app/.idea/workspace.xml new file mode 100644 index 000000000..5995984d6 --- /dev/null +++ b/app/.idea/workspace.xml @@ -0,0 +1,188 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +