Class: Valkyrie::Sequel::Persister::SaveAllPersister::Factory

Inherits:
Object
  • Object
show all
Defined in:
lib/valkyrie/sequel/persister.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(persister:) ⇒ Factory

Returns a new instance of Factory.



33
34
35
# File 'lib/valkyrie/sequel/persister.rb', line 33

def initialize(persister:)
  @persister = persister
end

Instance Attribute Details

#persisterObject (readonly)

Returns the value of attribute persister.



32
33
34
# File 'lib/valkyrie/sequel/persister.rb', line 32

def persister
  @persister
end

Instance Method Details

#for(resources:) ⇒ Object

Resources have to be handled differently based on whether or not optimistic locking is enabled. Splitting it into two upserts allows for faster save_all while still handling optimistic locking.



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/valkyrie/sequel/persister.rb', line 40

def for(resources:)
  grouped_resources = resources.group_by(&:optimistic_locking_enabled?)
  locked_resources = grouped_resources[true] || []
  unlocked_resources = grouped_resources[false] || []

  CompositePersister.new(
    [
      SaveAllPersister.new(resources: locked_resources, relation: locking_relation, resource_factory: resource_factory),
      SaveAllPersister.new(resources: unlocked_resources, relation: relation, resource_factory: resource_factory)
    ]
  )
end

#locking_relationObject

Locking relation has an update_where condition.



61
62
63
64
65
66
67
# File 'lib/valkyrie/sequel/persister.rb', line 61

def locking_relation
  resources.returning.insert_conflict(
    target: :id,
    update: update_branches,
    update_where: { Sequel.function(:coalesce, Sequel[:orm_resources][:lock_version], 0) => Sequel[:excluded][:lock_version] }
  )
end

#relationObject



53
54
55
56
57
58
# File 'lib/valkyrie/sequel/persister.rb', line 53

def relation
  resources.returning.insert_conflict(
    target: :id,
    update: update_branches
  )
end

#update_branchesObject



69
70
71
72
73
74
75
76
77
# File 'lib/valkyrie/sequel/persister.rb', line 69

def update_branches
  {
    metadata: Sequel[:excluded][:metadata],
    internal_resource: Sequel[:excluded][:internal_resource],
    lock_version: Sequel.function(:coalesce, Sequel[:excluded][:lock_version], 0) + 1,
    created_at: Sequel[:excluded][:created_at],
    updated_at: Time.now.utc
  }
end