class Shameless::Index
Constants
- DataTypes
- PRIMARY
Attributes
name[R]
Public Class Methods
new(name, model, &block)
click to toggle source
# File lib/shameless/index.rb, line 9 def initialize(name, model, &block) @name = name || PRIMARY @model = model instance_eval(&block) end
Public Instance Methods
column(name, type)
click to toggle source
# File lib/shameless/index.rb, line 23 def column(name, type) @columns ||= {} @columns[name] = type end
column?(key)
click to toggle source
# File lib/shameless/index.rb, line 75 def column?(key) @columns.keys.any? {|c| c.to_s == key.to_s } end
create_tables!()
click to toggle source
# File lib/shameless/index.rb, line 63 def create_tables! @model.store.create_table!(table_name) do |t, sharded_table_name| @columns.each do |name, type| t.column name, type, null: false end t.varchar :uuid, size: 36 t.index @columns.keys, name: "#{sharded_table_name}_index", unique: true end end
full_name()
click to toggle source
# File lib/shameless/index.rb, line 49 def full_name "#{@name}_index" end
index_values(values, all_required)
click to toggle source
# File lib/shameless/index.rb, line 53 def index_values(values, all_required) (@columns.keys + [:uuid]).each_with_object({}) do |column, o| if all_required o[column] = values.fetch(column) else o[column] = values[column] if values.key?(column) end end end
prevent_readonly_attribute_mutation!(key)
click to toggle source
# File lib/shameless/index.rb, line 79 def prevent_readonly_attribute_mutation!(key) if column?(key) raise ReadonlyAttributeMutation, "The attribute #{key} cannot be modified because it's part of the #{@name} index" end end
put(values)
click to toggle source
# File lib/shameless/index.rb, line 32 def put(values) shardable_value = values.fetch(@shard_on).to_i index_values = index_values(values, true) @model.store.put(table_name, shardable_value, index_values) end
shard_on(shard_on)
click to toggle source
# File lib/shameless/index.rb, line 28 def shard_on(shard_on) @shard_on = shard_on end
table_name()
click to toggle source
# File lib/shameless/index.rb, line 45 def table_name "#{@model.table_name}_#{full_name}" end
where(query, &block)
click to toggle source
# File lib/shameless/index.rb, line 39 def where(query, &block) shardable_value = query.fetch(@shard_on).to_i query = index_values(query, false) @model.store.where(table_name, shardable_value, query, &block).map {|r| @model.new(r[:uuid]) } end