Skip to content

Conversation

@TextC0de
Copy link
Collaborator

@TextC0de TextC0de commented Nov 6, 2024

No description provided.

@github-actions
Copy link

github-actions bot commented Nov 6, 2024

Coverage Report

Status Category Percentage Covered / Total
🔵 Lines 86.31% 19980 / 23147
🔵 Statements 86.31% 19980 / 23147
🔵 Functions 79.87% 516 / 646
🔵 Branches 80.84% 1566 / 1937
File Coverage
File Stmts Branches Functions Lines Uncovered Lines
Changed Files
src/schema/events/types.ts 78.96% 80.35% 67.64% 78.96% 140-145, 150-156, 162-175, 181-194, 200-213, 219-232, 281-287, 375-377, 394-404, 434-443, 462-463, 497-500
src/schema/purchaseOrder/mutations.tsx 71.62% 80% 75% 71.62% 39-76, 118-119, 142-143
src/schema/purchaseOrder/queries.ts 94.64% 57.14% 100% 94.64% 32-33, 42
src/schema/purchaseOrder/types.ts 97.53% 92.85% 88.88% 97.53% 95-96, 102-103
src/schema/ticket/types.ts 75.55% 88.88% 86.66% 75.55% 80-121, 159-160
src/schema/ticketAddons/types.ts 76.69% 85.71% 50% 76.69% 57-58, 75-76, 98-120, 125-128, 133-136, 210-219, 224-233
src/schema/userTickets/types.ts 90.87% 64.1% 90% 90.87% 62-63, 80-81, 94-95, 98-99, 111-112, 169-170, 209-210, 216-217, 227-228, 234-235, 245-246, 252-253
src/schema/userTickets/mutations/claimUserTicket/index.ts 92.08% 81.31% 100% 92.08% 124-125, 222-227, 233-238, 241-246, 343-348, 395-400, 422-427, 640, 664-669, 698-703, 715-720
src/schema/userTicketsAddons/mutations.ts 93.59% 90% 100% 93.59% 105-106, 144-149, 175-180, 228-233, 253-258, 278-279
src/schema/userTicketsTransfers/types.ts 95.74% 86.66% 100% 95.74% 47-48, 69-70
Generated in workflow #1359 for commit 2ba2630 by the Vitest Coverage Report Action

}),
},
resolve: async (root, { input }, { DB, USER }) => {
const wheres: SQL[] = [];
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Estos wheres no se utilizaban

SelectTicketSchema[] | undefined
>();

const ticketsPromises = ids.map(async (eventId) => {
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lo ideal sería una sola query a la BD pero dado que se está abstrayendo lógica con searchTickets lo dejo así

purchaseOrder,
ticketsIds,
};
return purchaseOrder;
Copy link
Collaborator Author

@TextC0de TextC0de Nov 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No se usan realmente los ticketsIds en el resolver.
Por eso cambié el PurchaseOrderRef y por eso cambie el tipo de retorno aquí.

values: purchaseOrderStatusEnum,
});

export const PurchaseOrderRef = builder.objectRef<{
Copy link
Collaborator Author

@TextC0de TextC0de Nov 6, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Creo que no era necesario tipar esto como:

{
  ticketsIds: string[];
  purchaseOrder: typeof selectPurchaseOrdersSchema._type;
}

export const PurchaseOrderLoadable = builder.loadableObject(PurchaseOrderRef, {
description: "Representation of a Purchase Order",
load: async (ids: string[], context) => {
const result = await context.DB.query.purchaseOrdersSchema
Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Creo que no es necesario traer los userTickets, nos podemos ahorrar esa query.

No encuentro como se usan los userTickets después ni cual es el beneficio de hacer la query de ello aquí.

@TextC0de TextC0de marked this pull request as ready for review November 6, 2024 04:50
@TextC0de TextC0de enabled auto-merge (squash) November 6, 2024 04:54
@joseglego
Copy link
Member

@TextC0de dañe este PR con el dataloader de cupons, Cómo quieres proceder? Soluciono el conflicto? o tienes suficiente contexto?

Sorry :(

@TextC0de
Copy link
Collaborator Author

Solucionado el merge conflict @joseglego

required: false,
}),
},
resolve: async (root, { input }, { DB, USER }) => {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Por qué pasar de resolve a load?

Copy link
Collaborator Author

@TextC0de TextC0de Nov 12, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

En la linea 345, se pasó de t.field a t.loadableList.
Este cambio fue necesario para implementar el método load, que aprovecha el patrón de DataLoader, agrupando múltiples solicitudes en una sola operación a la DB para optimizar el rendimiento.

Ahora, resolve se encarga de devolver los IDs de los eventos, que posteriormente se procesan en load (usando eventIds).
Este patrón es ideal cuando se devuelven múltiples eventos a una consulta, ya que evita el problema de N+1 reduciendo la cantidad de operaciones individuales ejecutadas en la DB.

Ejemplo de uso típico de la query:

query Events(
  $input: PaginatedInputEventsSearchInput!
  $ticketsInput: EventsTicketTemplateSearchInput!
) {
  searchEvents(input: $input) {  # Generalmente input.search.id es un solo ID
    data {
      id
      tickets(input: $ticketsInput) { // los tickets relacionados a cada evento
        id
      }
    }
  }
}

Lo que haría el nuevo código:

  1. Se ejecuta una consulta inicial para obtener los eventos (searchEvents).
  2. loadableList recibe todos los IDs de eventos.
  3. Por cada evento, se ejecuta en paralelo (Promise.all):
    • Verificación de permisos.
    • Búsqueda de cupones si es necesario.
    • Obtención de tickets.

Evitar el N+1 en este resolver implicaría más cambios en la lógica y no un simple Promise.all.
Lo ideal sería 1 sola query a la BD que permita traer todos los tickets relacionados a los eventsIds en cuestión pero no quise meterme ahí aún.

El cambio actual apunta a preparar el camino para una futura revisión de esta query, mantiene el PR pequeño y permite centrarse también en los otros DataLoaders que se incluyen en el PR.

Más info:

Copy link
Member

@joseglego joseglego left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@TextC0de TextC0de merged commit d061599 into main Nov 13, 2024
6 checks passed
@TextC0de TextC0de deleted the textcode/feat-dataloaders-performance branch November 13, 2024 13:13
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.

3 participants