<div style>Hi Shuhao,</div><div style><br></div><div style>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.</div><div style>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:</div>
<div style>1. Define the models with specific fields and properties;</div><div style>2. Generate the JSON Schema [1] based on these fields;</div><div style>3. Create an instances of our models;</div><div style>4. Validate against the schema;</div>
<div style>5. Generate the optimal sequence of actions we need to do to store the data, based on the meta information of our models;</div><div style>6. Store the data, resolve the conflicts if occur.</div><div style><br></div>
<div style>Also it should be possible to deserialize the JSON objects into python objects.</div><div style><br></div><div style>[1] - <a href="http://json-schema.org/" target="_blank" style="color:rgb(17,85,204)">http://json-schema.org/</a></div>
<div style><br></div><span style>Best regards,</span><div style>Andrey Martyanov</div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div><div>
<div class="h5"><br><br><div class="gmail_quote">On Fri, Mar 2, 2012 at 5:47 PM, Shuhao Wu <span dir="ltr"><<a href="mailto:admin@thekks.net" target="_blank">admin@thekks.net</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><p>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. </p>


<p>Cheers,<br>
Shuhao<br>
Sent from my phone.</p><div><div>
<div class="gmail_quote">On Mar 1, 2012 11:41 PM, "Andrey V. Martyanov" <<a href="mailto:realduke@gmail.com" target="_blank">realduke@gmail.com</a>> wrote:<br type="attribution"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">


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!<div>



<br></div><div>Best regards,</div><div>Andrey Martyanov<br><br><div class="gmail_quote">On Fri, Mar 2, 2012 at 9:01 AM, Andrey V. Martyanov <span dir="ltr"><<a href="mailto:realduke@gmail.com" target="_blank">realduke@gmail.com</a>></span> wrote:<br>



<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">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.<div>



<div><div>
<br><br><div class="gmail_quote">On Fri, Mar 2, 2012 at 8:39 AM, Shuhao Wu <span dir="ltr"><<a href="mailto:admin@thekks.net" target="_blank">admin@thekks.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">




The thing about riak-python-client is that it's already pretty high level, but not high level enough to be that simple.<div><br></div><div>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?</div>




<span><font color="#888888">

<div><br></div><div>Shuhao</div></font></span><div><div><div>
<br><br><div class="gmail_quote">On Thu, Mar 1, 2012 at 10:20 PM, Andrey V. Martyanov <span dir="ltr"><<a href="mailto:realduke@gmail.com" target="_blank">realduke@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">






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.<div><br></div><div>






Best regards,</div>
<div>Andrey Martyanov<div><div><br><br><div class="gmail_quote">On Fri, Mar 2, 2012 at 8:15 AM, Shuhao Wu <span dir="ltr"><<a href="mailto:admin@thekks.net" target="_blank">admin@thekks.net</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
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)<div>







<span><font color="#888888">

<br clear="all">Shuhao</font></span><div><div><br>
<br><br><div class="gmail_quote">On Thu, Mar 1, 2012 at 10:02 PM, Shuhao Wu <span dir="ltr"><<a href="mailto:admin@thekks.net" target="_blank">admin@thekks.net</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">









Hi!<div><br></div><div>First off, the code is <b>LGPL</b> 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.</div>










<div><br></div><div>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).</div>










<div><br></div><div>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.</div>










<div><br></div><div>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..</div><div><br></div><div>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)</div>










<div><br></div><div>Cheers,</div><div><br></div><div>Shuhao<br>
<br>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?</div>









<div><div>
<div><br><div class="gmail_quote">On Thu, Mar 1, 2012 at 9:35 PM, Andrey V. Martyanov <span dir="ltr"><<a href="mailto:realduke@gmail.com" target="_blank">realduke@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">










Hi!<div><br></div><div>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:</div>











<div>1. Serialize the objects to valid json;</div><div>2. Deserialize the data back to class instances;</div><div>3. Validate the fields data;</div><div>4. Track dependencies between models;</div><div><br></div><div>Simple example using Riakkit-like syntax;</div>











<div><br></div><div>class Post(Document):</div><div><br></div><div>    bucket_name  = 'posts'</div><div><br></div><div>    title = types.StringProperty(required=True)</div><div>    content = types.StringProperty(required=True)</div>











