lib/legato/query.rb in legato-0.0.1 vs lib/legato/query.rb in legato-0.0.2
- old
+ new
@@ -1,78 +1,79 @@
module Legato
class Query
include Enumerable
MONTH = 2592000
+ REQUEST_FIELDS = 'columnHeaders/name,rows,totalResults,totalsForAllResults'
- def define_filter(name, block)
+ def define_filter(name, &block)
(class << self; self; end).instance_eval do
- define_method(name) {|*args| apply_filter(*args, block)}
+ define_method(name) {|*args| apply_filter(*args, &block)}
end
end
def self.define_filter_operators(*methods)
methods.each do |method|
class_eval <<-CODE
- def #{method}(field, value)
- Filter.new(field, :#{method}, value) # defaults to joining with AND
+ def #{method}(field, value, join_character=nil)
+ Filter.new(field, :#{method}, value, join_character)
end
CODE
end
end
attr_reader :parent_klass
attr_accessor :profile, :start_date, :end_date
- attr_accessor :order, :limit, :offset#, :segment # individual, overwritten
+ attr_accessor :sort, :limit, :offset#, :segment # individual, overwritten
attr_accessor :filters # appended to, may add :segments later for dynamic segments
def initialize(klass)
@loaded = false
@parent_klass = klass
self.filters = FilterSet.new
self.start_date = Time.now - MONTH
self.end_date = Time.now
klass.filters.each do |name, block|
- define_filter(name, block)
+ define_filter(name, &block)
end
# may add later for dynamic segments
# klass.segment_definitions.each do |name, segment|
# self.class.define_segment(name, segment)
# end
end
- def apply_filter(*args, block)
+ def apply_filter(*args, &block)
@profile = extract_profile(args)
join_character = Legato.and_join_character # filters are joined by AND
# # block returns one filter or an array of filters
Array.wrap(instance_exec(*args, &block)).each do |filter|
- filter.join_character = join_character
+ filter.join_character ||= join_character # only set when not set explicitly
self.filters << filter
join_character = Legato.or_join_character # arrays are joined by OR
end
self
end
def apply_options(options)
if options.has_key?(:sort)
# warn
- options[:order] = options.delete(:sort)
+ options[:sort] = options.delete(:sort)
end
apply_basic_options(options)
# apply_filter_options(options[:filters])
self
end
def apply_basic_options(options)
- [:order, :limit, :offset, :start_date, :end_date].each do |key| #:segment
+ [:sort, :limit, :offset, :start_date, :end_date].each do |key| #:segment
self.send("#{key}=".to_sym, options[key]) if options.has_key?(key)
end
end
# def apply_filter_options(filter_options)
@@ -106,26 +107,41 @@
def loaded?
@loaded
end
def load
- @collection = request_for_query.collection
+ response = request_for_query
+ @collection = response.collection
+ @total_results = response.total_results
+ @totals_for_all_results = response.totals_for_all_results
@loaded = true
end
def collection
load unless loaded?
@collection
end
alias :to_a :collection
+ def total_results
+ load unless loaded?
+ @total_results
+ end
+
+ def totals_for_all_results
+ load unless loaded?
+ @totals_for_all_results
+ end
+
def each(&block)
collection.each(&block)
end
# if no filters, we use results to add profile
def results(profile=nil, options={})
+ options, profile = profile, nil if profile.is_a?(Hash)
+
self.profile = profile unless profile.nil?
apply_options(options)
self
end
@@ -143,12 +159,12 @@
def dimensions
parent_klass.dimensions
end
- def order=(arr)
- @order = Legato::ListParameter.new(:order, arr)
+ def sort=(arr)
+ @sort = Legato::ListParameter.new(:sort, arr)
end
# def segment_id
# segment.nil? ? nil : "gaid::#{segment}"
# end
@@ -163,13 +179,14 @@
'start-date' => Legato.format_time(start_date),
'end-date' => Legato.format_time(end_date),
'max-results' => limit,
'start-index' => offset,
# 'segment' => segment_id,
- 'filters' => filters.to_params # defaults to AND filtering
+ 'filters' => filters.to_params, # defaults to AND filtering
+ 'fields' => REQUEST_FIELDS
}
- [metrics, dimensions, order].each do |list|
+ [metrics, dimensions, sort].each do |list|
params.merge!(list.to_params) unless list.nil?
end
params.reject {|k,v| v.nil? || v.to_s.strip.length == 0}
end