let n:TreeNode = {node-for "Index"}
{for c in customers do
let nc:TreeNode = {node-for c}
{n.append nc}
{for s in status-codes do
let ns:TreeNode = {node-for s}
{nc.append ns}
let records:{Array-of Record} =
{orders.select filter =
{RecordData
CustomerName = c,
StatusCode = s}}
{for r in records do
let no:TreeNode = {node-for r["OrderID"]}
{ns.append no}
}
}
}
let n:TreeNode =
{order-tree-by-status
orders, customers, status-codes,
order-key = "OrderID",
customer-key = "CustomerName",
status-key = "StatusCode",
root-label = "Index"}
{define-proc public {order-tree-by-status
rs:RecordSet,
customers:StringArray,
status-codes:StringArray,
customer-key:String = "CustomerName",
order-key:String = "OrderID",
status-key:String = "StatusCode",
root-label:String = "Index"
}:TreeNode
{define-proc public {simple-category-tree
rs:RecordSet,
primary-vals:StringArray,
secondary-vals:StringArray,
key:String = "OrderID",
primary-key:String = "CustomerName",
secondary-key:String = "StatusCode",
root-label:String = "Index"
}:TreeNode
… and then, to arbitrary depth …
{define-proc {category-tree
rs:RecordSet,
category-keys:StringArray,
root-label:String = "Index"
}:TreeNode
… yielding an even more concise, declarative form.
{category-tree orders,
root-label = "Orders",
{StringArray
"OrderStatus",
"CustomerName",
"OrderDate",
"OrderID"}}
{define-proc {category-tree
rs:RecordSet,
categories:StringArray,
root-label:String = "Index"
}:TreeNode
let root:TreeNode = {TreeNode node-data = root-label}
|| index of created nodes
let nodes:{HashTable-of String, TreeNode} =
{{HashTable-of String, TreeNode}}
|| process records
{for r in rs do
|| current node, and key
let p:TreeNode = root
let k:String = ""
|| process categories
{for category in categories do
|| data for category
let v:any = r[category]
|| concatenate data for unique key
set k = {format "%s`%s", k, v}
|| check if subnode already exists
let (n:TreeNode, n?:bool) = {nodes.get-if-exists k}
|| descend to subnode
set p =
{if n? then n
else
|| new subnode: create, attach, index
let n:TreeNode = {TreeNode node-data = v}
{p.append n}
set nodes[k] = n
n}
}}
{return n}
}
There are no comments on this document