# Multi-Index Containers

**URL:** <https://www.ruby-forum.com/t/multi-index-containers/154557>\
**Category:** Ruby\
**Created:** [December 1, 2008, 4:59pm UTC](https://www.ruby-forum.com/t/multi-index-containers/154557 "2008-12-01T16:59:39Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![avdi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c6cbf5/32.png) [@avdi](https://www.ruby-forum.com/u/avdi)\
**Post date:** [December 1, 2008, 4:59pm UTC](https://www.ruby-forum.com/t/multi-index-containers/154557/1 "2008-12-01T16:59:39Z")

</div>

Does anyone know of a multi-index container library for Ruby? I just  
want to check before I put it on my personal TODO list.

By multi-index, I mean a container which will index its contained  
objects by more than one attribute. E.g. something along these lines:

mi = MultiIndex.new  
mi.add\_index(:prefix) {|val| val[0,3]}  
mi.add\_index(:size)

mi \<\< “foobar”  
mi \<\< “foobaz”  
mi \<\< “fuzz”  
mi \<\< “fuzzbizz”

mi.by\_prefix(“foo”) # =\> [“foobar”, “foobaz”]  
mi.by\_prefix(“fuz”) # =\> [“fuzz”, “fuzzbizz”]  
mi.by\_size(4) # =\> [“fuzz”]  
mi.by\_size(8) #= [“fuzzbizz”]

Yes, I know I can just uses #select on Ruby’s existing containers, but  
the idea here is that a MultiIndex would index each attribute on  
insert, making lookups faster than using a #select.

So: does this exist?

–  
Avdi

Home: [http://avdi.org](http://avdi.org)  
Developer Blog: [Avdi Grimm, Code Cleric](http://avdi.org/devblog/)  
Twitter: [http://twitter.com/avdi](http://twitter.com/avdi)  
Journal: [http://avdi.livejournal.com](http://avdi.livejournal.com)

---

<div class="post-metadata">

**Author:** ![avdi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c6cbf5/32.png) [@avdi](https://www.ruby-forum.com/u/avdi)\
**Post date:** [December 1, 2008, 6:06pm UTC](https://www.ruby-forum.com/t/multi-index-containers/154557/2 "2008-12-01T18:06:01Z")

</div>

On Dec 1, 2008, at 8:53 AM, Avdi G. wrote:

> By multi-index, I mean a container which will index its contained  
> objects by more than one attribute. E.g. something along these lines:

gem install rbtree

a @ [http://codeforpeople.com/](http://codeforpeople.com/)

---

<div class="post-metadata">

**Author:** ![avdi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c6cbf5/32.png) [@avdi](https://www.ruby-forum.com/u/avdi)\
**Post date:** [December 1, 2008, 6:13pm UTC](https://www.ruby-forum.com/t/multi-index-containers/154557/3 "2008-12-01T18:13:59Z")

</div>

On Mon, Dec 1, 2008 at 11:59 AM, ara.t.howard [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid)  
wrote:

> gem install rbtree

I’m not sure I understand how a Red/Black Tree covers indexing by  
multiple, arbitrary, potentially dynamic attributes.

–  
Avdi

Home: [http://avdi.org](http://avdi.org)  
Developer Blog: [Avdi Grimm, Code Cleric](http://avdi.org/devblog/)  
Twitter: [http://twitter.com/avdi](http://twitter.com/avdi)  
Journal: [http://avdi.livejournal.com](http://avdi.livejournal.com)

---

<div class="post-metadata">

**Author:** ![avdi](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/c6cbf5/32.png) [@avdi](https://www.ruby-forum.com/u/avdi)\
**Post date:** [December 1, 2008, 11:25pm UTC](https://www.ruby-forum.com/t/multi-index-containers/154557/4 "2008-12-01T23:25:59Z")

</div>

On 01.12.2008 16:53, Avdi G. wrote:

> mi \<\< “foobar”  
> the idea here is that a MultiIndex would index each attribute on  
> insert, making lookups faster than using a #select.
> 
> So: does this exist?

I haven’t seen it so far. Basically this would mimic what a relational  
DB does in memory.

Not difficult to write though.

class Table  
def initialize(index\_keys)  
@indexes =  
index\_keys.inject({}) do |idx,key|  
idx[key]= Hash.new {|h,k| h[k]=[]}  
idx  
end  
end

def add(o)  
@indexes.each do |key,idx|  
if Array === key  
idx[o.send(key)] \<\< o  
else  
idx[key.map{|k| o.send(k)}] \<\< o  
end  
end  
self  
end  
end

Kind regards

robert
