]> source.dussan.org Git - rspamd.git/commitdiff
More to priorities optimization.
authorVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 27 Mar 2015 00:02:48 +0000 (00:02 +0000)
committerVsevolod Stakhov <vsevolod@highsecure.ru>
Fri, 27 Mar 2015 00:02:48 +0000 (00:02 +0000)
src/libutil/expression.c
src/libutil/expression.h
test/lua/unit/expressions.lua

index a668371ccdd68dd9b4da764c2fa15cc0da780c38..c18783d79175840dfb1569ec6a57f97f3e4254de 100644 (file)
@@ -392,13 +392,14 @@ rspamd_ast_priority_traverse (GNode *node, gpointer d)
 
                if (elt->type == ELT_LIMIT) {
                        /* Always push limit first */
-                       elt->priority = G_MAXINT;
+                       elt->priority = 0;
                }
                else {
-                       elt->priority = 0;
+                       elt->priority = RSPAMD_EXPRESSION_MAX_PRIORITY;
 
                        if (expr->subr->priority != NULL) {
-                               elt->priority = expr->subr->priority (elt->p.atom);
+                               elt->priority = RSPAMD_EXPRESSION_MAX_PRIORITY -
+                                               expr->subr->priority (elt->p.atom);
                        }
                }
        }
@@ -411,7 +412,7 @@ rspamd_ast_priority_cmp (GNode *a, GNode *b)
 {
        struct rspamd_expression_elt *ea = a->data, *eb = b->data;
 
-       return eb->priority - ea->priority;
+       return ea->priority - eb->priority;
 }
 
 static gboolean
@@ -991,6 +992,8 @@ static gboolean
 rspamd_ast_string_traverse (GNode *n, gpointer d)
 {
        GString *res = d;
+       gint cnt;
+       GNode *cur;
        struct rspamd_expression_elt *elt = n->data;
        const char *op_str = NULL;
 
@@ -1034,6 +1037,15 @@ rspamd_ast_string_traverse (GNode *n, gpointer d)
                        break;
                }
                g_string_append (res, op_str);
+
+               if (n->children) {
+                       LL_COUNT(n->children, cur, cnt);
+
+                       if (cnt > 2) {
+                               /* Print n-ary of the operator */
+                               g_string_append_printf (res, "(%d)", cnt);
+                       }
+               }
        }
 
        g_string_append_c (res, ' ');
index 8605bbbda6dcc03a65927ed33217e2608ae630c3..924dbb45b4286dbfa5cc1c9939c323b3e553f05d 100644 (file)
@@ -28,6 +28,8 @@
 #include "config.h"
 #include "mem_pool.h"
 
+#define RSPAMD_EXPRESSION_MAX_PRIORITY 1024
+
 typedef struct rspamd_expression_atom_s {
        /* Opaque userdata */
        gpointer data;
index 7bf3806b9ae587f0dca0c1b66808edd2029e548a..d6deaefd7daf071aed74b7d20c75bcdadb89c640 100644 (file)
@@ -25,22 +25,22 @@ context("Rspamd expressions", function()
     local pool = rspamd_mempool.create()
     
     local cases = {
-       {'A & B | !C', 'A B & C ! |'},
+       {'A & B | !C', 'C ! A B & |'},
        {'A & (B | !C)', 'A B C ! | &'},
        -- Unbalanced braces
        {'(((A))', nil},
        -- Balanced braces
        {'(((A)))', 'A'},
        -- Plus and comparision operators
-       {'A + B + C + D > 2', 'A B C D + + + 2 >'},
+       {'A + B + C + D > 2', '2 A B C D +(4) >'},
        -- Plus and logic operators
-       {'((A + B + C + D) > 2) & D', 'A B C D + + + 2 > D &'},
+       {'((A + B + C + D) > 2) & D', 'D 2 A B C D +(4) > &'},
        -- Associativity
-       {'A | B | C & D & E', 'A B C D E & & | |'},
+       {'A | B | C & D & E', 'A B C D E &(3) |(3)'},
        -- More associativity
-       {'1 | 0 & 0 | 0', '1 0 0 & 0 | |'},
+       {'1 | 0 & 0 | 0', '1 0 0 & 0 |(3)'},
        -- Extra space
-       {'A & B | ! C', 'A B & C ! |'},
+       {'A & B | ! C', 'C ! A B & |'},
     }
     for _,c in ipairs(cases) do
       local expr,err = rspamd_expression.create(c[1],