Multi-Index Containers

A

Avdi Grimm

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
Developer Blog: http://avdi.org/devblog/
Twitter: http://twitter.com/avdi
Journal: http://avdi.livejournal.com
 
R

Robert Klemme

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?

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,769
Messages
2,569,579
Members
45,053
Latest member
BrodieSola

Latest Threads

Top