Sha256: b5206fca289fdb22c38867ec6c27ff72b45e7ae13dfef0cd9f145b5e2b71e4d7
Contents?: true
Size: 1.7 KB
Versions: 2
Compression:
Stored size: 1.7 KB
Contents
module GreyscaleRecord module DataStore class Table 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.1 | lib/greyscale_record/data_store/table.rb |
greyscale_record-1.0.0 | lib/greyscale_record/data_store/table.rb |