Also, what do you mean by conflict resolution? Synchronization or conflicts between references such as deleting references to a document when that document is deleted?
Shuhao On Fri, Mar 2, 2012 at 9:56 AM, Shuhao Wu <ad...@thekks.net> wrote: > Actually it's okay for no pull request for now.. I'm in the process of > rethinking the whole framework as well as I'm having some of the issues > that Andrey is describing as well. > > Shuhao > > > > On Fri, Mar 2, 2012 at 9:51 AM, Jared Morrow <ja...@basho.com> wrote: > >> Andrey, >> >> First off, you are indeed sending two emails to the Riak Users list each >> time you email, not just one, so I think gmail is doing the right thing the >> first time. >> >> Second, I'm sure Shuhao would love some pull requests to help with >> Riakkit since you seem to have a lot of ideas to make it better. >> >> -Jared >> >> >> On Mar 2, 2012, at 6:39 AM, Andrey V. Martyanov wrote: >> >> Also, I think we can add RoR-like migrations on top of that with >> automatic schema versioning and all the stuff. >> >> Best regards, >> Andrey Martyanov >> >> On Fri, Mar 2, 2012 at 6:22 PM, Andrey V. Martyanov >> <reald...@gmail.com>wrote: >> >>> I'm sorry for the repost, but my gmail client by default sends an email >>> to a specific subscriber, not to riak-users. >>> >>> >>> Hi Shuhao, >>> >>> I don't have enough time to write my own implementation and to see how >>> it works in practice. But I share my thoughts about that. >>> It's possible to save the current API, it's common now and used in >>> SQLAlchemy and Django ORM. But underlying implementation I see a bit >>> different. The simple workflow: >>> 1. Define the models with specific fields and properties; >>> 2. Generate the JSON Schema [1] based on these fields; >>> 3. Create an instances of our models; >>> 4. Validate against the schema; >>> 5. Generate the optimal sequence of actions we need to do to store the >>> data, based on the meta information of our models; >>> 6. Store the data, resolve the conflicts if occur. >>> >>> Also it should be possible to deserialize the JSON objects into python >>> objects. >>> >>> [1] - http://json-schema.org/ >>> >>> Best regards, >>> Andrey Martyanov >>> >>> On Fri, Mar 2, 2012 at 6:17 PM, Andrey V. Martyanov >>> <reald...@gmail.com>wrote: >>> >>>> Hi Shuhao, >>>> >>>> I don't have enough time to write my own implementation and to see how >>>> it works in practice. But I share my thoughts about that. >>>> It's possible to save the current API, it's common now and used in >>>> SQLAlchemy and Django ORM. But underlying implementation I see a bit >>>> different. The simple workflow: >>>> 1. Define the models with specific fields and properties; >>>> 2. Generate the JSON Schema [1] based on these fields; >>>> 3. Create an instances of our models; >>>> 4. Validate against the schema; >>>> 5. Generate the optimal sequence of actions we need to do to store the >>>> data, based on the meta information of our models; >>>> 6. Store the data, resolve the conflicts if occur. >>>> >>>> Also it should be possible to deserialize the JSON objects into python >>>> objects. >>>> >>>> [1] - http://json-schema.org/ >>>> >>>> Best regards, >>>> Andrey Martyanov >>>> >>>>> >>>>> >>>>> On Fri, Mar 2, 2012 at 5:47 PM, Shuhao Wu <ad...@thekks.net> wrote: >>>>> >>>>>> Yeah. You're looking at something like dictshield. As riakkit is more >>>>>> a RAD tool in its current state. You bring in an excellent point, >>>>>> nonetheless, which gave me some intuition and ideas about the next step. >>>>>> >>>>>> Cheers, >>>>>> Shuhao >>>>>> Sent from my phone. >>>>>> On Mar 1, 2012 11:41 PM, "Andrey V. Martyanov" <reald...@gmail.com> >>>>>> wrote: >>>>>> >>>>>>> Riakkit in its current implementation has a lot of overhead. But >>>>>>> what I get for this price? Almost nothing. Only field validation make >>>>>>> sense. Simple key-value mapping is about 50-70 lines of code, not a big >>>>>>> deal, even for small project. Riak used mostly in web-based projects. >>>>>>> Almost all modern projects use JSON. The simple workflow is get JSON >>>>>>> from >>>>>>> the client, validate, store in the database, query the database, send >>>>>>> JSON >>>>>>> to the client. If our mapper doesn't understand the JSON and cannot >>>>>>> operate >>>>>>> on it then it's not useful. We can use jsonpickle with a lot more >>>>>>> profit. >>>>>>> Just jsonpickle.encode the object and store it in Riak. I'm sorry, this >>>>>>> is >>>>>>> my position! >>>>>>> >>>>>>> Best regards, >>>>>>> Andrey Martyanov >>>>>>> >>>>>>> On Fri, Mar 2, 2012 at 9:01 AM, Andrey V. Martyanov < >>>>>>> reald...@gmail.com> wrote: >>>>>>> >>>>>>>> I'm just saying that to efficiently store and get the data user >>>>>>>> should have ability to customize the relationship. Riak has several >>>>>>>> options >>>>>>>> to get related data: secondary indexes, map-reduce etc. I think that >>>>>>>> the >>>>>>>> most important task of mapper is to validate the data and to track >>>>>>>> these >>>>>>>> dependencies. When you have enough meta information about objects >>>>>>>> storing >>>>>>>> these objects is not a big problem. >>>>>>>> >>>>>>>> >>>>>>>> On Fri, Mar 2, 2012 at 8:39 AM, Shuhao Wu <ad...@thekks.net> wrote: >>>>>>>> >>>>>>>>> The thing about riak-python-client is that it's already pretty >>>>>>>>> high level, but not high level enough to be that simple. >>>>>>>>> >>>>>>>>> From what I understand, tracking relationship between models will >>>>>>>>> still involve a certain level of magic. Right now the magic is that >>>>>>>>> when >>>>>>>>> you save any document, all the related document will be saved into the >>>>>>>>> database as well. You're saying that just tracking those relationship >>>>>>>>> change is good enough and saving will be up to the user? >>>>>>>>> >>>>>>>>> Shuhao >>>>>>>>> >>>>>>>>> >>>>>>>>> On Thu, Mar 1, 2012 at 10:20 PM, Andrey V. Martyanov < >>>>>>>>> reald...@gmail.com> wrote: >>>>>>>>> >>>>>>>>>> I'm not sure about forking the riak-python-client. The the whole >>>>>>>>>> idea of separation the low-level client library from the high-level >>>>>>>>>> mapper >>>>>>>>>> and the like is quite good. Some sort of SQLAlchemy does. >>>>>>>>>> >>>>>>>>>> Best regards, >>>>>>>>>> Andrey Martyanov >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Fri, Mar 2, 2012 at 8:15 AM, Shuhao Wu <ad...@thekks.net>wrote: >>>>>>>>>> >>>>>>>>>>> Another thing I was considering is forking riak-python-client. >>>>>>>>>>> Some of the stuff in there could use some fixing as well, and maybe >>>>>>>>>>> just >>>>>>>>>>> take out the core transports and such and plug that right into >>>>>>>>>>> riakkit and >>>>>>>>>>> skip the notion of RiakObject all together as those API is also >>>>>>>>>>> somewhat >>>>>>>>>>> weird. (such as add_link and remove_link) >>>>>>>>>>> >>>>>>>>>>> Shuhao >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Thu, Mar 1, 2012 at 10:02 PM, Shuhao Wu <ad...@thekks.net>wrote: >>>>>>>>>>> >>>>>>>>>>>> Hi! >>>>>>>>>>>> >>>>>>>>>>>> First off, the code is *LGPL* licensed, not GPL. So you're >>>>>>>>>>>> free to put this into any code you want, it's just that when you >>>>>>>>>>>> want to >>>>>>>>>>>> modify riakkit, you have to release your modified version. >>>>>>>>>>>> >>>>>>>>>>>> I just went over your idea and it would be a valid solution to >>>>>>>>>>>> some of the problems I'm having right now with my own projects with >>>>>>>>>>>> riakkit. When I initially started writing riakkit, I needed >>>>>>>>>>>> something to do >>>>>>>>>>>> RAD with, which would make sense to have an all-in-one, very >>>>>>>>>>>> simple to use >>>>>>>>>>>> framework, rather than working with serialization and what not. >>>>>>>>>>>> However, >>>>>>>>>>>> now I'm beginning to see problems in this approach when it comes to >>>>>>>>>>>> scalability as I'm slowing moving out of the RAD phase. I haven't >>>>>>>>>>>> done >>>>>>>>>>>> anything as I have not encountered any major issues yet (though I >>>>>>>>>>>> probably >>>>>>>>>>>> will). >>>>>>>>>>>> >>>>>>>>>>>> So here's what I'm thinking for the next branch ( I still have >>>>>>>>>>>> to maintain the master branch due to some code i've written and >>>>>>>>>>>> need ): I'm >>>>>>>>>>>> going to break riakkit into 2 pieces. The first piece is the >>>>>>>>>>>> underlying >>>>>>>>>>>> piece, which will do what you said, serialize/deserialize objects, >>>>>>>>>>>> validation, track relationships and what not, however, it doesn't >>>>>>>>>>>> load it >>>>>>>>>>>> those references up nor does it try to accomplish everything all >>>>>>>>>>>> in one >>>>>>>>>>>> shot, and a RAD layer that's compatible with the current API that >>>>>>>>>>>> will >>>>>>>>>>>> allow RAD to work with it, but still reserve the flexibility of >>>>>>>>>>>> having that >>>>>>>>>>>> underlying API that's relatively easy (as oppose to dead simple) >>>>>>>>>>>> to work >>>>>>>>>>>> with and not as messy as what's going on right now. >>>>>>>>>>>> >>>>>>>>>>>> I do agree that the code is messy.. Most of the time it's me >>>>>>>>>>>> fixing bugs I didn't anticipate as I go along and hacking >>>>>>>>>>>> everything into >>>>>>>>>>>> place.. >>>>>>>>>>>> >>>>>>>>>>>> One thing I'm not too clear about is what you mean by "Track >>>>>>>>>>>> dependencies between models". I'm not sure how you think I should >>>>>>>>>>>> go about >>>>>>>>>>>> approaching this (which right now is a pretty big disaster.. though >>>>>>>>>>>> relatively stable) >>>>>>>>>>>> >>>>>>>>>>>> Cheers, >>>>>>>>>>>> >>>>>>>>>>>> Shuhao >>>>>>>>>>>> >>>>>>>>>>>> P.S. I don't want to go into the whole PEP8 discussion and 4 >>>>>>>>>>>> spaces vs whatever.. I just like the 2 spaces and the style guide >>>>>>>>>>>> that >>>>>>>>>>>> Google uses. Is that really a big deal if you're using it as a >>>>>>>>>>>> library? >>>>>>>>>>>> >>>>>>>>>>>> On Thu, Mar 1, 2012 at 9:35 PM, Andrey V. Martyanov < >>>>>>>>>>>> reald...@gmail.com> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Hi! >>>>>>>>>>>>> >>>>>>>>>>>>> Two things force me to avoid using Riakkit: the code is GPL >>>>>>>>>>>>> licensed and non pep8 compliant. So, I cannot fork it and make >>>>>>>>>>>>> changes. The >>>>>>>>>>>>> code needs clean up, for example, json module is imported in >>>>>>>>>>>>> document.py, >>>>>>>>>>>>> but not used. Riakkit has no conflict resolution logic, it's >>>>>>>>>>>>> basically >>>>>>>>>>>>> delegate the work to underlying python client. If I'd like to >>>>>>>>>>>>> implement my >>>>>>>>>>>>> save method I need to copy and rewrite more than 150 lines of >>>>>>>>>>>>> code mess. >>>>>>>>>>>>> What I think the mapper should do: >>>>>>>>>>>>> 1. Serialize the objects to valid json; >>>>>>>>>>>>> 2. Deserialize the data back to class instances; >>>>>>>>>>>>> 3. Validate the fields data; >>>>>>>>>>>>> 4. Track dependencies between models; >>>>>>>>>>>>> >>>>>>>>>>>>> Simple example using Riakkit-like syntax; >>>>>>>>>>>>> >>>>>>>>>>>>> class Post(Document): >>>>>>>>>>>>> >>>>>>>>>>>>> bucket_name = 'posts' >>>>>>>>>>>>> >>>>>>>>>>>>> title = types.StringProperty(required=True) >>>>>>>>>>>>> content = types.StringProperty(required=True) >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> class Comment(Document): >>>>>>>>>>>>> >>>>>>>>>>>>> bucket_name = 'comments' >>>>>>>>>>>>> >>>>>>>>>>>>> text = types.StringProperty(required=True) >>>>>>>>>>>>> post = types.IndexReferenceProperty(reference_class=Post, >>>>>>>>>>>>> collection_name='comments') >>>>>>>>>>>>> >>>>>>>>>>>>> >>> post = Post('title', 'content') >>>>>>>>>>>>> >>> comment1 = ('comment1', post=post) >>>>>>>>>>>>> >>> comment2 = ('comment2', post=post) >>>>>>>>>>>>> >>> post.is_valid() >>>>>>>>>>>>> True >>>>>>>>>>>>> >> post.serialize() >>>>>>>>>>>>> { >>>>>>>>>>>>> "key": "post_key", >>>>>>>>>>>>> "title": "title", >>>>>>>>>>>>> "content": "content", >>>>>>>>>>>>> "comments": [ >>>>>>>>>>>>> { >>>>>>>>>>>>> "key": "comment1_key", >>>>>>>>>>>>> "text": "comment1" >>>>>>>>>>>>> }, >>>>>>>>>>>>> { >>>>>>>>>>>>> "key": "comment2_key", >>>>>>>>>>>>> "text": "comment2" >>>>>>>>>>>>> }, >>>>>>>>>>>>> ] >>>>>>>>>>>>> } >>>>>>>>>>>>> >>> post.store() >>>>>>>>>>>>> True >>>>>>>>>>>>> >>> post = Post.get_with_key('post_key') >>>>>>>>>>>>> >>> post.comments >>>>>>>>>>>>> ['Post comment1', 'Post comment2'] >>>>>>>>>>>>> >>> post_json_data = get_json_data_from_request() >>>>>>>>>>>>> >>> post = Post.deserialize(post_json_data) >>>>>>>>>>>>> >>> post.title >>>>>>>>>>>>> 'title' >>>>>>>>>>>>> >>> post.comments >>>>>>>>>>>>> ['Post comment1', 'Post comment2'] >>>>>>>>>>>>> >>>>>>>>>>>>> Something like that. >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> Best regards, >>>>>>>>>>>>> Andrey Martyanov >>>>>>>>>>>>> >>>>>>>>>>>>> On Fri, Mar 2, 2012 at 5:39 AM, Sean Carey <ca...@basho.com>wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Keep up the great work Shuhao! >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> On Mar 1, 2012, at 7:36 PM, Shuhao Wu <ad...@thekks.net> >>>>>>>>>>>>>> wrote: >>>>>>>>>>>>>> >>>>>>>>>>>>>> Hey guys, >>>>>>>>>>>>>> >>>>>>>>>>>>>> I started writing riakkit approximately 3 months ago and >>>>>>>>>>>>>> announced it here. In case you missed that, Riakkit is basically >>>>>>>>>>>>>> an object >>>>>>>>>>>>>> mapper for python and riak, which seemed to be lacking in at the >>>>>>>>>>>>>> time. Now >>>>>>>>>>>>>> that 3 months has passed and I have developed this project into >>>>>>>>>>>>>> much more >>>>>>>>>>>>>> than what I had envisioned to begin with. It's currently also >>>>>>>>>>>>>> being used >>>>>>>>>>>>>> and tested in a project of mine (web application) as well and >>>>>>>>>>>>>> functioning >>>>>>>>>>>>>> quite nicely. I would say that currently this is the only object >>>>>>>>>>>>>> mapper >>>>>>>>>>>>>> that can compete with their counterparts in other languages for >>>>>>>>>>>>>> Riak in >>>>>>>>>>>>>> Python, although a lot of work still needs to be done before it >>>>>>>>>>>>>> could fully >>>>>>>>>>>>>> compete. >>>>>>>>>>>>>> >>>>>>>>>>>>>> So today I felt that riakkit is "stable" and "clean" enough >>>>>>>>>>>>>> to deserve the first beta release. So I whipped up a website and >>>>>>>>>>>>>> it's >>>>>>>>>>>>>> released to pypi. Here's (again), a demo (the full tutorial can >>>>>>>>>>>>>> be found on >>>>>>>>>>>>>> the links below) >>>>>>>>>>>>>> >>>>>>>>>>>>>> class User(Document): >>>>>>>>>>>>>> client = riak.RiakClient() >>>>>>>>>>>>>> bucket_name = "users" >>>>>>>>>>>>>> >>>>>>>>>>>>>> name = StringProperty(required=True) >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>> user = User(name="foo") >>>>>>>>>>>>>> >>> user.save() >>>>>>>>>>>>>> >>> print user.name >>>>>>>>>>>>>> foo >>>>>>>>>>>>>> >>>>>>>>>>>>>> If anyone is interested, you can find the website here: >>>>>>>>>>>>>> http://ultimatebuster.github.com/riakkit and the code at >>>>>>>>>>>>>> http://github.com/ultimatebuster/riakkit >>>>>>>>>>>>>> >>>>>>>>>>>>>> Cheers! >>>>>>>>>>>>>> >>>>>>>>>>>>>> Shuhao >>>>>>>>>>>>>> >>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>> riak-users mailing list >>>>>>>>>>>>>> riak-users@lists.basho.com >>>>>>>>>>>>>> >>>>>>>>>>>>>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>>> riak-users mailing list >>>>>>>>>>>>>> riak-users@lists.basho.com >>>>>>>>>>>>>> >>>>>>>>>>>>>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com >>>>>>>>>>>>>> >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> _______________________________________________ >>>>>>>>>>>>> riak-users mailing list >>>>>>>>>>>>> riak-users@lists.basho.com >>>>>>>>>>>>> >>>>>>>>>>>>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>> >>>>>>> _______________________________________________ >>>>>>> riak-users mailing list >>>>>>> riak-users@lists.basho.com >>>>>>> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com >>>>>>> >>>>>>> >>>>> >>>> >>> >> _______________________________________________ >> riak-users mailing list >> riak-users@lists.basho.com >> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com >> >> >> >> _______________________________________________ >> riak-users mailing list >> riak-users@lists.basho.com >> http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com >> >> >
_______________________________________________ riak-users mailing list riak-users@lists.basho.com http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com