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
|
# File 'app/lib/has_helpers/search/sql_search.rb', line 11
def exec_query(resource:, query:, options:, filter:)
resource_klasses = Array(resource).map { |r| normalize_resource_to_class(r) }.compact.uniq
base_limit = Integer(options.dig(:with, :limit)) rescue Rails.application.config.x.search_default_limit
limit = base_limit * resource_klasses.size
intermediate_results = resource_klasses.map do |klass|
if klass.respond_to?(:search)
sql_results = klass.search(query, sql_search_options(options))
if defined?(ActiveRecord::Relation) && sql_results.is_a?(ActiveRecord::Relation)
scoped = apply_org_scope_relation(sql_results, options)
scoped = apply_filters_relation(scoped, filter)
scoped.limit(limit)
else
sql_results
end
else
resource_relation_name, owner_relation_name, owner_relation = owner_relation_from_scope(klass)
if owner_relation
scope = owner_relation
search_vector = "CONCAT_WS(' ', #{ owner_relation_name }.name, #{ owner_relation_name }.sub_item)"
else
scope = klass
search_vector = "#{ resource_relation_name }.name"
end
table_name = owner_relation ? owner_relation_name : resource_relation_name
scoped = apply_org_scope_table(scope, table_name, options)
scoped = apply_filters_relation(scoped, filter)
scoped.where(::HasHelpers::Query::Sql.sql(search_vector, query)).limit(limit)
end
end
{ results: intermediate_results.flatten }
end
|