Age Owner TLA Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * dict_simple.c
4 : * Simple dictionary: just lowercase and check for stopword
5 : *
6 : * Portions Copyright (c) 1996-2023, PostgreSQL Global Development Group
7 : *
8 : *
9 : * IDENTIFICATION
10 : * src/backend/tsearch/dict_simple.c
11 : *
12 : *-------------------------------------------------------------------------
13 : */
14 : #include "postgres.h"
15 :
16 : #include "commands/defrem.h"
17 : #include "tsearch/ts_locale.h"
18 : #include "tsearch/ts_utils.h"
19 : #include "utils/builtins.h"
20 :
21 :
22 : typedef struct
23 : {
24 : StopList stoplist;
25 : bool accept;
26 : } DictSimple;
27 :
28 :
29 : Datum
5710 tgl 30 CBC 35 : dsimple_init(PG_FUNCTION_ARGS)
31 : {
5709 32 35 : List *dictoptions = (List *) PG_GETARG_POINTER(0);
5706 33 35 : DictSimple *d = (DictSimple *) palloc0(sizeof(DictSimple));
5625 34 35 : bool stoploaded = false,
35 35 : acceptloaded = false;
36 : ListCell *l;
37 :
38 35 : d->accept = true; /* default */
39 :
5709 40 35 : foreach(l, dictoptions)
41 : {
5709 tgl 42 UBC 0 : DefElem *defel = (DefElem *) lfirst(l);
43 :
1899 44 0 : if (strcmp(defel->defname, "stopwords") == 0)
45 : {
5709 46 0 : if (stoploaded)
47 0 : ereport(ERROR,
48 : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
49 : errmsg("multiple StopWords parameters")));
5706 50 0 : readstoplist(defGetString(defel), &d->stoplist, lowerstr);
5709 51 0 : stoploaded = true;
52 : }
1899 53 0 : else if (strcmp(defel->defname, "accept") == 0)
54 : {
5625 55 0 : if (acceptloaded)
56 0 : ereport(ERROR,
57 : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
58 : errmsg("multiple Accept parameters")));
59 0 : d->accept = defGetBoolean(defel);
60 0 : acceptloaded = true;
61 : }
62 : else
63 : {
5709 64 0 : ereport(ERROR,
65 : (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
66 : errmsg("unrecognized simple dictionary parameter: \"%s\"",
67 : defel->defname)));
68 : }
69 : }
70 :
5710 tgl 71 CBC 35 : PG_RETURN_POINTER(d);
72 : }
73 :
74 : Datum
75 1837 : dsimple_lexize(PG_FUNCTION_ARGS)
76 : {
5706 77 1837 : DictSimple *d = (DictSimple *) PG_GETARG_POINTER(0);
5710 78 1837 : char *in = (char *) PG_GETARG_POINTER(1);
5624 bruce 79 1837 : int32 len = PG_GETARG_INT32(2);
80 : char *txt;
81 : TSLexeme *res;
82 :
5706 tgl 83 1837 : txt = lowerstr_with_len(in, len);
84 :
5710 85 1837 : if (*txt == '\0' || searchstoplist(&(d->stoplist), txt))
86 : {
87 : /* reject as stopword */
5710 tgl 88 UBC 0 : pfree(txt);
5625 89 0 : res = palloc0(sizeof(TSLexeme) * 2);
90 0 : PG_RETURN_POINTER(res);
91 : }
5625 tgl 92 CBC 1837 : else if (d->accept)
93 : {
94 : /* accept */
95 1837 : res = palloc0(sizeof(TSLexeme) * 2);
5710 96 1837 : res[0].lexeme = txt;
5625 97 1837 : PG_RETURN_POINTER(res);
98 : }
99 : else
100 : {
101 : /* report as unrecognized */
5625 tgl 102 UBC 0 : pfree(txt);
103 0 : PG_RETURN_POINTER(NULL);
104 : }
105 : }
|