lib/rom/adapter/memory/dataset.rb in rom-0.4.2 vs lib/rom/adapter/memory/dataset.rb in rom-0.5.0
- old
+ new
@@ -1,9 +1,8 @@
module ROM
class Adapter
class Memory < Adapter
-
class Dataset
include Charlatan.new(:data)
attr_reader :header
@@ -20,20 +19,35 @@
def each(&block)
return to_enum unless block
data.each(&block)
end
- def restrict(criteria = nil, &block)
+ def join(*args)
+ left, right = args.size > 1 ? args : [self, args.first]
+
+ join_map = left.to_a.each_with_object({}) { |tuple, h|
+ others = right.to_a.find_all { |t| (tuple.to_a & t.to_a).any? }
+ (h[tuple] ||= []).concat(others)
+ }
+
+ tuples = left.map { |tuple|
+ join_map[tuple].map { |other| tuple.merge(other) }
+ }.flatten
+
+ self.class.new(tuples, left.header + right.header)
+ end
+
+ def restrict(criteria = nil)
if criteria
- find_all { |tuple| criteria.all? { |k, v| tuple[k] == v } }
+ find_all { |tuple| criteria.all? { |k, v| tuple[k].eql?(v) } }
else
find_all { |tuple| yield(tuple) }
end
end
def project(*names)
- map { |tuple| tuple.reject { |key,_| names.include?(key) } }
+ map { |tuple| tuple.reject { |key| !names.include?(key) } }
end
def order(*names)
sort_by { |tuple| tuple.values_at(*names) }
end
@@ -45,11 +59,9 @@
def delete(tuple)
data.delete(tuple)
self
end
-
end
-
end
end
end