Class: Plutonium::Resource::QueryObject
- Inherits:
-
Object
- Object
- Plutonium::Resource::QueryObject
- Defined in:
- lib/plutonium/resource/query_object.rb
Instance Attribute Summary collapse
-
#default_sort_config ⇒ Object
Returns the value of attribute default_sort_config.
-
#search_filter ⇒ Object
readonly
Returns the value of attribute search_filter.
-
#search_query ⇒ Object
readonly
Returns the value of attribute search_query.
Instance Method Summary collapse
-
#apply(scope, params) ⇒ Object
Applies the defined filters and sorts to the given scope.
-
#build_url(**options) ⇒ String
Builds a URL with the given options for search and sorting.
-
#define_filter(name, body) ⇒ Object
Defines a filter with the given name and body.
-
#define_scope(name, body = nil) ⇒ Object
Defines a scope with the given name and body.
-
#define_search(body) ⇒ Object
Defines a search filter with the given body.
-
#define_sorter(name, body = nil, using: nil) ⇒ Object
Defines a sort with the given name and body.
- #filter_definitions ⇒ Object
-
#initialize(resource_class, params, request_path) {|_self| ... } ⇒ QueryObject
constructor
Initializes a QueryObject with the given resource_class and parameters.
- #scope_definitions ⇒ Object
- #sort_definitions ⇒ Object
-
#sort_params_for(name) ⇒ Hash?
Provides sorting parameters for the given field name.
Constructor Details
#initialize(resource_class, params, request_path) {|_self| ... } ⇒ QueryObject
Initializes a QueryObject with the given resource_class and parameters.
11 12 13 14 15 16 17 18 19 20 |
# File 'lib/plutonium/resource/query_object.rb', line 11 def initialize(resource_class, params, request_path, &) @resource_class = resource_class @params = params @request_path = request_path define_standard_queries yield self if block_given? extract_filter_params extract_sort_params end |
Instance Attribute Details
#default_sort_config ⇒ Object
Returns the value of attribute default_sort_config.
5 6 7 |
# File 'lib/plutonium/resource/query_object.rb', line 5 def default_sort_config @default_sort_config end |
#search_filter ⇒ Object (readonly)
Returns the value of attribute search_filter.
4 5 6 |
# File 'lib/plutonium/resource/query_object.rb', line 4 def search_filter @search_filter end |
#search_query ⇒ Object (readonly)
Returns the value of attribute search_query.
4 5 6 |
# File 'lib/plutonium/resource/query_object.rb', line 4 def search_query @search_query end |
Instance Method Details
#apply(scope, params) ⇒ Object
Applies the defined filters and sorts to the given scope.
86 87 88 89 90 91 92 |
# File 'lib/plutonium/resource/query_object.rb', line 86 def apply(scope, params) params = deep_compact(params.with_indifferent_access) scope = search_filter.apply(scope, search: params[:search]) if search_filter && params[:search] scope = scope_definitions[params[:scope]].apply(scope, **{}) if scope_definitions[params[:scope]] scope = apply_sorts(scope, params) apply_filters(scope, params) end |
#build_url(**options) ⇒ String
Builds a URL with the given options for search and sorting.
67 68 69 70 71 72 73 74 75 76 77 78 79 80 |
# File 'lib/plutonium/resource/query_object.rb', line 67 def build_url(**) q = {} q[:search] = .key?(:search) ? [:search].presence : search_query q[:scope] = .key?(:scope) ? [:scope].presence : selected_scope_filter q[:sort_directions] = selected_sort_directions.dup q[:sort_fields] = selected_sort_fields.dup (q, ) q.merge! params.slice(*filter_definitions.keys) query_params = deep_compact({q: q}).to_param "#{@request_path}?#{query_params}" end |
#define_filter(name, body) ⇒ Object
Defines a filter with the given name and body.
26 27 28 |
# File 'lib/plutonium/resource/query_object.rb', line 26 def define_filter(name, body, &) filter_definitions[name] = build_query(body, &) end |
#define_scope(name, body = nil) ⇒ Object
Defines a scope with the given name and body.
34 35 36 37 |
# File 'lib/plutonium/resource/query_object.rb', line 34 def define_scope(name, body = nil) body ||= name scope_definitions[name] = build_query(body) end |
#define_search(body) ⇒ Object
Defines a search filter with the given body.
57 58 59 60 61 |
# File 'lib/plutonium/resource/query_object.rb', line 57 def define_search(body) @search_filter = build_query(body) do |query| query.input :search end end |
#define_sorter(name, body = nil, using: nil) ⇒ Object
Defines a sort with the given name and body.
43 44 45 46 47 48 49 50 51 52 |
# File 'lib/plutonium/resource/query_object.rb', line 43 def define_sorter(name, body = nil, using: nil) if body.nil? sort_field = using || determine_sort_field(name) body = ->(scope, direction:) { scope.order(sort_field => direction) } end sort_definitions[name] = build_query(body) do |query| query.input :direction end end |
#filter_definitions ⇒ Object
96 |
# File 'lib/plutonium/resource/query_object.rb', line 96 def filter_definitions = @filter_definitions ||= {}.with_indifferent_access |
#scope_definitions ⇒ Object
94 |
# File 'lib/plutonium/resource/query_object.rb', line 94 def scope_definitions = @scope_definitions ||= {}.with_indifferent_access |
#sort_definitions ⇒ Object
98 |
# File 'lib/plutonium/resource/query_object.rb', line 98 def sort_definitions = @sort_definitions ||= {}.with_indifferent_access |
#sort_params_for(name) ⇒ Hash?
Provides sorting parameters for the given field name.
104 105 106 107 108 109 110 111 112 113 |
# File 'lib/plutonium/resource/query_object.rb', line 104 def sort_params_for(name) return unless sort_definitions[name] { url: build_url(sort: name), reset_url: build_url(sort: name, reset: true), position: selected_sort_fields.index(name.to_s), direction: selected_sort_directions[name] } end |