| PostgreSQL 9.0.23 Documentation | ||||
|---|---|---|---|---|
| Prev | Up | Chapter 53. GIN Indexes | Next | |
The GIN interface has a high level of abstraction, requiring the access method implementer only to implement the semantics of the data type being accessed. The GIN layer itself takes care of concurrency, logging and searching the tree structure.
All it takes to get a GIN access method working is to implement four (or five) user-defined methods, which define the behavior of keys in the tree and the relationships between keys, indexed values, and indexable queries. In short, GIN combines extensibility with generality, code reuse, and a clean interface.
The four methods that an operator class for GIN must provide are:
int compare(Datum a, Datum
      b)Compares keys (not indexed values!) and returns an integer less than zero, zero, or greater than zero, indicating whether the first key is less than, equal to, or greater than the second.
Datum *extractValue(Datum
      inputValue, int32 *nkeys)Returns an array of keys given a value to be indexed. The number of returned keys must be stored into *nkeys.
Datum *extractQuery(Datum query,
      int32 *nkeys, StrategyNumber n, bool **pmatch, Pointer
      **extra_data)Returns an array of keys given a value to be queried;
        that is, query is the value on the
        right-hand side of an indexable operator whose left-hand
        side is the indexed column. n is
        the strategy number of the operator within the operator
        class (see Section
        35.14.2). Often, extractQuery will need to consult
        n to determine the data type of
        query and the key values that need
        to be extracted. The number of returned keys must be stored
        into *nkeys. If the query contains
        no keys then extractQuery
        should store 0 or -1 into *nkeys,
        depending on the semantics of the operator. 0 means that
        every value matches the query and
        a full-index scan should be performed (but see Section 53.5). -1 means that nothing
        can match the query, and so the
        index scan can be skipped entirely. pmatch is an output argument for use when
        partial match is supported. To use it, extractQuery must allocate an array of
        *nkeys Booleans and store its
        address at *pmatch. Each element
        of the array should be set to TRUE if the corresponding key
        requires partial match, FALSE if not. If *pmatch is set to NULL then GIN assumes
        partial match is not required. The variable is initialized
        to NULL before call, so this argument can simply be ignored
        by operator classes that do not support partial match.
        extra_data is an output argument
        that allows extractQuery to
        pass additional data to the consistent and comparePartial methods. To use it,
        extractQuery must allocate an
        array of *nkeys Pointers and store
        its address at *extra_data, then
        store whatever it wants to into the individual pointers.
        The variable is initialized to NULL before call, so this
        argument can simply be ignored by operator classes that do
        not require extra data. If *extra_data is set, the whole array is
        passed to the consistent
        method, and the appropriate element to the comparePartial method.
bool consistent(bool check[],
      StrategyNumber n, Datum query, int32 nkeys, Pointer
      extra_data[], bool *recheck)Returns TRUE if the indexed value satisfies the query
        operator with strategy number n
        (or might satisfy, if the recheck indication is returned).
        The check array has length
        nkeys, which is the same as the
        number of keys previously returned by extractQuery for this query datum. Each element of the check array is TRUE if the indexed value
        contains the corresponding query key, ie, if (check[i] ==
        TRUE) the i-th key of the extractQuery result array is present in
        the indexed value. The original query datum (not the extracted key array!)
        is passed in case the consistent method needs to consult it.
        extra_data is the extra-data array
        returned by extractQuery, or
        NULL if none. On success, *recheck
        should be set to TRUE if the heap tuple needs to be
        rechecked against the query operator, or FALSE if the index
        test is exact.
Optionally, an operator class for GIN can supply a fifth method:
int comparePartial(Datum
      partial_key, Datum key, StrategyNumber n, Pointer
      extra_data)Compare a partial-match query to an index key. Returns
        an integer whose sign indicates the result: less than zero
        means the index key does not match the query, but the index
        scan should continue; zero means that the index key does
        match the query; greater than zero indicates that the index
        scan should stop because no more matches are possible. The
        strategy number n of the operator
        that generated the partial match query is provided, in case
        its semantics are needed to determine when to end the scan.
        Also, extra_data is the
        corresponding element of the extra-data array made by
        extractQuery, or NULL if
        none.
To support "partial match" queries,
  an operator class must provide the comparePartial method, and its extractQuery method must set the pmatch parameter when a partial-match query is
  encountered. See Section 53.3.2
  for details.