Skip to content

Commit f822be3

Browse files
committed
Refactor getWeights to write to caller-supplied buffer
This gets rid of the static result buffer. Reviewed-by: Robert Haas Discussion: https://www.postgresql.org/message-id/7f86e06a-98c5-4ce3-8ec9-3885c8de0358@iki.fi
1 parent 01e51ed commit f822be3

File tree

1 file changed

+31
-22
lines changed

1 file changed

+31
-22
lines changed

src/backend/utils/adt/tsrank.c

Lines changed: 31 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@
2121
#include "utils/array.h"
2222
#include "utils/fmgrprotos.h"
2323

24-
static const float weights[] = {0.1f, 0.2f, 0.4f, 1.0f};
24+
#define NUM_WEIGHTS 4
25+
static const float default_weights[NUM_WEIGHTS] = {0.1f, 0.2f, 0.4f, 1.0f};
2526

2627
#define wpos(wep) ( w[ WEP_GETWEIGHT(wep) ] )
2728

@@ -396,22 +397,24 @@ calc_rank(const float *w, TSVector t, TSQuery q, int32 method)
396397
return res;
397398
}
398399

399-
static const float *
400-
getWeights(ArrayType *win)
400+
/*
401+
* Extract weights from an array. The weights are stored in *ws, which must
402+
* have space for NUM_WEIGHTS elements.
403+
*/
404+
static void
405+
getWeights(ArrayType *win, float *ws)
401406
{
402-
static float ws[lengthof(weights)];
403407
int i;
404408
float4 *arrdata;
405409

406-
if (win == NULL)
407-
return weights;
410+
Assert(win != NULL);
408411

409412
if (ARR_NDIM(win) != 1)
410413
ereport(ERROR,
411414
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
412415
errmsg("array of weight must be one-dimensional")));
413416

414-
if (ArrayGetNItems(ARR_NDIM(win), ARR_DIMS(win)) < lengthof(weights))
417+
if (ArrayGetNItems(ARR_NDIM(win), ARR_DIMS(win)) < NUM_WEIGHTS)
415418
ereport(ERROR,
416419
(errcode(ERRCODE_ARRAY_SUBSCRIPT_ERROR),
417420
errmsg("array of weight is too short")));
@@ -422,16 +425,14 @@ getWeights(ArrayType *win)
422425
errmsg("array of weight must not contain nulls")));
423426

424427
arrdata = (float4 *) ARR_DATA_PTR(win);
425-
for (i = 0; i < lengthof(weights); i++)
428+
for (i = 0; i < NUM_WEIGHTS; i++)
426429
{
427-
ws[i] = (arrdata[i] >= 0) ? arrdata[i] : weights[i];
430+
ws[i] = (arrdata[i] >= 0) ? arrdata[i] : default_weights[i];
428431
if (ws[i] > 1.0)
429432
ereport(ERROR,
430433
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
431434
errmsg("weight out of range")));
432435
}
433-
434-
return ws;
435436
}
436437

437438
Datum
@@ -441,9 +442,11 @@ ts_rank_wttf(PG_FUNCTION_ARGS)
441442
TSVector txt = PG_GETARG_TSVECTOR(1);
442443
TSQuery query = PG_GETARG_TSQUERY(2);
443444
int method = PG_GETARG_INT32(3);
445+
float weights[NUM_WEIGHTS];
444446
float res;
445447

446-
res = calc_rank(getWeights(win), txt, query, method);
448+
getWeights(win, weights);
449+
res = calc_rank(weights, txt, query, method);
447450

448451
PG_FREE_IF_COPY(win, 0);
449452
PG_FREE_IF_COPY(txt, 1);
@@ -457,9 +460,11 @@ ts_rank_wtt(PG_FUNCTION_ARGS)
457460
ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
458461
TSVector txt = PG_GETARG_TSVECTOR(1);
459462
TSQuery query = PG_GETARG_TSQUERY(2);
463+
float weights[NUM_WEIGHTS];
460464
float res;
461465

462-
res = calc_rank(getWeights(win), txt, query, DEF_NORM_METHOD);
466+
getWeights(win, weights);
467+
res = calc_rank(weights, txt, query, DEF_NORM_METHOD);
463468

464469
PG_FREE_IF_COPY(win, 0);
465470
PG_FREE_IF_COPY(txt, 1);
@@ -475,7 +480,7 @@ ts_rank_ttf(PG_FUNCTION_ARGS)
475480
int method = PG_GETARG_INT32(2);
476481
float res;
477482

