Last active
January 3, 2016 20:29
-
-
Save rrichardson/8515407 to your computer and use it in GitHub Desktop.
A slight shortcut for importing hierarchical data into datomic
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
(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