Oops, one more.

There was also a Users table (Id, Username, ...)

I didn't see a way to handle join from Races to Users based on SupervisorId 
and AnalystId.  


On Monday, 29 February 2016 15:52:48 UTC+11, Oliver George wrote:
>
> Thanks for the details.
>
> I did a little experimenting and it works as advertised.  Notes below show 
> what I did and found.
>
> I was interested to see if this might be suitable as a simple om.next 
> remote for a relational database.  Potentially fanciful but it's a topic of 
> interest for me at the moment.
>
> I used an existing database so I had a semi interesting dataset to play 
> with.  
>
> Races (Id, RaceNumber, RaceTime, MeetingId, SupervisorId, AnalystId...)
> Meetings (Id, MeetingDate, MeetingTypeId, VenueId, JurisdictionId, ...)
> Venues (Id, Name)
> Jurisdiction (Id, Name, Code)
>
>
> The table and foreign key naming conventions didn't match so I created 
> views for each table.  If that was configurable then you'd open yourself to 
> a wider audience.  (e.g. MeetingId vs meetings_id)
>
> It was easy to setup some associations
>
> (def associations
>   {:meeting {:race         :has-many
>              :jurisdiction :belongs-to
>              :venue        :belongs-to}
>    :race    {:meeting      :belongs-to
>              :jurisdiction [:through :meeting :belongs-to]}
>    :venue   {}})
>
> My queries all worked as expected.  
>
> (find-one db-state :meeting #{:race} [[:= :meeting.id 5617]])
> (find-one db-state :meeting #{:venue} [[:= :meeting.id 5617]])
> (find-one db-state :race #{:meeting :jurisdiction} [[:= :race.id 42792]])
>
> I couldn't see how I might pull data which requires three levels of 
> information (e.g. race -> meeting -> venue).  I didn't dig deep enough to 
> be sure.
>
> Incidentally, in case you haven't come across the datomic pull inspired 
> om.next remote pull syntax this is what it might look like:
>
> [{:meeting [:race]}]
> (find-one db-state :meeting #{:race} [])
>
> [({:meeting [:race]} [:= :meeting.id 5617])]
> (find-one db-state :meeting #{:race} [[:= :meeting.id 5617]])
>
> [{:meeting [:venue]}]
> (find-one db-state :meeting #{:venue} [[:= :meeting.id 5617]])
>
> [{:race [{:meeting [{:venue :jurisdiction}]}]}]
>
> Not prettier necessarily but allows for composing multiple queries into a 
> request and for drilling deeper into available data.  
>
> cheers, Oliver
>  
>
>
>
>
>
>
> On Sunday, 28 February 2016 20:02:15 UTC+11, Krzysiek Herod wrote:
>>
>> Thanks Oliver for the feedback, 
>>
>> actually I came up with the idea of relational_mapper while working on a 
>> project in which I had one "data-model" that contained all the database 
>> related information, but the database related code contained a lot of 
>> features, and I really like working with small, focused clojure libraries, 
>> so in the end relational_mapper is as small as I could think of it. 
>>
>> Also as you can see in this commit: 
>> https://github.com/netizer/relational_mapper/commit/6b4d79f92570bf723e4092d329978d484c01d2ab#diff-2b44df73d826687086fd1972295f8bd0L8
>>  
>> I actually was storing both: relations and fields in the same structure, 
>> but I changed that because I needed "fields" only for migrations that I 
>> used in tests, and because the whole structure was unnecessarily complex 
>> (it was much easier to make mistake modifying the fields/associations 
>> structure). 
>>
>> Relational Mapper is meant only for reading data because whenever I tried 
>> to use complex structures to write data, I was unhappy with the result 
>> (often you have to update indexes of related records after one of them - 
>> with auto-increment field - is created, and there is a problem of 
>> determining if the related record has to be created or updated).
>>
>> I didn't write compare/contrast points because I couldn't find similar 
>> libraries in clojure. I mentioned ActiveRecord in README mostly because of 
>> the wording in types of relations, but even ActiveRecord is very far from 
>> Relational Mapper (it's much bigger, and has features that go way beyond 
>> simple relational mapping). 
>>
>> Thanks again, 
>> Krzysiek
>>
>> On Sunday, February 28, 2016 at 10:54:57 AM UTC+8, Oliver George wrote:
>>>
>>>
>>> Seems pretty nice to me.  Like a light weight version of the Django's 
>>> migrate and queryset features which build on model definitions.
>>>
>>> It seems like this would allow me to define a database schema (tables, 
>>> relations and fields) as data and use it to both create the database and 
>>> run select/insert/update/delete queries against it.  
>>>
>>> Is that your intention for the library?
>>>
>>> I've not explored the options in this space before.  It might be good to 
>>> have a section in the README pointing out to other related tools with some 
>>> compare/contrast points.
>>>
>>> Thanks.
>>>
>>>
>>> On Friday, 26 February 2016 17:51:10 UTC+11, Krzysiek Herod wrote:
>>>>
>>>> I created Relational Mapper, for situations where there is a relational 
>>>> database with certain amount of relations between tables and it's just not 
>>>> cool to fetch data from each table separately nor to write custom code for 
>>>> each such project so, with this library, you can just call: 
>>>>
>>>> (find_all db-state :posts #{:authors :attachments} [:= post.id 1])
>>>>
>>>> and assuming you have appropriate relations between these tables, you'll 
>>>> get:
>>>>
>>>> {:posts {:title "Christmas"
>>>>          :body "Merry Christmas!"
>>>>          :id 1
>>>>          :authors_id 10
>>>>          :authors {:name "Rudolf" :id 10}
>>>>          :attachments [{:name "rudolf.png" :id 100 :posts_id 1}
>>>>                        {:name "santa.png" :id 101 :posts_id 1}]
>>>>
>>>>
>>>> The code is here: https://github.com/netizer/relational_mapper
>>>>
>>>> Please, guys, let me know what do you think, and if you have any ideas 
>>>> about improvements. If somebody would be so kind to take a look at the 
>>>> code, it would be awesome to read some feedback.
>>>>
>>>> Krzysiek HerĂ³d
>>>>
>>>

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
--- 
You received this message because you are subscribed to the Google Groups 
"Clojure" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to clojure+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to