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