You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by Paul Feuer <pa...@gmail.com> on 2006/04/12 01:37:52 UTC

[collections] proposed new features - MapIndexing, MapPartitioning

Hi all,

(I looked at various FAQ's and some previous mailing list answers to
"I want to contribute" and I hope I do it right ;)

I'm a fan of collections and use it all over the place, but have a two
of functions I'd like to propose. I use these functions in some
operations of Collections of Maps that are returned by our database
layer at work. (The proposed code, however, is not the property of the
company - it was specially developed for including in the commons
project.)

I'm not sure if org.apache.commons.collections.functors is the best
place for these, but the map package seemed to be only Map
implementations, so the functors package seemed like a better home.
Tho I was surprised to see no TestCases in the functors package.

The indexing operation has come in handy when sending DB results out
to a JSP - transforming it this way allows easy keyed access to each
record.

The partitioning operation is useful when we need to bucket groups of records.

In each case, it could be argued that, given a large enough
collection, someone would not want to repeat the traversal of the
collection if they were going to do addition per-record processing,
but the same could be said for a lot of the Transformer
implementations. They're great commodity operations.

Links are provided to my proposed implementations and test cases below:
http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/index.html

Let me know if this is not the right approach to contributing!! I'm
looking to get involved and want to do it right!

cheers,

./paul

--------------------------------------------
1) MapIndexingTransformer
proposed package: org.apache.commons.collections.functors (?)
link: http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/MapIndexingTransformer.java.html
http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/TestMapIndexingTransformer.java.html

Transforms a Collection of Maps into a Map using a value of each Map
to key that Map in the output.

In pseudocode:
   indexValueToMapMap = Map
   for each record in input Collection
       get value from record at indexKey
       indexValueToMapMap[ index ] = record

Thus the input:
  Collection [
       Map[ "ID"=1, "NAME"="Paul" ],
       Map[ "ID"=2, "NAME"="Kim" ]
   ]

is indexed on "ID" into
   Map [
       1 = Map[ "ID"=1, "NAME"="Paul" ],
       2 = Map[ "ID"=2, "NAME"="Kim" ]
   ]

--------------------------------------------
2) MapPartitioningTransformer
proposed package: org.apache.commons.collections.functors (?)
link: http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/MapPartitioningTransformer.java.html
http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/TestMapPartitioningTransformer.java.html


Transform a Collection of Maps by grouping together those Maps that
share a common value for some key. In other words, the input to this
Transformer is a Collection of Maps as you might see coming from a
database, and for each of the records, they may share some common
value at a given key. "Partitioning on that value" will create
collections for each unique value of that key in the input collection.

In pseudocode:

partitionNameToCollection = Map

for each record of inputCollection
   get value as partitionName from record at partitionKey
   with partitionNameToCollection add record at partitionName

return partitionNameToCollection

Thus the input:

Collection[
    Map[ "ID"=1, "GROUP"="New York City", "NAME"="Paul" ]
    Map[ "ID"=2, "GROUP"="New York City", "NAME"="Kim" ]
    Map[ "ID"=3, "GROUP"="Atlanta", "NAME"="Marcia" ]
    Map[ "ID"=4, "GROUP"="Atlanta", "NAME"="Will" ]
]

is partitioned on "GROUP" into:

Map[
    "group1" = Collection[
                 Map[ "ID"=1, "GROUP"="New York City", "NAME"="Paul" ]
                 Map[ "ID"=2, "GROUP"="New York City", "NAME"="Kim" ]
               ]
    "group2" = Collection[
                 Map[ "ID"=3, "GROUP"="Atlanta", "NAME"="Marcia" ]
                 Map[ "ID"=4, "GROUP"="Atlanta", "NAME"="Will" ]
               ]
]

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Re: [collections] proposed new features - MapIndexing, MapPartitioning

Posted by Stephen Smith <st...@stephen-smith.co.uk>.
+1 for the idea of a SourceForge project dedicated to functors 
implementations - anything that reduces the number of chained If 
statements out there can only be a good thing. :)
--
Stephen Smith, MEng (Wales).
http://www.stephen-smith.co.uk/

