Skip to content

Conversation

edersoares
Copy link
Member

Portabilis patch 18/07/2025.

MarceloCajueiro and others added 30 commits April 24, 2025 11:45
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.
…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
This reverts commit aed81ea, reversing
changes made to dfefba6.
Revert "Merge pull request #4782 from portabilis/issue-6037"
mateusinacioo and others added 27 commits July 10, 2025 12:08
…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
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
Copy link

@edersoares edersoares merged commit ba507ee into 1.6 Jul 18, 2025
3 checks passed
@edersoares edersoares deleted the portabilis-patch-2025-07-18 branch July 18, 2025 23:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants