62.3. РаÑÑиÑÑемоÑÑÑ
ÐнÑеÑÑÐµÐ¹Ñ GIN Ñ Ð°ÑакÑеÑизÑеÑÑÑ Ð²ÑÑоким ÑÑовнем абÑÑÑакÑии и Ñаким обÑазом ÑÑебÑÐµÑ Ð¾Ñ ÑазÑабоÑÑика меÑода доÑÑÑпа ÑеализоваÑÑ ÑолÑко ÑмÑÑловое наполнение обÑабаÑÑваемого Ñипа даннÑÑ . УÑÐ¾Ð²ÐµÐ½Ñ GIN беÑÑÑ Ð½Ð° ÑÐµÐ±Ñ Ð·Ð°Ð±Ð¾ÑÑ Ð¾ паÑаллелÑном доÑÑÑпе, поддеÑжке жÑÑнала и поиÑке в ÑÑÑÑкÑÑÑе деÑева.
ÐÑÑ, ÑÑо нÑжно, ÑÑÐ¾Ð±Ñ Ð¿Ð¾Ð»ÑÑиÑÑ ÑабоÑаÑÑий меÑод доÑÑÑпа GIN â ÑÑо ÑеализоваÑÑ Ð½ÐµÑколÑко полÑзоваÑелÑÑÐºÐ¸Ñ Ð¼ÐµÑодов, опÑеделÑÑÑÐ¸Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ðµ клÑÑей в деÑеве и оÑноÑÐµÐ½Ð¸Ñ Ð¼ÐµÐ¶Ð´Ñ ÐºÐ»ÑÑами, индекÑиÑÑемÑми обÑекÑами и поддеÑживаемÑми запÑоÑами. Словом, GIN ÑоÑеÑÐ°ÐµÑ ÑаÑÑиÑÑемоÑÑÑ Ñ ÑнивеÑÑалÑноÑÑÑÑ, повÑоÑнÑм иÑполÑзованием кода и аккÑÑаÑнÑм инÑеÑÑейÑом.
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов должен пÑедоÑÑавиÑÑ GIN ÑледÑÑÑие два меÑода:
Datum *extractValue(Datum itemValue, int32 *nkeys, bool **nullFlags)ÐозвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив клÑÑей (вÑделеннÑй ÑеÑез palloc) Ð´Ð»Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемого обÑекÑа. ЧиÑло возвÑаÑаемÑÑ ÐºÐ»ÑÑей должно запиÑÑваÑÑÑÑ Ð²
*nkeys. ÐÑли какой-либо из клÑÑей Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ NULL, нÑжно Ñак же вÑделиÑÑ ÑеÑез palloc маÑÑив из*nkeysполейbool, запиÑаÑÑ ÐµÐ³Ð¾ адÑÐµÑ Ð²*nullFlagsи ÑÑÑановиÑÑ ÑÑи Ñлаги NULL как ÑÑебÑеÑÑÑ. Ð*nullFlagsможно оÑÑавиÑÑ Ð·Ð½Ð°ÑениеNULL(ÑÑо наÑалÑное знаÑение), еÑли вÑе клÑÑи оÑлиÑÐ½Ñ Ð¾Ñ NULL. ÐÑа ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑиÑÑNULL, еÑли обÑÐµÐºÑ Ð½Ðµ ÑодеÑÐ¶Ð¸Ñ ÐºÐ»ÑÑей.Datum *extractQuery(Datum query, int32 *nkeys, StrategyNumber n, bool **pmatch, Pointer **extra_data, bool **nullFlags, int32 *searchMode)ÐозвÑаÑÐ°ÐµÑ Ð¼Ð°ÑÑив клÑÑей (вÑделеннÑй ÑеÑез palloc) Ð´Ð»Ñ Ð·Ð°Ð¿ÑаÑиваемого знаÑениÑ; Ñо еÑÑÑ, в
queryпоÑÑÑÐ¿Ð°ÐµÑ Ð·Ð½Ð°Ñение, Ð½Ð°Ñ Ð¾Ð´ÑÑееÑÑ Ð¿Ð¾ пÑавÑÑ ÑÑоÑÐ¾Ð½Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÑемого опеÑаÑоÑа, по левÑÑ ÑÑоÑÐ¾Ð½Ñ ÐºÐ¾ÑоÑого Ñказан индекÑиÑÑемÑй ÑÑолбеÑ. ÐÑгÑменÑnзадаÑÑ Ð½Ð¾Ð¼ÐµÑ ÑÑÑаÑегии опеÑаÑоÑа в клаÑÑе опеÑаÑоÑов (Ñм. ÐодÑаздел 36.15.2). ЧаÑÑо ÑÑнкÑиÑextractQueryдолжна пÑоанализиÑоваÑÑn, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ Ñип даннÑÑ Ð°ÑгÑменÑаqueryи вÑбÑаÑÑ Ð¼ÐµÑод Ð´Ð»Ñ Ð¸Ð·Ð²Ð»ÐµÑÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñений клÑÑей. ЧиÑло возвÑаÑаемÑÑ ÐºÐ»ÑÑей должно бÑÑÑ Ð·Ð°Ð¿Ð¸Ñано в*nkeys. ÐÑли какие-либо клÑÑи могÑÑ Ð±ÑÑÑ NULL, нÑжно Ñак же вÑделиÑÑ ÑеÑез palloc маÑÑив из*nkeysполейbool, ÑÐ¾Ñ ÑаниÑÑ ÐµÐ³Ð¾ адÑÐµÑ Ð²*nullFlags, и ÑÑÑановиÑÑ ÑÑи Ñлаги NULL как ÑÑебÑеÑÑÑ. Ð*nullFlagsможно оÑÑавиÑÑ Ð·Ð½Ð°ÑениеNULL(ÑÑо наÑалÑное знаÑение), еÑли вÑе клÑÑи оÑлиÑÐ½Ñ Ð¾Ñ NULL. ÐÑа ÑÑнкÑÐ¸Ñ Ð¼Ð¾Ð¶ÐµÑ Ð²Ð¾Ð·Ð²ÑаÑиÑÑNULL, еÑлиqueryне ÑодеÑÐ¶Ð¸Ñ ÐºÐ»ÑÑей.ÐÑÑ Ð¾Ð´Ð½Ð¾Ð¹ аÑгÑменÑ
searchModeпозволÑÐµÑ ÑÑнкÑииextractQueryвÑбÑаÑÑ Ñежим, в коÑоÑом должен вÑполнÑÑÑÑÑ Ð¿Ð¾Ð¸Ñк. ÐÑли*searchModeÐ¸Ð¼ÐµÐµÑ Ð·Ð½Ð°ÑениеGIN_SEARCH_MODE_DEFAULT(ÑÑо знаÑение ÑÑÑанавливаеÑÑÑ Ð¿ÐµÑед вÑзовом), Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑими кандидаÑами ÑÑиÑаÑÑÑÑ ÑолÑко Ñе обÑекÑÑ, коÑоÑÑе ÑооÑвеÑÑÑвÑÑÑ Ð¼Ð¸Ð½Ð¸Ð¼Ñм Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð· возвÑаÑÑннÑÑ ÐºÐ»ÑÑей. ÐÑли в*searchModeÑÑÑановлено знаÑениеGIN_SEARCH_MODE_INCLUDE_EMPTY, Ñо в дополнение к обÑекÑам Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ñм одним Ñовпадением клÑÑа, Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑими кандидаÑами бÑдÑÑ ÑÑиÑаÑÑÑÑ Ð¸ обÑекÑÑ, вообÑе не ÑодеÑжаÑие клÑÑей. (ÐÑÐ¾Ñ Ñежим полезен Ð´Ð»Ñ ÑеализаÑии, напÑимеÑ, опеÑаÑоÑов A-ÑвлÑеÑÑÑ-подмножеÑÑвом-B.) ÐÑли в*searchModeÑÑÑановлено знаÑениеGIN_SEARCH_MODE_ALL, Ð¿Ð¾Ð´Ñ Ð¾Ð´ÑÑими кандидаÑами ÑÑиÑаÑÑÑÑ Ð²Ñе оÑлиÑнÑе Ð¾Ñ NULL обÑекÑÑ Ð² индекÑе, незавиÑимо Ð¾Ñ Ñого, вÑÑÑеÑаÑÑÑÑ Ð»Ð¸ в Ð½Ð¸Ñ Ð²Ð¾Ð·Ð²ÑаÑаемÑе клÑÑи. (ÐÑÐ¾Ñ Ñежим намного медленнее двÑÑ Ð´ÑÑÐ³Ð¸Ñ , Ñак как он по ÑÑÑи ÑÑебÑÐµÑ ÑканиÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð²Ñего индекÑа, но он Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð½ÐµÐ¾Ð±Ñ Ð¾Ð´Ð¸Ð¼ Ð´Ð»Ñ ÐºÐ¾ÑÑекÑной обÑабоÑки кÑÐ°Ð¹Ð½Ð¸Ñ ÑлÑÑаев. ÐпеÑаÑоÑ, коÑоÑÑй вÑбиÑÐ°ÐµÑ ÑÑÐ¾Ñ Ñежим в болÑÑинÑÑве ÑиÑÑаÑий, ÑкоÑее вÑего не Ð¿Ð¾Ð´Ñ Ð¾Ð´Ð¸Ñ Ð´Ð»Ñ ÑеализаÑии в клаÑÑе опеÑаÑоÑов GIN.) Ð¡Ð¸Ð¼Ð²Ð¾Ð»Ñ Ð´Ð»Ñ ÑÑÐ¸Ñ Ð·Ð½Ð°Ñений Ñежима опÑÐµÐ´ÐµÐ»ÐµÐ½Ñ Ð²access/gin.h.ÐÑÑ Ð¾Ð´Ð½Ð¾Ð¹ аÑгÑменÑ
pmatchиÑполÑзÑеÑÑÑ, когда поддеÑживаеÑÑÑ ÑаÑÑиÑное ÑооÑвеÑÑÑвие. ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐµÐ³Ð¾,extractQueryдолжна вÑделиÑÑ Ð¼Ð°ÑÑив из*nkeysлогиÑеÑÐºÐ¸Ñ ÑлеменÑов и ÑÐ¾Ñ ÑаниÑÑ ÐµÐ³Ð¾ адÑÐµÑ Ð²*pmatch. ÐÐ»ÐµÐ¼ÐµÐ½Ñ ÑÑого маÑÑива должен ÑодеÑжаÑÑ true, еÑли ÑооÑвеÑÑÑвÑÑÑий клÑÑ ÑÑебÑÐµÑ ÑаÑÑиÑного ÑооÑвеÑÑÑвиÑ, и false в пÑоÑивном ÑлÑÑае. ÐÑли пеÑеменнаÑ*pmatchÑодеÑжиÑNULL, GIN полагаеÑ, ÑÑо ÑаÑÑиÑное ÑооÑвеÑÑÑвие не ÑÑебÑеÑÑÑ. Ð ÑÑÑ Ð¿ÐµÑеменнÑÑ Ð·Ð°Ð¿Ð¸ÑÑваеÑÑÑNULLпеÑед вÑзовом, Ñак ÑÑо ÑÑÐ¾Ñ Ð°ÑгÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶Ð½Ð¾ пÑоÑÑо игноÑиÑоваÑÑ Ð² клаÑÑÐ°Ñ Ð¾Ð¿ÐµÑаÑоÑов, не поддеÑживаÑÑÐ¸Ñ ÑаÑÑиÑное ÑооÑвеÑÑÑвие.ÐÑÑ Ð¾Ð´Ð½Ð¾Ð¹ аÑгÑменÑ
extra_dataпозволÑÐµÑ ÑÑнкÑииextractQueryпеÑедаÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе меÑодамconsistentиcomparePartial. ЧÑÐ¾Ð±Ñ Ð¸ÑполÑзоваÑÑ ÐµÐ³Ð¾,extractQueryдолжна вÑделиÑÑ Ð¼Ð°ÑÑив из*nkeysÑказаÑелей и ÑÐ¾Ñ ÑаниÑÑ ÐµÐ³Ð¾ адÑÐµÑ Ð²*extra_data, а заÑем ÑÐ¾Ñ ÑаниÑÑ Ð²ÑÑ, ÑÑо ей ÑÑебÑеÑÑÑ, в оÑделÑнÑÑ ÑказаÑелÑÑ . Ð ÑÑÑ Ð¿ÐµÑеменнÑÑ Ð·Ð°Ð¿Ð¸ÑÑваеÑÑÑNULLпеÑед вÑзовом, поÑÑÐ¾Ð¼Ñ Ð´Ð°Ð½Ð½Ñй аÑгÑÐ¼ÐµÐ½Ñ Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑоÑÑо игноÑиÑоваÑÑÑÑ ÐºÐ»Ð°ÑÑами опеÑаÑоÑов, коÑоÑÑм не нÑÐ¶Ð½Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸ÑелÑнÑе даннÑе. ÐÑли маÑÑив*extra_dataзадан, он Ñеликом пеÑедаÑÑÑÑ Ð² меÑодconsistent, а вcomparePartialпеÑедаÑÑÑÑ ÑооÑвеÑÑÑвÑÑÑий его ÑлеменÑ.
ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов должен Ñакже пÑедоÑÑавиÑÑ ÑÑнкÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÑовеÑки, ÑооÑвеÑÑÑвÑÐµÑ Ð»Ð¸ индекÑиÑованнÑй обÑÐµÐºÑ Ð·Ð°Ð¿ÑоÑÑ. ÐоддеÑживаÑÑÑÑ Ð´Ð²Ðµ ÐµÑ Ð²Ð°ÑиаÑии: логиÑеÑÐºÐ°Ñ consistent и ÑÑоиÑÐ½Ð°Ñ triConsistent. ФÑнкÑÐ¸Ñ triConsistent покÑÑÐ²Ð°ÐµÑ ÑÑнкÑионалÑноÑÑÑ Ð¾Ð±Ð¾Ð¸Ñ
, Ñак ÑÑо доÑÑаÑоÑно ÑеализоваÑÑ ÑолÑко еÑ. Ðднако еÑли вÑÑиÑление логиÑеÑкой ваÑиаÑии оказÑваеÑÑÑ Ð·Ð½Ð°ÑиÑелÑно деÑевле, Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ ÑмÑÑл ÑеализоваÑÑ Ð¸Ñ
обе. ÐÑли пÑедÑÑавлена ÑолÑко логиÑеÑÐºÐ°Ñ Ð²Ð°ÑиаÑиÑ, некоÑоÑÑе опÑимизаÑии, поÑÑÑоеннÑе на оÑбÑаковÑвании обÑекÑов до вÑбоÑки вÑеÑ
клÑÑей, оÑклÑÑаÑÑÑÑ.
bool consistent(bool check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], bool *recheck, Datum queryKeys[], bool nullFlags[])ÐозвÑаÑÐ°ÐµÑ true, еÑли индекÑиÑованнÑй обÑÐµÐºÑ ÑдовлеÑвоÑÑÐµÑ Ð¾Ð¿ÐµÑаÑоÑÑ Ð·Ð°Ð¿ÑоÑа Ñ Ð½Ð¾Ð¼ÐµÑом ÑÑÑаÑегии
n(или поÑенÑиалÑно ÑдовлеÑвоÑÑеÑ, когда возвÑаÑаеÑÑÑ Ñказание пеÑепÑовеÑки). ÐÑа ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ð¿ÑÑмого доÑÑÑпа к знаÑÐµÐ½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑиÑованного обÑекÑа, Ñак как GIN не Ñ ÑÐ°Ð½Ð¸Ñ Ñами обÑекÑÑ. ÐмеÑÑо ÑÑого, она Ð·Ð½Ð°ÐµÑ Ð¾ знаÑениÑÑ ÐºÐ»ÑÑей, извлеÑÑннÑÑ Ð¸Ð· запÑоÑа и вÑÑÑеÑаÑÑÐ¸Ñ ÑÑ Ð² данном индекÑиÑованном обÑекÑе. ÐаÑÑивcheckÐ¸Ð¼ÐµÐµÑ Ð´Ð»Ð¸Ð½Ñnkeys, ÑÑо ÑавнÑеÑÑÑ ÑиÑÐ»Ñ ÐºÐ»ÑÑей, Ñанее возвÑаÑÑннÑÑ ÑÑнкÑиейextractQueryÐ´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ знаÑениÑquery. ÐÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑиваcheckÑавнÑеÑÑÑ true, еÑли индекÑиÑованнÑй обÑÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ ÑооÑвеÑÑÑвÑÑÑий клÑÑ Ð·Ð°Ð¿ÑоÑа; Ñо еÑÑÑ, еÑли (check[i] == true), Ñо i-Ñй клÑÑ Ð² маÑÑиве ÑезÑлÑÑаÑаextractQueryпÑиÑÑÑÑÑвÑÐµÑ Ð² индекÑиÑованном обÑекÑе. ÐÑÑ Ð¾Ð´Ð½Ð¾Ðµ знаÑениеqueryпеÑедаÑÑÑÑ Ð½Ð° ÑлÑÑай, еÑли оно поÑÑебÑеÑÑÑ Ð¼ÐµÑодÑconsistent; Ñ Ñой же ÑелÑÑ ÐµÐ¼Ñ Ð¿ÐµÑедаÑÑÑÑ Ð¼Ð°ÑÑивÑqueryKeys[]иnullFlags[], Ñанее возвÑаÑÑннÑе ÑÑнкÑиейextractQuery. РаÑгÑменÑеextra_dataпеÑедаÑÑÑÑ Ð¼Ð°ÑÑив дополниÑелÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ , возвÑаÑÑннÑй ÑÑнкÑиейextractQuery, илиNULL, еÑли дополниÑелÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð½ÐµÑ.Ðогда
extractQueryвозвÑаÑÐ°ÐµÑ ÐºÐ»ÑÑ NULL вqueryKeys[], ÑооÑвеÑÑÑвÑÑÑий ÑлеменÑcheck[]ÑодеÑÐ¶Ð¸Ñ true, еÑли индекÑиÑованнÑй обÑÐµÐºÑ ÑодеÑÐ¶Ð¸Ñ ÐºÐ»ÑÑ NULL; Ñо еÑÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ ÑÑиÑаÑÑ, ÑÑо ÑлеменÑÑcheck[]оÑÑажаÑÑ ÑÑловиеIS NOT DISTINCT FROM. ФÑнкÑиÑconsistentÐ¼Ð¾Ð¶ÐµÑ Ð¿ÑовеÑиÑÑ ÑооÑвеÑÑÑвÑÑÑий ÑлеменÑnullFlags[], еÑли ей нÑжно ÑазлиÑаÑÑ ÑооÑвеÑÑÑвие Ñ Ð¾Ð±ÑÑнÑм знаÑением и ÑооÑвеÑÑÑвие Ñ NULL.Ð ÑлÑÑае ÑÑÐ¿ÐµÑ Ð° в
*recheckнÑжно запиÑаÑÑ true, еÑли коÑÑеж даннÑÑ Ð½Ñжно пеÑепÑовеÑиÑÑ Ñ Ð¾Ð¿ÐµÑаÑоÑом запÑоÑа, либо false, еÑли пÑовеÑка по индекÑÑ Ð±Ñла ÑоÑной. То еÑÑÑ ÑезÑлÑÑÐ°Ñ false гаÑанÑиÑÑеÑ, ÑÑо коÑÑеж даннÑÑ Ð½Ðµ ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ; ÑезÑлÑÑÐ°Ñ true Ñо знаÑением*recheck, ÑавнÑм false, гаÑанÑиÑÑеÑ, ÑÑо коÑÑеж даннÑÑ ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ; а ÑезÑлÑÑÐ°Ñ true Ñо знаÑением*recheck, ÑавнÑм true, ознаÑаеÑ, ÑÑо коÑÑеж даннÑÑ Ð¼Ð¾Ð¶ÐµÑ ÑооÑвеÑÑÑвоваÑÑ Ð·Ð°Ð¿ÑоÑÑ, поÑÑÐ¾Ð¼Ñ ÐµÐ³Ð¾ нÑжно вÑбÑаÑÑ Ð¸ пеÑепÑовеÑиÑÑ, пÑименив опеÑаÑÐ¾Ñ Ð·Ð°Ð¿ÑоÑа непоÑÑедÑÑвенно к иÑÑ Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð¸Ð½Ð´ÐµÐºÑиÑÐ¾Ð²Ð°Ð½Ð½Ð¾Ð¼Ñ ÑлеменÑÑ.GinTernaryValue triConsistent(GinTernaryValue check[], StrategyNumber n, Datum query, int32 nkeys, Pointer extra_data[], Datum queryKeys[], bool nullFlags[])ФÑнкÑиÑ
triConsistentподобнаconsistent, но вмеÑÑо логиÑеÑÐºÐ¸Ñ Ð·Ð½Ð°Ñений в векÑоÑеcheckей пеÑедаÑÑÑÑ ÑÑи ваÑианÑа ÑÑавнений Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ клÑÑа:GIN_TRUE,GIN_FALSEиGIN_MAYBE.GIN_FALSEиGIN_TRUEимеÑÑ Ð¾Ð±ÑÑное логиÑеÑкое знаÑение, Ñогда какGIN_MAYBEознаÑаеÑ, ÑÑо пÑиÑÑÑÑÑвие клÑÑа неизвеÑÑно. Ðогда пÑиÑÑÑÑÑвÑÑÑ Ð·Ð½Ð°ÑениÑGIN_MAYBE, ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° возвÑаÑаÑÑGIN_TRUE, ÑолÑко еÑли обÑÐµÐºÑ ÑдовлеÑвоÑÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ñого, ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸ Ð¸Ð½Ð´ÐµÐºÑ ÑооÑвеÑÑÑвÑÑÑие клÑÑи запÑоÑа. ÐодобнÑм обÑазом, ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° возвÑаÑаÑÑGIN_FALSE, ÑолÑко еÑли обÑÐµÐºÑ Ð½Ðµ ÑдовлеÑвоÑÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимо Ð¾Ñ Ñого, ÑодеÑÐ¶Ð¸Ñ Ð»Ð¸ он клÑÑиGIN_MAYBE. ÐÑли ÑезÑлÑÑÐ°Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ ÑлеменÑовGIN_MAYBE, Ñо еÑÑÑ ÑооÑвеÑÑÑвие нелÑÐ·Ñ ÑÑвеÑждаÑÑ Ð¸Ð»Ð¸ оÑÑиÑаÑÑ Ð² завиÑимоÑÑи Ð¾Ñ Ð¸Ð·Ð²ÐµÑÑнÑÑ ÐºÐ»ÑÑей запÑоÑа, ÑÑнкÑÐ¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ð° веÑнÑÑÑGIN_MAYBE.Ðогда в векÑоÑе
checkÐ½ÐµÑ ÑлеменÑовGIN_MAYBE, возвÑаÑаемое знаÑениеGIN_MAYBEÑавнознаÑно ÑÑÑÐ°Ð½Ð¾Ð²Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ ÑлагÑrecheckв логиÑеÑкой ÑÑнкÑииconsistent.
ÐÑоме Ñого, GIN нÑжно каким-Ñо обÑазом ÑоÑÑиÑоваÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑа, Ñ ÑанÑÑиеÑÑ Ð² индекÑе. ÐлаÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð¼Ð¾Ð¶ÐµÑ Ð¾Ð¿ÑеделиÑÑ Ð¿Ð¾ÑÑдок ÑоÑÑиÑовки, Ñказав меÑод ÑÑавнениÑ:
int compare(Datum a, Datum b)СÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ Ð´Ð²Ð° клÑÑа (не индекÑиÑованнÑе обÑекÑÑ!) и возвÑаÑÐ°ÐµÑ Ñелое менÑÑе нÑлÑ, Ð½Ð¾Ð»Ñ Ð¸Ð»Ð¸ Ñелое болÑÑе нÑлÑ, показÑваÑÑее, ÑÑо пеÑвÑй клÑÑ Ð¼ÐµÐ½ÑÑе, Ñавен или болÑÑе вÑоÑого. ÐлÑÑи NULL никогда не пеÑедаÑÑÑÑ ÑÑой ÑÑнкÑии.
ÐÑли же клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов не опÑеделÑÐµÑ Ð¼ÐµÑод compare, GIN попÑÑаеÑÑÑ Ð½Ð°Ð¹Ñи клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов B-деÑева по ÑмолÑÐ°Ð½Ð¸Ñ Ð´Ð»Ñ Ñипа даннÑÑ
клÑÑа индекÑа и воÑполÑзоваÑÑÑÑ ÐµÐ³Ð¾ ÑÑнкÑией ÑÑавнениÑ. ÐÑли клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов GIN пÑедназнаÑен ÑолÑко Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ Ñипа даннÑÑ
, ÑекомендÑеÑÑÑ Ð·Ð°Ð´Ð°Ð²Ð°ÑÑ ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð² ÑÑом клаÑÑе опеÑаÑоÑов, Ñак как поиÑк клаÑÑа опеÑаÑоÑов B-деÑева Ð·Ð°Ð½Ð¸Ð¼Ð°ÐµÑ Ð½ÐµÑколÑко Ñиклов. Ðднако Ð´Ð»Ñ Ð¿Ð¾Ð»Ð¸Ð¼Ð¾ÑÑнÑÑ
клаÑÑов опеÑаÑоÑов GIN (напÑимеÑ, array_ops) задаÑÑ Ð¾Ð´Ð½Ñ ÑÑнкÑÐ¸Ñ ÑÑÐ°Ð²Ð½ÐµÐ½Ð¸Ñ Ð¾Ð±ÑÑно не пÑедÑÑавлÑеÑÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñм.
ÐополниÑелÑно клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов Ð´Ð»Ñ GIN Ð¼Ð¾Ð¶ÐµÑ Ð¿ÑедоÑÑавиÑÑ ÑледÑÑÑий меÑод:
int comparePartial(Datum partial_key, Datum key, StrategyNumber n, Pointer extra_data)СÑÐ°Ð²Ð½Ð¸Ð²Ð°ÐµÑ ÐºÐ»ÑÑ Ð·Ð°Ð¿ÑоÑа Ñ ÑаÑÑиÑнÑм ÑооÑвеÑÑÑвием Ñ ÐºÐ»ÑÑом индекÑа. ÐозвÑаÑÐ°ÐµÑ Ñелое ÑиÑло, знак коÑоÑого оÑÑÐ°Ð¶Ð°ÐµÑ ÑезÑлÑÑÐ°Ñ ÑÑавнениÑ: оÑÑиÑаÑелÑное ÑиÑло ознаÑаеÑ, ÑÑо клÑÑ Ð¸Ð½Ð´ÐµÐºÑа не ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ, но нÑжно пÑодолжаÑÑ ÑканиÑование индекÑа; Ð½Ð¾Ð»Ñ Ð¾Ð·Ð½Ð°ÑаеÑ, ÑÑо клÑÑ Ð¸Ð½Ð´ÐµÐºÑа ÑооÑвеÑÑÑвÑÐµÑ Ð·Ð°Ð¿ÑоÑÑ; положиÑелÑное ÑиÑло ознаÑаеÑ, ÑÑо ÑканиÑование индекÑа нÑжно пÑекÑаÑиÑÑ, Ñак как дÑÑÐ³Ð¸Ñ ÑооÑвеÑÑÑвий не бÑдеÑ. ФÑнкÑии пеÑедаÑÑÑÑ Ð½Ð¾Ð¼ÐµÑ ÑÑÑаÑегии
nопеÑаÑоÑа, ÑÑоÑмиÑовавÑего запÑÐ¾Ñ ÑаÑÑиÑного ÑооÑвеÑÑÑвиÑ, на ÑлÑÑай, еÑли нÑжно знаÑÑ ÐµÐ³Ð¾ ÑмÑÑл, ÑÑÐ¾Ð±Ñ Ð¾Ð¿ÑеделиÑÑ, когда пÑекÑаÑаÑÑ ÑканиÑование. ÐÑоме Ñого, ей пеÑедаÑÑÑÑextra_dataâ ÑооÑвеÑÑÑвÑÑÑий ÑÐ»ÐµÐ¼ÐµÐ½Ñ Ð¼Ð°ÑÑива дополниÑелÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ , ÑÑоÑмиÑованного ÑÑнкÑиейextractQuery, либоNULL, еÑли дополниÑелÑнÑÑ Ð´Ð°Ð½Ð½ÑÑ Ð½ÐµÑ. ÐнаÑÐµÐ½Ð¸Ñ NULL ÑÑой ÑÑнкÑии никогда не пеÑедаÑÑÑÑ.
ÐÐ»Ñ Ð¿Ð¾Ð´Ð´ÐµÑжки пÑовеÑок на «ÑаÑÑиÑное ÑооÑвеÑÑÑвие» клаÑÑ Ð¾Ð¿ÐµÑаÑоÑов должен пÑедоÑÑавиÑÑ Ð¼ÐµÑод comparePartial, а меÑод extractQuery должен ÑÑÑанавливаÑÑ Ð¿Ð°ÑамеÑÑ pmatch, когда вÑÑÑеÑаеÑÑÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ð½Ð° ÑаÑÑиÑное ÑооÑвеÑÑÑвие. Ðа подÑобноÑÑÑми обÑаÑиÑеÑÑ Ðº ÐодÑазделÑ 62.4.2.
ФакÑиÑеÑкие ÑÐ¸Ð¿Ñ Ð´Ð°Ð½Ð½ÑÑ
ÑазлиÑнÑÑ
знаÑений Datum, ÑпоминаемÑÑ
вÑÑе, завиÑÑÑ Ð¾Ñ ÐºÐ»Ð°ÑÑа опеÑаÑоÑов. ÐнаÑÐµÐ½Ð¸Ñ Ð¾Ð±ÑекÑов, пеÑедаваемÑе в extractValue, вÑегда имеÑÑ Ð²Ñ
одной Ñип клаÑÑа опеÑаÑоÑов, а вÑе знаÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей Ð´Ð¾Ð»Ð¶Ð½Ñ Ð±ÑÑÑ Ñипа, заданного паÑамеÑÑом STORAGE Ð´Ð»Ñ ÐºÐ»Ð°ÑÑа. Типом аÑгÑменÑа query, пеÑедаваемого ÑÑнкÑиÑм extractQuery, consistent и triConsistent, бÑÐ´ÐµÑ ÑÐ¾Ñ Ñип, ÑÑо Ñказан в каÑеÑÑве Ñипа пÑавого опеÑанда опеÑаÑоÑа-Ñлена клаÑÑа, опÑеделÑемого по номеÑÑ ÑÑÑаÑегии. ÐÑо не обÑзаÑелÑно должен бÑÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑÑемÑй Ñип, доÑÑаÑоÑно лиÑÑ, ÑÑÐ¾Ð±Ñ Ð¸Ð· него можно бÑло извлеÑÑ Ð·Ð½Ð°ÑÐµÐ½Ð¸Ñ ÐºÐ»ÑÑей, имеÑÑие нÑжнÑй Ñип. Ðднако ÑекомендÑеÑÑÑ, ÑÑÐ¾Ð±Ñ Ð² SQL-обÑÑвлениÑÑ
ÑÑиÑ
ÑÑÑÑ
опоÑнÑÑ
ÑÑнкÑий Ð´Ð»Ñ Ð°ÑгÑменÑа query назнаÑалÑÑ Ð¸Ð½Ð´ÐµÐºÑиÑÑемÑй Ñип клаÑÑа опеÑаÑоÑов, даже неÑмоÑÑÑ Ð½Ð° Ñо, ÑÑо ÑакÑиÑеÑкий Ñип Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð´ÑÑгим, в завиÑимоÑÑи Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑа.