64 lines
2.1 KiB
Ruby
64 lines
2.1 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
# License: AGPL-3.0-or-later WITH Web-Template-Output-Additional-Permission-3.0-or-later
|
|
|
|
module SearchVector
|
|
AcceptedTables = %w[supporters payments].freeze
|
|
|
|
def self.query(query_string, expr = nil)
|
|
(expr || Qexpr.new).where(
|
|
"to_tsvector('english', coalesce(supporters.name, '') || ' ' || coalesce(supporters.email, '')) @@ plainto_tsquery('english', $search)",
|
|
search: query_string
|
|
)
|
|
end
|
|
|
|
def self._payments_blob_query
|
|
Qexpr.new.select(
|
|
'payments.id',
|
|
"concat_ws(' '
|
|
, payments.gross_amount
|
|
, payments.kind
|
|
, payments.towards
|
|
, supporters.name
|
|
, supporters.organization
|
|
, supporters.email
|
|
, supporters.city
|
|
, supporters.state_code
|
|
, donations.designation
|
|
, donations.dedication
|
|
) AS search_blob"
|
|
)
|
|
.from(:payments)
|
|
.left_outer_join('supporters', 'payments.supporter_id=supporters.id')
|
|
.left_outer_join('donations', 'payments.donation_id=donations.id')
|
|
end
|
|
|
|
# Construct of query of ids and search blobs for all supporters
|
|
# for use in a sub-query
|
|
def self._supporters_blob_query
|
|
fields_subquery = Qexpr.new.select("string_agg(value::text, ' ') AS value", 'supporter_id')
|
|
.from(:custom_field_joins)
|
|
.group_by(:supporter_id)
|
|
.as(:custom_field_joins)
|
|
Qexpr.new.select(
|
|
'supporters.id',
|
|
"concat_ws(' '
|
|
, custom_field_joins.value
|
|
, supporters.name
|
|
, supporters.organization
|
|
, supporters.id
|
|
, supporters.email
|
|
, supporters.city
|
|
, supporters.state_code
|
|
, donations.designation
|
|
, donations.dedication
|
|
, payments.kind
|
|
, payments.towards
|
|
) AS search_blob"
|
|
)
|
|
.from(:supporters)
|
|
.left_outer_join(:payments, 'payments.supporter_id=supporters.id')
|
|
.left_outer_join(:donations, 'donations.supporter_id=supporters.id')
|
|
.left_outer_join(fields_subquery, 'custom_field_joins.supporter_id=supporters.id')
|
|
end
|
|
end
|