-
Notifications
You must be signed in to change notification settings - Fork 52
Portabilis patch 18/07/2025 #180
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
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Implementa melhorias de desempenho no relatório de frequência: 1. Redução de consultas N+1: - Adiciona includes(:student) ao carregar DailyFrequencyStudent - Adiciona includes para StudentEnrollmentDependence e StudentEnrollmentExemptedDiscipline - Otimiza teacher_allow_absence_by_discipline? com includes(:teacher) 2. Estruturas de dados eficientes: - Implementa hash indexado para daily_frequency_students por [daily_frequency_id, student_id] - Cria hashes para dependências, isenções e busca ativa - Otimiza métodos de busca para acesso O(1) 3. Memorização em métodos críticos: - SchoolCalendar.step com cache por data - StepsFetcher.step_by_date com cache por data - StepsFetcher.step_by_number com cache por número - AttendanceRecordReport.step_number com cache multinível por sala e data 4. Melhorias estruturais: - Otimiza set_teacher com consulta SQL direta usando joins
Melhorias implementadas no método students_frequencies_percentage para evitar chamadas repetitivas ao banco de dados e garantir um processamento mais eficiente dos dados de ausências. Adicionada nova função absences_students_query para otimizar a lógica de obtenção de dados de ausências, utilizando uma abordagem mais eficiente com memória. A estrutura de dados foi aprimorada para facilitar o cálculo das porcentagens de frequência.
…dekiq para os workers SynchronizerBuilderEnqueue e SynchronizerExecuterEnqueue, incluindo retry e dead false.
…ca de entidade no worker IeducarSynchronizer
…zerExecuter para utilizar 'unless' ao invés de 'if'
…para utilizar 'find_by' e adiciona verificação de existência da sincronização antes de prosseguir com o processamento.
…do o envio de erros para o Honeybadger e implementando lógica de retry para erros específicos.
…ica de validação de erros foi aprimorada para evitar notificações desnecessárias ao Honeybadger.
…ostagem na API do Ieducar, incluindo tratamento de erros e mensagens de aviso.
…em caso de erros de rede, incluindo lógica de atraso progressivo e registro de tentativas.
…ições à API do Ieducar, incluindo exceções personalizadas e lógica de tratamento para erros de validação, rede e tentativas de reenvio.
…ativas sobre turmas, alunos e disciplinas, com suporte a cache para otimização de consultas.
Evita criação de notificação se nenhum plano de ensino for copiado
Melhoria de performance do Registro de Frequência
Fixa versão da gem scenic para não conflitar com a versão atual do Ruby
Refatoração: Adiciona tratamento de erros durante o envio de notas/faltas, evitando erros desnecessários para o Honeybadger
Revert "Merge pull request #4782 from portabilis/issue-6037"
…olumn-to-view Adiciona coluna Id na tela de acompanhamento das sincronizações
Implementa sistema de debug para requisições da API controlado pela configuração debug_ieducar_api no secrets.yml. Quando ativo, registra: - Detalhes completos da requisição (método, URL, parâmetros) - Resposta da API (truncada para não poluir logs) - Erros e exceções com stack trace - Todas as mensagens prefixadas com [DEBUG_IEDUCAR_API] Útil para troubleshooting de problemas de sincronização.
…terior, garantindo que dados não sejam perdidos entre as sincronizações.
Durante a sincronização do i-Educar, foi identificado alto I/O wait no banco de dados causado por queries sem índice na tabela classrooms_grades. A query ClassroomsGrade.find_by(classroom_id: X, grade_id: Y) é executada para cada matrícula sincronizada, resultando em full table scan. Esta migração adiciona um índice composto (classroom_id, grade_id) que reduz significativamente o I/O, transformando Seq Scan em Index Scan.
- Adiciona índices em api_code para eliminar full table scans - Adiciona índices compostos para queries frequentes - Adiciona índices em foreign keys usadas em joins Essas melhorias devem reduzir drasticamente o tempo de sincronização com o i-Educar, resolvendo um dos principais pontos de reclamação dos clientes.
O Camargo reportou problemas de performance na query: SELECT COUNT(*) FROM system_notifications INNER JOIN system_notification_targets WHERE user_id = ? AND read = false Análise mostrou que alguns usuários têm até 48k notificações, e a query precisava filtrar todas em memória após buscar pelo user_id. O novo índice composto (user_id, read) permite buscar diretamente as notificações não lidas, eliminando o filter step e melhorando drasticamente a performance.
Análise de performance identificou gargalos em: - find_or_create_by!(description) usando índice GIN ineficientemente - Queries com ILIKE ordenadas por created_at sem índice - Queries nas tabelas de join ordenadas por position Novos índices: - contents(description) para buscas exatas - contents(created_at) para ordenação - Índices compostos (plan_id, position) nas tabelas de join Impacto esperado: - find_or_create_by: de ~38ms para <5ms - start_with_description: de ~108ms para ~20ms
Remove gems duplicadas
O índice B-tree falhou com erro: PG::ProgramLimitExceeded: ERROR: index row size 4496 exceeds btree version 4 maximum 2704 Análise mostrou que temos descrições com até 19.566 caracteres, muito além do limite de 2704 bytes do B-tree. Solução: usar índice HASH que: - Suporta valores de qualquer tamanho - É otimizado para comparações de igualdade (=) - Perfeito para find_or_create_by!(description: ...)
…t_exists Rails 5 não suporta if_not_exists nos índices. Usa index_exists? para verificar antes de criar. Mantém DROP INDEX IF EXISTS para o índice hash que precisa ser recriado devido ao erro de tamanho do B-tree.
…ifications Adiciona índice para otimizar queries de notificações não lidas
…-optimization Adiciona índices para otimizar queries do modelo Content
…for-synchronization Adiciona índices para otimizar performance da sincronização
Adiciona log detalhado de requisições para API i-Educar
…n-button Adiciona controle de período para sincronização completa
- Adiciona testes unitários para o método get_modified_date - Atualiza o número esperado de alunos de 29.923 para 117.573 - Corrige a mensagem de erro esperada no teste de URL inválida - Configura VCR para ignorar o parâmetro 'modified' nas URLs - Atualiza cassettes do VCR para incluir o parâmetro 'modified' - Ajusta expectativas dos testes para corresponder aos novos dados: - StudentRegistrations: 9 -> 5 matrículas - Disciplines: 332 -> 278 disciplinas - KnowledgeAreas: atualiza descrições e sequências esperadas Os testes agora passam com a nova lógica de sincronização que sempre busca dados desde o último domingo.
Adiciona `algorithm: :concurrently` e `disable_ddl_transaction\!` para garantir que o índice seja criado sem bloquear a tabela durante a operação. Isso evita downtime em produção durante a migração.
Adiciona índice em classrooms_grades para resolver problema de performance
Usa busca dinâmica por api_code ao invés de IDs hardcoded para knowledge areas, garantindo que os testes funcionem corretamente em diferentes ambientes onde os IDs podem variar.
Problema identificado pelo sysadmin: a query de contagem de notificações não lidas estava fazendo um JOIN desnecessário com system_notifications, causando lentidão para usuários com muitas notificações lidas. Solução implementada: - Criado método otimizado unread_notifications_count no modelo User - Removido JOIN desnecessário, consultando apenas system_notification_targets - Adicionado índice parcial para melhorar performance de queries com read=false - Atualizado helper e controller para usar o novo método Resultados dos testes: - Tempo reduzido de ~107ms para ~13ms no pior caso (49k notificações) - Melhoria de performance de até 1648% em testes locais - Novo índice parcial sendo utilizado corretamente Refs: portabilis/board#6128 (comment)
Altera sincronização parcial para buscar dados desde o último domingo
…unt-query Otimização de performance da query de contagem de notificações não lidas
Corrige erro que ocorria ao filtrar exames complementares por step_id. O bug foi causado pelo uso incorreto da variável @classroom (singular) quando deveria ser @classrooms (plural). Também corrigido o segundo erro onde estava sendo passado IDs ao invés dos objetos Classroom para o scope by_step_id. Fixes #6138 no board da Portabilis
- Simplifica teste focando na correção do bug - Remove complexidade desnecessária - Garante que não há erro ao filtrar por step_id - Verifica que @classrooms é definido corretamente
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Portabilis patch 18/07/2025.