class Thingfish::Metastore::Memory
An in-memory metastore for testing and tryout purposes.
Attributes
The raw Hash of metadata
Public Class Methods
Create a new MemoryMetastore, using the given storage
object to store data in. The storage
should quack like a Hash.
# File lib/thingfish/metastore/memory.rb, line 19 def initialize( storage={} ) @storage = storage end
Public Instance Methods
Apply the search :criteria from the specified options
to the collection in ds
and return the modified dataset.
# File lib/thingfish/metastore/memory.rb, line 113 def apply_search_criteria( ds, options ) if (( criteria = options[:criteria] )) criteria.each do |field, value| self.log.debug " applying criteria: %p => %p" % [ field.to_s, value ] ds = ds.select {|uuid| @storage[uuid][field.to_s] == value } end end return ds end
Apply the search :direction from the specified options
to the collection in ds
and return the modified dataset.
# File lib/thingfish/metastore/memory.rb, line 140 def apply_search_direction( ds, options ) ds.reverse! if options[:direction] && options[:direction] == 'desc' return ds end
Apply the search :limit from the specified options
to the collection in ds
and return the modified dataset.
# File lib/thingfish/metastore/memory.rb, line 148 def apply_search_limit( ds, options ) if (( limit = options[:limit] )) self.log.debug " limiting to %s results" % [ limit ] offset = options[:offset] || 0 ds = ds.to_a.slice( offset, limit ) end return ds end
Apply the search :order from the specified options
to the collection in ds
and return the modified dataset.
# File lib/thingfish/metastore/memory.rb, line 127 def apply_search_order( ds, options ) if (( fields = options[:order] )) ds = ds.to_a.sort_by do |uuid| @storage[ uuid ].values_at( *fields.compact ).map {|val| val || ''} end end return ds end
Iterate over the OID of each entry in the store, yielding to the block if one is given or returning an Enumerator if one is not.
# File lib/thingfish/metastore/memory.rb, line 37 def each_oid( &block ) return @storage.each_key( &block ) end
Fetch the data corresponding to the given oid
as a Hash-ish object.
# File lib/thingfish/metastore/memory.rb, line 50 def fetch( oid, *keys ) oid = normalize_oid( oid ) metadata = @storage[ oid ] or return nil if keys.empty? self.log.debug "Fetching metadata for OID %s" % [ oid ] return metadata.dup else self.log.debug "Fetching metadata for %p for OID %s" % [ keys, oid ] keys = normalize_keys( keys ) values = metadata.values_at( *keys ) return Hash[ [keys, values].transpose ] end end
Fetch the value of the metadata associated with the given key
for the specified oid
.
# File lib/thingfish/metastore/memory.rb, line 68 def fetch_value( oid, key ) oid = normalize_oid( oid ) key = normalize_key( key ) data = @storage[ oid ] or return nil return data[ key ] end
Returns true
if the metastore has metadata associated with the specified oid
.
# File lib/thingfish/metastore/memory.rb, line 188 def include?( oid ) oid = normalize_oid( oid ) return @storage.include?( oid ) end
Update the metadata for the given oid
with the specified values
hash.
# File lib/thingfish/metastore/memory.rb, line 160 def merge( oid, values ) oid = normalize_oid( oid ) values = normalize_keys( values ) @storage[ oid ].merge!( values ) end
Return an Array of all stored OIDs.
# File lib/thingfish/metastore/memory.rb, line 30 def oids return @storage.keys end
Remove all metadata associated with oid
from the Metastore.
# File lib/thingfish/metastore/memory.rb, line 168 def remove( oid, *keys ) oid = normalize_oid( oid ) if keys.empty? @storage.delete( oid ) else keys = normalize_keys( keys ) @storage[ oid ].delete_if {|key, _| keys.include?(key) } end end
Remove all metadata associated with oid
except for the specified keys
.
# File lib/thingfish/metastore/memory.rb, line 180 def remove_except( oid, *keys ) oid = normalize_oid( oid ) keys = normalize_keys( keys ) @storage[ oid ].keep_if {|key,_| keys.include?(key) } end
Save the metadata
Hash for the specified oid
.
# File lib/thingfish/metastore/memory.rb, line 43 def save( oid, metadata ) oid = normalize_oid( oid ) @storage[ oid ] = metadata.dup end
Search the metastore for UUIDs which match the specified criteria
and return them as an iterator.
# File lib/thingfish/metastore/memory.rb, line 87 def search( options={} ) ds = @storage.each_key self.log.debug "Starting search with %p" % [ ds ] ds = self.omit_related_resources( ds, options ) ds = self.apply_search_criteria( ds, options ) ds = self.apply_search_order( ds, options ) ds = self.apply_search_direction( ds, options ) ds = self.apply_search_limit( ds, options ) return ds.to_a end
Returns the number of objects the store contains.
# File lib/thingfish/metastore/memory.rb, line 195 def size return @storage.size end