Class: Terrestrial::Adapters::MemoryAdapter

Inherits:
Object
  • Object
show all
Includes:
AbstractAdapter
Defined in:
lib/terrestrial/adapters/memory_adapter.rb

Defined Under Namespace

Classes: DuplicateKeyError, Query, Relation, Upsert

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(schema, relations) ⇒ MemoryAdapter

Returns a new instance of MemoryAdapter.



17
18
19
20
# File 'lib/terrestrial/adapters/memory_adapter.rb', line 17

def initialize(schema, relations)
  @schema = schema
  @relations = relations
end

Class Method Details

.build_from_schema(schema, raw_storage) ⇒ Object



7
8
9
10
11
12
13
14
15
# File 'lib/terrestrial/adapters/memory_adapter.rb', line 7

def self.build_from_schema(schema, raw_storage)
  schema.each { |name, _| raw_storage[name] = [] }

  relations = Hash[schema.map { |name, columns|
    [name, Relation.new(columns, raw_storage.fetch(name))]
  }]

  new(schema, relations)
end

Instance Method Details

#[](table_name) ⇒ Object



54
55
56
# File 'lib/terrestrial/adapters/memory_adapter.rb', line 54

def [](table_name)
  @relations.fetch(table_name)
end

#rename_table(name, new_name) ⇒ Object



38
39
40
41
42
43
44
# File 'lib/terrestrial/adapters/memory_adapter.rb', line 38

def rename_table(name, new_name)
  relations[new_name] = relations[name]
  relations.delete(name)
  @schema[new_name] = @schema[name]
  @schema.delete(name)
  self
end

#schema(table_name) ⇒ Object



25
26
27
28
29
30
31
32
# File 'lib/terrestrial/adapters/memory_adapter.rb', line 25

def schema(table_name)
  @schema.fetch(table_name).map { |column_info|
    [
      column_info.fetch(:name),
      column_info.fetch(:options, { primary_key: false }),
    ]
  }
end

#tablesObject



34
35
36
# File 'lib/terrestrial/adapters/memory_adapter.rb', line 34

def tables
  @relations.keys
end

#transaction(&block) ⇒ Object



46
47
48
49
50
51
52
# File 'lib/terrestrial/adapters/memory_adapter.rb', line 46

def transaction(&block)
  old_state = Marshal.load(Marshal.dump(relations))
  block.call
rescue Object => e
  rollback(old_state)
  raise e
end

#upsert(record) ⇒ Object



58
59
60
61
62
63
64
65
66
67
68
# File 'lib/terrestrial/adapters/memory_adapter.rb', line 58

def upsert(record)
  existing = self[record.namespace].where(record.identity)

  if existing.any?
    existing.update(record.updatable_attributes)
  else
    self[record.namespace].insert(record.to_h)
  end
rescue Object => e
  raise Terrestrial::UpsertError.new(record.namespace, record.to_h, e)
end