Okay, here's a fixed version.

There were 2 problems. The first was that I forgot to remove the bad
(unmatched) hashes before returning a result. The second was that you
have to go through every key in the template to find a match (I was
returning after the first match). Thus find is no more efficient than
select due to the way the data is stored.

I also took out the 'unless bad.include? hash' clause from the compare
because I think it actually is slower that way, depending on what you
are comparing. I thought it would be faster than the original version
posted because I don't have to generate a set of candidates first, so
the initial benchmarks were disappointing. But maybe this version will
do even better. I look forward to seeing your results.

---

  # new version of select
  def select(template)
    good = Set.new; bad = Set.new
    template.each do |key,val1|
      (@c[key]).each do |val2,hash|
        ( val1 === val2 ? good : bad ) << hash # unless bad.include?
hash
      end
    end
    return (good - bad).to_a
  end

  # new version of find
  def find(template)
    r = select template
    r.first unless r.empty?
  end


---

Regards,
Dan


On Dec 19, 2:23 pm, Christophe Mckeon <chromatoph... / gmail.com> wrote:
> there's a bug in yours. not sure where yet. try
>
> d = DB.new
> d << {:a => 2, :b => 1, :c => 'b'}
> puts d.find({ :a => Numeric, :b => 'a' }).inspect
>
> returns {:a => 2, :b => 1, :c => 'b'}
>
> --
> Posted viahttp://www.ruby-forum.com/.