Sha256: e41af8a96cda5e4bfcaf416356cdf265381403be97ea4b1537cd321891031719
Contents?: true
Size: 1.72 KB
Versions: 2
Compression:
Stored size: 1.72 KB
Contents
module GreyscaleRecord module DataStore class Table attr_accessor :name def initialize(name, store) @name = name @store = store # initialize the index array for later use @indices = {} # generate IDs for the records based on YAML keys generate_ids! # preemptively index the IDs add_index :id end def all rows.values end def add_index( column ) return if @store.patched? @indices = @indices.merge( { column => Index.new(column, rows) } ) end def find( params = {} ) return all if params.empty? sets = params.map do | column, values | if !patched? && indexed?( column ) find_in_index column, values else GreyscaleRecord.logger.warn "You are running a query on #{@name}.#{column} which is not indexed. This will perform a table scan." find_in_column column, values end end sets.inject( sets.first ) do |result, subset| result & subset end end private def rows @store[@name] end def patched? @store.patched? end def indexed?(column) @indices[column].present? end def find_in_column( column, values ) rows.values.select do |datum| Array( values ).include? datum[ column ] end end def find_in_index( column, values ) keys = @indices[column].find( Array( values ) ) keys.map do |id| rows[id] end end def generate_ids! # init IDs rows.each do |k, v| v[:id] = k end end end end end
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
greyscale_record-1.0.3 | lib/greyscale_record/data_store/table.rb |
greyscale_record-1.0.2 | lib/greyscale_record/data_store/table.rb |