<div><br></div><div><br></div><div>class Comment(Document):</div><div><br></div><div>    bucket_name = 'comments'</div><div><br></div><div>    text = types.StringProperty(required=True)</div><div>    post = types.IndexReferenceProperty(reference_class=Post, collection_name='comments')</div>











<div><br></div><div>>>> post = Post('title', 'content')</div><div>>>> comment1 = ('comment1', post=post)</div><div>>>> comment2 = ('comment2', post=post)</div><div>











>>> post.is_valid()</div><div>True</div><div>>> post.serialize()</div><div>{</div><div>    "key": "post_key",</div><div>    "title": "title",</div><div>    "content": "content",</div>











<div>    "comments": [</div><div>        {</div><div>            "key": "comment1_key",</div><div>            "text": "comment1"</div><div>        },</div><div><div>        {</div>











<div>            "key": "comment2_key",</div><div>            "text": "comment2"</div><div>        },</div></div><div>    ]</div><div>}</div><div>>>> post.store()</div><div>











True</div><div>>>> post = Post.get_with_key('post_key')</div><div>>>> post.comments</div><div>['Post comment1', 'Post comment2']</div><div>>>> post_json_data = get_json_data_from_request()</div>











<div>>>> post = Post.deserialize(post_json_data)</div><div>>>> post.title</div><div>'title'</div><div>>>> post.comments</div><div>['Post comment1', 'Post comment2']</div>











<div><br></div><div>Something like that.</div><div><br></div><div><br></div><div>Best regards,</div><div>Andrey Martyanov</div><div><div><br><div class="gmail_quote">On Fri, Mar 2, 2012 at 5:39 AM, Sean Carey <span dir="ltr"><<a href="mailto:carey@basho.com" target="_blank">carey@basho.com</a>></span> wrote:<br>











<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div bgcolor="#FFFFFF"><div>Keep up the great work Shuhao!<div><div><br><br>On Mar 1, 2012, at 7:36 PM, Shuhao Wu <<a href="mailto:admin@thekks.net" target="_blank">admin@thekks.net</a>> wrote:<br>











<br></div></div></div><div><div><div></div><blockquote type="cite">
<div>Hey guys,<div><br></div><div>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.</div>














<div><br></div><div>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)</div>














<div><br></div><div>class User(Document):</div><div>    client = riak.RiakClient()</div><div>    bucket_name = "users"</div><div><br></div><div>    name = StringProperty(required=True)</div><div><br></div><div>













>>> user = User(name="foo")</div>
<div>>>> user.save()</div><div>>>> print <a href="http://user.name" target="_blank">user.name</a></div><div>foo</div><div><br></div><div>If anyone is interested, you can find the website here: <a href="http://ultimatebuster.github.com/riakkit" target="_blank">http://ultimatebuster.github.com/riakkit</a> and the code at <a href="http://github.com/ultimatebuster/riakkit" target="_blank">http://github.com/ultimatebuster/riakkit</a></div>














<div><br></div><div>Cheers!</div><div><br clear="all">Shuhao<br>
</div>
</div></blockquote></div></div><blockquote type="cite"><div><span>_______________________________________________</span><br><span>riak-users mailing list</span><br><span><a href="mailto:riak-users@lists.basho.com" target="_blank">riak-users@lists.basho.com</a></span><br>












<span><a href="http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com" target="_blank">http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com</a></span><br></div></blockquote></div>
<br>_______________________________________________<br>
riak-users mailing list<br>
<a href="mailto:riak-users@lists.basho.com" target="_blank">riak-users@lists.basho.com</a><br>
<a href="http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com" target="_blank">http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com</a><br>
<br></blockquote></div><br>
</div></div><br>_______________________________________________<br>
riak-users mailing list<br>
<a href="mailto:riak-users@lists.basho.com" target="_blank">riak-users@lists.basho.com</a><br>
<a href="http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com" target="_blank">http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com</a><br>
<br></blockquote></div><br></div>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br></div></div></div>
</blockquote></div><br></div>
</div></div></blockquote></div><br></div>
</div></div></blockquote></div><br></div>
<br>_______________________________________________<br>
riak-users mailing list<br>
<a href="mailto:riak-users@lists.basho.com" target="_blank">riak-users@lists.basho.com</a><br>
<a href="http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com" target="_blank">http://lists.basho.com/mailman/listinfo/riak-users_lists.basho.com</a><br>
<br></blockquote></div>
</div></div></blockquote></div><br></div></div></div>
</blockquote></div><br>