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

52.2. Extensibilité

L'interface GIN a un haut niveau d'abstraction. De ce fait, la personne qui code la méthode d'accès n'a besoin d'implanter que les sémantiques du type de données accédé. La couche GIN prend en charge la gestion de la concurrence, des traces et des recherches dans la structure de l'arbre.

Pour obtenir une méthode d'accès GIN fonctionnelle, il suffit d'implanter quatre méthodes utilisateur. Celles-ci définissent le comportement des clés dans l'arbre et les relations entre clés, valeurs indexées et requêtes indexables. En résumé, GIN combine extensibilité, généralisation, ré-utilisation du code à 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 (et non les valeurs indexées !) et renvoie un entier négatif, zéro ou un entier positif, qui indique si la première clé est inférieure, égale à ou supérieure à la seconde.

Datum* extractValue(Datum inputValue, int32 *nkeys)

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

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

Renvoie un tableau de clés en fonction de la valeur à requêter ; 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 34.14.2, « Stratégies des méthode d'indexation »). Souvent, extractQuery doit consulter n pour déterminer le type de données de query et les valeurs de clés à extraire. Le nombre de clés renvoyées doit être stocké dans *nkeys. Si le nombre de clés est égal à zéro, alors extractQuery doit enregistrer 0 ou -1 dans *nkeys. 0 signifie que toutes les lignes répondent à la requête et qu'un parcours séquentiel doit être lancé. -1 signifie que rien ne satisfait la requête (query). Le choix de la valeur est basé sur la signification sémantique de l'opération correspondant au numéro de stratégie indiqué.

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

Renvoie TRUE si la valeur indexée satisfait l'opérateur de la requête pour le numéro de stratégie n (ou peut 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 que si (check[i] == TRUE), la i-ème clé du tableau résultant d'extractQuery est présente dans la valeur indexée. Le datum query d'origine (pas le tableau de clés extrait !) est passé au cas où la méthode consistent a besoin de le consulter.