Re: syntax for reaching into records, specifically ts_stat results

From: Oleg Bartunov <oleg(at)sai(dot)msu(dot)su>
To: Dan Chak <chak(at)MIT(dot)EDU>
Cc: pgsql-hackers(at)postgresql(dot)org
Subject: Re: syntax for reaching into records, specifically ts_stat results
Date: 2008-12-09 20:04:26
Message-ID: Pine.LNX.4.64.0812092303280.28443@sn.sai.msu.ru
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

try
select * from ts_stat(....)
btw, performance of ts_stat() was greatly improved in 8.4.

Oleg
On Tue, 9 Dec 2008, Dan Chak wrote:

> Dear Postgres Folk,
>
> In working with tsvectors (added in 8.3), I've come to a place where my
> syntax-fu has failed me. I've resorted to turning a result set of records
> into strings so that I can regexp out the record fields I need, rather than
> access them directly, as I'm sure it's possible to do with the right
> syntactic formulation. Although my solution works, I'm sure it's much less
> efficient than it could be, and hope someone on the list can help do this the
> right way.
>
> Basically, I would like to transpose a series of tsvectors (one per row) into
> columns. E.g., as tsvects, I have this:
>
> test=# select * from tsvects;
> sentence_id | tsvect
> -------------+------------------------------
> 1 | 'fox':3 'brown':2 'quick':1
> 2 | 'lazi':1 'eleph':3 'green':2
>
> Instead I want this:
>
> sentence_id | word | freq
> -------------+-------+------
> 1 | fox | 1
> 1 | brown | 1
> 1 | quick | 1
> 2 | lazi | 1
> 2 | eleph | 1
> 2 | green | 1
>
> I am able to generate this with the following view, but the problem is that
> to create it, I must first cast the ts_stat results to a string, and then
> regexp out the pertinent pieces:
>
> create or replace view words as
> select sentence_id,
> substring(stat from '^\\(([^,]+),') as word,
> substring(stat from ',([^,]+)\\)$') as freq
> from (select sentence_id,
> ts_stat('select tsvect from tsvects where sentence_id = ' ||
> tsvects.sentence_id)::text as stat
> from tsvects
> ) as foo;
>
> It seems like there should be a way to access fields in the records returned
> from ts_stat directly, but I can't figure out how. Here's the result of the
> subquery:
>
> test=# select sentence_id,
> ts_stat('select tsvect from tsvects where sentence_id = ' ||
> tsvects.sentence_id)::text as stat
> from tsvects;
> sentence_id | stat
> -------------+-------------
> 1 | (fox,1,1)
> 1 | (brown,1,1)
> 1 | (quick,1,1)
> 2 | (lazi,1,1)
> 2 | (eleph,1,1)
> 2 | (green,1,1)
> (6 rows)
>
> If I try to get at the elements (which I believe are named 'word', 'ndoc',
> 'nentry'), I get a variety of syntax errors:
>
> test=# select sentence_id,
> test-# stat['word'],
> test-# stat['nentry']
> test-# from (select sentence_id,
> test(# ts_stat('select tsvect from tsvects where sentence_id =
> ' ||
> test(# tsvects.sentence_id) as stat
> test(# from tsvects
> test(# ) as foo;
> ERROR: cannot subscript type record because it is not an array
>
> If I say stat.word (instead of subscripting), I get 'missing FROM-clause
> entry for table "stat"'. If I say foo.stat.word, I get 'ERROR: schema "foo"
> does not exist'.
>
> Any ideas on how to get into these records with resorting to text parsing?
>
> Thanks,
> Dan
>
>

Regards,
Oleg
_____________________________________________________________
Oleg Bartunov, Research Scientist, Head of AstroNet (www.astronet.ru),
Sternberg Astronomical Institute, Moscow University, Russia
Internet: oleg(at)sai(dot)msu(dot)su, http://www.sai.msu.su/~megera/
phone: +007(495)939-16-83, +007(495)939-23-83

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Dan Chak 2008-12-09 20:11:58 Re: syntax for reaching into records, specifically ts_stat results
Previous Message Tom Lane 2008-12-09 20:02:31 Re: parallel restore vs. windows