/* * Returns whether the Bloom filter contains the item or not */ Datum bloom_contains(PG_FUNCTION_ARGS) { BloomFilter *bloom; Datum elem = PG_GETARG_DATUM(1); bool contains = false; Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 1); TypeCacheEntry *typ; StringInfo buf; if (val_type == InvalidOid) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine input data type"))); if (PG_ARGISNULL(0)) PG_RETURN_BOOL(contains); bloom = (BloomFilter *) PG_GETARG_VARLENA_P(0); typ = lookup_type_cache(val_type, 0); buf = makeStringInfo(); DatumToBytes(elem, typ, buf); contains = BloomFilterContains(bloom, buf->data, buf->len); pfree(buf->data); pfree(buf); PG_RETURN_BOOL(contains); }
/* * Returns the estimate normalized frequency of the item */ Datum cmsketch_norm_frequency(PG_FUNCTION_ARGS) { CountMinSketch *cms; Datum elem = PG_GETARG_DATUM(1); float8 freq = 0; Oid val_type = get_fn_expr_argtype(fcinfo->flinfo, 1); TypeCacheEntry *typ; StringInfo buf; if (val_type == InvalidOid) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("could not determine input data type"))); if (PG_ARGISNULL(0)) PG_RETURN_FLOAT8(freq); cms = (CountMinSketch *) PG_GETARG_VARLENA_P(0); typ = lookup_type_cache(val_type, 0); buf = makeStringInfo(); DatumToBytes(elem, typ, buf); freq = CountMinSketchEstimateNormFrequency(cms, buf->data, buf->len); pfree(buf->data); pfree(buf); PG_RETURN_FLOAT8(freq); }
static BloomFilter * bloom_add_datum(FunctionCallInfo fcinfo, BloomFilter *bloom, Datum elem) { TypeCacheEntry *typ = (TypeCacheEntry *) fcinfo->flinfo->fn_extra; StringInfo buf; buf = makeStringInfo(); DatumToBytes(elem, typ, buf); BloomFilterAdd(bloom, buf->data, buf->len); pfree(buf->data); pfree(buf); return bloom; }
static CountMinSketch * cmsketch_add_datum(FunctionCallInfo fcinfo, CountMinSketch *cms, Datum elem, int32 n) { TypeCacheEntry *typ = (TypeCacheEntry *) fcinfo->flinfo->fn_extra; StringInfo buf; if (!typ->typbyval && !elem) return cms; buf = makeStringInfo(); DatumToBytes(elem, typ, buf); CountMinSketchAdd(cms, buf->data, buf->len, n); pfree(buf->data); pfree(buf); return cms; }
static HyperLogLog * hll_add_datum(FunctionCallInfo fcinfo, HyperLogLog *hll, Datum elem) { TypeCacheEntry *typ = (TypeCacheEntry *) fcinfo->flinfo->fn_extra; StringInfo buf; int result; if (!typ->typbyval && !elem) return hll; buf = makeStringInfo(); DatumToBytes(elem, typ, buf); hll = HLLAdd(hll, buf->data, buf->len, &result); pfree(buf->data); pfree(buf); SET_VARSIZE(hll, HLLSize(hll)); return hll; }