64 lines
1.5 KiB
Ruby
64 lines
1.5 KiB
Ruby
|
# frozen_string_literal: true
|
||
|
|
||
|
module Projects
|
||
|
module Ml
|
||
|
class CandidateFinder
|
||
|
VALID_ORDER_BY_TYPES = %w[column metric].freeze
|
||
|
VALID_ORDER_BY_COLUMNS = %w[name created_at id].freeze
|
||
|
VALID_SORT = %w[asc desc].freeze
|
||
|
|
||
|
def initialize(experiment, params = {})
|
||
|
@experiment = experiment
|
||
|
@params = params
|
||
|
end
|
||
|
|
||
|
def execute
|
||
|
candidates = @experiment.candidates.including_relationships
|
||
|
|
||
|
candidates = by_name(candidates)
|
||
|
order(candidates)
|
||
|
end
|
||
|
|
||
|
private
|
||
|
|
||
|
def by_name(candidates)
|
||
|
return candidates unless @params[:name].present?
|
||
|
|
||
|
candidates.by_name(@params[:name])
|
||
|
end
|
||
|
|
||
|
def order(candidates)
|
||
|
return candidates.order_by_metric(metric_order_by, sort) if order_by_metric?
|
||
|
|
||
|
candidates.order_by("#{column_order_by}_#{sort}").with_order_id_desc
|
||
|
end
|
||
|
|
||
|
def order_by_metric?
|
||
|
order_by_type == 'metric'
|
||
|
end
|
||
|
|
||
|
def order_by_type
|
||
|
valid_or_default(@params[:order_by_type], VALID_ORDER_BY_TYPES, 'column')
|
||
|
end
|
||
|
|
||
|
def column_order_by
|
||
|
valid_or_default(@params[:order_by], VALID_ORDER_BY_COLUMNS, 'created_at')
|
||
|
end
|
||
|
|
||
|
def metric_order_by
|
||
|
@params[:order_by] || ''
|
||
|
end
|
||
|
|
||
|
def sort
|
||
|
valid_or_default(@params[:sort]&.downcase, VALID_SORT, 'desc')
|
||
|
end
|
||
|
|
||
|
def valid_or_default(value, valid_values, default)
|
||
|
return value if valid_values.include?(value)
|
||
|
|
||
|
default
|
||
|
end
|
||
|
end
|
||
|
end
|
||
|
end
|