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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy