How Can I Optimize Recursive List Search?
Any ideas on how I might further optimize this recursive script?
TIA.
This is a test script that is the same as my production script I’m writing for Evernote Mac, except for the acquisition of the source list data.
The purpose is to build a list of Evernote Tags, starting with the top-level parent tag, and then drill down into each child tag, then using it as the Parent Tag, get all of its children.
EDIT: 2018-07-12 14:41 GMT-5
Please see my Revised Script below for a simpler, more clear example.
–
Each EN Tag has this structure:
- name
- parent
- name
So, I’m looking at a hierarchical tag list like this:
(with some tags cut out for brevity)
In the below script, I have hard-coded the source lists to search to make it easy for you guys to test. You don’t need Evernote.
Recursive Script to Build Child Tag List
property ptyScriptName : "Get List of Child Tags for a Parent Tag"
property ptyScriptVer : "2.0"
property ptyScriptDate : "2018-07-11"
property ptyScriptAuthor : "JMichaelTX"
property tagNameList : {}
property parNameList : {}
set parTagName to "HOME"
### Normally Get Lists from Evernote Mac ###
-- runs very fast, only 0.24 sec for 1500 tags
(*
set tagNameList to name of every tag
set parNameList to name of parent of every tag
*)
### FOR TESTING ###
set {tagNameList, parNameList} to {{"Home.Kitchen", "Home.Refrigerator", "Home.Crystal", "Home.Cooking", "Home.Tool", "TOOLS", "Tool.Craftsman", "Tool.PowerTool", "Tool.Router", "Tool.Vacuum", "Tool.HandTool", "Tool.Saw", "Tool.TableSaw", "Home.Cleaning", "HomeDepot", "Home.Electrical", "Home.Landscaping", "Home.Improvement", "Home Note", "Home.Knives", "Home.Maint", "Home.DisasterPlan", "Home.Furniture", "Home.Outdoor", "Home.Repair", "Home.Dining", "UTILITIES", "UTIL.Mobile_Phone", "UTIL.NatGas", "UTIL.Phone", "UTIL.Sat_TV", "UTIL.Electric", "UTIL.Water", "UTIL.Internet_Service", "Home.Appliance"}, {"HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "TOOLS", "TOOLS", "TOOLS", "TOOLS", "TOOLS", "TOOLS", "TOOLS", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "HOME", "UTILITIES", "UTILITIES", "UTILITIES", "UTILITIES", "UTILITIES", "UTILITIES", "UTILITIES", "HOME"}}
set childTagList to {}
my getChildTags(parTagName, childTagList)
return childTagList
### Can This be Optimized? Takes ~7 sec in Real World ###
on getChildTags(pParTagName, pChildTagList)
repeat with iTag from 1 to (count of tagNameList)
set tagName to item iTag of tagNameList
set parName to item iTag of parNameList
if (parName = pParTagName) then
set end of pChildTagList to tagName
my getChildTags(tagName, pChildTagList)
end if
end repeat
end getChildTags
Results
{"Home.Kitchen", "Home.Refrigerator", "Home.Crystal", "Home.Cooking", "Home.Tool",
"TOOLS", "Tool.Craftsman", "Tool.PowerTool", "Tool.Router", "Tool.Vacuum",
"Tool.HandTool", "Tool.Saw", "Tool.TableSaw", "Home.Cleaning", "HomeDepot",
"Home.Electrical", "Home.Landscaping", "Home.Improvement", "Home Note",
"Home.Knives", "Home.Maint", "Home.DisasterPlan", "Home.Furniture", "Home.Outdoor",
"Home.Repair", "Home.Dining", "UTILITIES", "UTIL.Mobile_Phone", "UTIL.NatGas",
"UTIL.Phone", "UTIL.Sat_TV", "UTIL.Electric", "UTIL.Water", "UTIL.Internet_Service",
"Home.Appliance"}