Sorry multiEntry attribute in 'clad-name' is true.
On Nov 17, 2013 12:21 PM, "Kyaw Tun" <[email protected]> wrote:

> Current IndexedDB spec does not allow MultiEntry index for array keyPath
> (compound index). Implementation of multiEntry compound index is rather
> straight forward, but ambiguous specification is an issue as explained in
> this bug report <https://www.w3.org/Bugs/Public/show_bug.cgi?id=21836#c2>.
> MultiEntry compound indexes are required for efficient key joining that
> involve multiEntry key.
>
> The behaviour of multiEntry attribute if array keyPath index can be
> defined by taking into account of multiEntry attribute of constituting
> indexes. Each item (string) of an array keyPath index is an index name on
> the object store, the index is called constituting index.
>
> Creating array keyPath index with optional multiEntry attribute is allowed
> and does not throw Error. When creating array keyPath index with multiEntry
> attribute set to true, but none of its constituting indexes exists or none
> of its constituting indexes has multiEntry attribute set to true, throw
> ConstraintError.
>
> If multiEntry attribute of array keyPath index is false or not exist,
> algorithm for storing a record and evaluation of keyPath value is the same
> as currently defined, but additionally each item in keyPath sequence can be
> an index name, in this case index key are referred by the constituting
> index.
>
> If multiEntry attribute of array keyPath index is true, algorithm for
> storing a record is modified such that each item in combination of keys of
> constituting indexes as its key and key as its value.
>
> As an illustrating example, support we have the following record.
>
> var human = {
>   taxon: 9606,
>   classification: ['Animalia', 'Mammalia', 'Primates'],
>   name: {
>     genus: 'Homo',
>     species: 'sapiens'
>   },
>   habitat: ['asia', 'americas', 'africa', 'europe', 'oceania']
> }
>
> store = db.createObjectStore('specie', {keyPath: 'taxon'});
> store.createIndex('clade', 'classification', {multiEntry: true});
> store.createIndex('habitat', 'habitat', {multiEntry: true});
> store.createIndex('binomen', ['name.genus', 'name.species']);
>
>
>
> The following composite index is used to list specie table.
>
> store.createIndex('specie', ['classification', 'binomen'], {unique: true, 
> multiEntry: false});
>
> It should create a index value of
>
> [['Animalia', 'Mammalia', 'Primates'], ['Homo', 'sapiens']]
>
> Notice that 'bionomen' is index name, not keyPath of record value.
>
> The following composite index is used to query specific clad order by name.
>
> store.createIndex('clad-name', ['clade', 'binomen'], {multiEntry: false});
>
> It should crate index values of
>
> ['Animalia', ['Homo', 'sapiens']]
> ['Mammalia', ['Homo', 'sapiens']]
> ['Primates', ['Homo', 'sapiens']]
>
>
> The following composite index is used to query habitant and clad.
>
>
> store.createIndex('clad-habitat', ['clade', 'habitat', 'binomen'], 
> {multiEntry: true});
> It should crate index values of
> ['Animalia', 'africa', ['Homo', 'sapiens']]
> ['Animalia', 'asia', ['Homo', 'sapiens']]
> ['Animalia', 'americas', ['Homo', 'sapiens']]
> ['Animalia', 'europe', ['Homo', 'sapiens']]
> ['Animalia', 'oceania', ['Homo', 'sapiens']]
> ['Mammalia', 'africa', ['Homo', 'sapiens']]
> ['Mammalia', 'asia', ['Homo', 'sapiens']]
> ['Mammalia', 'americas', ['Homo', 'sapiens']]
> ['Mammalia', 'europe', ['Homo', 'sapiens']]
> ['Mammalia', 'oceania', ['Homo', 'sapiens']]
> ['Mammalia', 'africa', ['Homo', 'sapiens']]
> ['Primates', 'africa', ['Homo', 'sapiens']]
> ['Primates', 'asia', ['Homo', 'sapiens']]
> ['Primates', 'americas', ['Homo', 'sapiens']]
> ['Primates', 'europe', ['Homo', 'sapiens']]
> ['Primates', 'oceania', ['Homo', 'sapiens']]
>
> Alternatively, this problem can also be solved by Bug 10000 
> <https://www.w3.org/Bugs/Public/show_bug.cgi?id=10000> using index key 
> created by expression. Expression based index is very powerful and can solve 
> many problems including full-text search index.
>
> However multiEntry compound index is common use case and this proposal is 
> expected behaviour of such index and should be baked into IndexedDB API. If 
> web developers, or wrapper library are generating multiEntry compound index 
> using expression index, handling schema changes will be nightmare.
>
>
> Best,
>
>
> Kyaw
>
>
>
>

Reply via email to