/*! * copy datum <c>dat</c> into the offset of position <c>index</c> of * the mfv sketch stored in <c>transblob</c>. * * <i>Caller beware: this helper return assumes that * <c>dat</c> is small enough to fit in the storage * currently used by the datum at position <c>index</c>.</i> * * \param transblob a bytea holding and mfv transval * \param index the index of the destination for copying * \param dat the datum to be copied into the transval */ void mfv_copy_datum(bytea *transblob, int index, Datum dat) { mfvtransval *transval = (mfvtransval *)VARDATA(transblob); size_t datumLen = ExtractDatumLen(dat, transval->typLen, transval->typByVal, -1); void * curval = (char*)transval + transval->mfvs[index].offset; memmove(curval, (void *)DatumExtractPointer(dat, transval->typByVal), datumLen); }
/*! * copy datum <c>dat</c> into the offset of position <c>index</c> of * the mfv sketch stored in <c>transblob</c>. * * <i>Caller beware: this helper return assumes that * <c>dat</c> is small enough to fit in the storage * currently used by the datum at position <c>index</c>.</i> * * \param transblob a bytea holding and mfv transval * \param index the index of the destination for copying * \param dat the datum to be copied into the transval */ void mfv_copy_datum(bytea *transblob, int index, Datum dat) { mfvtransval *transval = (mfvtransval *)VARDATA(transblob); size_t datumLen = ExtractDatumLen(dat, transval->typLen, transval->typByVal, -1); void * curval = mfv_transval_getval(transblob,index); memmove(curval, (void *)DatumExtractPointer(dat, transval->typByVal), datumLen); }
/*! * look to see if the mfvsketch currently has <c>val</c> * stored as one of its most-frequent values. * Returns the offset in the <c>mfvs</c> array, or -1 * if not found. * NOTE: a 0 return value means the item <i>was found</i> * at offset 0! * \param blob a bytea holding an mfv transval * \param val the datum to search for */ int mfv_find(bytea *blob, Datum val) { mfvtransval *transval = (mfvtransval *)VARDATA(blob); unsigned i; uint32 len; void * datp; Datum iDat; void *valp = DatumExtractPointer(val, transval->typByVal); /* look for existing entry for this value */ for (i = 0; i < transval->next_mfv; i++) { /* if they're the same */ datp = mfv_transval_getval(blob,i); iDat = PointerExtractDatum(datp, transval->typByVal); if ((len = ExtractDatumLen(iDat, transval->typLen, transval->typByVal, -1)) == ExtractDatumLen(val, transval->typLen, transval->typByVal, -1)) { if (!memcmp(datp, valp, len)) /* arg is an mfv */ return(i); } } return(-1); }