Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf822be3

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

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-
staticconstfloatweights[]= {0.1f,0.2f,0.4f,1.0f};
24+
#defineNUM_WEIGHTS 4
25+
staticconstfloatdefault_weights[NUM_WEIGHTS]= {0.1f,0.2f,0.4f,1.0f};
2526

2627
#definewpos(wep)( w[ WEP_GETWEIGHT(wep) ] )
2728

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

399-
staticconstfloat*
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+
staticvoid
405+
getWeights(ArrayType*win,float*ws)
401406
{
402-
staticfloatws[lengthof(weights)];
403407
inti;
404408
float4*arrdata;
405409

406-
if (win==NULL)
407-
returnweights;
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-
returnws;
435436
}
436437

437438
Datum
@@ -441,9 +442,11 @@ ts_rank_wttf(PG_FUNCTION_ARGS)
441442
TSVectortxt=PG_GETARG_TSVECTOR(1);
442443
TSQueryquery=PG_GETARG_TSQUERY(2);
443444
intmethod=PG_GETARG_INT32(3);
445+
floatweights[NUM_WEIGHTS];
444446
floatres;
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
TSVectortxt=PG_GETARG_TSVECTOR(1);
459462
TSQueryquery=PG_GETARG_TSQUERY(2);
463+
floatweights[NUM_WEIGHTS];
460464
floatres;
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
intmethod=PG_GETARG_INT32(2);
476481
floatres;
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
TSQueryquery=PG_GETARG_TSQUERY(1);
490495
floatres;
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
CoverExtext;
857862
doubleWdoc=0.0;
858-
doubleinvws[lengthof(weights)];
863+
doubleinvws[NUM_WEIGHTS];
859864
doubleSumDist=0.0,
860865
PrevExtPos=0.0;
861866
intNExtent=0;
862867
QueryRepresentationqr;
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
TSVectortxt=PG_GETARG_TSVECTOR(1);
957962
TSQueryquery=PG_GETARG_TSQUERY(2);
958963
intmethod=PG_GETARG_INT32(3);
964+
floatweights[NUM_WEIGHTS];
959965
floatres;
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
TSVectortxt=PG_GETARG_TSVECTOR(1);
974981
TSQueryquery=PG_GETARG_TSQUERY(2);
982+
floatweights[NUM_WEIGHTS];
975983
floatres;
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
intmethod=PG_GETARG_INT32(2);
9911000
floatres;
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
TSQueryquery=PG_GETARG_TSQUERY(1);
10051014
floatres;
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)

[8]ページ先頭

©2009-2025 Movatter.jp