3.
float * penalty( GISTENTRY *origentry, GISTENTRY *newentry, float *result)
��������� ���� ���������� origentry->key ��� ��� ����������� � newentry->key.
����������� �������� ������ ��������� � *result � ������� ��������� �� ����.
���� ��� ������� �� �������� ��� isstrict, �� key ����� ���� NULL. ����� �������
�� ���������� � ���������, ��� ���� = 0 ���� ���� �� ���� �� ����������
is NULL
4.
Datum union(bytea *entryvec, int *size)
��������� ����������� ������. ���������� ������������ ���� (�� GISTENTRY!).
� *size �������� ������ ��������������� ����� � ������.
entryvec - ��� ��������� �� ������ GISTENTRY.
int len = (VARSIZE(entryvec) - VARHDRSZ)/sizeof(GISTENTRY); - ������ �������
GISTENTRY arr = (GISTENTRY *) VARDATA(entryvec); - ���������� ��������� �� ������
������ ������� �� �������� NULL ���������.
5.
bool consistent( Datum key, Datum query, StrategyNumber strategy )
��������� ���� (key) �� ������������ ������� (query) ��������� � �������
strategy � ���������� TRUE � ������ ������������, ����� FALSE
���� ���� ��������� �� ���������� �������� ������, �������
������ ���������� TRUE ���� key ����� ��������������� query
(FALSE ���� key ����� �� ������������� query).
������� ��������:
���� ���� ��������� �� �������� (leaf) ��������, �� ��� ������������
���������� RECHECK ��� ���������� �������� (��. CREATE OPERATOR CLASS).
RECHECK - ������ ������� ������ �����, ��� - �����.
������ GIST_LEAF(key) ���������� TRUE ���� ���� ��������� �� leaf ��������.
������, ����� �������� ����� strategy ������������� �����
� ������� ���������� SQL( �� ������� gist_box_ops, ���������
������ ������ ����������� ):
select
pg_amop.amopstrategy,
pg_operator.oprname,
pg_amop.amopreqcheck
from
pg_type,
pg_operator,
pg_opclass,
pg_am,
pg_amop
where
pg_type.typname = 'box' and
pg_am.amname = 'gist' and
pg_opclass.opcname = 'gist_box_ops' and
pg_am.oid=pg_opclass.opcamid and
pg_opclass.oid = pg_amop.amopclaid and
pg_opclass.opcintype = pg_type.oid and
pg_amop.amopopr = pg_operator.oid;
��������������, ��� �������� ������ opclass �/��� �������� ����
������������ �� ���������� ��������� ������.
6.
GIST_SPLITVEC * split(bytea *entryvec, GIST_SPLITVEC *v)
��������� ������ ������ entryvec �� ���.
������ entryvec �� ����� ��������� NULL ��������
��������� GIST_SPLITVEC:
typedef struct GIST_SPLITVEC
{
OffsetNumber *spl_left; /* array of entries that go left */
int spl_nleft; /* size of this array */
Datum spl_ldatum; /* Union of keys in spl_left */
OffsetNumber *spl_right; /* array of entries that go right */
int spl_nright; /* size of the array */
Datum spl_rdatum; /* Union of keys in spl_right */
...
} GIST_SPLITVEC;
��������� �������� ������� ���������� �����, ��� ������� �����, ��
��������� ���� �� ������ �� ���������.
v->spl_left & v->spl_right ������ �������������� ��������������,
��� �������� ��� ������ ��������� ������
��������� ������� entryvec (���� ����� �� ����� ����������� � spl_left � spl_right
������������). �������� � ������� entryvec ���������� � 1, � �� � 0!!
����� ������� ������� ������������ spl_ldatum & spl_rdatum.
����������� ������������ ������� ( version 7.2)
������ ��� ������ 7.3 ������ ����
� �������� ������� ���������� ���������� R-tree ��� ���� box.
- 1. ������� � ���������� ��� ������������ ������� � �������
create function .
- 2. �������� � pg_opclass ����� opclass.
�������:
- 1) ���� ������ �� ���� ��� � ������������� ��������.
INSERT INTO pg_opclass (opcamid, opcname, opcintype,opckeytype, opcdefault)
SELECT pg_am.oid, 'gist_box_ops', pg_type.oid, 0, true
FROM pg_type, pg_am
WHERE pg_type.typname = 'box' and
pg_am.amname='gist';
- 2) ��� ����� ������� �� ���� �������������� ��������
INSERT INTO pg_opclass (opcamid, opcname, opcintype,opckeytype, opcdefault)
SELECT pg_am.oid, 'gist_int4_ops', pg_type.oid, pg_key.oid, true
FROM pg_type, pg_am, pg_type pg_key
WHERE pg_type.typname = 'int4' and
pg_key.typname = 'int4key' and
pg_am.amname='gist';
���������� ����� � pg_opclass:
opcamid - oid ���� �������( pg_am )
opcname - �������� opclass'a
opcintype - oid ����, ��� �������������� �������� ������������ ���� opclass
opckeytype - ��� ����� � �������, ���� = 0, ��
�����������, ��� ��� ����� ��������� � �����
�������������� ��������
opcdefault �������� �� ���� opclass default'�� ���
���� opcintype ��� ������� opcamid
- 3. ��� �������� � � ����� ����� ����������� SQL� �������
��������� �������, ���������� oid �������� ��� ���������� ���� � �� �������������
��������:
SELECT o.oid AS opoid, o.oprname
INTO TABLE rt_ops_tmp
FROM pg_operator o, pg_type t
WHERE o.oprleft = t.oid
and t.typname = 'box';
- 4. ��� ������ �������� �������� ������ � pg_amop. ���� amopstrategy
������ ������������� �� ��������� strategy � ������� split.
������:
INSERT INTO pg_amop (amopclaid, amopopr, amopstrategy, amopreqcheck)
SELECT opcl.oid, c.opoid, 1, false
FROM pg_am am, pg_opclass opcl, rt_ops_tmp c
WHERE am.amname = 'gist' and am.oid = opcl.opcamid and
opcl.opcname = 'gist_box_ops' and c.oprname = '<<';
���� pg_amop.amopreqcheck ������ ���� true, ����
index hit must be reevaluated against heap value
to make sure it really is match, ����� false
- 5. ������� ��������� ��� core GiSTa ������������ �������. ��� ����� ����
������ ������ � ������� pg_amproc, ������ ���� pg_amproc.amprocnum
������ ����� ��������� ��������:
������� | ��������
-------------+-----------
consistent | 1
union | 2
compress | 3
decompress | 4
penalty | 5
picksplit | 6
equal | 7
������:
INSERT INTO pg_amproc (amopclaid, amproc, amprocnum)
SELECT am.oid, opcl.oid, pro.oid, 3
FROM pg_am am, pg_opclass opcl, pg_proc pro
WHERE am.amname = 'gist' and am.oid = opcl.opcamid and
opcl.opcname = 'gist_box_ops' and pro.proname = 'gbox_compress';
����������� ������������ ������� (version 7.3)
- 1. ������� ��� ������������ ������� � ������� create function .
- 2. ������� opclass � ������� �������:
CREATE OPERATOR CLASS gist_box_ops
DEFAULT FOR TYPE box USING gist AS
OPERATOR 1 << ,
OPERATOR 2 &< ,
OPERATOR 3 && ,
OPERATOR 4 &> ,
OPERATOR 5 >> ,
OPERATOR 6 ~= ,
OPERATOR 7 ~ ,
OPERATOR 8 @ ,
FUNCTION 1 gbox_consistent (opaque, box, int4),
FUNCTION 2 gbox_union (bytea, opaque),
FUNCTION 3 gbox_compress (opaque),
FUNCTION 4 rtree_decompress (opaque),
FUNCTION 5 gbox_penalty (opaque, opaque, opaque),
FUNCTION 6 gbox_picksplit (opaque, opaque),
FUNCTION 7 gbox_same (box, box, opaque);
���������
- 1. ����� FUNCTION ������ ���� ����� ��� ����� �������, �� ����� ������
core GiST �������������� ������������ �-���
- 2. ����� OPERATOR ������ ��������� � strategy � ������ consistent. ���������
������������ � consistent ������ ��� ����������� ���� ��������.
- 3. ��������� � CREATE OPERATOR CLASS �� PostgreSQL 7.3devel Programmer's Guide,
����� II. Server Programming, ������� 17.6, 17.7 � �������� � PostgreSQL
7.3devel Reference Manual, ����� I. SQL Commands, ������ CREATE OPERATOR CLASS