On Thu, Jun 30, 2011 at 1:19 PM, Israel Hilerio <isra...@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 <isra...@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
>> >> <isra...@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
>> >> >> <isra...@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

Reply via email to