그진인터페이스는 추상화 수준이 높기 때문에 액세스 방법 구현자가 액세스되는 데이터 유형의 의미만 구현하면 됩니다.진레이어 자체가 동시성을 관리하고 트리 구조를 로깅 및 검색합니다.
을 얻기 위해 필요한 모든 것진액세스 방법 작동은 트리의 키 동작과 키, 색인된 항목 및 색인 가능한 쿼리 간의 관계를 정의하는 몇 가지 사용자 정의 방법을 구현하는 것입니다. 한마디로,진확장성과 일반성, 코드 재사용 및 깔끔한 인터페이스를 결합합니다.
연산자 클래스에는 두 가지 메소드가 있습니다진다음을 제공해야 합니다.
데이텀 *extractValue(데이텀 itemValue, int32 *nkeys, bool **nullFlags)인덱싱할 항목이 주어지면 palloc'd 키 배열을 반환합니다. 반환된 키의 수는 다음 위치에 저장되어야 합니다.*nkeys. 키 중 하나라도 null이 될 수 있는 경우, 또한 다음 배열을 palloc으로 지정합니다.*nkeys 부울필드, 주소를 다음 위치에 저장하세요.*nullFlags, 필요에 따라 이러한 null 플래그를 설정합니다.*nullFlags남길 수 있음NULL(초기값) 모든 키가 null이 아닌 경우. 반환 값은 다음과 같습니다.NULL항목에 열쇠가 포함되어 있지 않은 경우.
데이텀 *extractQuery(데이텀 쿼리, int32 *nkeys, StrategyNumber n, bool **pmatch, 포인터 **extra_data, bool **nullFlags, int32 *searchMode)쿼리할 값이 주어지면 palloc'd 키 배열을 반환합니다. 즉,질의왼쪽이 인덱싱된 열인 인덱싱 가능한 연산자의 오른쪽 값입니다.n은 연산자 클래스 내 연산자의 전략 번호입니다(참조섹션 38.15.2). 종종,추출쿼리상담이 필요합니다n데이터 유형 결정질의및 키 값을 추출하는 데 사용해야 하는 방법입니다. 반환된 키의 수는 다음 위치에 저장되어야 합니다.*nkeys. 키 중 하나라도 null이 될 수 있는 경우, 또한 다음 배열을 palloc으로 지정합니다.*nkeys 부울필드, 주소를 다음 위치에 저장하세요.*nullFlags, 필요에 따라 이러한 null 플래그를 설정합니다.*nullFlags남길 수 있음NULL11827_11900NULL만일질의키가 포함되어 있지 않습니다.
검색모드다음을 허용하는 출력 인수입니다.추출쿼리검색 수행 방법에 대한 세부정보를 지정합니다. 만일*검색모드다음으로 설정됨GIN_SEARCH_MODE_DEFAULT(호출 전에 초기화되는 값), 반환된 키 중 최소한 하나와 일치하는 항목만 후보 일치로 간주됩니다. 만일*검색모드다음으로 설정됨GIN_SEARCH_MODE_INCLUDE_EMPTY, 그러면 일치하는 키가 하나 이상 포함된 항목 외에도 키가 전혀 포함되지 않은 항목도 후보 일치로 간주됩니다. (이 모드는 예를 들어 is-subset-of 연산자를 구현하는 데 유용합니다.) If*검색모드다음으로 설정됨GIN_SEARCH_MODE_ALL, 반환된 키와 일치하는지 여부에 관계없이 인덱스의 null이 아닌 모든 항목은 후보 일치로 간주됩니다. (이 모드는 본질적으로 전체 인덱스를 스캔해야 하기 때문에 다른 두 가지 선택보다 훨씬 느립니다. 그러나 코너 케이스를 올바르게 구현해야 할 수도 있습니다. 대부분의 경우 이 모드가 필요한 연산자는 아마도 GIN 연산자 클래스에 적합한 후보가 아닐 것입니다.) 이 모드를 설정하는 데 사용할 기호는 다음에 정의되어 있습니다.액세스/gin.h.
pmatch은 부분 일치가 지원되는 경우 사용하기 위한 출력 인수입니다. 그것을 사용하려면,추출쿼리다음 배열을 할당해야 합니다*nkeys주소를 부울하고 저장합니다.*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 triConcious(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보다 크면 더 이상 일치하는 항목이 없기 때문에 인덱스 스캔이 중지되어야 함을 나타냅니다. 전략 번호n22404_22549extra_data는 다음에 의해 만들어진 추가 데이터 배열의 해당 요소입니다.추출쿼리, 또는NULL없으면. Null 키는 이 함수에 전달되지 않습니다.
지원하기 위해“부분 일치”쿼리, 연산자 클래스는 다음을 제공해야 합니다.비교부분방법 및 해당추출쿼리메소드는 다음을 설정해야 합니다pmatch부분 일치 쿼리가 발견될 때의 매개변수입니다. 참조섹션 66.4.2자세한 내용은.
다양한 실제 데이터 유형데이텀위에 언급된 값은 연산자 클래스에 따라 다릅니다. 전달된 항목 값추출값항상 연산자 클래스의 입력 유형이고 모든 키 값은 클래스의 입력 유형이어야 합니다.저장유형. 의 유형질의인수 전달됨추출쿼리, 일관됨그리고트리일관성는 전략 번호로 식별되는 클래스 멤버 연산자의 오른쪽 입력 유형입니다. 올바른 유형의 키 값을 추출할 수 있는 한 색인화된 유형과 동일할 필요는 없습니다. 그러나 이 세 가지 지원 함수의 SQL 선언에서는 opclass의 인덱스 데이터 유형을 사용하는 것이 좋습니다.질의인수, 비록 실제 유형이 연산자에 따라 다를 수도 있습니다.