Skip to content

Commit

Permalink
feat: after update smart detects to use :update when lazy are present (
Browse files Browse the repository at this point in the history
…#10)

* feat: after update smart detects to use :update when lazy are present

The document itself may not include the lazy attributes, and by
performing :index request all the updated done through the lazy update
attribute actions will be lost. So updated the logic to attempt push
document using :update api with a :index fallback in case doc does not
exist yet. This behaviour can be overriten by passing with: :index

* feat: remove group from count query
  • Loading branch information
marcosgz authored Jul 31, 2024
1 parent 8f9867a commit feea0e4
Show file tree
Hide file tree
Showing 4 changed files with 31 additions and 12 deletions.
3 changes: 2 additions & 1 deletion lib/esse/active_record/callbacks.rb
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,9 @@ module ActiveRecord
class Callback
attr_reader :repo, :options, :block_result

def initialize(repo:, block_result: nil, **kwargs)
def initialize(repo:, block_result: nil, with: nil, **kwargs)
@repo = repo
@with = with
@options = kwargs
@block_result = block_result
end
Expand Down
9 changes: 1 addition & 8 deletions lib/esse/active_record/callbacks/indexing_on_update.rb
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,6 @@
module Esse::ActiveRecord
module Callbacks
class IndexingOnUpdate < Callback
attr_reader :update_with

def initialize(with: :index, **kwargs, &block)
@update_with = with
super(**kwargs, &block)
end

def call(model)
record = block_result || model

Expand Down Expand Up @@ -43,7 +36,7 @@ def call(model)
def update_document(document)
return if document.ignore_on_index?

if update_with == :update
if @with == :update || (@with.nil? && repo.lazy_document_attributes.any?)
begin
repo.index.update(document, **options)
rescue Esse::Transport::NotFoundError
Expand Down
2 changes: 1 addition & 1 deletion lib/esse/active_record/collection.rb
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ def each_batch_ids
end

def count
dataset.except(:includes, :preload, :eager_load, :order, :limit, :offset).count
dataset.except(:includes, :preload, :eager_load, :group, :order, :limit, :offset).count
end
alias_method :size, :count

Expand Down
29 changes: 27 additions & 2 deletions spec/esse/active_record/callbacks/indexing_on_update_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
describe '.initialize' do
let(:repo) { instance_double(Esse::Repository) }

it 'sets update_with' do
it 'sets @with' do
callback = described_class.new(repo: repo, with: :update)
expect(callback.update_with).to eq(:update)
expect(callback.instance_variable_get(:@with)).to eq(:update)
end

it 'sets options' do
Expand Down Expand Up @@ -96,5 +96,30 @@
state.update!(name: 'IL')
end
end

context 'when not calling with in a repository with lazy attributes' do
before do
StatesIndex::State.lazy_document_attribute :total_counties do |docs|
::County.where(state_id: docs.map(&:id)).group(:state_id).count
end
end

after do
StatesIndex::State.instance_variable_set(:@lazy_document_attributes, {}.freeze)
end

it { expect(StatesIndex::State.lazy_document_attributes).not_to be_empty }

it 'updates the record using :update action to avoid losing lazy attributes' do
expect(StatesIndex).to receive(:update).and_call_original
expect(StatesIndex).to esse_receive_request(:update).with(
id: state.id,
index: StatesIndex.index_name,
body: {doc: { name: 'IL' } },
).and_return(ok_response)

state.update!(name: 'IL')
end
end
end
end

0 comments on commit feea0e4

Please sign in to comment.