Re: Proposal: New CollationKey Byte Representation API additions

syn wee <[email protected]>
Newsgroups gmane.comp.lib.icu.general
Message-ID <[email protected]>
Hi Geoff,

Yes, I agree, we would have to add extra APIs to allow reuse of 
UCharacterIterator.
I have just submitted a jitterbug under your name for the 2 proposed API
public RawCollationKey getRawCollationKey(UCharacterIterator source, 
RawCollationKey key)
public RawCollationKey getRawCollationKey(char[] source, RawCollationKey 
key)
The bug number is 3270.
http://www.jtcsv.com/cgibin/icu-bugs?findid=3270

Syn Wee.

Geoff Mottram wrote:

> You may file the proposal under my name if you like. Since you are 
> defining the UCharacterIterator class, it would be a huge improvement 
> if you could create an instance with a character array in addition to 
> a CharacterIterator (which introduces too much method calling overhead 
> -- one call per character). It would be an additional improvement if 
> there was a way to reuse the UCharacterIterator instances. Something 
> like a reset() function that takes a character array. Finally, if you 
> could add a version of getRawCollationKey() that takes a 
> UCharacterIterator as a source string, things would really start cooking.
>
> public RawCollationKey getRawCollationKey(UCharacterIterator source,
>     RawCollationKey key)
>
> My need for speed has a lot to do with the way I am using the ICU. In 
> addition to building traditional database indexes, I am also 
> constructing keyword indexes. The latter requires parsing out separate 
> words from a record and building a key for each word. This can easily 
> mean creating thousands of collation keys for a single record. 
> Reducing the overhead of unnecessary object creation becomes 
> increasingly important as the number of objects multiplies. I try to 
> reuse objects and eliminate object sharing (to remove the need for 
> synchronization) as much as possible.
>
> Thanks again.
>
> Geoff Mottram
> Minaret Corp.
> [email protected]
>
>
>> Internally, the ICU4J collation module uses Strings and 
>> CharacterIterators instead of character arrays. 
>> CollationElementIterators are used to calculate the collation 
>> elements of each character, and to traverse the source text 
>> CollationElementIterator uses the class CharacterIterator.
>>
>> This would change with jitterbug 2212, due for release 2.8, where 
>> ICU4J collation will migrate to using 
>> com.ibm.icu.text.UCharacterIterator instead. 
>> http://www.jtcsv.com/cgibin/private/icu-bugs-private/collation?id=2212.
>>
>> With the migration to using com.ibm.icu.text.UCharacterIterator, it 
>> will be alot easier for us to add the method you proposed.
>>
>> I would like file a seperate jitterbug for this proposed method, and 
>> if you are interested I can file it under your name, so that the 
>> implementor of the jitterbug could contact you directly if there are 
>> any issues involved.
>>
>> Syn Wee.
>>
>> Geoff Mottram wrote:
>>
>>> This would be a really useful enhancement to the ICU.
>>>
>>> Since you are almost certainly converting any String arguments into 
>>> character arrays internally, is there any chance of adding the 
>>> following as well?
>>>
>>> public RawCollationKey getRawCollationKey(char [] source, int offset,
>>>     int count, RawCollationKey key)
>>>
>>> It's a shame if the caller has a character array (for efficiency) to 
>>> have to create a String to pass to the ICU which then allocates a 
>>> character array. Even if the ICU is using an internal buffer and not 
>>> allocating one every time, couldn't it just as well copy from a 
>>> source array instead of a String?
>>>
>>> Thanks.
>>>
>>> Geoff Mottram
>>> Minaret Corp.
>>> [email protected]
>>>
>>>
>>> syn wee wrote:
>>>
>>>> Proposal: Addition of ByteArrayWrapper class, RawCollationKey class 
>>>> and getRawCollationKey method.
>>>>
>>>> Please respond with comments by Oct 3rd 2003.
>>>>
>>>> This proposal is related to jitterbug 2732, 
>>>> http://www.jtcsv.com/cgibin/icu-bugs?findid=2732.
>>>>
>>>> ICU recommends the use and storage of CollationKeys in a system 
>>>> where comparison are to be done to the same String multiple times. 
>>>> See 
>>>> http://oss.software.ibm.com/icu4j/doc/com/ibm/icu/text/RuleBasedCollator.html#getCollationKey(java.lang.String). 
>>>>
>>>> However, calling the current getCollationKey() method creates a new 
>>>> CollationKey object everytime and access to the internal 
>>>> CollationKey byte representation returns a copy of the byte array. 
>>>> To enable further optimization for speed critical systems, ICU 
>>>> proposes the following classes and method to allow user a more 
>>>> direct access to the byte representation of the CollationKey.
>>>>
>>>> New class ByteArrayWrapper to reside in package com.ibm.icu.util
>>>> /**
>>>> * A simple wrapper utility class
>>>> */
>>>> public class ByteArrayWrapper {
>>>>    public byte[] bytes;
>>>>    /**
>>>>     * Size of the internal byte array used. Different from 
>>>> bytes.length, size will be <= bytes.length.
>>>>     */
>>>>    public int size;
>>>>    /**
>>>>     *Ensure that the byte array is at least of length 
>>>> minCapacity.     *If the byte array is null or its length is less 
>>>> than minCapacity, a new byte array of
>>>>     * length minCapacity will be allocated.  The contents of the 
>>>> array (between 0 and size)
>>>>     * remain unchanged.
>>>>     */
>>>>    public void ensureCapacity(int capacity)
>>>> }
>>>>
>>>> New class RawCollationKey to reside in package com.ibm.icu.text.
>>>>
>>>> /**
>>>> * Simple class wrapper to store the internal byte representation of 
>>>> a CollationKey.
>>>> * Unlike the CollationKey, this class do not contain information on 
>>>> the source
>>>> * string the sort order represents.
>>>> * RawCollationKey is mutable and users can reuse its objects with 
>>>> the method in
>>>> * RuleBasedCollator.getRawCollationKey(..).
>>>> */
>>>> public final class RawCollationKey extends ByteArrayWrapper {
>>>>    /**
>>>>     * Default constructor, internal byte array is null
>>>>     */
>>>>    public RawCollationKey() {
>>>>    /**
>>>>     * RawCollationKey created with a internal byte array of length 
>>>> capacity
>>>>     */
>>>>    public RawCollationKey(int capacity) {
>>>>    /**
>>>>     * RawCollationKey created with a internal byte array bytes
>>>>     */
>>>>    public RawCollationKey(byte[] bytes) {
>>>>    /**
>>>>     * Compares 2 RawCollationKey objects.
>>>>     * @return 0 if the sort order is the same,
>>>>     *                 <0 if this RawCollationKey has a smaller sort 
>>>> order than target,
>>>>     *                 >0 if this RawCollationKey has a bigger sort 
>>>> order than target.
>>>>     */
>>>>    public int compare(RawCollationKey target) {
>>>> }
>>>>
>>>> New method getRawCollationKey to reside in the class 
>>>> com.ibm.icu.text.RuleBasedCollator
>>>> /**
>>>> * Calculates the sort order of the String source and stores the 
>>>> byte array representation of
>>>> * the key into the user provided argument.
>>>> * If key has a internal byte array of length that's too small for 
>>>> the result,
>>>> * the internal byte array will be grown to the exact required size.
>>>> * @return If key is null, a new instance of RawCollationKey will be 
>>>> created and returned,
>>>> *                otherwise the user provided key will be returned.
>>>> * @see #getCollationKey
>>>> */
>>>> public RawCollationKey getRawCollationKey(String source, 
>>>> RawCollationKey key)
>>>>
>>>> Example of use:
>>>>
>>>> RuleBasedCollator collator = 
>>>> (RuleBasedCollator)Collator.getInstance();
>>>> RawCollationKey key = new RawCollationKey(128);
>>>> for (int i = 0; i < str.length; i ++) {
>>>>    collator.getRawCollationKey(str[i], key);
>>>>    // do something with key.bytes
>>>> }
>>>>
>>>> _______________________________________________
>>>> icu mailing list
>>>> [email protected]
>>>> http://oss.software.ibm.com/developerworks/oss/mailman/listinfo/icu
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> icu mailing list
>>> [email protected]
>>> http://oss.software.ibm.com/developerworks/oss/mailman/listinfo/icu
>>>
>>>
>>
>
> _______________________________________________
> icu mailing list
> [email protected]
> http://oss.software.ibm.com/developerworks/oss/mailman/listinfo/icu
>
>
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.