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