To edit pages or tickets please login with username/password: aaf/aaf

Show
Ignore:
Timestamp:
07/09/08 09:18:10 (4 months ago)
Author:
jk
Message:

fix sorting bug when using ferret sort along with pagination options

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/plugin/acts_as_ferret/lib/acts_as_ferret.rb

    r348 r351  
    300300    # implementations 
    301301    models = [ models_or_index_name ] if Class === models_or_index_name 
    302     if models && models.size == 1 
    303       return models.shift.find_with_ferret query, options, ar_options 
    304     end 
     302    # if models && models.size == 1 
     303    #   return models.shift.find_with_ferret query, options, ar_options 
     304    # end 
    305305    index = find_index(models_or_index_name) 
    306306    multi = (MultiIndex === index or index.shared?) 
    307307    if options[:per_page] 
     308      # need pagination 
    308309      options[:page] = options[:page] ? options[:page].to_i : 1 
    309310      limit = options[:per_page] 
    310311      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) 
    312320        ar_options[:limit] = limit 
    313321        ar_options[:offset] = offset 
     
    315323        options.delete :offset 
    316324      else 
    317         # do pagination with ferret (or after everything is done in the case 
    318         # of multi_search) 
    319325        options[:limit] = limit 
    320326        options[:offset] = offset 
     
    322328    elsif ar_options[:conditions] 
    323329      if multi 
    324         # multisearch ignores ar_options limit and offset 
     330        # multisearch does not use ar_options limit and offset directly but applies them later 
    325331        options[:limit] ||= ar_options.delete(:limit) 
    326332        options[:offset] ||= ar_options.delete(:offset) 
     
    334340      end 
    335341    end 
    336  
     342    ActsAsFerret::logger.debug "$$$$$$$$$ options: #{options.inspect}\nar_options: #{ar_options.inspect}" 
    337343    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}" 
    339345    SearchResults.new(result, total_hits, options[:page], options[:per_page]) 
    340346  end 
  • trunk/plugin/acts_as_ferret/lib/class_methods.rb

    r338 r351  
    153153        end 
    154154      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 
    179156    end  
    180157 
  • trunk/plugin/acts_as_ferret/lib/ferret_find_methods.rb

    r346 r351  
    55 
    66    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] 
    89        logger.warn "find_options #{ar_options} are ignored because :lazy => true" unless ar_options.empty? 
    910        lazy_find q, options 
     
    1112        ar_find q, options, ar_options 
    1213      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] 
    1320    end 
    1421 
     
    2532 
    2633    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}" 
    2841      result = ActsAsFerret::retrieve_records(id_arrays, ar_options) 
     42      logger.debug "#{result.size} results from AR: #{result.inspect}" 
    2943       
    3044      # 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  
    159159 
    160160 
    161  
     161    # retrieves stored fields from index definition in case the fields to retrieve  
     162    # haven't been specified with the :lazy option 
    162163    def determine_stored_fields(options = {}) 
    163164      stored_fields = options[:lazy] 
     
    171172    # loads data for fields declared as :lazy from the Ferret document 
    172173    def extract_stored_fields(doc, stored_fields)  
    173       fields = index_definition[:ferret_fields]  
    174174      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 
    182185      return data  
    183186    end 

To edit pages or tickets please login with username/password: aaf/aaf