Stephen Colebourne wrote:
> Hi Paul,
> Thanks for your proposal. I took a look, and it seems like an intriguing 
> idea.
> 
> However, they are really too specific for [collections] itself. The 
> functor package in [collections] has to try and stay focussed on just 
> the very basic functors, as there are literally thousands of possible 
> good implementations out there.
> 
> Maybe someone should startup a sourceforge fuctor implementations project!
> 
> Stephen
> 
> 
> Paul Feuer wrote:
>> Hi all,
>>
>> (I looked at various FAQ's and some previous mailing list answers to
>> "I want to contribute" and I hope I do it right ;)
>>
>> I'm a fan of collections and use it all over the place, but have a two
>> of functions I'd like to propose. I use these functions in some
>> operations of Collections of Maps that are returned by our database
>> layer at work. (The proposed code, however, is not the property of the
>> company - it was specially developed for including in the commons
>> project.)
>>
>> I'm not sure if org.apache.commons.collections.functors is the best
>> place for these, but the map package seemed to be only Map
>> implementations, so the functors package seemed like a better home.
>> Tho I was surprised to see no TestCases in the functors package.
>>
>> The indexing operation has come in handy when sending DB results out
>> to a JSP - transforming it this way allows easy keyed access to each
>> record.
>>
>> The partitioning operation is useful when we need to bucket groups of 
>> records.
>>
>> In each case, it could be argued that, given a large enough
>> collection, someone would not want to repeat the traversal of the
>> collection if they were going to do addition per-record processing,
>> but the same could be said for a lot of the Transformer
>> implementations. They're great commodity operations.
>>
>> Links are provided to my proposed implementations and test cases below:
>> http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/index.html 
>>
>>
>> Let me know if this is not the right approach to contributing!! I'm
>> looking to get involved and want to do it right!
>>
>> cheers,
>>
>> ./paul
>>
>> --------------------------------------------
>> 1) MapIndexingTransformer
>> proposed package: org.apache.commons.collections.functors (?)
>> link: 
>> http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/MapIndexingTransformer.java.html 
>>
>> http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/TestMapIndexingTransformer.java.html 
>>
>>
>> Transforms a Collection of Maps into a Map using a value of each Map
>> to key that Map in the output.
>>
>> In pseudocode:
>>    indexValueToMapMap = Map
>>    for each record in input Collection
>>        get value from record at indexKey
>>        indexValueToMapMap[ index ] = record
>>
>> Thus the input:
>>   Collection [
>>        Map[ "ID"=1, "NAME"="Paul" ],
>>        Map[ "ID"=2, "NAME"="Kim" ]
>>    ]
>>
>> is indexed on "ID" into
>>    Map [
>>        1 = Map[ "ID"=1, "NAME"="Paul" ],
>>        2 = Map[ "ID"=2, "NAME"="Kim" ]
>>    ]
>>
>> --------------------------------------------
>> 2) MapPartitioningTransformer
>> proposed package: org.apache.commons.collections.functors (?)
>> link: 
>> http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/MapPartitioningTransformer.java.html 
>>
>> http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/TestMapPartitioningTransformer.java.html 
>>
>>
>>
>> Transform a Collection of Maps by grouping together those Maps that
>> share a common value for some key. In other words, the input to this
>> Transformer is a Collection of Maps as you might see coming from a
>> database, and for each of the records, they may share some common
>> value at a given key. "Partitioning on that value" will create
>> collections for each unique value of that key in the input collection.
>>
>> In pseudocode:
>>
>> partitionNameToCollection = Map
>>
>> for each record of inputCollection
>>    get value as partitionName from record at partitionKey
>>    with partitionNameToCollection add record at partitionName
>>
>> return partitionNameToCollection
>>
>> Thus the input:
>>
>> Collection[
>>     Map[ "ID"=1, "GROUP"="New York City", "NAME"="Paul" ]
>>     Map[ "ID"=2, "GROUP"="New York City", "NAME"="Kim" ]
>>     Map[ "ID"=3, "GROUP"="Atlanta", "NAME"="Marcia" ]
>>     Map[ "ID"=4, "GROUP"="Atlanta", "NAME"="Will" ]
>> ]
>>
>> is partitioned on "GROUP" into:
>>
>> Map[
>>     "group1" = Collection[
>>                  Map[ "ID"=1, "GROUP"="New York City", "NAME"="Paul" ]
>>                  Map[ "ID"=2, "GROUP"="New York City", "NAME"="Kim" ]
>>                ]
>>     "group2" = Collection[
>>                  Map[ "ID"=3, "GROUP"="Atlanta", "NAME"="Marcia" ]
>>                  Map[ "ID"=4, "GROUP"="Atlanta", "NAME"="Will" ]
>>                ]
>> ]
>>
>> ---------------------------------------------------------------------
>> To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
>> For additional commands, e-mail: commons-dev-help@jakarta.apache.org
>>
>>
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: commons-dev-help@jakarta.apache.org
> 
> 
> 


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Re: [collections] proposed new features - MapIndexing, MapPartitioning