478-
res = calc_rank(getWeights(NULL), txt, query, method);
483+
res = calc_rank(default_weights, txt, query, method);
479484

480485
PG_FREE_IF_COPY(txt, 0);
481486
PG_FREE_IF_COPY(query, 1);
@@ -489,7 +494,7 @@ ts_rank_tt(PG_FUNCTION_ARGS)
489494
TSQuery query = PG_GETARG_TSQUERY(1);
490495
float res;
491496

492-
res = calc_rank(getWeights(NULL), txt, query, DEF_NORM_METHOD);
497+
res = calc_rank(default_weights, txt, query, DEF_NORM_METHOD);
493498

494499
PG_FREE_IF_COPY(txt, 0);
495500
PG_FREE_IF_COPY(query, 1);
@@ -855,16 +860,16 @@ calc_rank_cd(const float4 *arrdata, TSVector txt, TSQuery query, int method)
855860
doclen = 0;
856861
CoverExt ext;
857862
double Wdoc = 0.0;
858-
double invws[lengthof(weights)];
863+
double invws[NUM_WEIGHTS];
859864
double SumDist = 0.0,
860865
PrevExtPos = 0.0;
861866
int NExtent = 0;
862867
QueryRepresentation qr;
863868

864869

865-
for (i = 0; i < lengthof(weights); i++)
870+
for (i = 0; i < NUM_WEIGHTS; i++)
866871
{
867-
invws[i] = ((double) ((arrdata[i] >= 0) ? arrdata[i] : weights[i]));
872+
invws[i] = ((double) ((arrdata[i] >= 0) ? arrdata[i] : default_weights[i]));
868873
if (invws[i] > 1.0)
869874
ereport(ERROR,
870875
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
@@ -956,9 +961,11 @@ ts_rankcd_wttf(PG_FUNCTION_ARGS)
956961
TSVector txt = PG_GETARG_TSVECTOR(1);
957962
TSQuery query = PG_GETARG_TSQUERY(2);
958963
int method = PG_GETARG_INT32(3);
964+
float weights[NUM_WEIGHTS];
959965
float res;
960966

961-
res = calc_rank_cd(getWeights(win), txt, query, method);
967+
getWeights(win, weights);
968+
res = calc_rank_cd(weights, txt, query, method);
962969

963970
PG_FREE_IF_COPY(win, 0);
964971
PG_FREE_IF_COPY(txt, 1);
@@ -972,9 +979,11 @@ ts_rankcd_wtt(PG_FUNCTION_ARGS)
972979
ArrayType *win = (ArrayType *) PG_DETOAST_DATUM(PG_GETARG_DATUM(0));
973980
TSVector txt = PG_GETARG_TSVECTOR(1);
974981
TSQuery query = PG_GETARG_TSQUERY(2);
982+
float weights[NUM_WEIGHTS];
975983
float res;
976984

977-
res = calc_rank_cd(getWeights(win), txt, query, DEF_NORM_METHOD);
985+
getWeights(win, weights);
986+
res = calc_rank_cd(weights, txt, query, DEF_NORM_METHOD);
978987

979988
PG_FREE_IF_COPY(win, 0);
980989
PG_FREE_IF_COPY(txt, 1);
@@ -990,7 +999,7 @@ ts_rankcd_ttf(PG_FUNCTION_ARGS)
990999
int method = PG_GETARG_INT32(2);
9911000
float res;
9921001

993-
res = calc_rank_cd(getWeights(NULL), txt, query, method);
1002+
res = calc_rank_cd(default_weights, txt, query, method);
9941003

9951004
PG_FREE_IF_COPY(txt, 0);
9961005
PG_FREE_IF_COPY(query, 1);
@@ -1004,7 +1013,7 @@ ts_rankcd_tt(PG_FUNCTION_ARGS)
10041013
TSQuery query = PG_GETARG_TSQUERY(1);
10051014
float res;
10061015

1007-
res = calc_rank_cd(getWeights(NULL), txt, query, DEF_NORM_METHOD);
1016+
res = calc_rank_cd(default_weights, txt, query, DEF_NORM_METHOD);
10081017

10091018
PG_FREE_IF_COPY(txt, 0);
10101019
PG_FREE_IF_COPY(query, 1);

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy