the진인터페이스에는 높은 수준의 추상화가있어 액세스 방법 구현자가 액세스하는 데이터 유형의 의미를 구현해야합니다. 그만큼gin레이어 자체는 동시성, 트리 구조 로깅 및 검색을 처리합니다.
a진액세스 방법 작업은 트리의 키의 동작과 키, 롤 토토 항목 및 롤 토토 가능한 쿼리 간의 관계를 정의하는 몇 가지 사용자 정의 메소드를 구현하는 것입니다. 요컨대진확장 성과 일반성, 코드 재사용 및 깨끗한 인터페이스를 결합합니다.
운영자가 클래스하는 두 가지 방법이 있습니다진제공해야합니다 :
Datum *ExtractValue (Datum itemvalue, int32 *nkeys, bool ** nullflags)
색인을 제공 할 항목이 주어진 Palloc'd Keys를 반환합니다. 반환 된 키의 수는에 저장되어야합니다.*nkeys
. 키가 null 일 수 있다면 Palloc a array*nkeys
bool
필드, 주소를 저장*nullflags
,이 널 플래그를 필요에 따라 설정합니다.*nullflags
남겨질 수 있습니다null
(초기 값) 모든 키가 null이 아닌 경우. 반환 값은입니다.null
항목에 키가 포함되어 있지 않은 경우.
Datum *ExtractQuery (Datum Query, int32 *nkeys, StrategyNumber N, Bool ** PMATCH, 포인터 ** extra_data, bool ** nullflags, int32 *searchmode)
쿼리 할 값이 주어진 Palloc'd Keys를 반환합니다. 즉,쿼리
왼쪽이 색인화 된 열인 롤 토토 가능한 연산자의 오른쪽에있는 값입니다.n
운영자 클래스 내 운영자의 전략 번호입니다 (참조섹션 38.15.2). 자주,ExtractQuery
상담해야합니다n
데이터 유형을 결정하려면쿼리
및 주요 값을 추출하는 데 사용해야하는 메소드. 반환 된 키의 수는에 저장되어야합니다.*nkeys
. 키가 null 일 수 있다면 Palloc a array*nkeys
bool
필드, 주소를 저장*nullflags
,이 널 플래그를 필요에 따라 설정하십시오.*nullflags
남을 수 있습니다null
(초기 값) 모든 키가 null이 아닌 경우. 반환 값은입니다.NULL
IF쿼리
키가 포함되어 있습니다.
SearchMode
허용하는 출력 인수입니다ExtractQuery
검색 수행 방법에 대한 세부 정보를 지정합니다. 만약에*SearchMode
로 설정되었습니다gin_search_mode_default
(전화 전에 초기화 된 값), 반환 된 키 중 하나 이상 일치하는 항목 만 후보 일치로 간주됩니다. 만약에*SearchMode
로 설정되었습니다gin_search_mode_include_empty
, 그 다음 하나 이상의 일치 키를 포함하는 항목 외에도 키가 전혀없는 항목은 후보 일치로 간주됩니다. (이 모드는 예를 들어 IS 서브 세트 오퍼레이터를 구현하는 데 유용합니다.) if*SearchMode
로 설정되었습니다gin_search_mode_all
, 롤 토토의 모든 널이 아닌 항목은 반환 된 키와 일치하는지 여부에 관계없이 후보 일치로 간주됩니다. (이 모드는 본질적으로 전체 롤 토토를 스캔해야하므로 다른 두 가지 선택보다 훨씬 느립니다. 그러나 코너 케이스를 올바르게 구현해야 할 수도 있습니다. 대부분의 경우이 모드가 필요한 연산자는 아마도 진 운영자 클래스를위한 좋은 후보가 아닐 것입니다.)이 모드를 설정하는 데 사용하는 기호는에 정의되어 있습니다.access/gin.h
.
PMATCH
부분 일치가 지원 될 때 사용하기위한 출력 인수입니다. 사용하려면ExtractQuery
배열을 할당해야합니다*nkeys
부울 및 주소를 보관하십시오.*PMATCH
. 해당 키에 부분 일치가 필요한 경우 배열의 각 요소가 true로 설정되어야합니다. 만약에*PMATCH
로 설정되었습니다NULL
그런 다음 진은 부분 일치가 필요하지 않다고 가정합니다. 변수가 초기화되어NULL
호출하기 전에,이 인수는 부분 일치를 지원하지 않는 운영자 클래스에서 단순히 무시할 수 있습니다.
extra_data
허용하는 출력 인수입니다ExtractQuery
추가 데이터를 전달하려면일관성
and비교적
방법. 사용하려면ExtractQuery
배열을 할당해야합니다*nkeys
포인터 및 주소를 보관하십시오.*엑스트라 _data
, 그런 다음 원하는 것을 개별 포인터에 보관하십시오. 변수가 초기화되어NULL
호출하기 전에이 인수는 추가 데이터가 필요하지 않은 운영자 클래스에서 단순히 무시할 수 있습니다. 만약에*엑스트라 _data
설정되어 전체 배열이에 전달됩니다.일관성
메소드 및 적절한 요소비교적
메소드
운영자 클래스는 인덱스 된 항목이 쿼리와 일치하는지 확인하는 기능을 제공해야합니다. 그것은 두 가지 맛으로 온다, 부울일관성
함수 및 3 개triconsistent
기능.triconsistent
두 가지 기능을 다루므로 제공triconsistent
혼자 충분합니다. 그러나 부울 변형이 계산하기가 상당히 저렴한 경우 둘 다를 제공하는 것이 유리할 수 있습니다. 부울 변형 만 제공되는 경우 모든 키를 가져 오기 전에 롤 토토 항목을 반박하는 데 의존하는 일부 최적화가 비활성화됩니다.
BOOL 일관성 (BOOL Check [], StrategyNumber N, Datum Query, Int32 Nkeys, Pointer extra_data [], bool *Recheck, Datum QueryKeys [], Bool Nullflags [])
인덱스 된 항목이 전략 번호로 쿼리 연산자를 만족시키는 경우 true를 반환합니다n
(또는 재확인 표시가 반환되는 경우이를 만족시킬 수도 있음). 이 기능은 이후로 인덱싱 된 항목의 값에 직접 액세스하지 못합니다.gin아이템을 명시 적으로 저장하지 않습니다. 오히려, 사용 가능한 것은 쿼리에서 추출한 주요 값이 주어진 인덱스 항목에 나타나는 지식입니다. 그만큼check
배열 길이nkeys
, 이는 이전에 반환 된 키의 수와 동일합니다ExtractQuery
이것을 위해쿼리
Datum. 의 각 요소check
인덱스 항목에 해당 쿼리 키가 포함 된 경우 배열이 사실입니다.ExtractQuery
결과 배열은 롤 토토 항목에 있습니다. 원래쿼리
Datum은의 경우 통과됩니다일관성
방법을 참조해야합니다.QueryKeys []
및nullflags []
이전에 반환 된 배열ExtractQuery
. extra_data
Extra-Data 어레이는입니다.ExtractQuery
또는NULL
없음.
언제ExtractQuery
NULL 키를 반환QueryKeys []
, 해당check []
인덱스 항목에 null 키가 포함 된 경우 요소가 참입니다. 즉,의 의미론check []
. 그만큼
일관성
함수는 해당하는 것을 검사 할 수 있습니다nullflags []
요소가 일반 값 일치와 널 매치의 차이를 알려야하는 경우 요소
성공,*재확인
18051_18293*재확인
힙 튜플이 쿼리와 일치한다는 것을 허위로 설정합니다. 그리고의 진정한 반환 값*재확인
True로 설정된 힙 튜플이 쿼리와 일치 할 수 있음을 의미하므로 원래 인덱스 항목에 대해 쿼리 연산자를 직접 평가하여 가져 와서 다시 확인해야합니다..
GinternaryValue triconsistent (GinternaryValue check [], StrategyNumber N, Datum Query, Int32 nkeys, Pointer extra_data [], Datum QueryKeys [], bool nullflags [])
triconsistent
|일관성
, 그러나 부울 대신check
벡터, 각 키에 대한 세 가지 가능한 값이 있습니다.gin_true
, gin_false
andgin_maybe
. gin_false
andgin_true
일반 부울 값과 같은 의미를 지니고gin_maybe
는 해당 키의 존재가 알려져 있지 않음을 의미합니다. 언제gin_maybe
값이 존재하며 함수는 반환해야합니다gin_true
항목이 확실히 일치하는 경우 인덱스 항목에 해당 쿼리 키가 포함되어 있는지 여부. 마찬가지로 함수는 반환해야합니다gin_false
항목이 확실히 일치하지 않는 경우에만gin_maybe
키. 결과가에 의존하는 경우gin_maybe
항목, 즉, 알려진 쿼리 키에 따라 일치를 확인하거나 반박 할 수 없으므로 함수는 반환해야합니다gin_maybe
.
없을 때gin_maybe
check
벡터, Agin_maybe
return 값은 설정과 동일합니다다시 확인
부울의 깃발일관성
기능.
또한 Gin은 롤 토토에 저장된 주요 값을 정렬 할 수있는 방법이 있어야합니다. 연산자 클래스는 비교 방법을 지정하여 정렬 순서를 정의 할 수 있습니다.
int 비교 (Datum A, Datum B)
두 개의 키를 비교하고 (색인이없는 항목이 아님) 0, 0보다 작은 정수를 0보다 적은 정수를 반환하여 첫 번째 키가 두 번째 키보다 적은지 또는 크지 여부를 나타냅니다. 널 키는이 기능으로 전달되지 않습니다.
대안 적으로, 운영자 클래스가 A를 제공하지 않으면비교
메소드, Gin은 인덱스 키 데이터 유형에 대한 기본 BTREE 연산자 클래스를 찾아 비교 함수를 사용합니다. Btree 운영자 클래스를 찾는 데 몇주기가 비용이 들기 때문에 하나의 데이터 유형만을 의미하는 GIN 연산자 클래스에서 비교 함수를 지정하는 것이 좋습니다. 그러나 다형성 진 운영자 클래스 (예 :array_ops
) 일반적으로 단일 비교 함수를 지정할 수 없습니다.
선택적으로, 운영자 클래스진다음 방법을 제공 할 수 있습니다.
int comparePartial (Datum partial_key, Datum Key, StrategyNumber N, Pointer extra_data)
부분 무관 쿼리 키를 색인 키와 비교합니다. 부호가 결과를 나타내는 정수를 반환합니다. 0보다 작 으면 인덱스 키가 쿼리와 일치하지 않지만 인덱스 스캔이 계속되어야합니다. 0은 인덱스 키가 쿼리와 일치 함을 의미합니다. 0보다 큰 것은 더 이상 일치 할 수 없기 때문에 인덱스 스캔이 중지되어야 함을 나타냅니다. 전략 번호n
부분 일치 쿼리를 생성 한 연산자의 스캔을 종료 할시기를 결정하기 위해 의미론이 필요합니다. 또한,extra_data
ExtractQuery
또는NULL
없음. 널 키는이 기능으로 전달되지 않습니다.
지원하기“부분 경기”쿼리, 운영자 클래스는를 제공해야합니다.비교 상점
메소드 및 그ExtractQuery
메소드를 설정해야합니다PMATCH
매개 변수 부분 매치 쿼리가 발생하면. 보다섹션 66.4.2자세한 내용.
다양한 데이터 유형Datum
위에서 언급 한 값은 운영자 클래스에 따라 다릅니다. 항목 값이 전달되었습니다ExtractValue
항상 운영자 클래스의 입력 유형이므로 모든 주요 값은 클래스의 여야합니다스토리지
타입. 의 유형쿼리
인수가 통과되었습니다ExtractQuery
, 일관성
및triconsistent
전략 번호로 식별 된 클래스 멤버 연산자의 오른쪽 입력 유형이 무엇이든. 올바른 유형의 주요 값을 추출 할 수있는 한 롤 토토 유형과 동일 할 필요는 없습니다. 그러나이 세 가지 지원 기능의 SQL 선언은에 OPCLASS의 롤 토토 데이터 유형을 사용하는 것이 좋습니다.쿼리
인수, 실제 유형이 연산자에 따라 다른 것일 수 있지만