51.2. 可扩展性 #
GIN 接口具有很高的抽象层次,访问方法实现者只需实现所访问数据类型的语义。GIN 层本身会处理并发、日志记录以及树结构的搜索。
要让一个 GIN 访问方法工作起来,只需实现四个用户定义的方法,它们定义了树中键的行为,以及键、被索引值和可索引查询之间的关系。简言之,GIN 将可扩展性与通用性、代码复用以及清晰的接口结合了起来。
索引操作符类必须为GIN提供的四个方法是:
- int compare(Datum a, Datum b)
比较键(不是被索引的值!)并返回一个小于零、等于零或大于零的整数,用以表示第一个键是小于、等于还是大于第二个键。
- Datum* extractValue(Datum inputValue, uint32 *nkeys)
给定一个要被索引的值,返回一个键数组。返回键的数量必须存入
*nkeys。- Datum* extractQuery(Datum query, uint32 *nkeys, StrategyNumber n)
给定一个待查询的值,返回一个键数组;也就是说,
query是一个可索引操作符右侧的值,而该操作符左侧是被索引列。n是该操作符在操作符类中的策略号(见第 33.14.2 节)。通常,extractQuery需要查看n,以确定query的数据类型,以及需要提取的键值。返回键的数量必须存入*nkeys。- bool consistent(bool check[], StrategyNumber n, Datum query)
如果被索引值满足带有策略号
n的查询操作符(如果该操作符在操作符类中被标记为 RECHECK,则是可能满足),则返回 TRUE。check数组的长度与extractQuery此前为此查询返回的键数量相同。如果被索引值包含相应的查询键,则check数组的对应元素为 TRUE,也就是说,如果 (check[i] == TRUE),则extractQuery结果数组的第 i 个键出现在被索引值中。原始的query值(不是提取出的键数组!)也会被传入,以防consistent方法需要查看它。