Thread: tsearch2 trigger alternative

tsearch2 trigger alternative

From
Chris Gamache
Date:
Tsearch2 comes with its own tsearch2 trigger function. You pass column names to
it, and it puts a vanilla tsvector into the column named in TG_ARGV[0]. Not
only can you pass column names to it, but you can pass simple functions to it
as well. This is magical to me. :)

I'm trying to figure out how to do the same thing using plpgsql, except instead
of returning a vanilla tsvector, I want to return a specially weighted
tsvector. I've created a function that can do this:

create or replace function name_vector (text) returns tsvector as 'select
setweight(to_tsvector(substr($1,1,strpos($1,'',''))),''C'') ||
to_tsvector(substr($1,strpos($1,'','')+1,length($1)));' language 'sql';

so...

Plain:

select to_tsvector('Einstein, Albert');
       to_tsvector
-------------------------
 'albert':2 'einstein':1

Weighted:

select name_vector('Einstein, Albert');
       name_vector
--------------------------
 'albert':2 'einstein':1C


Now, to somehow package that into a magical trigger function...

All the examples for creating trigger functions that I've found use static
column names, NEW and OLD ... I would like to create a generic trigger
function, as the tsearch2 trigger function does, to return the specially
weighted tsvector.

Its like a lighter to a caveman. Can anyone lend a hand?

CG

__________________________________
Do you Yahoo!?
Yahoo! Mail SpamGuard - Read only the mail you want.
http://antispam.yahoo.com/tools

Re: tsearch2 trigger alternative

From
Teodor Sigaev
Date:

Chris Gamache wrote:
> Tsearch2 comes with its own tsearch2 trigger function. You pass column names to
> it, and it puts a vanilla tsvector into the column named in TG_ARGV[0]. Not
> only can you pass column names to it, but you can pass simple functions to it
> as well. This is magical to me. :)
look at tsvector.c:864

numattr = SPI_fnumber(rel->rd_att, trigger->tgargs[i]);
if (numattr == SPI_ERROR_NOATTRIBUTE)
{
      funcoid = findFunc(trigger->tgargs[i]);
      if (funcoid == InvalidOid)
           ereport(ERROR,
                 (errcode(ERRCODE_UNDEFINED_COLUMN),
                  errmsg("could not find function or field \"%s\"",
                  trigger->tgargs[i])));
           continue;
}

If current args (trigger->tgargs[i]) isn't a column name, then it's a function
name. It's simple :)


>
> I'm trying to figure out how to do the same thing using plpgsql, except instead
> of returning a vanilla tsvector, I want to return a specially weighted
> tsvector. I've created a function that can do this:
I didn't work with plpgsql :(

--
Teodor Sigaev                                  E-mail: teodor@sigaev.ru

Re: tsearch2 trigger alternative

From
Chris Gamache
Date:
--- Teodor Sigaev <teodor@sigaev.ru> wrote:
>
>
> Chris Gamache wrote:
> > Tsearch2 comes with its own tsearch2 trigger function. You pass column
> names to
> > it, and it puts a vanilla tsvector into the column named in TG_ARGV[0]. Not
> > only can you pass column names to it, but you can pass simple functions to
> it
> > as well. This is magical to me. :)
> look at tsvector.c:864
>
> numattr = SPI_fnumber(rel->rd_att, trigger->tgargs[i]);
> if (numattr == SPI_ERROR_NOATTRIBUTE)
> {
>       funcoid = findFunc(trigger->tgargs[i]);
>       if (funcoid == InvalidOid)
>            ereport(ERROR,
>                  (errcode(ERRCODE_UNDEFINED_COLUMN),
>                   errmsg("could not find function or field \"%s\"",
>                   trigger->tgargs[i])));
>            continue;
> }
>
> If current args (trigger->tgargs[i]) isn't a column name, then it's a
> function
> name. It's simple :)

Its like a circuit board to Genghis Kahn... :) I still wouldn't be able to
quickly write my own trigger. It occurrs to me that this might be an
opportunity to properly extend tsearch2, though.

I'm sure that the tsearch2 trigger could detect a tsvector type and allow it to
be inserted without modification. That would solve this problem completely! I
can't think of any practical argument against it. It makes sense that others
besides myself would want to selectively weight columns upon insert without
having to write their own custom trigger in C.

CG

__________________________________
Do you Yahoo!?
Yahoo! Mail SpamGuard - Read only the mail you want.
http://antispam.yahoo.com/tools