Class: Muster::Strategies::ActiveRecord

Inherits:
Rack
  • Object
show all
Defined in:
lib/muster/strategies/active_record.rb

Overview

Query string parsing strategy that outputs ActiveRecord Query compatible options

Examples:


strategy = Muster::Strategies::ActiveRecord.new
results  = strategy.parse('select=id,name&where=status:new&order=name:desc')

# { 'select' => ['id', 'name'], :where => {'status' => 'new}, :order => 'name desc' }
#
# Person.select( results[:select] ).where( results[:where] ).order( results[:order] )

Instance Attribute Summary

Attributes inherited from Rack

#fields, #options

Instance Method Summary collapse

Methods inherited from Rack

#fields_to_parse, #initialize, #parse_query_string

Constructor Details

This class inherits a constructor from Muster::Strategies::Rack

Instance Method Details

#parse(query_string) ⇒ Muster::Results

Processes a query string and returns a hash of its fields/values

Examples:


results  = strategy.parse('select=id,name&where=status:new&order=name:desc')

# { 'select' => ['id', 'name'], :where => {'status' => 'new}, :order => 'name desc' }

Parameters:

  • query_string (String)

    the query string to parse

Returns:



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/muster/strategies/active_record.rb', line 34

def parse(query_string) # rubocop:disable Metrics/MethodLength
  pagination = parse_pagination(query_string)

  parameters = Muster::Results.new(
    :select   => parse_select(query_string),
    :order    => parse_order(query_string),
    :limit    => pagination[:limit],
    :offset   => pagination[:offset],
    :where    => parse_where(query_string),
    :joins    => parse_joins(query_string),
    :includes => parse_includes(query_string)
  )

  parameters.regular_writer('pagination', pagination[:pagination].symbolize_keys)

  parameters
end

#parse_includes(query_string) ⇒ Hash (protected)

Returns includes clauses for AR queries

Examples:


value = parse_joins('includes=authors')  #=> {'includes' => 'authors'}

Parameters:

  • query_string (String)

    the original query string to parse join statements from

Returns:



153
154
155
156
157
158
# File 'lib/muster/strategies/active_record.rb', line 153

def parse_includes(query_string)
  strategy = Muster::Strategies::JoinsExpression.new(:field => :includes)
  results  = strategy.parse(query_string)

  results[:includes] || {}
end

#parse_joins(query_string) ⇒ Hash (protected)

Returns joins clauses for AR queries

Examples:


value = parse_joins('joins=authors')  #=> {'joins' => 'authors'}

Parameters:

  • query_string (String)

    the original query string to parse join statements from

Returns:



137
138
139
140
141
142
# File 'lib/muster/strategies/active_record.rb', line 137

def parse_joins(query_string)
  strategy = Muster::Strategies::JoinsExpression.new(:field => :joins)
  results  = strategy.parse(query_string)

  results[:joins] || {}
end

#parse_order(query_string) ⇒ Array (protected)

Returns order by clauses for AR queries

Examples:


value = parse_order('order=name:desc')  #=> ['name asc']

Parameters:

  • query_string (String)

    the original query string to parse order clauses from

Returns:

  • (Array)


79
80
81
82
83
84
# File 'lib/muster/strategies/active_record.rb', line 79

def parse_order(query_string)
  strategy = Muster::Strategies::SortExpression.new(:field => :order)
  results  = strategy.parse(query_string)

  Array.wrap(results[:order])
end

#parse_pagination(query_string) ⇒ Hash (protected)

Returns pagination information for AR queries

Examples:


value = parse_pagination('page=2&page_size=10')  #=> { 'pagination' => {:page => 2, :per_page => 10}, 'limit' => 10, 'offset' => 10 }

Parameters:

  • query_string (String)

    the original query string to parse pagination from

Returns:



95
96
97
98
# File 'lib/muster/strategies/active_record.rb', line 95

def parse_pagination(query_string)
  strategy = Muster::Strategies::Pagination.new(:fields => [:pagination, :limit, :offset])
  strategy.parse(query_string)
end

#parse_select(query_string) ⇒ Array (protected)

Returns select clauses for AR queries

Examples:


value = parse_select('select=id,name')  #=> ['id', 'name']

Parameters:

  • query_string (String)

    the original query string to parse select clauses from

Returns:

  • (Array)


63
64
65
66
67
68
# File 'lib/muster/strategies/active_record.rb', line 63

def parse_select(query_string)
  strategy = Muster::Strategies::Hash.new(:field => :select)
  results  = strategy.parse(query_string)

  Array.wrap(results[:select])
end

#parse_where(query_string) ⇒ Hash (protected)

Returns where clauses for AR queries

  • In the case a NULL or NIL query string value is included (case insensitive), a ‘nil` object is substituted for the String value.

Examples:


value = parse_where('where=id:1')  #=> {'id' => '1'}
value = parse_where('where=id:null')  #=> {'id' => nil}
value = parse_where('where=id:nil')  #=> {'id' => nil}

Parameters:

  • query_string (String)

    the original query string to parse where statements from

Returns:



113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/muster/strategies/active_record.rb', line 113

def parse_where(query_string)
  strategy = Muster::Strategies::FilterExpression.new(:field => :where)
  results  = strategy.parse(query_string)

  nil_regex = /^(null|nil)$/i

  if results[:where] && !results[:where].values.grep(nil_regex).empty?
    results[:where].each do |key, value|
      results[:where][key] = nil if value.match(nil_regex)
    end
  end

  results[:where] || {}
end