/
appeals_updated_since_query.rb
53 lines (43 loc) · 1.35 KB
/
appeals_updated_since_query.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
# frozen_string_literal: true
# Match any Appeal or its associations that have been updated since a baseline date.
#
class AppealsUpdatedSinceQuery
def initialize(since_date:)
@since_date = since_date
end
def call
build_query
end
private
# Before adding to this list, consider adding `include HasAppealUpdatedSince`
# or `scope :updated_since_for_appeals` to the model, esp. if the ETL::Appeal table uses the model's data.
SKIP_ASSOCIATIONS = %w[
versions
appeal_views
claims_folder_searches
job_notes
nod_date_updates
record_synced_by_job
request_decision_issues
request_issues_updates
vbms_uploaded_documents
].freeze
attr_reader :since_date
def association_names
@association_names ||= Appeal.reflections.keys.reject { |key| SKIP_ASSOCIATIONS.include?(key) }
end
def build_query
Appeal.established.where("appeals.updated_at >= ?", since_date)
.or(Appeal.established.where("appeals.id IN (#{clauses_union})"))
end
def clauses_union
updated_since_for_appeals_relations.map(&:arel).map(&:to_sql).join("\n UNION ")
end
def updated_since_for_appeals_relations
association_names.map do |association_name|
association = Appeal.reflections[association_name]
assoc_klass = association.klass
assoc_klass.updated_since_for_appeals(since_date)
end
end
end