Rainer, so I see what you mean now. I never noticed there were 2 keys, but
reading over the docs I now see:
googleKeyvalue returned from GoogleWrite(). If used, then kind and keyName
must not be used. kindIf 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. keyNameIf 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 !!
-~----------~----~----~----~------~----~------~--~---