Using HStore type in TSearch

Поиск
Список
Период
Сортировка
От Łukasz Dejneka
Тема Using HStore type in TSearch
Дата
Msg-id 4df5da451003290418h41400685g26ae6a7dc2f50944@mail.gmail.com
обсуждение исходный текст
Ответы Re: Using HStore type in TSearch  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
Hi,
 
I've asked this question in novice group and another Postgres forum, but didn't get any help.
 
What I want to do is to use HStore data type (namely the HStore keys) in TSearch. I don't want use TSVector and the original ts_match_vq function, because I want to be able to control exact values that are passed to the search and not use their lexemes.
 
I'm pretty green about Postgres and C, so please forgive me for any mistakes I make here...
 
What I tried was to modify the ts_match_vq function and use it to pass values from HStore directly to the recursive TS_execute function. Unfortunately the HStore ARRPTR() and STRPTR() functions do not return the same structures as their TSVector counterparts. HStore as I gathered returns pointer to a string, but the TSVector (and the TS_execute) needs a ltree of search entries. I guess I need to convert the HStore values to the ltree structure, but I can't get it right.
 
This is the partially modified ts_match_vq:
 
#undef CALCDATASIZE
#undef ARRPTR
#undef STRPTR
#define CALCDATASIZE(x, lenstr) ( (x) * sizeof(HEntry) + HSHRDSIZE + (lenstr) )
#define ARRPTR(x)                ( (HEntry*) ( (char*)(x) + HSHRDSIZE ) )
#define STRPTR(x)                ( (char*)(x) + HSHRDSIZE + ( sizeof(HEntry) * ((HStore*)x)->size ) )
 
PG_FUNCTION_INFO_V1(ljd_test);
Datum ljd_test(PG_FUNCTION_ARGS);
Datum.
ljd_test(PG_FUNCTION_ARGS).
{
    //get arguments
    HStore <---><------>*hs = PG_GETARG_HS(0);.
    TSQuery <--><------>tq = PG_GETARG_TSQUERY(1);
    TSQuery <--><------>tq_in;
    CHKVAL <---><------>chkvalKeys;
    bool <-----><------>res;

    //check for empty values.
    if (!hs->size || !tq->size)
    {
<------>PG_FREE_IF_COPY(hs, 0);
<------>PG_FREE_IF_COPY(tq, 1);
<------>PG_RETURN_BOOL(false);
    }
    //process TSQuery
    tq_in = TSQueryGetDatum(tq);
    //process HStore
    chkvalKeys.arrb = ARRPTR(hs);     
    chkvalKeys.arre = chkvalKeys.arrb + hs->size
    chkvalKeys.values = STRPTR(hs);   
    chkvalKeys.operand = GETQUERY(tq_in);
res = ljd_exec(
<------>    GETQUERY(tq_in),
<------>    &chkvalKeys,
<------>    true,
<------>    checkcondition_str
                );

    PG_RETURN_BOOL(res);.

}
Thank you in advance for any help and tips on how to solve this.

В списке pgsql-hackers по дате отправления:

Предыдущее
От: Gokulakannan Somasundaram
Дата:
Сообщение: Re: GSoC Query
Следующее
От: Michael Meskes
Дата:
Сообщение: Problems with variable cursorname in ecpg