def search_index(query, find_options={}, options={})
@query_cache = {} if options[:no_query_cache]
if !@query_cache || !@query_cache[query]
build_index
(@query_cache ||= {})[query] = new_index.search(query)
end
if options[:ids_only]
find_option_keys = find_options.keys.map{ |k| k.to_sym }
find_option_keys -= [:limit, :offset]
if find_option_keys.any?
raise ArgumentError, 'ids_only can not be combined with find option keys other than :offset or :limit'
end
end
if find_options.include?(:order)
part_query = @query_cache[query].map{ |r| r.first }
else
offset = find_options[:offset] || 0
limit = find_options.include?(:limit) ? find_options[:limit] : @query_cache[query].size
part_query = sort(@query_cache[query]).slice(offset,limit).map{ |r| r.first }
find_options[:offset] = nil
find_options[:limit] = nil
end
return part_query if options[:ids_only]
with_scope :find => find_options do
records = find(:all, :conditions => [ "#{table_name}.#{primary_key} IN (?)", part_query])
if find_options.include?(:order)
records
else
ranked_records = ActiveSupport::OrderedHash.new
records.each do |r|
ranked_records[r] = @query_cache[query][r.id]
end
sort(ranked_records.to_a).map{ |r| r.first }
end
end
end