Class: IndexQueryBuilder::QueryDefinition
- Inherits:
-
Object
- Object
- IndexQueryBuilder::QueryDefinition
- Defined in:
- lib/index_query_builder/query_definition.rb
Overview
Provides a DSL to build a query definition
Instance Attribute Summary collapse
-
#arel_filters ⇒ Object
readonly
Returns the value of attribute arel_filters.
-
#arel_ordering ⇒ Object
readonly
Returns the value of attribute arel_ordering.
Instance Method Summary collapse
-
#filter_field(field_name, predicates = {equal_to: field_name}) ⇒ Object
Specifies how to filter a field.
- #filter_names ⇒ Object
-
#initialize ⇒ QueryDefinition
constructor
A new instance of QueryDefinition.
-
#order_by(*args) ⇒ Object
Specifies how to order the result.
Constructor Details
#initialize ⇒ QueryDefinition
Returns a new instance of QueryDefinition.
7 8 9 10 |
# File 'lib/index_query_builder/query_definition.rb', line 7 def initialize @arel_filters = {} @arel_ordering = [] end |
Instance Attribute Details
#arel_filters ⇒ Object (readonly)
Returns the value of attribute arel_filters.
5 6 7 |
# File 'lib/index_query_builder/query_definition.rb', line 5 def arel_filters @arel_filters end |
#arel_ordering ⇒ Object (readonly)
Returns the value of attribute arel_ordering.
5 6 7 |
# File 'lib/index_query_builder/query_definition.rb', line 5 def arel_ordering @arel_ordering end |
Instance Method Details
#filter_field(field_name, predicates = {equal_to: field_name}) ⇒ Object
Specifies how to filter a field
Operators
Operators will apply where clauses to query *only if* the filter_name is present in filters hash.
- :equal_to
-
Applies field_name = filter_value
- :contains
-
Applies substring (ILIKE ‘%filter_value%’)
- :greater_than_or_equal_to
-
Applies field_name >= filter_value
- :less_than
-
Applies field_name < filter_value
- :present_if
-
Applies
field_name IS NOT NULL if filter_value field_name IS NULL if filter_value
Examples
query.filter_field :received query.filter_field :reference, contains: :reference query.filter_field [:vendor, :name], equal_to: :vendor_name query.filter_field [:receive_order_items, :sku, :code], equal_to: :sku_code query.filter_field :expected_delivery_at, greater_than_or_equal_to: :from_expected_delivery_at, less_than: :to_expected_delivery_at query.filter_field :expected_delivery_at, less_than_or_equal_to: :to_expected_delivery_at query.filter_field :outbound_trailer_id, present_if: :has_trailer
46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/index_query_builder/query_definition.rb', line 46 def filter_field(field_name, predicates={equal_to: field_name}) predicates.each do |operator, filter| @arel_filters[filter] = [] if operator == :contains @arel_filters[filter] << ->(arel, value) do table_name, field = apply_joins(arel, field_name, filter) arel.where("#{table_name}.#{field} ILIKE ?", "%#{value}%") end elsif operator == :equal_to @arel_filters[filter] << ->(arel, value) do table_name, field = apply_joins(arel, field_name, filter) arel.where(table_name => {field => value}) end elsif operator == :greater_than_or_equal_to @arel_filters[filter] << ->(arel, value) do table_name, field = apply_joins(arel, field_name, filter) arel.where("#{table_name}.#{field} >= ?", value) end elsif operator == :less_than @arel_filters[filter] << ->(arel, value) do table_name, field = apply_joins(arel, field_name, filter) arel.where("#{table_name}.#{field} < ?", value) end elsif operator == :less_than_or_equal_to @arel_filters[filter] << ->(arel, value) do table_name, field = apply_joins(arel, field_name, filter) arel.where("#{table_name}.#{field} <= ?", value) end elsif operator == :present_if @arel_filters[filter] << ->(arel, value) do table_name, field = apply_joins(arel, field_name, filter) if value arel.where("#{table_name}.#{field} IS NOT NULL") else arel.where("#{table_name}.#{field} IS NULL") end end else raise UnknownOperator.new("Unknown operator #{operator}.") end end end |
#filter_names ⇒ Object
103 104 105 |
# File 'lib/index_query_builder/query_definition.rb', line 103 def filter_names arel_filters.keys end |
#order_by(*args) ⇒ Object
Specifies how to order the result. Uses same syntax as Arel#order (guides.rubyonrails.org/active_record_querying.html#ordering)
Examples
query.order_by "expected_delivery_at DESC, receive_orders.id DESC"
97 98 99 100 101 |
# File 'lib/index_query_builder/query_definition.rb', line 97 def order_by(*args) @arel_ordering << ->(arel) do arel.order(*args) end end |