HeadlineParsedText vs HeadlineText

Поиск
Список
Период
Сортировка
От Heikki Linnakangas
Тема HeadlineParsedText vs HeadlineText
Дата
Msg-id 46CEEE96.9000502@enterprisedb.com
обсуждение исходный текст
Список pgsql-patches
Two identical structs are defined and used interchangeably in tsearch:
HeadlineParsedText and HeadlineText, along with corresponding
HeadlineWord and HeadlineWordEntry sub-structs. In the contrib version
this struct only appeared once, and was called HLPRSTEXT, so apparently
that was accidentally moved and renamed twice.

Here's a patch to unite them again.

--
  Heikki Linnakangas
  EnterpriseDB   http://www.enterprisedb.com
Index: src/backend/tsearch/ts_parse.c
===================================================================
RCS file: /home/hlinnaka/pgcvsrepository/pgsql/src/backend/tsearch/ts_parse.c,v
retrieving revision 1.1
diff -c -r1.1 ts_parse.c
*** src/backend/tsearch/ts_parse.c    21 Aug 2007 01:11:18 -0000    1.1
--- src/backend/tsearch/ts_parse.c    24 Aug 2007 14:29:21 -0000
***************
*** 427,440 ****
   * Headline framework
   */
  static void
! hladdword(HeadlineText * prs, char *buf, int4 buflen, int type)
  {
      while (prs->curwords >= prs->lenwords)
      {
          prs->lenwords *= 2;
!         prs->words = (HeadlineWord *) repalloc((void *) prs->words, prs->lenwords * sizeof(HeadlineWord));
      }
!     memset(&(prs->words[prs->curwords]), 0, sizeof(HeadlineWord));
      prs->words[prs->curwords].type = (uint8) type;
      prs->words[prs->curwords].len = buflen;
      prs->words[prs->curwords].word = palloc(buflen);
--- 427,440 ----
   * Headline framework
   */
  static void
! hladdword(HeadlineParsedText * prs, char *buf, int4 buflen, int type)
  {
      while (prs->curwords >= prs->lenwords)
      {
          prs->lenwords *= 2;
!         prs->words = (HeadlineWordEntry *) repalloc((void *) prs->words, prs->lenwords * sizeof(HeadlineWordEntry));
      }
!     memset(&(prs->words[prs->curwords]), 0, sizeof(HeadlineWordEntry));
      prs->words[prs->curwords].type = (uint8) type;
      prs->words[prs->curwords].len = buflen;
      prs->words[prs->curwords].word = palloc(buflen);
***************
*** 443,458 ****
  }

  static void
! hlfinditem(HeadlineText * prs, TSQuery query, char *buf, int buflen)
  {
      int            i;
      QueryItem  *item = GETQUERY(query);
!     HeadlineWord *word;

      while (prs->curwords + query->size >= prs->lenwords)
      {
          prs->lenwords *= 2;
!         prs->words = (HeadlineWord *) repalloc((void *) prs->words, prs->lenwords * sizeof(HeadlineWord));
      }

      word = &(prs->words[prs->curwords - 1]);
--- 443,458 ----
  }

  static void
! hlfinditem(HeadlineParsedText * prs, TSQuery query, char *buf, int buflen)
  {
      int            i;
      QueryItem  *item = GETQUERY(query);
!     HeadlineWordEntry *word;

      while (prs->curwords + query->size >= prs->lenwords)
      {
          prs->lenwords *= 2;
!         prs->words = (HeadlineWordEntry *) repalloc((void *) prs->words, prs->lenwords * sizeof(HeadlineWordEntry));
      }

      word = &(prs->words[prs->curwords - 1]);
***************
*** 462,468 ****
          {
              if (word->item)
              {
!                 memcpy(&(prs->words[prs->curwords]), word, sizeof(HeadlineWord));
                  prs->words[prs->curwords].item = item;
                  prs->words[prs->curwords].repeated = 1;
                  prs->curwords++;
--- 462,468 ----
          {
              if (word->item)
              {
!                 memcpy(&(prs->words[prs->curwords]), word, sizeof(HeadlineWordEntry));
                  prs->words[prs->curwords].item = item;
                  prs->words[prs->curwords].repeated = 1;
                  prs->curwords++;
***************
*** 475,481 ****
  }

  static void
! addHLParsedLex(HeadlineText * prs, TSQuery query, ParsedLex * lexs, TSLexeme * norms)
  {
      ParsedLex  *tmplexs;
      TSLexeme   *ptr;
--- 475,481 ----
  }

  static void
! addHLParsedLex(HeadlineParsedText * prs, TSQuery query, ParsedLex * lexs, TSLexeme * norms)
  {
      ParsedLex  *tmplexs;
      TSLexeme   *ptr;
***************
*** 511,517 ****
  }

  void
! hlparsetext(Oid cfgId, HeadlineText * prs, TSQuery query, char *buf, int4 buflen)
  {
      int            type,
                  lenlemm;
--- 511,517 ----
  }

  void
! hlparsetext(Oid cfgId, HeadlineParsedText * prs, TSQuery query, char *buf, int4 buflen)
  {
      int            type,
                  lenlemm;
***************
*** 571,582 ****
  }

  text *
! generatHeadline(HeadlineText * prs)
  {
      text       *out;
      int            len = 128;
      char       *ptr;
!     HeadlineWord *wrd = prs->words;

      out = (text *) palloc(len);
      ptr = ((char *) out) + VARHDRSZ;
--- 571,582 ----
  }

  text *
! generatHeadline(HeadlineParsedText * prs)
  {
      text       *out;
      int            len = 128;
      char       *ptr;
!     HeadlineWordEntry *wrd = prs->words;

      out = (text *) palloc(len);
      ptr = ((char *) out) + VARHDRSZ;
Index: src/backend/tsearch/wparser.c
===================================================================
RCS file: /home/hlinnaka/pgcvsrepository/pgsql/src/backend/tsearch/wparser.c,v
retrieving revision 1.2
diff -c -r1.2 wparser.c
*** src/backend/tsearch/wparser.c    22 Aug 2007 01:39:45 -0000    1.2
--- src/backend/tsearch/wparser.c    24 Aug 2007 14:29:43 -0000
***************
*** 300,306 ****
      text       *in = PG_GETARG_TEXT_P(1);
      TSQuery        query = PG_GETARG_TSQUERY(2);
      text       *opt = (PG_NARGS() > 3 && PG_GETARG_POINTER(3)) ? PG_GETARG_TEXT_P(3) : NULL;
!     HeadlineText prs;
      List       *prsoptions;
      text       *out;
      TSConfigCacheEntry *cfg;
--- 300,306 ----
      text       *in = PG_GETARG_TEXT_P(1);
      TSQuery        query = PG_GETARG_TSQUERY(2);
      text       *opt = (PG_NARGS() > 3 && PG_GETARG_POINTER(3)) ? PG_GETARG_TEXT_P(3) : NULL;
!     HeadlineParsedText prs;
      List       *prsoptions;
      text       *out;
      TSConfigCacheEntry *cfg;
***************
*** 309,317 ****
      cfg = lookup_ts_config_cache(PG_GETARG_OID(0));
      prsobj = lookup_ts_parser_cache(cfg->prsId);

!     memset(&prs, 0, sizeof(HeadlineText));
      prs.lenwords = 32;
!     prs.words = (HeadlineWord *) palloc(sizeof(HeadlineWord) * prs.lenwords);

      hlparsetext(cfg->cfgId, &prs, query, VARDATA(in), VARSIZE(in) - VARHDRSZ);

--- 309,317 ----
      cfg = lookup_ts_config_cache(PG_GETARG_OID(0));
      prsobj = lookup_ts_parser_cache(cfg->prsId);

!     memset(&prs, 0, sizeof(HeadlineParsedText));
      prs.lenwords = 32;
!     prs.words = (HeadlineWordEntry *) palloc(sizeof(HeadlineWordEntry) * prs.lenwords);

      hlparsetext(cfg->cfgId, &prs, query, VARDATA(in), VARSIZE(in) - VARHDRSZ);

Index: src/include/tsearch/ts_utils.h
===================================================================
RCS file: /home/hlinnaka/pgcvsrepository/pgsql/src/include/tsearch/ts_utils.h,v
retrieving revision 1.1
diff -c -r1.1 ts_utils.h
*** src/include/tsearch/ts_utils.h    21 Aug 2007 01:11:29 -0000    1.1
--- src/include/tsearch/ts_utils.h    24 Aug 2007 14:31:41 -0000
***************
*** 13,18 ****
--- 13,19 ----
  #define _PG_TS_UTILS_H_

  #include "tsearch/ts_type.h"
+ #include "tsearch/ts_public.h"

  /*
   * Common parse definitions for tsvector and tsquery
***************
*** 105,137 ****
   *    3 generatHeadline to generate result text
   */

! typedef struct
! {
!     uint32        selected:1,
!                 in:1,
!                 replace:1,
!                 repeated:1,
!                 unused:4,
!                 type:8,
!                 len:16;
!     char       *word;
!     QueryItem  *item;
! } HeadlineWord;
!
! typedef struct
! {
!     HeadlineWord *words;
!     int4        lenwords;
!     int4        curwords;
!     char       *startsel;
!     char       *stopsel;
!     int2        startsellen;
!     int2        stopsellen;
! } HeadlineText;
!
! extern void hlparsetext(Oid cfgId, HeadlineText * prs, TSQuery query,
              char *buf, int4 buflen);
! extern text *generatHeadline(HeadlineText * prs);

  /*
   * token/node types for parsing
--- 106,114 ----
   *    3 generatHeadline to generate result text
   */

! extern void hlparsetext(Oid cfgId, HeadlineParsedText * prs, TSQuery query,
              char *buf, int4 buflen);
! extern text *generatHeadline(HeadlineParsedText * prs);

  /*
   * token/node types for parsing

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

Предыдущее
От: "Heikki Linnakangas"
Дата:
Сообщение: Re: Bunch of tsearch fixes and cleanup
Следующее
От: Tom Lane
Дата:
Сообщение: Re: Bunch of tsearch fixes and cleanup