- From: Eliot Graff <Eliot.Graff@microsoft.com>
- Date: Fri, 8 Jul 2011 00:24:23 +0000
- To: Jonas Sicking <jonas@sicking.cc>, Israel Hilerio <israelh@microsoft.com>
- CC: "public-webapps@w3.org" <public-webapps@w3.org>, Adam Herchenroether <aherchen@microsoft.com>, Victor Ngo <vicngo@microsoft.com>
Done and pushed to Mercurial. Updated sync and async versions of openCursor on ObjectStore and Index as follows: made type of 'range' equal to any made 'range' nullable Eliot > -----Original Message----- > From: public-webapps-request@w3.org [mailto:public-webapps- > request@w3.org] On Behalf Of Jonas Sicking > Sent: Thursday, June 30, 2011 2:30 PM > To: Israel Hilerio > Cc: public-webapps@w3.org; Adam Herchenroether; Victor Ngo > Subject: Re: [indexeddb] openCursor optional parameters issue > > On Thu, Jun 30, 2011 at 1:19 PM, Israel Hilerio <israelh@microsoft.com> > wrote: > > On Tuesday, June 28, 2011 7:31 PM, Jonas Sicking wrote: > >> On Tue, Jun 28, 2011 at 4:59 PM, Israel Hilerio > >> <israelh@microsoft.com> > >> wrote: > >> > On Tuesday, June 28, 2011 12:49 PM, Jonas Sicking wrote: > >> >> On Tue, Jun 28, 2011 at 10:53 AM, Israel Hilerio > >> >> <israelh@microsoft.com> > >> >> wrote: > >> >> > On Monday, June 27, 2011 8:21 PM, Jonas Sicking wrote: > >> >> >> On Mon, Jun 27, 2011 at 11:42 AM, Israel Hilerio > >> >> >> <israelh@microsoft.com> > >> >> >> wrote: > >> >> >> > The IDBObjectStore.openCursor method is defined to have two > >> >> >> > optional > >> >> >> parameters: > >> >> >> > * IDBRequest openCursor (in optional any range, in optional > >> >> >> > unsigned short direction) raises (IDBDatabaseException); > >> >> >> > > >> >> >> > Based on the examples in the spec, it seems we're envisioning > >> >> >> > the method > >> >> >> to be used in the following ways: > >> >> >> > * objStore.openCursor(); > >> >> >> > * objStore.openCursor(keyRange); > >> >> >> > * objStore.openCursor(keyRange, IDBCursor.PREV); > >> >> >> > * objStore.openCursor(IDBCursor.PREV); > >> >> >> > >> >> >> No, that's not how optional parameters work in WebIDL. In order > >> >> >> to specify an optional parameter, you always have to specify > >> >> >> all preceding optional parameters. So only the following > >> >> >> syntaxes are > >> >> >> valid: > >> >> >> > >> >> >> * objStore.openCursor(); > >> >> >> * objStore.openCursor(keyRange); > >> >> >> * objStore.openCursor(keyRange, IDBCursor.PREV); > >> >> >> > >> >> >> > Having "any" for the keyRange type makes it difficult to > >> >> >> > detect the correct > >> >> >> overloaded parameter for openCursor. > >> >> >> > >> >> >> The reason the first parameter is of type 'any' is so that you > >> >> >> can pass either a IDBKeyRange or a value. So for example: > >> >> >> > >> >> >> req = objStore.openCursor("hello"); req = index.openCursor(4); > >> >> >> > >> >> >> are valid. When called with a simple value on an object store > >> >> >> the cursor will obviously always return 0 or 1 rows. For > >> >> >> indexes it could return any number of rows though. > >> >> >> > >> >> >> This is actually already specified if you look at the steps for > >> >> >> opening a > >> >> cursor. > >> >> >> The same holds true for many other functions, such as .get and > .delete. > >> >> >> > >> >> >> However it's a very subtle feature that's easy to miss. If you > >> >> >> have suggestions for how to make this more clear in the spec > >> >> >> I'd love to hear them. I've been thinking that we should add > >> >> >> non-normative, easy-to-understand text to explain each > >> >> >> function, similar to what the > >> >> >> HTML5 spec does when defining APIs. > >> >> >> > >> >> >> / Jonas > >> >> > > >> >> > What you're saying makes a lot of sense. That was what I > >> >> > originally thought > >> >> but what confused me was some of the examples in the current spec > >> >> which suggest we want to do the following (Section 3.3.5): > >> >> > * objStore.openCursor(IDBCursor.PREV); > >> >> > >> >> I don't think we should allow this. The benefit of saving the > >> >> author from writing objStore.openCursor(nulll, IDBCursor.PREV) > >> >> isn't worth the complexity that is introduced. IMHO. We should > >> >> just fix the example > >> instead. > >> >> > >> >> > Independent of how up to date the examples are, the issue with > >> >> > the way it is > >> >> currently spec'ed is that there is an implied dependency between > >> >> keyRange and Cursor direction. In other words, you can't open a > >> >> cursor without any keyRange and just a direction. One possible > >> >> way to resolve this is to allow the keyRange to be nullable. This > >> >> will allow us to define a cursor without a keyRange and with a direction: > >> >> > * objStore.openCursor(null, IDBCursor.PREV); > >> >> > > >> >> > Without something like this, it is not easy to get a list of all > >> >> > the records on > >> >> the store going in the opposite direction from IDBCursor.NEXT. > >> >> > >> >> Indeed, it was the intent that this should be allowed. I suspect > >> >> we simply haven't kept up to date with WebIDL changing under us. > >> >> But I do think that the text in the algorithm does say to do the > >> >> right thing when no keyrange (or key > >> >> value) is supplied. > >> >> > >> >> / Jonas > >> > > >> > My concern is not having a clean mechanism to retrieve a regular > >> > cursor > >> with an inverted order without knowing any records (first or last) in > >> the list. This seems like a common operation that is not supported today. > >> > > >> > These are some of the alternatives that I believe we have: > >> > * Support a null value for IDBKeyRange: > >> > -IDBRequest objStore.openCursor(null, IDBCursor.PREV); > >> > * Introduce a new specialized method to handle this scenario: > >> > -IDBRequest objStore.openDirectionalCursor(IDBCursor.PREV); > >> > * This will default internally to an IDBKeyRange with the > >> > properties > >> defined below. > >> > * One advantage of this approach is that we don't have to > >> > expose a new > >> IDBKeyRange constructor. > >> > * Define a new static keyRange constructor that is a catch all: > >> > -static IDBKeyRange.all(); > >> > * The values for the new constructor would be: > >> > IDBKeyRange.lower = undefined > >> > IDBKeyRange.upper = undefined > >> > IDBKeyRange.lowerOpen = false > >> > IDBKeyRange.upperOpen = false > >> > * I believe these satisfy the conditions for a key is in a > >> > key range section > >> [1]. > >> > > >> > * We could pass this new keyRange to the existing openCursor > method: > >> > -objStore.openCursor(IDBKeyRange.all(), IDBCursor.PREV); > >> > > >> > Let me know if you see any other alternatives or if you like any of > >> > these > >> options. > >> > > >> > Israel > >> > [1] > >> > http://dvcs.w3.org/hg/IndexedDB/raw-file/tip/Overview.html#dfn-in-a > >> > -ke > >> > y-range > >> > >> I think we're talking past each other. I was trying to say that when > >> I wrote the current spec text, my intent was for > >> > >> req = objStore.openCursor(null, IDBCursor.PREV); > >> > >> to work and return a cursor which iterates the whole object store. > >> Same for indexes of course. The "Cursor Iteration Operation" should > >> already support this unless I've made a mistake somewhere. > >> > >> What's happened is that since I wrote the text WebIDL changed in such > >> a way that it now requires types to be explicitly nullable. However I > >> don't think that applies to the 'any' type used for most cursor-open > functions. > >> > >> However I do now see that the type defined for the open-cursor > >> functions on indexes use "IDBKeyRange" rather than "any" as type. > >> That needs to be fixed (In both sync and async) such that you can do > >> things like > >> > >> req = myindex.openCursor(4); > >> and > >> req = myindex.openKeyCursor("hello", IDBCursor.PREV); > >> > >> / Jonas > > > > Great, thanks for clarifying! Yes, I believe we are in violent > > agreement :-) > > > > To avoid future confusion, I believe we should update the WebIDL table > associated with IDBObjectStore.openCursor and IDBIndex.openCursor to add > a checkmark in the Nullable field instead of an x. Plus as you pointed out, we > need to ensure the type arguments are the same for both of these two > methods (add the any and replace the IDBKeyRange). > > > > I can work with Eliot on this. > > Sounds great! Thanks! > > / Jonas >
Received on Friday, 8 July 2011 00:25:06 UTC