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.
|