From f5d688331590966829bca375d1fd012ab0df2876 Mon Sep 17 00:00:00 2001 From: Enrico Horn Date: Thu, 14 May 2020 00:28:08 +0200 Subject: [PATCH] findall: Search for duplicates --- README.md | 1 + findall.lua | 51 +++++++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 80f4064..d6aaabb 100644 --- a/README.md +++ b/README.md @@ -26,6 +26,7 @@ findall [: [:...]] [-e|--export=] * `character1`: the name of the characters to use for the search. * `...`: variable list of character names. * `query` the word you are looking for. +* `-d` or `--duplicates` to list only items which are found in more than one container * `-e` or `--export=` exports the results to a csv file. The file will be created in the data folder. Looks for any item whose name (long or short) contains the specified value on the specified characters. diff --git a/findall.lua b/findall.lua index f2942d8..4cb05c3 100644 --- a/findall.lua +++ b/findall.lua @@ -79,6 +79,7 @@ function error(method, message) print('ERR(' .. method .. '): ' .. message) end + function encase_key(key) if type(key) == 'number' then return '[' .. tostring(key) .. ']' @@ -258,6 +259,7 @@ function print_help() { ' [: [:...]]', '- the names of the characters to use for the search.' }, { ' [! [!...]]', '- the names of the characters to exclude from the search.' }, { ' []', '- the word you are looking for.' }, + { ' [-d|--duplicates]', '- list only items which are found in more than one container.' }, { ' [-e|--export=]', '- exports the results to a csv file in the data folder.' }, } local examples = { @@ -312,6 +314,7 @@ function determine_query_elements(searchparams) local char_exclude = {} local search_terms = {} local export = nil + local duplicates = false for _, query_element in pairs(searchparams) do -- character specifiers must start with a '!' or a ':' @@ -336,12 +339,14 @@ function determine_query_elements(searchparams) error('determine_query_elements', 'The filename cannot contain any of the following characters: \\ / : * ? " < > |') end end + elseif string.match(query_element, '^--duplicates$') or string.match(query_element, '^-d$') then + duplicates = true else table.insert(search_terms, query_element) end end - return char_include, char_exclude, table.concat(search_terms,' '), export + return char_include, char_exclude, table.concat(search_terms,' '), export, duplicates end @@ -389,7 +394,34 @@ function search(char_include, char_exclude, terms) end -function display_search_results(result, from_all_chars, terms) +function filter_duplicates(search_result) + for char_name, storage_list in pairs(search_result) do + storage_list[KEY_ITEM_STORAGE_NAME] = nil + end + + local counts_by_itemid = {} + for char_name, storage_list in pairs(search_result) do + for storage_name, item_list in pairs(storage_list) do + for item_id, quantity in pairs(item_list) do + counts_by_itemid[item_id] = (counts_by_itemid[item_id] or 0) + 1 + end + end + end + + for char_name, storage_list in pairs(search_result) do + for storage_name, item_list in pairs(storage_list) do + for item_id, quantity in pairs(item_list) do + if counts_by_itemid[item_id] == 1 then + item_list[item_id] = nil + end + end + end + end + return search_result +end + + +function display_search_results(result, from_all_chars, terms, duplicates) local terms_pattern = build_search_pattern(terms) local total_quantity = 0 @@ -403,7 +435,7 @@ function display_search_results(result, from_all_chars, terms) total_quantity = total_quantity + quantity end - local prefix = '\30\03' .. char_name .. '/' .. storage_name .. ':\30\01 ' + local prefix = '\30\03' .. char_name .. '/' .. storage_name .. '\30\01' local suffix = (quantity > 1 and ' \30\03' .. '(' .. quantity .. ')\30\01' or '') local item_name @@ -417,7 +449,11 @@ function display_search_results(result, from_all_chars, terms) else item_name = names.name end - table.insert(results, prefix .. item_name .. suffix) + if duplicates then + table.insert(results, item_name .. ': ' .. prefix .. suffix) + else + table.insert(results, prefix .. '\30\03: \30\01' .. item_name .. suffix) + end end end end @@ -472,10 +508,13 @@ end function handle_command(args) - local char_include, char_exclude, terms, export = determine_query_elements(args) + local char_include, char_exclude, terms, export, duplicates = determine_query_elements(args) local result = search(char_include, char_exclude, terms) + if duplicates then + result = filter_duplicates(result) + end local all_chars = #char_include == 0 and #char_exclude == 0 - display_search_results(result, all_chars, terms) + display_search_results(result, all_chars, terms, duplicates) if export ~=nil then export_to_file(result, export) end