On peut partir de la définition du stock :
BR_G39 - ENTRY.stock
ENTRY.stock = COUNT(REDUCE_BY(GLOBAL_CINDEX[issuer=ENTRY.issuer], 'receiver', 'created_on')[expired_on=0])
Ici, il faut comprendre :
GLOBAL_CINDEX[issuer=ENTRY.issuer]
: ce sont les entrées d’index liées à des certifications émises parENTRY.issuer
. Le plus souvent ce sont des certifications, parfois des mises à jour de données des certifications (par exemple, faire expirer une certification est une entrée d’index UPDATE qui met le champexpired_on
à une valeur positive.REDUCE_BY(GLOBAL_CINDEX[issuer=ENTRY.issuer], 'receiver', 'created_on')
: on réduit les entrées en les réduisant parreceiver
etcreated_on
(le blockstamp). Cette opération revient à avoir une liste de certifications avec leur état à l’instant t. Cette notion de réduction est capitale et omniprésente dans Duniter v1. Il faut bien comprendre que les index sont une liste de changements d’états, et que pour obtenir une entité (genre une certification au sein du CINDEX) il faut réduire par une clé faisant sens. Ici, une certification est représentée de façon unique par la clé “issuer + receiver + created_on”. D’où cette réduction.N.B. : je note que dans le code de Duniter v1 “created_on” n’est pas utilisé, d’ailleurs je n’en voyais pas non plus l’intérêt en te l’expliquant car issuer + receiver est déjà suffisamment unique pour lister les certifications de façon unique, rejeux inclus.
[expired_on=0]
: exprime que l’on veut filtrer, dans cette réduction (donc, la liste des certifications) pour ne conserver que celles ayant un champexpired_on
à zéro, c-à-d n’ayant pas expiré. En effet, une certification expirée ne devrait pas être comptée dans le stock.- COUNT : compte le nombre de certifications résultantes.
Et donc quelques pistes pour DataJune :
- peut-être comptes-tu les certifications expirées, ou que tu les comptes à un moment différente de Duniter v1 ;
- peut-être comptes-tu les rejeux de certifications comme 2 certifs