(def dbSample {
:person [{:person/id 1 :name "dan" :surname "stone" :joindate "01.06.2022" :experience :experience/starter :loyalitylevel :loyality-level/zero-one-years :worktime :worktime/internship :managers {:manager/id 1}}
{:person/id 2 :name "dave" :surname "jhons" :joindate "04.04.2021" :experience :experience/medior :loyalitylevel :loyality-level/one-two-years :worktime :worktime/full-time :managers {:manager/id 1}}
{:person/id 3 :name "patrick" :surname "square pant" :joindate "09.01.2022" :experience :experience/senior :loyalitylevel :loyality-level/zero-one-years :worktime :worktime/part-time :managers {:manager/id 1}}
{:person/id 9 :name "rich" :surname "hickey" :joindate "04.04.2016" :experience :experience/lead :loyalitylevel :loyality-level/more-than-seven-years :worktime :worktime/part-time}
]
:employees/developerteam [{:frontend [[:person/id 1] [:person/id 2] [:person/id 3]]
}]
:employees/managers [{
:manager/id 1 :manager/person [:person/id 9]
}
]
:relations/experience {:experience/starter "0-1"
:experience/medior "1-3"
:experience/senior "3-6"
:experience/lead "6+"
}
:relations/loyalitylevel {:loyality-level/zero-one-years "0-1 year(s)"
:loyality-level/one-two-years "1-2 year(s)"
:loyality-level/three-five-years "3-5 year(s)"
:loyality-level/five-seven-years "5-7 year(s)"
:loyality-level/more-than-seven-years "7+ year(s)"}
:relations/worktime {:worktime/full-time "full time"
:worktime/part-time "part time"
:worktime/internship "internship"}}
)
Hello everyone, I started to learn Clojure and to try to do some exercises to understand it better. How can I find the frontend team member's manager's name? I getting their ":person/id" with that function that you can see at the bottom. Now I wondering how can I reach their manager's names.
I just created a sample data (it is little bit more complex but I cut off extra complexity) to learn how to get data and travel inside data. I want to give input to my second function's output and I want to see who are these person managers. I don't know if it is easy or possible.
(defn getFrontendDeveloperTeamMembersIds [] :docstring "get frontend developer team members references"
(->> dbSample
(:employees/developerteam)
(first)
(:frontend)
)
)
(getFrontendDeveloperTeamMembersIds)
;=> [[:person/id 1] [:person/id 2] [:person/id 3]]
I created some function to help my need, they are almost working by I am not sure that they are best practices or not. Moreover still I giving :person/id manually.
(defn getPersonById [id] :docstring "get person by :person/id value"
(->> dbSample
(:person)
(filter #(= (:person/id %1) id))))
(defn getManagerPersonIdByManagerId [id] :docstring "get a manager name my given manager id"
(->> dbSample
(:employees/managers)
(filter #(= (:manager/id %) id))
(first)
(:manager/person)
(second)
))
(defn getPersonNameById [id]
(->> dbSample
(:person)
(filter #(= (:person/id %1) id))
(first)
(:name)
)
)
(defn getPersonManagerNameByPersonId [id] :docstring "get a person's manager name by given person id"
(->> id
(getPersonById)
(first)
(:managers)
(:manager/id)
(getManagerPersonIdByManagerId)
(getPersonNameById)
)
)
(getPersonManagerNameByPersonId 1)
;=> "rich"
There are many ways to do this but you asked for guidance on best practices so here are a couple (but I make some assumptions)
Assumption 1: the person/id uniquely identifies a person. Probably right since you use
first
. So rather than a list use a dict for person.Similarly, managers and teams can be the dict you show without using a vector.
so data like:
Now you can query much more of the data with simple
get-in
, e.g. :Also note the position of the docstring and preference for
kebab-case
overcamelCase
. Databases change so the db should be passed into the queries to be pure functions.