Changeset 351 for trunk/plugin/acts_as_ferret
- Timestamp:
- 07/09/08 09:18:10 (4 months ago)
- Files:
-
- trunk/plugin/acts_as_ferret/lib/acts_as_ferret.rb (modified) (4 diffs)
- trunk/plugin/acts_as_ferret/lib/class_methods.rb (modified) (1 diff)
- trunk/plugin/acts_as_ferret/lib/ferret_find_methods.rb (modified) (3 diffs)
- trunk/plugin/acts_as_ferret/lib/local_index.rb (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/plugin/acts_as_ferret/lib/acts_as_ferret.rb
r348 r351 300 300 # implementations 301 301 models = [ models_or_index_name ] if Class === models_or_index_name 302 if models && models.size == 1303 return models.shift.find_with_ferret query, options, ar_options304 end302 # if models && models.size == 1 303 # return models.shift.find_with_ferret query, options, ar_options 304 # end 305 305 index = find_index(models_or_index_name) 306 306 multi = (MultiIndex === index or index.shared?) 307 307 if options[:per_page] 308 # need pagination 308 309 options[:page] = options[:page] ? options[:page].to_i : 1 309 310 limit = options[:per_page] 310 311 offset = (options[:page] - 1) * limit 311 if ar_options[:conditions] && !multi 312 313 if multi or ((ar_options[:conditions] || ar_options[:order]) && options[:sort]) 314 # do pagination as the last step after everything has been fetched 315 options[:late_pagination] = { :limit => limit, :offset => offset } 316 options[:offset] = nil 317 options[:limit] = :all 318 elsif ar_options[:conditions] or ar_options[:order] 319 # do pagination right in AR call (faster but only works in this case) 312 320 ar_options[:limit] = limit 313 321 ar_options[:offset] = offset … … 315 323 options.delete :offset 316 324 else 317 # do pagination with ferret (or after everything is done in the case318 # of multi_search)319 325 options[:limit] = limit 320 326 options[:offset] = offset … … 322 328 elsif ar_options[:conditions] 323 329 if multi 324 # multisearch ignores ar_options limit and offset330 # multisearch does not use ar_options limit and offset directly but applies them later 325 331 options[:limit] ||= ar_options.delete(:limit) 326 332 options[:offset] ||= ar_options.delete(:offset) … … 334 340 end 335 341 end 336 342 ActsAsFerret::logger.debug "$$$$$$$$$ options: #{options.inspect}\nar_options: #{ar_options.inspect}" 337 343 total_hits, result = index.find_records query, options.merge(:models => models), ar_options 338 logger.debug "Query: #{query}\ntotal hits: #{total_hits}, results delivered: #{result.size}"344 ActsAsFerret::logger.debug "Query: #{query}\ntotal hits: #{total_hits}, results delivered: #{result.size}" 339 345 SearchResults.new(result, total_hits, options[:page], options[:per_page]) 340 346 end trunk/plugin/acts_as_ferret/lib/class_methods.rb
r338 r351 153 153 end 154 154 end 155 156 if options[:per_page] 157 options[:page] = options[:page] ? options[:page].to_i : 1 158 limit = options[:per_page] 159 offset = (options[:page] - 1) * limit 160 if find_options[:conditions] 161 find_options[:limit] = limit 162 find_options[:offset] = offset 163 options[:limit] = :all 164 options.delete :offset 165 else 166 # do pagination with ferret 167 options[:limit] = limit 168 options[:offset] = offset 169 end 170 elsif find_options[:conditions] 171 find_options[:limit] ||= options.delete(:limit) unless options[:limit] == :all 172 find_options[:offset] ||= options.delete(:offset) 173 options[:limit] = :all 174 end 175 176 total_hits, result = aaf_index.find_records q, options.merge(:models => [self]), find_options 177 logger.debug "Query: #{q}\ntotal hits: #{total_hits}, results delivered: #{result.size}" 178 SearchResults.new(result, total_hits, options[:page], options[:per_page]) 155 return ActsAsFerret::find q, self, options, find_options 179 156 end 180 157 trunk/plugin/acts_as_ferret/lib/ferret_find_methods.rb
r346 r351 5 5 6 6 def find_records(q, options = {}, ar_options = {}) 7 if options[:lazy] 7 late_pagination = options.delete :late_pagination 8 total_hits, result = if options[:lazy] 8 9 logger.warn "find_options #{ar_options} are ignored because :lazy => true" unless ar_options.empty? 9 10 lazy_find q, options … … 11 12 ar_find q, options, ar_options 12 13 end 14 if late_pagination 15 limit = late_pagination[:limit] 16 offset = late_pagination[:offset] 17 result = result[offset..limit+offset-1] 18 end 19 return [total_hits, result] 13 20 end 14 21 … … 25 32 26 33 def ar_find(q, options = {}, ar_options = {}) 27 total_hits, id_arrays = find_id_model_arrays q, options 34 ferret_options = options.dup 35 if ar_options[:conditions] or ar_options[:order] 36 ferret_options[:limit] = :all 37 ferret_options.delete :offset 38 end 39 total_hits, id_arrays = find_id_model_arrays q, ferret_options 40 logger.debug "now retrieving records from AR with options: #{ar_options.inspect}" 28 41 result = ActsAsFerret::retrieve_records(id_arrays, ar_options) 42 logger.debug "#{result.size} results from AR: #{result.inspect}" 29 43 30 44 # count total_hits via sql when using conditions, multiple models, or when we're called trunk/plugin/acts_as_ferret/lib/local_index.rb
r346 r351 159 159 160 160 161 161 # retrieves stored fields from index definition in case the fields to retrieve 162 # haven't been specified with the :lazy option 162 163 def determine_stored_fields(options = {}) 163 164 stored_fields = options[:lazy] … … 171 172 # loads data for fields declared as :lazy from the Ferret document 172 173 def extract_stored_fields(doc, stored_fields) 173 fields = index_definition[:ferret_fields]174 174 data = {} 175 logger.debug "extracting stored fields #{stored_fields.inspect} from document #{doc[:class_name]} / #{doc[:id]}" 176 stored_fields.each do |field| 177 if field_cfg = fields[field] 178 data[field_cfg[:via]] = doc[field] 179 end 180 end if stored_fields 181 logger.debug "done: #{data.inspect}" 175 unless stored_fields.nil? 176 logger.debug "extracting stored fields #{stored_fields.inspect} from document #{doc[:class_name]} / #{doc[:id]}" 177 fields = index_definition[:ferret_fields] 178 stored_fields.each do |field| 179 if field_cfg = fields[field] 180 data[field_cfg[:via]] = doc[field] 181 end 182 end 183 logger.debug "done: #{data.inspect}" 184 end 182 185 return data 183 186 end
