Add an "absval" parameter to allow contrib/dict_int to ignore signs.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Mar 2020 22:35:06 +0000 (18:35 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 8 Mar 2020 22:35:06 +0000 (18:35 -0400)
Jeff Janes

Discussion: https://postgr.es/m/CAMkU=1xRcs_BUPzR0+V3WndaCAv0E_m3h6aUEJ8NF-sY1nnHsw@mail.gmail.com

contrib/dict_int/dict_int.c
contrib/dict_int/expected/dict_int.out
contrib/dict_int/sql/dict_int.sql
doc/src/sgml/dict-int.sgml

index 56cb28312cf03830e60c34fd228b61c4715127ec..a7e9890fcc4f89df61f000df6eba7be371ee210b 100644 (file)
@@ -21,6 +21,7 @@ typedef struct
 {
    int         maxlen;
    bool        rejectlong;
+   bool        absval;
 } DictInt;
 
 
@@ -37,6 +38,7 @@ dintdict_init(PG_FUNCTION_ARGS)
    d = (DictInt *) palloc0(sizeof(DictInt));
    d->maxlen = 6;
    d->rejectlong = false;
+   d->absval = false;
 
    foreach(l, dictoptions)
    {
@@ -55,6 +57,10 @@ dintdict_init(PG_FUNCTION_ARGS)
        {
            d->rejectlong = defGetBoolean(defel);
        }
+       else if (strcmp(defel->defname, "absval") == 0)
+       {
+           d->absval = defGetBoolean(defel);
+       }
        else
        {
            ereport(ERROR,
@@ -72,11 +78,21 @@ dintdict_lexize(PG_FUNCTION_ARGS)
 {
    DictInt    *d = (DictInt *) PG_GETARG_POINTER(0);
    char       *in = (char *) PG_GETARG_POINTER(1);
-   char       *txt = pnstrdup(in, PG_GETARG_INT32(2));
+   int         len = PG_GETARG_INT32(2);
+   char       *txt;
    TSLexeme   *res = palloc0(sizeof(TSLexeme) * 2);
 
    res[1].lexeme = NULL;
-   if (PG_GETARG_INT32(2) > d->maxlen)
+
+   if (d->absval && (in[0] == '+' || in[0] == '-'))
+   {
+       len--;
+       txt = pnstrdup(in + 1, len);
+   }
+   else
+       txt = pnstrdup(in, len);
+
+   if (len > d->maxlen)
    {
        if (d->rejectlong)
        {
index 483e700d23153826260941955409c00c4961f22e..702f7afbca1ec92cbca2048976c9660880e4809e 100644 (file)
@@ -302,3 +302,28 @@ select ts_lexize('intdict', '314532610153');
 
 ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = -214783648);
 ERROR:  maxlen value has to be >= 1
+select ts_lexize('intdict', '-40865854');
+ ts_lexize 
+-----------
+ {-40865}
+(1 row)
+
+select ts_lexize('intdict', '+40865854');
+ ts_lexize 
+-----------
+ {+40865}
+(1 row)
+
+ALTER TEXT SEARCH DICTIONARY intdict (ABSVAL = true);
+select ts_lexize('intdict', '-40865854');
+ ts_lexize 
+-----------
+ {408658}
+(1 row)
+
+select ts_lexize('intdict', '+40865854');
+ ts_lexize 
+-----------
+ {408658}
+(1 row)
+
index 5c27accff4a4ab9fb034c1f08d7db9c8c8b9362b..8f702aa10b00953c142b949de6da88af9f158f90 100644 (file)
@@ -53,3 +53,9 @@ select ts_lexize('intdict', '641439323669');
 select ts_lexize('intdict', '314532610153');
 
 ALTER TEXT SEARCH DICTIONARY intdict (MAXLEN = -214783648);
+
+select ts_lexize('intdict', '-40865854');
+select ts_lexize('intdict', '+40865854');
+ALTER TEXT SEARCH DICTIONARY intdict (ABSVAL = true);
+select ts_lexize('intdict', '-40865854');
+select ts_lexize('intdict', '+40865854');
index b556f1b4daf37b1adfa91405ed01aa3ad940c6c5..8babfdd5c245c2b7324aa60411da3676be80f3d6 100644 (file)
@@ -25,7 +25,7 @@
   <title>Configuration</title>
 
   <para>
-   The dictionary accepts two options:
+   The dictionary accepts three options:
   </para>
 
   <itemizedlist>
      such an integer cannot be searched for.
     </para>
    </listitem>
+   <listitem>
+    <para>
+     The <literal>absval</literal> parameter specifies whether leading
+     <quote><literal>+</literal></quote> or <quote><literal>-</literal></quote>
+     signs should be removed from integer words.  The default
+     is <literal>false</literal>.  When <literal>true</literal>, the sign is
+     removed before <literal>maxlen</literal> is applied.
+    </para>
+   </listitem>
   </itemizedlist>
  </sect2>