graphprotocol / graphprotocol/graph-node
Feature: `.findMany` & `.saveMany`
Nadie ha tomado este issue todavía.
- Lenguaje dominante
- Rust
- Estrellas
- 3.2k
- Forks
- 1.1k
- Merge medio
- 4 d 1 h
- PR fusionados (30 d)
- 1
Descripción
Proposal
The injected entity API should also expose bulk operations like findMany, saveMany. This seems like a simple addition to me that would enable better bulk operations and indexing-time aggregations like storing a rank, percentiles, etc.
By the example of the Eden Network Subgraph, that would enable them to save a lot of database reads and writes:
Instead of (simplified ranking logic from them):
let stakers = network.stakers.map<Staker | null>(id => Staker.load(id)).filter(staker => staker != null);
let sortedStakers = stakers((a, b) =>
b.staked.div(WEI).minus(a.staked.div(WEI)).toI32()
);
sortedStakers.forEach((staker, index) => {
staker.rank = BigInt.fromI32(index);
staker.save();
});
They could do something like:
let stakers = Stakers.findMany({ orderBy: { staked: 'desc' } });
let rankedStakers = sortedStakers.map((staker, index) => {
staker.rank = BigInt.fromI32(index);
return staker;
});
Stakers.saveMany(rankedStakers);
Currently, they have ~7000 stakers. That addition would save them 14k-2 database operations.
Current behaviour
In order to update multiple entities in one mapping, subgraph developers are forced to store the ids of all entities that they would like to update in an array on a global singleton entity. That leads to unnecessary big arrays in the database and unnecessary amount of reads and writes.
Affected subgraphs
- Eden Network
- Superfluid
- ...
Inspiration
I personally think the Prisma V2 ORM is pretty well designed: https://www.prisma.io/docs/reference/api-reference/prisma-client-reference#findmany
Guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Línea de trabajo
Comienza con la API de entidades inyectadas descrita en la propuesta y compara el comportamiento previsto de findMany y saveMany con la referencia de findMany de Prisma V2. Define la semántica de lectura masiva, ordenación y escritura; después, identifica los puntos de entrada relevantes de implementación y pruebas; se considera completado cuando los subgrafos pueden reemplazar las cargas y guardados repetidos de entidades por estas operaciones.
Escrito por el modelo de indexación a partir del texto del issue.
Evaluación
- Stack tecnológico
- rust, typescript
- Área
- api, backend-api-design, databases
- Tipo de issue
- Nueva funcionalidad
- Dificultad
- 5/5
- Tiempo estimado
- Más de una semana
- Estado de actividad
- Estancado
- Claridad
- Bastante claro
- Aptitud para principiantes
- 30/100