Class: Kabk::QueryBuilder
- Inherits:
-
Object
- Object
- Kabk::QueryBuilder
- Defined in:
- lib/kabk/query_builder.rb
Overview
Handles applying page, sort, search, and filters to a Sequel dataset
Class Method Summary collapse
- .apply_filters(dataset, resource, filters) ⇒ Object
- .apply_pagination(dataset, resource, params) ⇒ Object
- .apply_search(dataset, resource, search_term) ⇒ Object
- .apply_sort(dataset, resource, sort_term) ⇒ Object
-
.build(resource, params) ⇒ Sequel::Dataset
Paginated dataset.
Class Method Details
.apply_filters(dataset, resource, filters) ⇒ Object
31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# File 'lib/kabk/query_builder.rb', line 31 def self.apply_filters(dataset, resource, filters) return dataset unless filters.is_a?(Hash) filters.each do |field, value| # In a real scenario, you might want to validate if the field is filterable values = value.to_s.split(",") dataset = if values.size > 1 dataset.where(field.to_sym => values) else dataset.where(field.to_sym => value) end end dataset end |
.apply_pagination(dataset, resource, params) ⇒ Object
60 61 62 63 64 65 66 67 68 69 70 |
# File 'lib/kabk/query_builder.rb', line 60 def self.apply_pagination(dataset, resource, params) page = (params["page"] || 1).to_i per_page = (params["per_page"] || resource.per_page_default).to_i page = 1 if page < 1 per_page = 15 if per_page < 1 # Note: requires Sequel's pagination extension to be loaded (Sequel.extension :pagination) # Returns a Sequel::Dataset which responds to page_count, page_size, current_page, pagination_record_count dataset.extension(:pagination).paginate(page, per_page) end |
.apply_search(dataset, resource, search_term) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/kabk/query_builder.rb', line 19 def self.apply_search(dataset, resource, search_term) return dataset if search_term.nil? || search_term.to_s.strip.empty? return dataset if resource.searchable_fields.nil? || resource.searchable_fields.empty? # Use Sequel.or and Sequel.ilike for global search search_conditions = resource.searchable_fields.map do |field| Sequel.ilike(field.to_sym, "%#{search_term}%") end dataset.where(Sequel.|(*search_conditions)) end |
.apply_sort(dataset, resource, sort_term) ⇒ Object
46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/kabk/query_builder.rb', line 46 def self.apply_sort(dataset, resource, sort_term) return dataset if sort_term.nil? || sort_term.to_s.strip.empty? is_desc = sort_term.start_with?("-") field_name = is_desc ? sort_term[1..-1] : sort_term # Allow sorting only by permitted fields if resource.sortable_fields&.include?(field_name) col = field_name.to_sym dataset = is_desc ? dataset.order(Sequel.desc(col)) : dataset.order(Sequel.asc(col)) end dataset end |
.build(resource, params) ⇒ Sequel::Dataset
Returns Paginated dataset.
9 10 11 12 13 14 15 16 17 |
# File 'lib/kabk/query_builder.rb', line 9 def self.build(resource, params) dataset = resource.model_class.dataset dataset = apply_search(dataset, resource, params["search"]) dataset = apply_filters(dataset, resource, params["filter"]) dataset = apply_sort(dataset, resource, params["sort"] || resource.default_sort) apply_pagination(dataset, resource, params) end |