I am trying to implement, through Gun, a tree structure that allows to express relationships between companies, subsidiaries of these companies and their products. The structure that I have done is as follows:
- there is a root node: this is the main seller of some product (for example, sensors) and all its children (depth nodes 1) are its customers;
- there are children nodes, not leaves, from level depth 1 on: these are the customers of the root knot; they can have different branches; there can be sub-sub-sub-branches of a branch and so on, there are no limits to the number of sub-subbranches;
- there are leaf knots: these are the products contained in a branch, a sub-branch, a sub-sub-branch...
Here's how I thought of this:
- create a
client
set; - put clients nodes inside
client
set; - create a
branch
set; - put branches nodes inside
branch
set; - link
branches
set toclient
set; - create a
sensor
set; - put sensors nodes inside
sensor
set; - link
sensors
set tobranches
set.
Somethink like this:
[clients]
/\
/ \
(MecDoland) (FrankMirros)
| |
[branches] [branches]
/ | \ |
(NY) (CA) (DA) ...
| | |
| [sensors]...
| |
| ...
[sensors]
/|\
......
Here's my implementation
const Gun = require('gun')
const gun = new Gun()
// Just a util function
function printError(ack) {
if (ack.err) {
console.log(ack.err)
}
}
// [clients]
const clients = gun.get('clients') // group
// (MecDoland)
const mac = clients.get('MecDoland').put({ data: 12 })
// (FrankMirros)
const pm = clients.get('FrankMirros').put({ data: 13 })
console.log('Adding to "clients" set MecDoland...')
// [clients] -> (MecDoland)
clients.set(mac, printError)
console.log('Adding to "clients" set philip morris...')
// [clients] -> (FrankMirros)
clients.set(pm, printError)
// [branches]
const branches = gun.get('branches') // group
// (MecDolandNY)
const macny = gun.get('MacDonaldNY').put({ data: 1 }, printError)
// (MecDolandCA)
const macca = gun.get('MecDolandCA').put({ data: 2 }, printError)
// [branches] -> (MecDolandNY)
branches.set(macny, printError)
// [branches] -> (MecDolandCA)
branches.set(macca, printError)
// [MecDoland] -> [branches]
mac.set(branches, printError)
//clients.map().once(v => console.log('CLIENT:',v))
//branches.map().once(v => console.log('BRANCH:',v._))
const sensors = gun.get('sensorsMecDolandNY') // group
const temp = gun.get('temperatue').put({ measure: 'celsius', value: 37 })
const press = gun.get('pressure').put({ measure: 'Bar', value: 2 })
sensors.set(temp)
sensors.set(press)
macny.set(sensors)
// Show all clients
gun
.get('clients')
.map()
.once(v => console.log(v))
There are two points that I haven't been able to clarify:
1 - I don't know if I am using Gun sets well: I tried to add some relationships but didn't work out; consider the following instructions:
macDoland.get('client').put(rootNode)
frankMirrors.get('client').put(rootNode)
I tried to put a client
relationship for both customer nodes, but printing rootNode
showed me that rootNode
had client
relationship only with frankMirrors
node! The first relationship with macDoland
node disappeared so I started using Gun sets.
My code works (more or less) but I don't know if I am using Gun set properly and if this is the right way to do it, given the kind of relationship I want to build between main vendors, customers, customers' branches and sensors in each branch.
2 - I'd like to make this approach more generic and scalable: for now there are clients, branches and sensors; this may change in future and the number of levels between clients and sensors may increase.
This means that there may be an arbitrary number of levels between client nodes (depth 1) and sensors (max depth): for example, a very small client may be without branches and thus its client node smallCompany
would directly be linked to its sensors
; for another example, a gigantic client may have (say) five level of depths and I don't want to hard-code Gun set names such as macDolandNySubSubSubSubBranch
.
How could I provide scalability for an arbitrary number of sub-branches?