Baz, I am sorry that I couldn't respond earlier, but I was struck by a mean flu last couple of days.
On my dev server, I have a working CRUD, using only kind+key combination. I will post it here as soon as I get well again. Imho, you don't need the 'GoogleKey' at all. I started with using it in my CRUD, because I appreciated the auto creation of an identifier by the datastore, but in the end, I had to store it as a property in an object (and save again to the ds), in order to be able to do an update, and that I didn't like so much. Cheers, Rainer. Verstuurd vanaf mijn iPhone Op 23 nov 2009 om 10:01 heeft Bassil Karam <[email protected]> het volgende geschreven:\ > Vince what are you thoughts on the potential confusion with the > custom GoogleKey in OpenBD and the real Key in app engine? Why not > just use kind and key as the identifier rather than a superfluous > GoogleKey? > > Baz > > > On Mon, Nov 16, 2009 at 11:34 PM, Rainer Schreiber <[email protected] > > wrote: > Baz, let me respond to you this afternoon, when I am back home from > my daily work. > > 2009/11/17 Bassil Karam <[email protected]> > > Rainer, is the datastore key populated somewhere in the cfc after > you write (NOT the openbd googlekey)? I'm only asking because I'm > not somewhere where I can test it myself. > > Baz > > > On Mon, Nov 16, 2009 at 3:08 PM, Bassil Karam <[email protected]> > wrote: > To add, the statement User.googleRead(2) would actually just be a > shortcut for: > > User.setGoogleKey(2); > User.googleRead(); // which automatically finds and uses the > "GoogleKey" property of a cfc > > Similarly the User.googleWrite(1) function would be a shortcut for: > > User.setGoogleKey(1); > User.googleWrite(); > > Baz > > > On Mon, Nov 16, 2009 at 3:01 PM, Bassil Karam <[email protected]> > wrote: > Rainer, so I see what you mean now. I never noticed there were 2 > keys, but reading over the docs I now see: > > googleKey value returned from GoogleWrite(). If used, then kind and > keyName must not be used. > kind If used, then googleKey must not be used. kind is used by this > function together with keyName to create a googleKey that is then > used to read the entity from the datastore. > keyName If used, then googleKey must not be used. keyName is used by > this function together with kind to create a googleKey that is then > used to read the entity from the datastore. > > So "googleKey" is an OpenBD-specific key that gets returned from > googleWrite() whereas "keyName" is the actual id of the kind as the > datstore sees it. I have a feeling the googleKey is basically hash > (kind && keyName) to make a single uniquely identifiable key that in > independent of kind. > > Now for the question of whether this is *good* or not :) > > For one it seems certain that it shouldn't be called "googleKey", as > that is quite misleading, but rather something much closer to > "OpenBD-Specific-Key". I guess the main problem it is trying to > solve is to be able to interact with records without having to > specify 2 values ("key" and "kind") - this is probably especially > useful when doing a batch read using an array of keys, which is much > simpler than an array of structs with "key" and "kind". > > Given all that though, I think I agree with your criticisms Rainer - > seems to add more confusion and complexity than it solves. In the > world of relational db's, you need to know the id AND table name, so > people are used to dealing with both pieces of data. With regards to > batch reads, might be ok to limit that to one kind. So when you > provide an array of keys, you know it is for a single kind. And for > a super-advanced version you can provide an array of structs with > kind/key. > > To me, this seems like the most natural flow: > > dataset for kind USER > key = 1, name = baz, coolness = high > key = 2, name = rainer, coolness = almost-as-high > > read > User.googleRead(2) // reads user "rainer" at key #2 > User.googleRead(2, 'User') // same as above except "kind" is > explicitly specified > Key = googleRead('User', 2) // "key" and "kind" are required when > using the general googleRead() function > > write > User.googleWrite() // writes the "rainer" object that was read in > previous statements, no key necessary as it is stored as a property > of the cfc > User.googleWrite(1) // overwrites the "baz" record at key #1 with > the "rainier" record because the key was manually specified. (The > resulting recordset would have 2 identical records except with key > #1 and #2) > > googleWrite(User) // only cfc is required when using general > googleWrite(), the key is stored in the cfc > > Seems simpler this way, without any roadblocks - thoughts? > > Baz > > > > > On Mon, Nov 16, 2009 at 1:54 PM, Rainer <[email protected]> > wrote: > > If I run the following code: > > --- > --- > --- > --- > --------------------------------------------------------------------- > <cfset local.myCountry = CreateObject > ("component","model.country.Country").init > (countryCode= > "DE" > ,tld= > "de",googleAnalyticsAccountNr="UA-8664183-3",verifyV1="yYX5DacOjdbms/ > rvqM9jhPpwLMHVuaFUf53eUGCu1pw=") /> > <cfset local.myGoogleKey = GoogleWrite(local.myCountry,"Country") /> > Generated GoogleKey = #local.myGoogleKey#<br> > > <cfset aCountries = GoogleQuery('select from Country') /> > Number of Country objects in datastore = #ArrayLen(aCountries)#<br> > > <cfset local.myCountry2 = CreateObject > ("component","model.country.Country").init > (countryCode= > "GE" > ,tld= > "ge",googleAnalyticsAccountNr="RR-8664183-3",verifyV1="aaX5DacOjdbms/ > rvqM9jhPpwLMHVuaFUf53eUGCu1pw=") /> > <cfset local.myGoogleKey2 = GoogleWrite > (local.myCountry2,"Country",local.myGoogleKey) /> > Generated GoogleKey2 = #local.myGoogleKey2#<br> > > <cfset aCountries2 = GoogleQuery('select from Country') /> > Number of Country objects in datastore = #ArrayLen(aCountries2)#<br> > --- > --- > --- > --- > --------------------------------------------------------------------- > > > I get the following result: > > > --- > --- > --- > --- > --------------------------------------------------------------------- > Generated GoogleKey = agZvd296em9yDgsSB2NvdW50cnkY4gEM > Number of Country objects in datastore = 1 > Generated GoogleKey2 = > agZvd296em9yLQsSB2NvdW50cnkiIGFnenZkMjk2ZW05eWRnc3NiMm52ZHc1MGNua3k0Z2VtDA > Number of Country objects in datastore = 2 > --- > --- > --- > --- > --------------------------------------------------------------------- > > > > On Nov 16, 10:42 pm, Rainer Schreiber <[email protected]> > wrote: > > I get a key like 'agZvd296em9yDgsSB2NvdW50cnkYzQEM' > > > > 2009/11/16 Bassil Karam <[email protected]> > > > > > Rainer, > > > > > What do you get for GoogleKey when you do 'GoogleKey = > > > GoogleWrite (myObj,myKind)'? > > > > > Baz > > > > > On Mon, Nov 16, 2009 at 1:13 PM, Rainer > <[email protected]> wrote: > > > > >> Good point Baz: > > >> At the moment I use GoogleWrite(MyObj,getMetaData > > >> (MyObj).name,'MyKey123'). Why must I give the name of my object > as an > > >> argument, when the function GoogleWrite should be able to fetch > it > > >> itselve from the first argument MyObj? > > > > >> I furthermore must recall my latest blog here: keyName NOT EQUALS > > >> googleKey!!! I still think that the implementation of the > unique keys > > >> of objects in the datastore is confusing! > > > > >> First of all, you can NOT use the 'GoogleKey' which is > generated by > > >> the function 'GoogleWrite'. If you try 'GoogleKey = GoogleWrite > > >> (myObj,myKind)' and in a next request you use the GoogleKey to > do an > > >> update like 'GoogleKey2 = GoogleWrite(myObj,myKind,GoogleKey)', > there > > >> will be 2 objects in the datastore, and 'GoogleKey2' NOT equals > > >> 'GoogleKey'! > > > > >> Secondly, if you generate a unique key yourselve (f.i. > myUniqueKey = > > >> CreateUUID()), you must store this unique key as a property in > your > > >> object in order to be able to update this object in the > datastore. Let > > >> me explain: I save a new object to the datastore with > 'GoogleWrite > > >> (myObj,myKind,myUniqueKey)'. In a next request, I must read > > >> myUniqueKey from a (listed) object, in order to be able to > update the > > >> object in the datastore by doing a 'GoogleWrite > > >> (myObj,myKind,myUniqueKey)'. I think that's really stupid, if > there's > > >> already a GoogleKey! > > > > >> And now I am back at my first point, that you can NOT use the > > >> GoogleKey! > > > > >> So, what I am trying to say is that the idea of having a > GoogleKey is > > >> really great, because you would not have to store a unique key > in your > > >> object. But that only works if you can first do a GoogleKey = > > >> GoogleWrite(myObj) and than later on use this GoogleKey to do a > > >> GoogleWrite(myObj,GoogleKey), and NOT GoogleWrite > (myObj,keyName)!! > > > > >> Vince, could you please respond to this post and let me know > what you > > >> think, I would really appreciate that. > > > > >> Cheers, > > > > >> Rainer. > > > > >> On Nov 16, 8:55 pm, Bassil Karam <[email protected]> wrote: > > >> > My pleasure :) > > > > >> > One suggestion I would make to Vince is to reverse the > positions of the > > >> > attributes "kind" and "keyName" and to not make "kind" > required if > > >> "keyName" > > >> > is specified. For example, if I wanted to save an object, I > could do: > > > > >> > googleWrite(MyObj); > > > > >> > This will automatically populate the kind and the keyName, > but if I had > > >> my > > >> > own key name, it seems I should be able to simply provide it: > > > > >> > googleWrite(MyObj, 'MyKeyName'); > > > > >> > With the "kind" automatically populated as before. Why should > I have to > > >> now > > >> > specify it just because I have a key? > > > > >> > Similarly if you invoke googleWrite on the component itself: > > > > >> > MyObj.googleWrite('MyKeyName') > > > > >> > I think keyname is going to be specified MUCH more often than > kind and > > >> > should therefore precede kind in the attribute list and also > not be tied > > >> to > > >> > it. > > > > >> > Just some thoughts, > > >> > Baz > > > > >> > On Mon, Nov 16, 2009 at 11:17 AM, Rainer > <[email protected]> > > >> wrote: > > > > >> > > Thanks Baz, that one helped me out. > > > > >> > > I didn't get it into my grey cells that keyName = > googleKey. Of > > >> > > course, it's not a problem to use a kind, but I didn't know > that you > > >> > > can use a GoogleKey as a KeyName to update an object with > GoogleWrite. > > > > >> > > Great, let's put my model together this night! > > > > >> > > Thanks again Baz. > > > > >> > > Rainer. > > > > >> > > On Nov 16, 6:25 pm, Bassil Karam <[email protected]> wrote: > > >> > > > Rainer, > > > > >> > > > For your first question you say that you have the google > key in a > > >> hidden > > >> > > > form field. So that means you can do: > > > > >> > > > googleWrite(MyCFC, 'MyKind', 'MyKey123'); > > > > >> > > > What's the trouble? Is it that you would prefer to do > something > > >> like: > > > > >> > > > MyCFC.setGoogleKey('MyKey123'); > > >> > > > MyCFC.googleWrite(); > > > > >> > > > So that you don't have to specify a kind? > > > > >> > > > Baz > > > > >> > > > On Mon, Nov 16, 2009 at 1:27 AM, Rainer > <[email protected]> > > >> > > wrote: > > > > >> > > > > Sorry for my mistake... > > >> > > > > In my option 2) I know, that I can update an object with > > >> GoogleWrite > > >> > > > > (kind,keyName), so that's not my question there. > > >> > > > > My question in option 2) is: > > >> > > > > How do I get the kind and Keyname when I do a listing? > > >> > > > > - aUsers = GoogleQuery('select from User'); > > >> > > > > - loop over aUsers > > >> > > > > - have an User object, can I do than a User.getKind() and > > >> > > > > User.getKeyName()? > > > > >> > > > > Rainer. > > > > >> > > > > On 16 nov, 10:18, Rainer <[email protected]> > wrote: > > >> > > > > > Vince, > > > > >> > > > > > Coul you please clarify me on this subject, I don't > get 'the > > >> circle > > >> > > > > > closed'. > > > > >> > > > > > When I follow the documentation athttp:// > > >> > > > > wiki.openbluedragon.org/wiki/index.php/GoogleAppEngine:Datastore > , > > >> > > > > > I can't seem to make a closing structure of my logic. > > > > >> > > > > > 1) When I choose to go for the googleKey (which I > higly prefer, > > >> > > > > > because it's generated by the datastore), I do the > following: > > >> > > > > > - create an object from my User.cfc (bean); User = > CreateObject > > >> > > > > > ('component','model.user.User').init() > > >> > > > > > - write it to the datastore; googleKey = GoogleWrite > (User); > > >> > > > > > - read from the datastore; User = googleRead > (googleKey); > > >> > > > > > - get list of users; aUsers = GoogleQuery('select > from User') > > >> > > > > > But what if I have a the details of a user in a form > (with the > > >> > > > > > googleKey in a hidden input), and I post this form. > > >> > > > > > How do I than create a User object that 'knows' the > googleKey so > > >> that > > >> > > > > > a GoogleWrite() will update an exisiting object in the > > >> datastore? > > >> > > > > > Should I first do a 'User = googleRead(googleKey)' > and than > > >> update > > >> > > the > > >> > > > > > properties with my form properties, and than > > >> 'GoogleWrite(User)'? > > >> > > > > > Or can I set the googleKey in my User object with a > > >> 'setGoogleKey()' > > >> > > > > > function, or something like that? > > > > >> > > > > > 2) When I choose to go for the combination kind/ > keyName, I do > > >> the > > >> > > > > > following: > > >> > > > > > - create an object from my User.cfc (bean); User = > CreateObject > > >> > > > > > ('component','model.user.User').init(kind,keyName) > > >> > > > > > - write it to the datastore; GoogleWrite > (User,kind,keyName); > > >> > > > > > - read from the datastore; User = googleRead > (kind,keyName); > > >> > > > > > - get list of users; aUsers = GoogleQuery('select > from User'); > > >> > > > > > But what if I have a the details of a user in a form > (with the > > >> kind > > >> > > > > > and keyName in a hidden input), and I post this form. > > >> > > > > > How do I than create a User object that 'knows' the > the kind and > > >> > > > > > keyName so that a GoogleWrite() will update an > exisiting object > > >> in > > >> > > the > > >> > > > > > datastore? Should I first do a 'User = googleRead > (kind,keyName)' > > >> and > > >> > > > > > than update the properties with my form properties, > and than > > >> > > > > > 'GoogleWrite(User)'? > > >> > > > > > Or can I set the kind and keyName in my User object > with > > >> > > 'setGoogleKind > > >> > > > > > () and setGoogleKeyName()' functions, or something > like that? > > > > >> > > > > > Maybe, I am overseeing something very badly, but > after read the > > >> doc a > > >> > > > > > couple of time, and trying some different code, I > coul not come > > >> up > > >> > > > > > with a solution. > > > > >> > > > > > Thank you in advance for helping me out, > > > > >> > > > > > Rainer. > > > > >> > > > > > On 14 nov, 10:52, Rainer <[email protected]> > wrote: > > > > >> > > > > > > Great! ... but, how do I know when I try to insert > a new > > >> object > > >> > > what > > >> > > > > > > the new int (max int + 1) is for this specific > object's > > >> keyName? > > > > >> > > > > > > And if I start using a UUID, is it unique enough to > be sure it > > >> was > > >> > > not > > >> > > > > > > used before in a save action to the datastore? > > > > >> > > > > > > Questions... questions... > > > > >> > > > > > > Rainer. > > > > >> > > > > > > On Nov 14, 2:01 am, Bassil Karam > <[email protected]> wrote: > > > > >> > > > > > > > I think I read somewhere that an int works a lot > faster on > > >> gae, > > >> > > but I > > >> > > > > could > > >> > > > > > > > be completely mistaken. Anyone know? But > otherwise, yeah: ) > > > > >> > > > > > > > On Nov 13, 2009 4:54 PM, "Rainer" > <[email protected] > > > > >> > > wrote: > > > > >> > > > > > > > Okay, so I don't rely on googleKey, but instead, > I create my > > >> own > > >> > > > > > > > unique key, like maybe a UUID ?! > > > > >> > > > > > > > On Nov 14, 1:43 am, Bassil Karam > <[email protected]> > > >> wrote: > > > >> > > Hey > > >> > > > > Rainer, > > >> > > > > > > > you don't need to read f... > > > > >> > > > > > > > > On Fri, Nov 13, 2009 at 4:14 PM, Rainer < > > >> > > [email protected]> > > >> > > > > wrote: > > >> > > > > > > > > > > Guys, > > > Maybe ...- Tekst uit > oorspronkelijk > > >> bericht > > >> > > niet > > >> > > > > weergeven - > > > > >> > > > > > > - Tekst uit oorspronkelijk bericht weergeven -- > Tekst uit > > >> > > > > oorspronkelijk bericht niet weergeven - > > > > >> > > > > > - Tekst uit oorspronkelijk bericht weergeven - > > > > > > > > > > --~--~---------~--~----~------------~-------~--~----~ > Open BlueDragon Public Mailing List > http://www.openbluedragon.org/ http://twitter.com/OpenBlueDragon > mailing list - http://groups.google.com/group/openbd?hl=en > !! save a network - please trim replies before posting !! > > -~----------~----~----~----~------~----~------~--~--- > > > > -- > Open BlueDragon Public Mailing List > http://www.openbluedragon.org/ http://twitter.com/OpenBlueDragon > mailing list - http://groups.google.com/group/openbd?hl=en > > !! save a network - please trim replies before posting !! > > -- > Open BlueDragon Public Mailing List > http://www.openbluedragon.org/ http://twitter.com/OpenBlueDragon > mailing list - http://groups.google.com/group/openbd?hl=en > > !! save a network - please trim replies before posting !! -- Open BlueDragon Public Mailing List http://www.openbluedragon.org/ http://twitter.com/OpenBlueDragon mailing list - http://groups.google.com/group/openbd?hl=en !! save a network - please trim replies before posting !!
