I think I am missing/not understanding your direction.

are there still 4 new types?

/mikem

Daniel John Debrunner wrote:
Mamta Satoor wrote:

Ok, so I spent some time trying to move COLLATION attribute code from DataDictionaryImpl.boot to DataValueFactoryImpl.boot. I thought I could simply put following piece of code in DataValueFactoryImpl.boot method and the Property.COLLATION will get saved in the properties conglomerate.


I think some of this goes back to the intended implementation.

The intended implementation seems to be that there will be variants of the four character datatypes with locale based collation. This is four new (internal) datatypes in Derby that share most code with the existing CHAR, VARCHAR, LONG VARCHHAR and CLOB types.

I'm not sure this is the correct approach.

My first thought is that this doesn't scale and doesn't seem like an OO solution. To think ahead this means any addition collation style will also add four new datatypes, which means there could easily be sixteen or more datatypes to represent the characters. Each datatype will come with some code cost, classes and/or methods per type.

My second concern is that many places get characters and the change must ensure they get the correct datatype, apart from potentially being a lot of work, the chance of missing some or picking the wrong character types seems high.

What is really required is 'character type + collation'. I've been thinking that looking at the problem in this way may make it more manageable and easier to contain, with the main idea being only worry about collation type when actually performing a collation. So some initial ideas:

- collation is a attribute of DataTypeDescriptor, not valid for non character types, 0 for UCS_BASIC, 1 for UNICODE etc.
       int getCollationType();

- A method on DataValueFactory, returns null if type is UCS_BASIC
       RuleBasedCollator getCharacterCollator(int type)

- A method on StringDataValue
       StringDataValue getValue(RuleBasedCollator collator)

       For SQLChar:
            getValue(null) would return itself
getValue(non-null) would return a new CollateSQLChar() with the value of the SQLChar and the collator set.

       For CollatorSQLChar
getValue(null) would return a new SQLChar() with the value of the CollateSQLChar getValue(non-null) would return itself with the collator set correctly.

- The collation type (the integer) is written into the meta-data for an index just as ascending/descending is today (including the btree control row, thus making the information available for recovery). Collation type applies to all character columns in the index.

- At SQL collation time, the code generation sets up the various types correctly using the new methods.

- At recovery time the btree uses the collation type and the data value factory to setup its template row array correctly. Something like
     for each dvd in row array
        if (dvd instanceof StringDataValue)
             dvd = dvd.getValue(dvf.getCharacterCollator(type));



- setting the collation property remains in the data dictionary

- basic database sets the locale for the DataValueFactory after it boots it, using a new method on DVF
        void setLocale(Locale locale);

I think approaching the problem this way will lead to a cleaner solution in the long term and be somewhat easier to implement.

Thanks,
Dan.







Reply via email to