giststrat.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:4k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*-------------------------------------------------------------------------
  2.  *
  3.  * giststrat.c
  4.  *   strategy map data for GiSTs.
  5.  *
  6.  * Copyright (c) 1994, Regents of the University of California
  7.  *
  8.  *
  9.  * IDENTIFICATION
  10.  *   /usr/local/devel/pglite/cvs/src/backend/access/gist/giststrat.c,v 1.4 1995/06/14 00:10:05 jolly Exp
  11.  *
  12.  *-------------------------------------------------------------------------
  13.  */
  14. #include "postgres.h"
  15. #include "access/gist.h"
  16. #include "access/istrat.h"
  17. /*
  18.  * Note:  negate, commute, and negatecommute all assume that operators are
  19.  *    ordered as follows in the strategy map:
  20.  *
  21.  * contains, contained-by
  22.  *
  23.  * The negate, commute, and negatecommute arrays are used by the planner
  24.  * to plan indexed scans over data that appears in the qualificiation in
  25.  * a boolean negation, or whose operands appear in the wrong order.  For
  26.  * example, if the operator "<%" means "contains", and the user says
  27.  *
  28.  * where not rel.box <% "(10,10,20,20)"::box
  29.  *
  30.  * the planner can plan an index scan by noting that GiST indices have
  31.  * an operator in their operator class for negating <%.
  32.  *
  33.  * Similarly, if the user says something like
  34.  *
  35.  * where "(10,10,20,20)"::box <% rel.box
  36.  *
  37.  * the planner can see that the GiST index on rel.box has an operator in
  38.  * its opclass for commuting <%, and plan the scan using that operator.
  39.  * This added complexity in the access methods makes the planner a lot easier
  40.  * to write.
  41.  */
  42. /* if a op b, what operator tells us if (not a op b)? */
  43. static StrategyNumber GISTNegate[GISTNStrategies] = {
  44. InvalidStrategy,
  45. InvalidStrategy,
  46. InvalidStrategy
  47. };
  48. /* if a op_1 b, what is the operator op_2 such that b op_2 a? */
  49. static StrategyNumber GISTCommute[GISTNStrategies] = {
  50. InvalidStrategy,
  51. InvalidStrategy,
  52. InvalidStrategy
  53. };
  54. /* if a op_1 b, what is the operator op_2 such that (b !op_2 a)? */
  55. static StrategyNumber GISTNegateCommute[GISTNStrategies] = {
  56. InvalidStrategy,
  57. InvalidStrategy,
  58. InvalidStrategy
  59. };
  60. /*
  61.  * GiSTs do not currently support TermData (see rtree/rtstrat.c for
  62.  * discussion of
  63.  * TermData) -- such logic must be encoded in the user's Consistent function.
  64.  */
  65. /*
  66.  * If you were sufficiently attentive to detail, you would go through
  67.  * the ExpressionData pain above for every one of the strategies
  68.  * we defined.  I am not. Now we declare the StrategyEvaluationData
  69.  * structure that gets shipped around to help the planner and the access
  70.  * method decide what sort of scan it should do, based on (a) what the
  71.  * user asked for, (b) what operators are defined for a particular opclass,
  72.  * and (c) the reams of information we supplied above.
  73.  *
  74.  * The idea of all of this initialized data is to make life easier on the
  75.  * user when he defines a new operator class to use this access method.
  76.  * By filling in all the data, we let him get away with leaving holes in his
  77.  * operator class, and still let him use the index.  The added complexity
  78.  * in the access methods just isn't worth the trouble, though.
  79.  */
  80. static StrategyEvaluationData GISTEvaluationData = {
  81. GISTNStrategies, /* # of strategies */
  82. (StrategyTransformMap) GISTNegate, /* how to do (not qual) */
  83. (StrategyTransformMap) GISTCommute, /* how to swap operands */
  84. (StrategyTransformMap) GISTNegateCommute, /* how to do both */
  85. {NULL}
  86. };
  87. StrategyNumber
  88. RelationGetGISTStrategy(Relation r,
  89. AttrNumber attnum,
  90. RegProcedure proc)
  91. {
  92. return RelationGetStrategy(r, attnum, &GISTEvaluationData, proc);
  93. }
  94. #ifdef NOT_USED
  95. bool
  96. RelationInvokeGISTStrategy(Relation r,
  97.    AttrNumber attnum,
  98.    StrategyNumber s,
  99.    Datum left,
  100.    Datum right)
  101. {
  102. return (RelationInvokeStrategy(r, &GISTEvaluationData, attnum, s,
  103.    left, right));
  104. }
  105. #endif