Posted by Stephen Colebourne <sc...@btopenworld.com>.
Hi Paul,
Thanks for your proposal. I took a look, and it seems like an intriguing 
idea.

However, they are really too specific for [collections] itself. The 
functor package in [collections] has to try and stay focussed on just 
the very basic functors, as there are literally thousands of possible 
good implementations out there.

Maybe someone should startup a sourceforge fuctor implementations project!

Stephen


Paul Feuer wrote:
> Hi all,
> 
> (I looked at various FAQ's and some previous mailing list answers to
> "I want to contribute" and I hope I do it right ;)
> 
> I'm a fan of collections and use it all over the place, but have a two
> of functions I'd like to propose. I use these functions in some
> operations of Collections of Maps that are returned by our database
> layer at work. (The proposed code, however, is not the property of the
> company - it was specially developed for including in the commons
> project.)
> 
> I'm not sure if org.apache.commons.collections.functors is the best
> place for these, but the map package seemed to be only Map
> implementations, so the functors package seemed like a better home.
> Tho I was surprised to see no TestCases in the functors package.
> 
> The indexing operation has come in handy when sending DB results out
> to a JSP - transforming it this way allows easy keyed access to each
> record.
> 
> The partitioning operation is useful when we need to bucket groups of records.
> 
> In each case, it could be argued that, given a large enough
> collection, someone would not want to repeat the traversal of the
> collection if they were going to do addition per-record processing,
> but the same could be said for a lot of the Transformer
> implementations. They're great commodity operations.
> 
> Links are provided to my proposed implementations and test cases below:
> http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/index.html
> 
> Let me know if this is not the right approach to contributing!! I'm
> looking to get involved and want to do it right!
> 
> cheers,
> 
> ./paul
> 
> --------------------------------------------
> 1) MapIndexingTransformer
> proposed package: org.apache.commons.collections.functors (?)
> link: http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/MapIndexingTransformer.java.html
> http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/TestMapIndexingTransformer.java.html
> 
> Transforms a Collection of Maps into a Map using a value of each Map
> to key that Map in the output.
> 
> In pseudocode:
>    indexValueToMapMap = Map
>    for each record in input Collection
>        get value from record at indexKey
>        indexValueToMapMap[ index ] = record
> 
> Thus the input:
>   Collection [
>        Map[ "ID"=1, "NAME"="Paul" ],
>        Map[ "ID"=2, "NAME"="Kim" ]
>    ]
> 
> is indexed on "ID" into
>    Map [
>        1 = Map[ "ID"=1, "NAME"="Paul" ],
>        2 = Map[ "ID"=2, "NAME"="Kim" ]
>    ]
> 
> --------------------------------------------
> 2) MapPartitioningTransformer
> proposed package: org.apache.commons.collections.functors (?)
> link: http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/MapPartitioningTransformer.java.html
> http://fe4.com/opensrc/apache/org/apache/commons/collections/functors/TestMapPartitioningTransformer.java.html
> 
> 
> Transform a Collection of Maps by grouping together those Maps that
> share a common value for some key. In other words, the input to this
> Transformer is a Collection of Maps as you might see coming from a
> database, and for each of the records, they may share some common
> value at a given key. "Partitioning on that value" will create
> collections for each unique value of that key in the input collection.
> 
> In pseudocode:
> 
> partitionNameToCollection = Map
> 
> for each record of inputCollection
>    get value as partitionName from record at partitionKey
>    with partitionNameToCollection add record at partitionName
> 
> return partitionNameToCollection
> 
> Thus the input:
> 
> Collection[
>     Map[ "ID"=1, "GROUP"="New York City", "NAME"="Paul" ]
>     Map[ "ID"=2, "GROUP"="New York City", "NAME"="Kim" ]
>     Map[ "ID"=3, "GROUP"="Atlanta", "NAME"="Marcia" ]
>     Map[ "ID"=4, "GROUP"="Atlanta", "NAME"="Will" ]
> ]
> 
> is partitioned on "GROUP" into:
> 
> Map[
>     "group1" = Collection[
>                  Map[ "ID"=1, "GROUP"="New York City", "NAME"="Paul" ]
>                  Map[ "ID"=2, "GROUP"="New York City", "NAME"="Kim" ]
>                ]
>     "group2" = Collection[
>                  Map[ "ID"=3, "GROUP"="Atlanta", "NAME"="Marcia" ]
>                  Map[ "ID"=4, "GROUP"="Atlanta", "NAME"="Will" ]
>                ]
> ]
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: commons-dev-help@jakarta.apache.org
> 
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org