Class: WorkerPlugins::AddQuery

Inherits:
ApplicationService show all
Defined in:
app/services/worker_plugins/add_query.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods inherited from ApplicationService

#db_now_value, #postgres?, #quote, #quote_column, #quote_table, #sqlite?

Constructor Details

#initialize(query:, workplace:) ⇒ AddQuery

Returns a new instance of AddQuery.



4
5
6
7
8
# File 'app/services/worker_plugins/add_query.rb', line 4

def initialize(query:, workplace:)
  @query = query
    .except(:order) # This fixes crashes in Postgres
  @workplace = workplace
end

Instance Attribute Details

#queryObject (readonly)

Returns the value of attribute query.



2
3
4
# File 'app/services/worker_plugins/add_query.rb', line 2

def query
  @query
end

#workplaceObject (readonly)

Returns the value of attribute workplace.



2
3
4
# File 'app/services/worker_plugins/add_query.rb', line 2

def workplace
  @workplace
end

Instance Method Details

#add_query_to_workplaceObject



16
17
18
# File 'app/services/worker_plugins/add_query.rb', line 16

def add_query_to_workplace
  WorkerPlugins::WorkplaceLink.connection.execute(sql)
end

#createdObject



20
21
22
# File 'app/services/worker_plugins/add_query.rb', line 20

def created
  @created ||= resources_to_add.pluck(primary_key.to_sym)
end

#ids_added_alreadyObject



30
31
32
33
34
35
36
# File 'app/services/worker_plugins/add_query.rb', line 30

def ids_added_already
  WorkerPlugins::SelectColumnWithTypeCast.execute!(
    column_name_to_select: :resource_id,
    column_to_compare_with: model_class.column_for_attribute(:id),
    query: ids_added_already_query
  )
end

#ids_added_already_queryObject



24
25
26
27
28
# File 'app/services/worker_plugins/add_query.rb', line 24

def ids_added_already_query
  workplace
    .workplace_links
    .where(resource_type: model_class.name, resource_id: query_with_selected_ids)
end

#model_classObject



38
39
40
# File 'app/services/worker_plugins/add_query.rb', line 38

def model_class
  @model_class ||= query.klass
end

#performObject



10
11
12
13
14
# File 'app/services/worker_plugins/add_query.rb', line 10

def perform
  created # Cache which are about to be created
  add_query_to_workplace
  succeed!(created:)
end

#primary_keyObject



42
43
44
# File 'app/services/worker_plugins/add_query.rb', line 42

def primary_key
  @primary_key ||= resources_to_add.klass.primary_key
end

#query_with_selected_idsObject



46
47
48
49
50
51
52
# File 'app/services/worker_plugins/add_query.rb', line 46

def query_with_selected_ids
  WorkerPlugins::SelectColumnWithTypeCast.execute!(
    column_name_to_select: :id,
    column_to_compare_with: WorkerPlugins::WorkplaceLink.column_for_attribute(:resource_id),
    query:
  )
end

#resources_to_addObject



54
55
56
57
58
59
# File 'app/services/worker_plugins/add_query.rb', line 54

def resources_to_add
  @resources_to_add ||= query
    .distinct
    .where
    .not(id: ids_added_already)
end

#select_sqlObject



61
62
63
64
65
66
67
68
69
70
71
# File 'app/services/worker_plugins/add_query.rb', line 61

def select_sql
  @select_sql ||= resources_to_add
    .select("
      #{db_now_value},
      #{quote(resources_to_add.klass.name)},
      #{quote_table(resources_to_add.klass.table_name)}.#{quote_column(primary_key)},
      #{db_now_value},
      #{select_workplace_id_sql}
    ")
    .to_sql
end

#select_workplace_id_sqlObject



73
74
75
76
77
78
79
80
81
# File 'app/services/worker_plugins/add_query.rb', line 73

def select_workplace_id_sql
  workplace_id_column = WorkerPlugins::WorkplaceLink.columns.find { |column| column.name == "workplace_id" }

  if workplace_id_column.type == :uuid
    "CAST(#{quote(workplace.id)} AS UUID)"
  else
    quote(workplace.id)
  end
end

#sqlObject



83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'app/services/worker_plugins/add_query.rb', line 83

def sql
  @sql ||= "
    INSERT INTO
      worker_plugins_workplace_links

    (
      created_at,
      resource_type,
      resource_id,
      updated_at,
      workplace_id
    )

    #{select_sql}
  "
end