Browse Source

findall: Search for duplicates

pull/5/head
Enrico Horn 5 years ago
parent
commit
f5d6883315
  1. 1
      README.md
  2. 51
      findall.lua

1
README.md

@ -26,6 +26,7 @@ findall [:<character1> [:...]] <query> [-e<filename>|--export=<filename>] @@ -26,6 +26,7 @@ findall [:<character1> [:...]] <query> [-e<filename>|--export=<filename>]
* `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<filename>` or `--export=<filename>` 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.

51
findall.lua

@ -79,6 +79,7 @@ function error(method, message) @@ -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() @@ -258,6 +259,7 @@ function print_help()
{ ' [:<character1> [:...]]', '- the names of the characters to use for the search.' },
{ ' [!<character1> [!...]]', '- the names of the characters to exclude from the search.' },
{ ' [<query>]', '- the word you are looking for.' },
{ ' [-d|--duplicates]', '- list only items which are found in more than one container.' },
{ ' [-e<filename>|--export=<filename>]', '- exports the results to a csv file in the data folder.' },
}
local examples = {
@ -312,6 +314,7 @@ function determine_query_elements(searchparams) @@ -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) @@ -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) @@ -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) @@ -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) @@ -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 @@ -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

Loading…
Cancel
Save