commit 440902f: [Minor] Clickhouse: Allow to have explicit order of extra columns

Vsevolod Stakhov vsevolod at highsecure.ru
Thu May 21 13:35:07 UTC 2020


Author: Vsevolod Stakhov
Date: 2020-05-21 14:30:15 +0100
URL: https://github.com/rspamd/rspamd/commit/440902f91a5938f0fa711825bd54bd925ed42ca4 (HEAD -> master)

[Minor] Clickhouse: Allow to have explicit order of extra columns

---
 src/plugins/lua/clickhouse.lua | 28 +++++++++++++++++-----------
 1 file changed, 17 insertions(+), 11 deletions(-)

diff --git a/src/plugins/lua/clickhouse.lua b/src/plugins/lua/clickhouse.lua
index 06edd33b2..fb4db3fc9 100644
--- a/src/plugins/lua/clickhouse.lua
+++ b/src/plugins/lua/clickhouse.lua
@@ -1350,8 +1350,14 @@ if opts then
     if settings.extra_columns then
       -- Check sanity and create selector closures
       local lua_selectors = require "lua_selectors"
-
-      for col_name,col_data in pairs(settings.extra_columns) do
+      local columns_transformed = {}
+      local need_sort = false
+      -- Select traverse function depending on what we have
+      local iter_func = settings.extra_columns[1] and ipairs or pairs
+
+      for col_name,col_data in iter_func(settings.extra_columns) do
+        -- Array based extra columns
+        if col_data.name then col_name = col_data.name end
         if not col_data.selector or not col_data.type then
           rspamd_logger.errx(rspamd_config, 'cannot add clickhouse extra row %s: no type or no selector',
               col_name)
@@ -1368,8 +1374,6 @@ if opts then
           if not selector then
             rspamd_logger.errx(rspamd_config, 'cannot add clickhouse extra row %s: bad selector: %s',
                 col_name, col_data.selector)
-            -- Remove column
-            settings.extra_columns[col_name] = nil
           else
             if not col_data.default_value then
               if is_array then
@@ -1379,20 +1383,22 @@ if opts then
               end
             end
             col_data.real_selector = selector
+            if not col_data.name then
+              col_data.name = col_name
+              need_sort = true
+            end
+            table.insert(columns_transformed, col_data)
           end
         end
       end
 
       -- Convert extra columns from a map to an array sorted by column name to
       -- preserve strict order when doing altering
-      local extra_cols = {}
-      for col_name,col_data in pairs(settings.extra_columns) do
-        local nelt = lua_util.shallowcopy(col_data)
-        nelt.name = col_name
-        extra_cols[#extra_cols + 1] = nelt
+      if need_sort then
+        rspamd_logger.infox(rspamd_config, 'sort extra columns as they are not configured as an array')
+        table.sort(columns_transformed, function(c1, c2) return c1.name < c2.name end)
       end
-      table.sort(extra_cols, function(c1, c2) return c1.name < c2.name end)
-      settings.extra_columns = extra_cols
+      settings.extra_columns = columns_transformed
     end
 
     rspamd_config:register_symbol({


More information about the Commits mailing list