그진인터페이스는 추상화 수준이 높기 때문에 액세스 방법 구현자가 액세스되는 데이터 유형의 의미만 구현하면 됩니다.진레이어 자체가 동시성, 로깅 및 트리 구조 검색을 관리합니다.
을 얻기 위해 필요한 모든 것진액세스 방법 작동은 트리의 키 동작과 키, 색인된 항목 및 색인 가능한 쿼리 간의 관계를 정의하는 몇 가지 사용자 정의 방법을 구현하는 것입니다. 한마디로,진확장성과 일반성, 코드 재사용 및 깔끔한 인터페이스를 결합합니다.
연산자 클래스에는 두 가지 메소드가 있습니다진다음을 제공해야 합니다.
데이텀 *extractValue(데이텀 itemValue, int32 *nkeys, bool **nullFlags)인덱싱할 항목이 주어지면 palloc'd 키 배열을 반환합니다. 반환된 키의 수는 다음 위치에 저장되어야 합니다.*nkeys. 키 중 하나라도 null이 될 수 있으면 다음 배열도 palloc에 추가합니다.*nkeys 부울필드, 해당 주소를에 저장*nullFlags, 필요에 따라 이러한 null 플래그를 설정합니다.*nullFlags남길 수 있음NULL10035_10108NULL항목에 키가 포함되어 있지 않은 경우.
데이텀 *extractQuery(데이텀 쿼리, int32 *nkeys, StrategyNumber n, bool **pmatch, 포인터 **extra_data, bool **nullFlags, int32 *searchMode)쿼리할 값이 주어지면 palloc'd 키 배열을 반환합니다. 즉,질의왼쪽이 인덱싱된 열인 인덱싱 가능한 연산자의 오른쪽 값입니다.n은 연산자 클래스 내 연산자의 전략 번호입니다(참조섹션 38.16.2). 종종,추출쿼리상담이 필요합니다n데이터 유형을 결정하기 위해질의및 키 값을 추출하는 데 사용해야 하는 방법입니다. 반환된 키의 수는 다음 위치에 저장되어야 합니다.*nkeys. 키 중 하나라도 null이 될 수 있으면 다음 배열도 palloc에 추가합니다.*nkeys 부울필드, 주소를 다음 위치에 저장하세요.*nullFlags, 필요에 따라 이러한 null 플래그를 설정합니다.*nullFlags남길 수 있음NULL11472_11545NULL만약에질의키가 포함되어 있지 않습니다.
검색모드다음을 허용하는 출력 인수입니다.추출쿼리검색 수행 방법에 대한 세부정보를 지정합니다. 만일*검색모드다음으로 설정됨GIN_SEARCH_MODE_DEFAULT(호출 전에 초기화되는 값), 반환된 키 중 최소한 하나와 일치하는 항목만 후보 일치로 간주됩니다. 만일*검색모드다음으로 설정됨GIN_SEARCH_MODE_INCLUDE_EMPTY, 일치하는 키가 하나 이상 포함된 항목 외에도 키가 전혀 포함되지 않은 항목도 후보 일치로 간주됩니다. (이 모드는 예를 들어 is-subset-of 연산자를 구현하는 데 유용합니다.) If*검색모드다음으로 설정됨GIN_SEARCH_MODE_ALL, 반환된 키와 일치하는지 여부에 관계없이 인덱스의 null이 아닌 모든 항목은 후보 일치로 간주됩니다. (이 모드는 본질적으로 전체 인덱스를 스캔해야 하기 때문에 다른 두 가지 선택보다 훨씬 느립니다. 그러나 코너 케이스를 올바르게 구현해야 할 수도 있습니다. 대부분의 경우 이 모드가 필요한 연산자는 아마도 GIN 연산자 클래스에 적합한 후보가 아닐 것입니다.) 이 모드를 설정하는 데 사용할 기호는 다음에 정의되어 있습니다.액세스/gin.h.
pmatch은 부분 일치가 지원될 때 사용되는 출력 인수입니다. 그것을 사용하려면,추출쿼리다음 배열을 할당해야 합니다*nkeys 부울s 및 해당 주소를에 저장*pmatch. 해당 키에 부분 일치가 필요한 경우 배열의 각 요소를 true로 설정하고, 그렇지 않은 경우 false로 설정해야 합니다. 만일*pmatch다음으로 설정됨NULL그러면 GIN은 부분 일치가 필요하지 않다고 가정합니다. 변수는 다음과 같이 초기화됩니다.NULL호출하기 전에, 부분 일치를 지원하지 않는 연산자 클래스에서는 이 인수를 무시할 수 있습니다.
extra_data다음을 허용하는 출력 인수입니다.추출쿼리추가 데이터를 다음에 전달하기 위해일관적인그리고비교부분메소드. 그것을 사용하려면,추출쿼리다음 배열을 할당해야 합니다.*nkeys포인터를 사용하고 주소를 다음 위치에 저장합니다.*extra_data, 그런 다음 원하는 것을 개별 포인터에 저장합니다. 변수는 다음과 같이 초기화됩니다.NULL호출하기 전에 추가 데이터가 필요하지 않은 연산자 클래스에서는 이 인수를 무시할 수 있습니다. 만일*extra_data이 설정되면 전체 배열이일관됨메소드 및 해당 요소비교부분방법.
연산자 클래스는 색인된 항목이 쿼리와 일치하는지 확인하는 함수도 제공해야 합니다. 부울의 두 가지 맛이 있습니다.일관됨함수 및 삼항트리일관성함수.트리일관성두 가지 기능을 모두 다루므로 다음을 제공합니다.트리일관성그 자체만으로도 충분합니다. 그러나 부울 변형이 계산 비용이 훨씬 저렴하다면 두 가지를 모두 제공하는 것이 유리할 수 있습니다. 부울 변형만 제공되는 경우 모든 키를 가져오기 전에 색인 항목을 반박하는 데 의존하는 일부 최적화가 비활성화됩니다.
bool 일관된(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], bool *recheck, Datum queryKeys[], bool nullFlags[])색인된 항목이 쿼리 연산자의 전략 번호를 만족하면 참을 반환합니다.n(또는 재확인 표시가 반환되면 이를 만족할 수도 있음). 이 함수는 인덱싱된 항목의 값에 직접 액세스할 수 없습니다.진항목을 명시적으로 저장하지 않습니다. 오히려 쿼리에서 추출된 키 값이 특정 인덱싱된 항목에 나타나는지에 대한 정보가 이용 가능합니다.확인배열에 길이가 있음n키, 이는 이전에에서 반환된 키 수와 동일합니다.추출쿼리이것을 위해질의데이텀. 의 각 요소확인인덱싱된 항목에 해당 쿼리 키가 포함되어 있으면 배열이 참입니다. 즉, (check[i] == true) i번째 키가추출쿼리결과 배열이 색인된 항목에 있습니다. 원본질의다음의 경우 데이터가 전달됩니다.일관됨메소드는 이를 참조해야 하며, 그도 마찬가지입니다쿼리키[]그리고nullFlags[]이전에 반환한 배열추출쿼리. extra_data은에 의해 반환된 추가 데이터 배열입니다.추출 쿼리또는NULL없으면.
언제추출쿼리null 키를 반환합니다.쿼리키[], 해당확인[]인덱싱된 항목에 null 키가 포함되어 있으면 요소는 true입니다. 즉, 의미론은확인[]같습니다다음과 다르지 않습니다.일관됨함수는 해당하는 것을 검사할 수 있습니다nullFlags[]일반 값 일치와 null 일치 간의 차이를 알려야 하는 경우 요소입니다.
성공하면,*다시 확인힙 튜플을 쿼리 연산자에 대해 다시 확인해야 하는 경우 true로 설정해야 하고, 인덱스 테스트가 정확하면 false로 설정해야 합니다. 즉, 잘못된 반환 값은 힙 튜플이 쿼리와 일치하지 않음을 보장합니다. 를 사용한 실제 반환 값*다시 확인false로 설정하면 힙 튜플이 쿼리와 일치함을 보장합니다. 그리고 다음의 실제 반환 값은*다시 확인true로 설정하면 힙 튜플이 쿼리와 일치할 수 있으므로 원래 인덱싱된 항목에 대해 쿼리 연산자를 직접 평가하여 가져오고 다시 확인해야 함을 의미합니다.
GinTernaryValue triConpersist(GinTernaryValue check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], Datum queryKeys[], bool nullFlags[])트리일관성다음과 유사함일관됨, 하지만의 부울 대신확인벡터, 각 키에 대해 세 가지 가능한 값이 있습니다.GIN_TRUE, GIN_FALSE그리고GIN_MAYBE. GIN_FALSE그리고GIN_TRUE일반 부울 값과 동일한 의미를 갖는 반면GIN_MAYBE해당 키의 존재를 알 수 없음을 의미합니다. 언제GIN_MAYBE값이 존재합니다. 함수는 반환만 해야 합니다.GIN_TRUE인덱스 항목에 해당 쿼리 키가 포함되어 있는지 여부와 항목이 확실히 일치하는 경우. 마찬가지로 함수는 다음을 반환해야 합니다.GIN_FALSE항목이 확실히 일치하지 않는 경우에만 다음 항목이 포함되어 있는지 여부GIN_MAYBE키. 결과가 다음에 따라 달라지는 경우GIN_MAYBE항목, 즉 알려진 쿼리 키를 기반으로 일치를 확인하거나 반박할 수 없으며 함수는 반환해야 합니다.GIN_MAYBE.
없을 때GIN_MAYBE값확인벡터, aGIN_MAYBE반환 값은 다음을 설정하는 것과 동일합니다.재확인부울 플래그일관됨함수.
또한 GIN에는 색인에 저장된 키 값을 정렬하는 방법이 있어야 합니다. 연산자 클래스는 비교 방법을 지정하여 정렬 순서를 정의할 수 있습니다.
int Compare(데이텀 a, 데이텀 b)두 개의 키(인덱싱된 항목 아님!)를 비교하고 0보다 작은 정수, 0 또는 0보다 큰 정수를 반환하여 첫 번째 키가 두 번째 키보다 작거나 같은지 또는 큰지를 나타냅니다. Null 키는 이 함수에 전달되지 않습니다.
또는 연산자 클래스가 다음을 제공하지 않는 경우비교메소드를 사용하면 GIN은 인덱스 키 데이터 유형에 대한 기본 btree 연산자 클래스를 조회하고 해당 비교 기능을 사용합니다. btree 연산자 클래스를 찾는 데 몇 사이클이 걸리기 때문에 단 하나의 데이터 유형만을 의미하는 GIN 연산자 클래스에 비교 함수를 지정하는 것이 좋습니다. 그러나 다형성 GIN 연산자 클래스(예:array_ops)은 일반적으로 단일 비교 함수를 지정할 수 없습니다.
다음에 대한 연산자 클래스진선택적으로 다음 메소드를 제공할 수 있습니다:
int ComparePartial(데이텀 부분 키, 데이텀 키, 전략 번호 n, 포인터 extra_data)부분 일치 쿼리 키를 인덱스 키와 비교하세요. 결과를 나타내는 부호가 있는 정수를 반환합니다. 0보다 작으면 인덱스 키가 쿼리와 일치하지 않지만 인덱스 스캔은 계속되어야 함을 의미합니다. 0은 인덱스 키가 쿼리와 일치함을 의미합니다. 0보다 크면 더 이상 일치하는 항목이 없기 때문에 인덱스 스캔이 중지되어야 함을 나타냅니다. 전략 번호n22075_22220extra_data는 다음에 의해 만들어진 추가 데이터 배열의 해당 요소입니다.추출쿼리또는NULL없으면. Null 키는 이 함수에 전달되지 않습니다.
void 옵션(local_relopts *relopts)연산자 클래스 동작을 제어하는 사용자가 볼 수 있는 매개변수 세트를 정의합니다.
그옵션함수는 a에 대한 포인터를 전달받습니다.local_reloptsstruct, 연산자 클래스별 옵션 세트로 채워져야 합니다. 옵션은를 사용하여 다른 지원 기능에서 액세스할 수 있습니다.PG_HAS_OPCLASS_OPTIONS()그리고PG_GET_OPCLASS_OPTIONS()매크로.
인덱싱된 값의 키 추출과 키의 표현이 모두 있기 때문에진유연하며 사용자가 지정한 매개변수에 따라 달라질 수 있습니다.
지원하기 위해“부분 일치”쿼리, 연산자 클래스는 다음을 제공해야 합니다.비교부분방법 및 그추출쿼리메소드는 다음을 설정해야 합니다pmatch23597_23657섹션 70.4.2자세한 내용은.
다양한 실제 데이터 유형데이텀위에 언급된 값은 연산자 클래스에 따라 다릅니다. 전달된 항목 값추출값항상 연산자 클래스의 입력 유형이고 모든 키 값은 클래스의 입력 유형이어야 합니다.저장유형. 의 유형질의인수 전달됨추출쿼리, 일관적인그리고트리일관성은 전략 번호로 식별되는 클래스 멤버 연산자의 오른쪽 입력 유형입니다. 올바른 유형의 키 값을 추출할 수 있는 한 색인화된 유형과 동일할 필요는 없습니다. 그러나 이 세 가지 지원 함수의 SQL 선언에서는 opclass의 인덱스 데이터 유형을 사용하는 것이 좋습니다.질의인수, 비록 실제 유형이 연산자에 따라 다를 수도 있습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.