Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 15 additions & 2 deletions lib/full_text_search/issue_mapper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -32,10 +32,23 @@ def upsert_fts_target(options={})
fts_target.last_modified_at = @record.updated_on
fts_target.registered_at = @record.created_on
fts_target.save!
return unless options[:recursive]

@record.journals.each do |journal|
JournalMapper.redmine_mapper(journal).upsert_fts_target(options)
redmine_mapper = JournalMapper.redmine_mapper(journal)
# We don't insert a new FTS target here to avoid an unique
# constraint error when a new journal is added. The following
# jobs are enqueued when a new journal is added:
#
# 1. UpsertTargetJob(IssueMapper)
# 2. UpsertTargetJob(JournalMapper)
#
# If both of jobs are executed in parallel, both of job 1. and
# job 2. may try adding new FTS target for the same
# journal. In the case, one of them is failed by an unique
# constraint error. If we don't create a new FTS target in
# here (job 1.), we can avoid the error.
next unless redmine_mapper.find_fts_target.persisted?
redmine_mapper.upsert_fts_target(options)
end
# @record.custom_values
end
Expand Down
22 changes: 22 additions & 0 deletions test/unit/full_text_search/issue_test.rb
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,28 @@ def test_save
targets.collect {|target| target.attributes.except("id")})
end

def test_save_journal_status_and_tracker
issue = Issue.generate!(
status: IssueStatus.find_by_name("New"),
tracker: Tracker.find_by_name("Bug")
)
journal = issue.journals.create!(notes: "comment")
issue.status = IssueStatus.find_by_name("Closed")
issue.tracker = Tracker.find_by_name("Support request")
issue.save!

journal_targets = Target.where(source_id: journal.id,
source_type_id: Type.journal.id)
assert_equal([
[
Tag.user(journal.user_id),
Tag.tracker(issue.tracker_id),
Tag.issue_status(issue.status_id),
].sort_by(&:id),
],
journal_targets.collect {|target| target.tags.sort_by(&:id)})
end

def test_destroy
searchable_custom_field = custom_fields(:custom_fields_002)
issue = Issue.generate! do |i|
Expand Down
Loading