aboutsummaryrefslogtreecommitdiff
path: root/src/backend/utils/adt/tsrank.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/utils/adt/tsrank.c')
-rw-r--r--src/backend/utils/adt/tsrank.c68
1 files changed, 35 insertions, 33 deletions
diff --git a/src/backend/utils/adt/tsrank.c b/src/backend/utils/adt/tsrank.c
index 535a3541bf7..453b67df431 100644
--- a/src/backend/utils/adt/tsrank.c
+++ b/src/backend/utils/adt/tsrank.c
@@ -7,7 +7,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/utils/adt/tsrank.c,v 1.4 2007/09/07 16:03:40 teodor Exp $
+ * $PostgreSQL: pgsql/src/backend/utils/adt/tsrank.c,v 1.5 2007/09/11 08:46:29 teodor Exp $
*
*-------------------------------------------------------------------------
*/
@@ -53,22 +53,24 @@ cnt_length(TSVector t)
{
WordEntry *ptr = ARRPTR(t),
*end = (WordEntry *) STRPTR(t);
- int len = 0,
- clen;
+ int len = 0;
while (ptr < end)
{
- if ((clen = POSDATALEN(t, ptr)) == 0)
+ int clen = POSDATALEN(t, ptr);
+
+ if (clen == 0)
len += 1;
else
len += clen;
+
ptr++;
}
return len;
}
-static int4
+static int
WordECompareQueryItem(char *eval, char *qval, WordEntry *ptr, QueryOperand *item)
{
if (ptr->len == item->length)
@@ -80,6 +82,10 @@ WordECompareQueryItem(char *eval, char *qval, WordEntry *ptr, QueryOperand *item
return (ptr->len > item->length) ? 1 : -1;
}
+/*
+ * Returns a pointer to a WordEntry corresponding 'item' from tsvector 't'. 'q'
+ * is the TSQuery containing 'item'. Returns NULL if not found.
+ */
static WordEntry *
find_wordentry(TSVector t, TSQuery q, QueryOperand *item)
{
@@ -178,15 +184,15 @@ SortAndUniqItems(TSQuery q, int *size)
}
/* A dummy WordEntryPos array to use when haspos is false */
-static WordEntryPos POSNULL[] = {
+static WordEntryPosVector POSNULL = {
1, /* Number of elements that follow */
- 0
+ { 0 }
};
static float
calc_rank_and(float *w, TSVector t, TSQuery q)
{
- uint16 **pos;
+ WordEntryPosVector **pos;
int i,
k,
l,
@@ -207,9 +213,8 @@ calc_rank_and(float *w, TSVector t, TSQuery q)
pfree(item);
return calc_rank_or(w, t, q);
}
- pos = (uint16 **) palloc(sizeof(uint16 *) * q->size);
- memset(pos, 0, sizeof(uint16 *) * q->size);
- WEP_SETPOS(POSNULL[1], MAXENTRYPOS - 1);
+ pos = (WordEntryPosVector **) palloc0(sizeof(WordEntryPosVector *) * q->size);
+ WEP_SETPOS(POSNULL.pos[0], MAXENTRYPOS - 1);
for (i = 0; i < size; i++)
{
@@ -218,25 +223,25 @@ calc_rank_and(float *w, TSVector t, TSQuery q)
continue;
if (entry->haspos)
- pos[i] = (uint16 *) _POSDATAPTR(t, entry);
+ pos[i] = _POSVECPTR(t, entry);
else
- pos[i] = (uint16 *) POSNULL;
+ pos[i] = &POSNULL;
- dimt = *(uint16 *) (pos[i]);
- post = (WordEntryPos *) (pos[i] + 1);
+ dimt = pos[i]->npos;
+ post = pos[i]->pos;
for (k = 0; k < i; k++)
{
if (!pos[k])
continue;
- lenct = *(uint16 *) (pos[k]);
- ct = (WordEntryPos *) (pos[k] + 1);
+ lenct = pos[k]->npos;
+ ct = pos[k]->pos;
for (l = 0; l < dimt; l++)
{
for (p = 0; p < lenct; p++)
{
dist = Abs((int) WEP_GETPOS(post[l]) - (int) WEP_GETPOS(ct[p]));
- if (dist || (dist == 0 && (pos[i] == (uint16 *) POSNULL || pos[k] == (uint16 *) POSNULL)))
+ if (dist || (dist == 0 && (pos[i] == &POSNULL || pos[k] == &POSNULL)))
{
float curw;
@@ -285,8 +290,8 @@ calc_rank_or(float *w, TSVector t, TSQuery q)
}
else
{
- dimt = *(uint16 *) POSNULL;
- post = POSNULL + 1;
+ dimt = POSNULL.npos;
+ post = POSNULL.pos;
}
resj = 0.0;
@@ -456,17 +461,19 @@ typedef struct
{
QueryItem **item;
int16 nitem;
- bool needfree;
uint8 wclass;
int32 pos;
} DocRepresentation;
static int
-compareDocR(const void *a, const void *b)
+compareDocR(const void *va, const void *vb)
{
- if (((DocRepresentation *) a)->pos == ((DocRepresentation *) b)->pos)
+ DocRepresentation *a = (DocRepresentation *) va;
+ DocRepresentation *b = (DocRepresentation *) vb;
+
+ if (a->pos == b->pos)
return 0;
- return (((DocRepresentation *) a)->pos > ((DocRepresentation *) b)->pos) ? 1 : -1;
+ return (a->pos > b->pos) ? 1 : -1;
}
static bool
@@ -547,11 +554,11 @@ Cover(DocRepresentation *doc, int len, TSQuery query, Extention *ext)
ptr = doc + lastpos;
- /* find lower bound of cover from founded upper bound, move down */
+ /* find lower bound of cover from found upper bound, move down */
while (ptr >= doc + ext->pos)
{
for (i = 0; i < ptr->nitem; i++)
- if(ptr->item[i]->type == QI_VAL) /* XXX */
+ if(ptr->item[i]->type == QI_VAL)
ptr->item[i]->operand.istrue = 1;
if (TS_execute(GETQUERY(query), NULL, true, checkcondition_QueryOperand))
{
@@ -620,8 +627,8 @@ get_docrep(TSVector txt, TSQuery query, int *doclen)
}
else
{
- dimt = *(uint16 *) POSNULL;
- post = POSNULL + 1;
+ dimt = POSNULL.npos;
+ post = POSNULL.pos;
}
while (cur + dimt >= len)
@@ -636,7 +643,6 @@ get_docrep(TSVector txt, TSQuery query, int *doclen)
{
int k;
- doc[cur].needfree = false;
doc[cur].nitem = 0;
doc[cur].item = (QueryItem **) palloc(sizeof(QueryItem *) * query->size);
@@ -658,7 +664,6 @@ get_docrep(TSVector txt, TSQuery query, int *doclen)
}
else
{
- doc[cur].needfree = false;
doc[cur].nitem = doc[cur - 1].nitem;
doc[cur].item = doc[cur - 1].item;
}
@@ -764,9 +769,6 @@ calc_rank_cd(float4 *arrdata, TSVector txt, TSQuery query, int method)
if ((method & RANK_NORM_LOGUNIQ) && txt->size > 0)
Wdoc /= log((double) (txt->size + 1)) / log(2.0);
- for (i = 0; i < doclen; i++)
- if (doc[i].needfree)
- pfree(doc[i].item);
pfree(doc);
return (float4) Wdoc;