PostgreSQLLa base de données la plus sophistiquée au monde.

51.2. Extensibilité

L'interface GIN a un haut niveau d'abstraction, nécessitant à la personne implémentant la méthode d'accès d'implémenter seulement les sémantiques du type de données en cours d'accès. La couche GIN elle-même s'occupe de la concurrence, des traces et des recherches dans la structure de l'arbre.

Ce qui est nécessaire pour qu'une méthode d'accès GIN fonctionne est d'implémenter quatre méthodes définies par l'utilisateur, méthodes qui définissent le comportement des clés dans l'arbre et les relations entre les clés, les valeurs indexées et les requêtes indexables. En bref, GIN combine une extensibilité avec une généralisation, une ré-utilisation du code et une interface claire.

Les quatre méthodes qu'une classe d'opérateur d'index GIN doit fournir sont :

int compare(Datum a, Datum b)

Compare les clés (valeurs non indexées !) et renvoie un entier plus ptit que zéro, zéro ou plus grand que zéro, indiquant que la première clé est plus petite, égale à, plus grande que la seconde.

Datum* extractValue(Datum inputValue, uint32 *nkeys)

Renvoie un tableau de clés à partir de valeurs à indexer. Le nombre de clés renvoyées doit être stocké dans *nkeys.

Datum* extractQuery(Datum query, uint32 *nkeys, StrategyNumber n)

Renvoie un tableau de clés suivant une valeur indiquée ; c'est-à-dire que query est la valeur du côté droit d'un opérateur indexable dont le côté gauche est la colonne indexée. n est le numéro de stratégie de l'opérateur dans la classe d'opérateur (voir Section 33.14.2, « Stratégies des méthode d'indexation »). Souvent, extractQuery aura besoin de consulter n pour déterminer le type de données de query et les valeurs de clés qui doivent être extraites. Le nombre de clés renvoyées doit être stocké dans *nkeys.

bool consistent(bool check[], StrategyNumber n, Datum query)

Renvoie TRUE si la valeur indexée satisfait l'opérateur de la requête avec un numéro de stratégie n (ou pourrait satisfaire si l'opérateur est marqué RECHECK dans la classe d'opérateur). Le tableau check a la même longueur que le nombre de clés précédemment renvoyées par extractQuery pour cette requête. Chaque élément du tableau check est TRUE si la valeur indexée contient la clé correspondante de la requête, c'est-à-dire si check[i] == TRUE, la i-ième clé du tableau résultant d'extractQuery est présent dans la valeur indexée. Le datum original query (pas le tableau de la clé extraite !) est passé au cas où la méthode consistent a besoin de le consulter.