lib/restful_query/parser.rb in restful_query-0.3.0 vs lib/restful_query/parser.rb in restful_query-0.3.1
- old
+ new
@@ -1,13 +1,14 @@
module RestfulQuery
class Parser
- attr_reader :query, :exclude_columns, :integer_columns, :options
+ attr_reader :query, :exclude_columns, :map_columns, :integer_columns, :options
def initialize(query, options = {})
@options = options || {}
- @exclude_columns = options[:exclude_columns] ? [options.delete(:exclude_columns)].flatten.collect {|c| c.to_s } : []
- @integer_columns = options[:integer_columns] ? [options.delete(:integer_columns)].flatten.collect {|c| c.to_s } : []
+ @exclude_columns = columns_from_options(:exclude, options)
+ @integer_columns = columns_from_options(:integer, options)
+ @map_columns = options[:map_columns] || {}
@default_sort = options[:default_sort] ? [Sort.parse(options[:default_sort])] : []
@single_sort = options[:single_sort] || false
@query = (query || {}).dup
@default_join = @query.delete(:join) || :and
extract_sorts_from_conditions
@@ -42,16 +43,11 @@
def to_query_hash
hash = @query
hash['_sort'] = sorts.collect {|s| s.to_s } unless sorts.empty?
hash
end
-
- def self.sorts_from_hash(sorts)
- sort_conditions = [sorts].flatten.compact
- sort_conditions.collect {|c| Sort.parse(c) }
- end
-
+
def sort_sql
@sorts.collect {|s| s.to_sql }.join(', ')
end
def has_sort?
@@ -64,20 +60,23 @@
def sorted_columns
sorts.collect {|s| s.column }
end
- def sorted_by?(column)
+ def sorted_by?(column_name)
+ column = map_column(column_name)
sorted_columns.include?(column.to_s)
end
- def sort(column)
- sorts.detect {|s| s && s.column == column.to_s }
+ def sort(column_name)
+ column = map_column(column_name)
+ sorts.detect {|s| s && s.column == column }
end
- def set_sort(column, direction)
- if new_sort = self.sort(column)
+ def set_sort(column_name, direction)
+ column = map_column(column_name)
+ if new_sort = self.sort(column_name)
if direction.nil?
self.sorts.reject! {|s| s.column == column.to_s }
else
new_sort.direction = direction
end
@@ -109,11 +108,11 @@
[]
end
end
def extract_sorts_from_conditions
- @sorts = self.class.sorts_from_hash(@query.delete('_sort'))
+ @sorts = sorts_from_hash(@query.delete('_sort'))
@sorts = @default_sort if @sorts.empty?
end
def map_conditions
conditions = query.delete(:conditions) || query
@@ -131,17 +130,37 @@
conditions = conditions_array
end
# with a normalized array of conditions
conditions.each do |condition|
column, operator, value = condition['column'], condition['operator'] || 'eq', condition['value']
- unless exclude_columns.include?(column.to_s)
+ unless exclude_columns.include?(column.to_s) || value == ''
condition_options = {}
condition_options[:chronic] = true if chronic_columns.include?(column.to_s)
condition_options[:integer] = true if integer_columns.include?(column.to_s)
condition_options.merge!(condition['options'] || {})
- add_condition_for(column, Condition.new(column, value, operator, condition_options))
+ column_name = map_column(column)
+ add_condition_for(column, Condition.new(column_name, value, operator, condition_options))
end
end
end
+ def sorts_from_hash(sorts)
+ sort_conditions = [sorts].flatten.compact
+ sort_conditions.collect do |c|
+ s = Sort.parse(c)
+ s.column = map_column(s.column)
+ s
+ end
+ end
+
+ def columns_from_options(column_type, options)
+ option = "#{column_type}_columns".to_sym
+ options[option] ? [options.delete(option)].flatten.collect {|c| c.to_s } : []
+ end
+
+ def map_column(column_name)
+ map_columns[column_name.to_s] || column_name.to_s
+ end
+
+
end
end
\ No newline at end of file