Skip to content

Commit 23565ba

Browse files
authored
Copy from subject metadata to SMS attrs (zooniverse#3130)
* Copy priority from subject metadata to SMS attr * Hound * Priority->Metadata. Needs migration for training_subject field and extreme optimization * Raw SQL for single update query * Even raw-er SQL, rails5 compatibility, nil check * Newlines * add ability to make more subjects * use num_subjects evaluator to build subjects * preserve decimal values if they are provided subject selectors allow for decimal priority values so we should preserve them if provided * remove stray focus spec
1 parent 38109c2 commit 23565ba

File tree

5 files changed

+63
-3
lines changed

5 files changed

+63
-3
lines changed

app/controllers/api/v1/subject_sets_controller.rb

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,9 @@ def add_relation(resource, relation, value)
105105
[ resource.id, subject_id, rand ]
106106
end
107107

108-
SetMemberSubject.import IMPORT_COLUMNS, new_sms_values, validate: false
108+
result = SetMemberSubject.import IMPORT_COLUMNS, new_sms_values, validate: false
109+
SubjectMetadataWorker.perform_async(resource.id)
110+
result
109111
else
110112
super
111113
end
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
class SubjectMetadataWorker
2+
include Sidekiq::Worker
3+
4+
def perform(subject_set_id)
5+
update_sms_priority_sql = <<-SQL
6+
UPDATE set_member_subjects
7+
SET priority = CAST(subjects.metadata->>'#priority' AS NUMERIC)
8+
FROM subjects
9+
WHERE subjects.id = set_member_subjects.subject_id
10+
AND subjects.metadata ? '#priority'
11+
AND set_member_subjects.subject_set_id = $1
12+
SQL
13+
14+
ActiveRecord::Base.connection.exec_update(
15+
update_sms_priority_sql,
16+
"SQL",
17+
[[nil, subject_set_id]]
18+
)
19+
end
20+
end

spec/controllers/api/v1/subject_sets_controller_spec.rb

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,13 @@
154154
run_update_links
155155
end
156156

157+
it "should queue the SMS metadata worker" do
158+
expect(SubjectMetadataWorker)
159+
.to receive(:perform_async)
160+
.with(kind_of(Numeric))
161+
run_update_links
162+
end
163+
157164
it "should call the unfinish workflow worker" do
158165
resource.workflows.each do |workflow|
159166
expect(UnfinishWorkflowWorker).to receive(:perform_async).with(workflow.id)

spec/factories/subject_sets.rb

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
factory :subject_set do
33
transient do
44
num_workflows 1
5+
num_subjects 2
56
end
67

78
sequence(:display_name) { |n| "Subject Set #{n}" }
@@ -16,8 +17,8 @@
1617
end
1718

1819
factory :subject_set_with_subjects do
19-
after(:create) do |set|
20-
2.times do |i|
20+
after(:create) do |set, evaluator|
21+
evaluator.num_subjects.times do |i|
2122
subject = create(:subject, project: set.project, uploader: set.project.owner)
2223
create(:set_member_subject, subject_set: set, subject: subject)
2324
end
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
require "spec_helper"
2+
3+
RSpec.describe SubjectMetadataWorker do
4+
let(:user) { create :user }
5+
let(:project) { create :project_with_workflow, owner: user }
6+
let(:workflow) { project.workflows.first }
7+
let(:subject_set) do
8+
create(:subject_set_with_subjects, num_subjects: 3, project: project, workflows: [workflow])
9+
end
10+
11+
subject(:worker) { SubjectMetadataWorker.new }
12+
13+
before do
14+
subject_set.subjects[0].metadata['#priority'] = 1/3.0
15+
subject_set.subjects[1].metadata['#priority'] = "2"
16+
subject_set.subjects.map(&:save)
17+
end
18+
19+
describe "#perform" do
20+
it 'copies priority from metadata to SMS attribute' do
21+
worker.perform(subject_set.id)
22+
sms_one, sms_two, sms_three = SetMemberSubject.find(
23+
subject_set.set_member_subject_ids
24+
).sort_by(&:id)
25+
expect(sms_one.priority).to eq(1/3.0)
26+
expect(sms_two.priority).to eq(2)
27+
expect(sms_three.priority).to be_nil
28+
end
29+
end
30+
end

0 commit comments

Comments
 (0)