Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitc047a94

Browse files
author
Vladlen Popolitov
committed
GIN support function updated
1 parentfb08de1 commitc047a94

File tree

2 files changed

+211
-0
lines changed

2 files changed

+211
-0
lines changed

‎anyarray--1.2.sql

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -894,6 +894,85 @@ AS
894894
FUNCTION4 ginanyarray_consistent(internal, internal, anyarray),
895895
STORAGEnumeric;
896896

897+
/*
898+
* anyarray version 1.1
899+
*/
900+
901+
CREATE OR REPLACEFUNCTIONginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal)
902+
RETURNS internal
903+
AS'MODULE_PATHNAME'
904+
LANGUAGE C IMMUTABLE;
905+
906+
ALTEROPERATOR FAMILY _bit_aa_ops USING gin ADD
907+
FUNCTION6 (bit[],bit[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
908+
909+
ALTEROPERATOR FAMILY _bytea_aa_ops USING gin ADD
910+
FUNCTION6 (bytea[],bytea[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
911+
912+
ALTEROPERATOR FAMILY _char_aa_ops USING gin ADD
913+
FUNCTION6 (char[],char[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
914+
915+
ALTEROPERATOR FAMILY _cidr_aa_ops USING gin ADD
916+
FUNCTION6 (cidr[],cidr[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
917+
918+
ALTEROPERATOR FAMILY _date_aa_ops USING gin ADD
919+
FUNCTION6 (date[],date[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
920+
921+
ALTEROPERATOR FAMILY _float4_aa_ops USING gin ADD
922+
FUNCTION6 (float4[],float4[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
923+
924+
ALTEROPERATOR FAMILY _float8_aa_ops USING gin ADD
925+
FUNCTION6 (float8[],float8[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
926+
927+
ALTEROPERATOR FAMILY _inet_aa_ops USING gin ADD
928+
FUNCTION6 (inet[],inet[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
929+
930+
ALTEROPERATOR FAMILY _int2_aa_ops USING gin ADD
931+
FUNCTION6 (int2[],int2[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
932+
933+
ALTEROPERATOR FAMILY _int4_aa_ops USING gin ADD
934+
FUNCTION6 (int4[],int4[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
935+
936+
ALTEROPERATOR FAMILY _int8_aa_ops USING gin ADD
937+
FUNCTION6 (int8[],int8[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
938+
939+
ALTEROPERATOR FAMILY _interval_aa_ops USING gin ADD
940+
FUNCTION6 (interval[],interval[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
941+
942+
ALTEROPERATOR FAMILY _macaddr_aa_ops USING gin ADD
943+
FUNCTION6 (macaddr[],macaddr[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
944+
945+
ALTEROPERATOR FAMILY _money_aa_ops USING gin ADD
946+
FUNCTION6 (money[],money[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
947+
948+
ALTEROPERATOR FAMILY _numeric_aa_ops USING gin ADD
949+
FUNCTION6 (numeric[],numeric[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
950+
951+
ALTEROPERATOR FAMILY _oid_aa_ops USING gin ADD
952+
FUNCTION6 (oid[],oid[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
953+
954+
ALTEROPERATOR FAMILY _text_aa_ops USING gin ADD
955+
FUNCTION6 (text[],text[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
956+
957+
ALTEROPERATOR FAMILY _time_aa_ops USING gin ADD
958+
FUNCTION6 (time[],time[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
959+
960+
ALTEROPERATOR FAMILY _timestamp_aa_ops USING gin ADD
961+
FUNCTION6 (timestamp[],timestamp[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
962+
963+
ALTEROPERATOR FAMILY _timestamptz_aa_ops USING gin ADD
964+
FUNCTION6 (timestamptz[],timestamptz[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
965+
966+
ALTEROPERATOR FAMILY _timetz_aa_ops USING gin ADD
967+
FUNCTION6 (timetz[],timetz[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
968+
969+
ALTEROPERATOR FAMILY _varbit_aa_ops USING gin ADD
970+
FUNCTION6 (varbit[],varbit[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
971+
972+
ALTEROPERATOR FAMILY _varchar_aa_ops USING gin ADD
973+
FUNCTION6 (varchar[],varchar[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
974+
975+
897976
/*
898977
RUM
899978
*/

‎anyarray_gin.c

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,3 +194,135 @@ ginanyarray_consistent(PG_FUNCTION_ARGS)
194194

195195
PG_RETURN_BOOL(res);
196196
}
197+
198+
199+
PG_FUNCTION_INFO_V1(ginanyarray_triconsistent);
200+
Datum
201+
ginanyarray_triconsistent(PG_FUNCTION_ARGS)
202+
{
203+
GinTernaryValue*check= (GinTernaryValue*)PG_GETARG_POINTER(0);
204+
StrategyNumberstrategy=PG_GETARG_UINT16(1);
205+
int32nkeys=PG_GETARG_INT32(3);
206+
/* Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
207+
GinTernaryValueres=GIN_MAYBE;
208+
int32i;
209+
210+
switch (strategy)
211+
{
212+
caseRTOverlapStrategyNumber:
213+
/* if at least one element in check[] is GIN_TRUE, so result = GIN_TRUE
214+
* otherwise if at least one element in check[] is GIN_MAYBE, so result = GIN_MAYBE
215+
* otherwise result = GIN_FALSE
216+
*/
217+
res=GIN_FALSE;
218+
for (i=0;i<nkeys;i++)
219+
{
220+
if (check[i]==GIN_TRUE)
221+
{
222+
res=GIN_TRUE;
223+
break;
224+
}elseif (check[i]==GIN_MAYBE)
225+
{
226+
res=GIN_MAYBE;
227+
}
228+
}
229+
break;
230+
caseRTContainedByStrategyNumber:
231+
/* at least one element in check[] is GIN_TRUE or GIN_MAYBE, so result = GIN_MAYBE (we will need recheck in any case) */
232+
res=GIN_MAYBE;
233+
break;
234+
caseRTSameStrategyNumber:
235+
/* if at least one element in check[] is GIN_FALSE, so result = GIN_FALSE
236+
* otherwise result = GIN_MAYBE
237+
*/
238+
res=GIN_MAYBE;
239+
for (i=0;i<nkeys;i++)
240+
{
241+
if (check[i]==GIN_FALSE)
242+
{
243+
res=GIN_FALSE;
244+
break;
245+
}
246+
}
247+
break;
248+
caseRTContainsStrategyNumber:
249+
/* if at least one element in check[] is GIN_FALSE, so result = GIN_FALSE
250+
* otherwise if at least one element in check[] is GIN_MAYBE, so result = GIN_MAYBE
251+
* otherwise result = GIN_TRUE
252+
*/
253+
res=GIN_TRUE;
254+
for (i=0;i<nkeys;i++)
255+
{
256+
if (check[i]==GIN_FALSE)
257+
{
258+
res=GIN_FALSE;
259+
break;
260+
}elseif (check[i]==GIN_MAYBE)
261+
{
262+
res=GIN_MAYBE;
263+
}
264+
}
265+
break;
266+
caseAnyAarraySimilarityStrategy:
267+
{
268+
int32nIntersectionMin=0;
269+
int32nIntersectionMax=0;
270+
271+
res=GIN_FALSE;
272+
for (i=0;i<nkeys;i++)
273+
{
274+
if (check[i]==GIN_TRUE)
275+
{
276+
nIntersectionMin++;
277+
nIntersectionMax++;
278+
}elseif (check[i]==GIN_MAYBE)
279+
{
280+
nIntersectionMax++;
281+
res=GIN_MAYBE;
282+
}
283+
}
284+
285+
switch(SmlType)
286+
{
287+
caseAA_Cosine:
288+
/* nIntersection / sqrt(nkeys * nIntersection) */
289+
if(sqrt(((double)nIntersectionMax) / (double)nkeys)<SmlLimit){
290+
res=GIN_FALSE;
291+
}else {
292+
res=GIN_MAYBE;
293+
}
294+
break;
295+
caseAA_Jaccard:
296+
if((((double)nIntersectionMax) / (double)nkeys)<SmlLimit){
297+
res=GIN_FALSE;
298+
}else {
299+
res=GIN_MAYBE;
300+
}
301+
break;
302+
caseAA_Overlap:
303+
/* nIntersectionMin - quantity of GIN_TRUE in check array
304+
* nIntersectionMax - quantity of GIN_TRUE and GIN_MAYBE in check array
305+
* if nIntersectionMin >= SmlLimit, so result = GIN_TRUE
306+
* if nIntersectionMax < SmlLimit, so result = GIN_FALSE
307+
* otherwise if at least one element in check[] is GIN_MAYBE, so result = GIN_MAYBE
308+
* otherwise result = GIN_FALSE
309+
*/
310+
if(((double)nIntersectionMin) >=SmlLimit)
311+
{
312+
res=GIN_TRUE;
313+
}elseif(((double)nIntersectionMax)<SmlLimit)
314+
{
315+
res=GIN_FALSE;
316+
}
317+
break;
318+
default:
319+
elog(ERROR,"unknown similarity type");
320+
}
321+
}
322+
break;
323+
default:
324+
elog(ERROR,"ginanyarray_triconsistent: unknown strategy number: %d",
325+
strategy);
326+
}
327+
PG_RETURN_GIN_TERNARY_VALUE(res);
328+
}

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp