Skip to content

Instantly share code, notes, and snippets.

@rrichardson
Last active January 3, 2016 20:29
Show Gist options
  • Save rrichardson/8515407 to your computer and use it in GitHub Desktop.
Save rrichardson/8515407 to your computer and use it in GitHub Desktop.
A slight shortcut for importing hierarchical data into datomic
(def org1
[:db/id (tmp)
:organization/name "Org 1"
:organization/league
[:db/id (tmp)
:league/name "ligue 1"
:league/field
[:db/id (tmp)
:field/name "The field of dreams"
:field/address "123 4th avenue, France"]
:league/team
[:db/id (tmp)
:team/name "PSG"
:team/player [ :db/id (tmp) :player/name "Manuel Noriega"]
:team/player [ :db/id (tmp) :player/name "JoeRod Blumpkin"]
:team/player [ :db/id (tmp) :player/name "Mleurg Borgins"]
]
:league/team
[:db/id (tmp)
:team/name "Redonk"
:team/player [ :db/id (tmp) :player/name "Gabby Hey"]
:team/player [ :db/id (tmp) :player/name "Wha Dap"]
:team/player [ :db/id (tmp) :player/name "Moiny Moiny"]
]
]
:organization/league
[:db/id (tmp)
:league/name "La Liga Dos"
:league/field [:db/id (tmp)
:field/name "The Kingdome Real"
:field/address "1414 Seattle Rd, Spain"]
:league/team [:db/id (tmp)
:team/name "Besteam"
:team/player [:db/id (tmp) :player/name "Bronk McCropilis"]
:team/player [:db/id (tmp) :player/name "Magvin VinGamibottom"]
:team/player [:db/id (tmp) :player/name "Gorbaleyev Gobgobgobanov"]
]
]
]
)
(defn elist' [tree]
(let [tr (partition 2 tree)
id (apply hash-map (first tr))
trav (fn [item]
(if (not (vector? (second item)))
(conj id (apply hash-map item))
(let [nxtfield (first item)
nxtid (second (second item))
hdr (assoc id nxtfield nxtid)]
(conj (elist' (second item)) hdr))))]
(map trav (next tr))))
(defn elist [tree] (flatten (elist' tree)))
> (elist org1)
;results in
({:organization/name "Org 1", :db/id #db/id[:db.part/user -1000000]}
{:organization/league #db/id[:db.part/user -1000001], :db/id #db/id[:db.part/user -1000000]}
{:league/name "ligue 1", :db/id #db/id[:db.part/user -1000001]}
{:league/field #db/id[:db.part/user -1000002], :db/id #db/id[:db.part/user -1000001]}
{:field/name "The field of dreams", :db/id #db/id[:db.part/user -1000002]}
{:field/address "123 4th avenue, France", :db/id #db/id[:db.part/user -1000002]}
{:league/team #db/id[:db.part/user -1000003], :db/id #db/id[:db.part/user -1000001]}
{:team/name "PSG", :db/id #db/id[:db.part/user -1000003]}
{:team/player #db/id[:db.part/user -1000004], :db/id #db/id[:db.part/user -1000003]}
{:player/name "Manuel Noriega", :db/id #db/id[:db.part/user -1000004]}
{:team/player #db/id[:db.part/user -1000005], :db/id #db/id[:db.part/user -1000003]}
{:player/name "JoeRod Blumpkin", :db/id #db/id[:db.part/user -1000005]}
{:team/player #db/id[:db.part/user -1000006], :db/id #db/id[:db.part/user -1000003]}
{:player/name "Mleurg Borgins", :db/id #db/id[:db.part/user -1000006]}
{:league/team #db/id[:db.part/user -1000007], :db/id #db/id[:db.part/user -1000001]}
{:team/name "Redonk", :db/id #db/id[:db.part/user -1000007]}
{:team/player #db/id[:db.part/user -1000008], :db/id #db/id[:db.part/user -1000007]}
{:player/name "Gabby Hey", :db/id #db/id[:db.part/user -1000008]}
{:team/player #db/id[:db.part/user -1000009], :db/id #db/id[:db.part/user -1000007]}
{:player/name "Wha Dap", :db/id #db/id[:db.part/user -1000009]}
{:team/player #db/id[:db.part/user -1000010], :db/id #db/id[:db.part/user -1000007]}
{:player/name "Moiny Moiny", :db/id #db/id[:db.part/user -1000010]})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment