Skip to content

Commit c047a94

Browse files
author
Vladlen Popolitov
committed
GIN support function updated
1 parent fb08de1 commit c047a94

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
FUNCTION 4 ginanyarray_consistent(internal, internal, anyarray),
895895
STORAGE numeric;
896896

897+
/*
898+
* anyarray version 1.1
899+
*/
900+
901+
CREATE OR REPLACE FUNCTION ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal)
902+
RETURNS internal
903+
AS 'MODULE_PATHNAME'
904+
LANGUAGE C IMMUTABLE;
905+
906+
ALTER OPERATOR FAMILY _bit_aa_ops USING gin ADD
907+
FUNCTION 6 (bit[],bit[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
908+
909+
ALTER OPERATOR FAMILY _bytea_aa_ops USING gin ADD
910+
FUNCTION 6 (bytea[],bytea[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
911+
912+
ALTER OPERATOR FAMILY _char_aa_ops USING gin ADD
913+
FUNCTION 6 (char[],char[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
914+
915+
ALTER OPERATOR FAMILY _cidr_aa_ops USING gin ADD
916+
FUNCTION 6 (cidr[],cidr[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
917+
918+
ALTER OPERATOR FAMILY _date_aa_ops USING gin ADD
919+
FUNCTION 6 (date[],date[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
920+
921+
ALTER OPERATOR FAMILY _float4_aa_ops USING gin ADD
922+
FUNCTION 6 (float4[],float4[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
923+
924+
ALTER OPERATOR FAMILY _float8_aa_ops USING gin ADD
925+
FUNCTION 6 (float8[],float8[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
926+
927+
ALTER OPERATOR FAMILY _inet_aa_ops USING gin ADD
928+
FUNCTION 6 (inet[],inet[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
929+
930+
ALTER OPERATOR FAMILY _int2_aa_ops USING gin ADD
931+
FUNCTION 6 (int2[],int2[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
932+
933+
ALTER OPERATOR FAMILY _int4_aa_ops USING gin ADD
934+
FUNCTION 6 (int4[],int4[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
935+
936+
ALTER OPERATOR FAMILY _int8_aa_ops USING gin ADD
937+
FUNCTION 6 (int8[],int8[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
938+
939+
ALTER OPERATOR FAMILY _interval_aa_ops USING gin ADD
940+
FUNCTION 6 (interval[],interval[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
941+
942+
ALTER OPERATOR FAMILY _macaddr_aa_ops USING gin ADD
943+
FUNCTION 6 (macaddr[],macaddr[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
944+
945+
ALTER OPERATOR FAMILY _money_aa_ops USING gin ADD
946+
FUNCTION 6 (money[],money[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
947+
948+
ALTER OPERATOR FAMILY _numeric_aa_ops USING gin ADD
949+
FUNCTION 6 (numeric[],numeric[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
950+
951+
ALTER OPERATOR FAMILY _oid_aa_ops USING gin ADD
952+
FUNCTION 6 (oid[],oid[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
953+
954+
ALTER OPERATOR FAMILY _text_aa_ops USING gin ADD
955+
FUNCTION 6 (text[],text[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
956+
957+
ALTER OPERATOR FAMILY _time_aa_ops USING gin ADD
958+
FUNCTION 6 (time[],time[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
959+
960+
ALTER OPERATOR FAMILY _timestamp_aa_ops USING gin ADD
961+
FUNCTION 6 (timestamp[],timestamp[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
962+
963+
ALTER OPERATOR FAMILY _timestamptz_aa_ops USING gin ADD
964+
FUNCTION 6 (timestamptz[],timestamptz[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
965+
966+
ALTER OPERATOR FAMILY _timetz_aa_ops USING gin ADD
967+
FUNCTION 6 (timetz[],timetz[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
968+
969+
ALTER OPERATOR FAMILY _varbit_aa_ops USING gin ADD
970+
FUNCTION 6 (varbit[],varbit[]) ginanyarray_triconsistent(internal, internal, anyarray,internal,internal,internal,internal,internal);
971+
972+
ALTER OPERATOR FAMILY _varchar_aa_ops USING gin ADD
973+
FUNCTION 6 (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+
StrategyNumber strategy = PG_GETARG_UINT16(1);
205+
int32 nkeys = PG_GETARG_INT32(3);
206+
/* Pointer *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
207+
GinTernaryValue res = GIN_MAYBE;
208+
int32 i;
209+
210+
switch (strategy)
211+
{
212+
case RTOverlapStrategyNumber:
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+
} else if (check[i] == GIN_MAYBE)
225+
{
226+
res = GIN_MAYBE;
227+
}
228+
}
229+
break;
230+
case RTContainedByStrategyNumber:
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+
case RTSameStrategyNumber:
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+
case RTContainsStrategyNumber:
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+
} else if (check[i] == GIN_MAYBE)
261+
{
262+
res = GIN_MAYBE;
263+
}
264+
}
265+
break;
266+
case AnyAarraySimilarityStrategy:
267+
{
268+
int32 nIntersectionMin = 0;
269+
int32 nIntersectionMax = 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+
} else if (check[i] == GIN_MAYBE)
279+
{
280+
nIntersectionMax++;
281+
res = GIN_MAYBE;
282+
}
283+
}
284+
285+
switch(SmlType)
286+
{
287+
case AA_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+
case AA_Jaccard:
296+
if((((double)nIntersectionMax) / (double)nkeys) < SmlLimit){
297+
res = GIN_FALSE;
298+
} else {
299+
res = GIN_MAYBE;
300+
}
301+
break;
302+
case AA_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+
} else if(((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)