Class: Alf::Engine::Materialize::Hash
- Inherits:
-
Object
- Object
- Alf::Engine::Materialize::Hash
- Includes:
- Cog, Alf::Engine::Materialize
- Defined in:
- lib/alf/engine/materialize/hash.rb
Overview
Provides in-memory materialization through a ruby Hash.
This class acts as a Cog, that it, it is an enumerable of tuples. No particular ordering is guaranteed. In addition, the class provides indexed access through the [] method.
Materialization occurs at prepare time, with auto-prepare on first access.
Example:
rel = [
{:name => "Jones", :city => "London"},
{:name => "Smith", :city => "Paris"},
{:name => "Blake", :city => "London"}
]
op = Materialize::Hash.new(rel, AttrList[:city])
op.to_a
# => same as rel, no ordering guaranteed
op[:city => "London"].to_a
# => [
{:name => "Jones", :city => "London"},
{:name => "Blake", :city => "London"}
]
op[:city => "London"].to_a
# => [
{:name => "Jones", :city => "London"},
{:name => "Blake", :city => "London"}
]
op[:city => "Athens"].to_a
# => []
Constant Summary
Constants included from Cog
Cog::EMPTY_CHILDREN, Cog::EMPTY_OPTIONS
Instance Attribute Summary collapse
-
#allbut ⇒ Boolean
readonly
Hash on all but specified attributes?.
-
#key ⇒ AttrList
readonly
Attributes for the hash key.
-
#operand ⇒ Enumerable
readonly
The operand.
Attributes included from Compiler::Cog
Instance Method Summary collapse
-
#[](key_tuple, project = false) ⇒ Cog
Returns tuples that match a given key.
- #_each(&block) ⇒ Object
-
#clean ⇒ Object
Frees the materizalied hash.
-
#each_pair(&block) ⇒ Object
Yields indexed (key, tuples) pairs in turn.
-
#initialize(operand, key, allbut = false, expr = nil, compiler = nil) ⇒ Hash
constructor
Creates a Materialize::Hash instance.
-
#prepare ⇒ Object
Prepare through materialization of the operand as a hash.
Methods included from Cog
#arguments, #children, #each, #options, #to_s
Methods included from Compiler::Cog
#cog_orders, #orderedby?, #relation_type, #to_ascii_tree, #to_cog, #to_relation
Constructor Details
#initialize(operand, key, allbut = false, expr = nil, compiler = nil) ⇒ Hash
Creates a Materialize::Hash instance
54 55 56 57 58 59 60 |
# File 'lib/alf/engine/materialize/hash.rb', line 54 def initialize(operand, key, allbut = false, expr = nil, compiler = nil) super(expr, compiler) @operand = operand @key = key @allbut = allbut @materialized = nil end |
Instance Attribute Details
#allbut ⇒ Boolean (readonly)
Returns Hash on all but specified attributes?.
51 52 53 |
# File 'lib/alf/engine/materialize/hash.rb', line 51 def allbut @allbut end |
#key ⇒ AttrList (readonly)
Returns Attributes for the hash key.
48 49 50 |
# File 'lib/alf/engine/materialize/hash.rb', line 48 def key @key end |
#operand ⇒ Enumerable (readonly)
Returns The operand.
45 46 47 |
# File 'lib/alf/engine/materialize/hash.rb', line 45 def operand @operand end |
Instance Method Details
#[](key_tuple, project = false) ⇒ Cog
Returns tuples that match a given key.
This method returns a Cog instance in all case. En empty Cog is returned if no tuples match the key.
82 83 84 85 86 |
# File 'lib/alf/engine/materialize/hash.rb', line 82 def [](key_tuple, project = false) key_tuple = key_for(key_tuple) if project m = materialized m.has_key?(key_tuple) ? m[key_tuple] : [] end |
#_each(&block) ⇒ Object
63 64 65 66 67 |
# File 'lib/alf/engine/materialize/hash.rb', line 63 def _each(&block) materialized.each_value do |rel| rel.each(&block) end end |
#clean ⇒ Object
Frees the materizalied hash
105 106 107 |
# File 'lib/alf/engine/materialize/hash.rb', line 105 def clean @materialized = nil end |
#each_pair(&block) ⇒ Object
Yields indexed (key, tuples) pairs in turn.
70 71 72 |
# File 'lib/alf/engine/materialize/hash.rb', line 70 def each_pair(&block) materialized.each_pair(&block) end |
#prepare ⇒ Object
Prepare through materialization of the operand as a hash
91 92 93 94 95 96 97 98 99 100 |
# File 'lib/alf/engine/materialize/hash.rb', line 91 def prepare @materialized ||= begin h = ::Hash.new{|h,k| h[k] = []} operand.each do |tuple| h[key_for(tuple)] << tuple end h end self end |