def initialize(repository, model, options = {})
assert_kind_of 'repository', repository, Repository
assert_kind_of 'model', model, Model
assert_kind_of 'options', options, Hash
options.each_pair { |k,v| options[k] = v.call if v.is_a? Proc } if options.is_a? Hash
assert_valid_options(options)
@repository = repository
@properties = model.properties(@repository.name)
@model = model
@reload = options.fetch :reload, false
@unique = options.fetch :unique, false
@offset = options.fetch :offset, 0
@limit = options.fetch :limit, nil
@order = options.fetch :order, model.default_order(@repository.name)
@add_reversed = options.fetch :add_reversed, false
@fields = options.fetch :fields, @properties.defaults
@links = options.fetch :links, []
@includes = options.fetch :includes, []
@conditions = []
@order = normalize_order(@order)
@fields = normalize_fields(@fields)
@links = normalize_links(@links)
@includes = normalize_includes(@includes)
(options.keys - OPTIONS).each do |k|
append_condition(k, options[k])
end
if conditions = options[:conditions]
if conditions.kind_of?(Hash)
conditions.each do |k,v|
append_condition(k, v)
end
elsif conditions.kind_of?(Array)
raw_query, *bind_values = conditions
@conditions << if bind_values.empty?
[ :raw, raw_query ]
else
[ :raw, raw_query, bind_values ]
end
end
end
end