* Allowing VariantQuery for Feed Generation Apologies for the breadth of this pull request, I had considered many small commits, but felt that would've been more effort for the value provided. This commit includes the following: - Documentation updates to the feed variant (though not the final pass) - Renaming and adding RelevancyLevers that help differentiate - Adding RelevancyLever#range to provide documentation - Reducing redundent controller logic by making a `Articles::Feeds.feed_for` method. - Adding some configuration validation for RelevancyLevers - Adding constants for better clarification - Testing unhappy paths for feed configuration - Adjusting the module namespace of some objects - Exposing top-level configurations for variants (along with their defaults) - Creating the VariantyQuery that at present inherits from the `Articles::Feeds::WeightedQueryStrategy` As implemented, we can deploy this code to production without using the new VariantQuery. Once we toggle on the `:feed_uses_variant_query_feature` FeatureFlag, it will switch to using the VariantQuery. The VariantQuery's two variants and the internal configuration of `Articles::Feeds::WeightedQueryStrategy` produce the same query. The goal of this factor is to allow for a quick on and off toggle of the feed query; to ensure that what we introduce remains performant. - Closes forem/forem#17272 - Closes forem/forem#17276 - Closes forem/forem#17216 In addition, I will be recording a code-walkthrough and linking that recording to the pull request. * Apply suggestions from code review Co-authored-by: Mac Siri <krairit.siri@gmail.com> Co-authored-by: Mac Siri <krairit.siri@gmail.com>
25 lines
876 B
Ruby
25 lines
876 B
Ruby
module Articles
|
|
module Feeds
|
|
# This simple data structure describes a configuration of SQL "clause" fragments used in
|
|
# sorting the list of Articles queried for the feed.
|
|
#
|
|
# @see config/feed/README.md
|
|
class OrderByLever
|
|
# @param key [Symbol] the programmatic means of naming this
|
|
# lever. (e.g. "publication_date_decay_lever")
|
|
# @param label [String] the "help text" for describing this lever. (e.g. "How the
|
|
# publication date impacts relevancy score?")
|
|
# @param order_by_fragment [String] a SQL `ORDER` fragment
|
|
def initialize(key:, label:, order_by_fragment:)
|
|
@key = key.to_sym
|
|
@label = label
|
|
@order_by_fragment = order_by_fragment
|
|
end
|
|
attr_reader :key, :label, :order_by_fragment
|
|
|
|
def to_sql
|
|
Arel.sql(order_by_fragment)
|
|
end
|
|
end
|
|
end
|
|
end
|