Skip to content
This repository
tag: v4.6.5
Fetching contributors…

Octocat-spinner-32-eaf2f5

Cannot retrieve contributors at this time

file 109 lines (96 sloc) 2.901 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
module Picky

  #
  #
  class Index
    include Helpers::Indexing

    # Delegators for indexing.
    #
    delegate :cache,
             :clear,
             :to => :categories

    # Define an index tokenizer on the index.
    #
    # Parameters are the exact same as for indexing.
    #
    def indexing options = {}
      @tokenizer = Tokenizer.from options
    end

    # Calling prepare on an index will call prepare
    # on every category.
    #
    # Decides whether to use a parallel indexer or whether to
    # delegate to each category to prepare themselves.
    #
    def prepare scheduler = Scheduler.new
      if source.respond_to?(:each)
        check_source_empty
        prepare_in_parallel scheduler
      else
        with_data_snapshot { categories.prepare scheduler }
      end
    end

    # Check if the given enumerable source is empty.
    #
    # Note: Checking as early as possible to tell the
    # user as early as possible.
    #
    def check_source_empty
      warn %Q{\n\033[1mWarning\033[m, source for index "#{name}" is empty: #{source} (responds true to empty?).\n} if source.respond_to?(:empty?) && source.empty?
    end

    # Indexes the categories in parallel.
    #
    # Only use where the category does have a #each source defined.
    #
    def prepare_in_parallel scheduler
      indexer = Indexers::Parallel.new self
      indexer.prepare categories, scheduler
    end

    # Note: Duplicated in category_indexing.rb.
    #
    # Take a data snapshot if the source offers it.
    #
    def with_data_snapshot
      if source.respond_to? :with_snapshot
        source.with_snapshot(self) do
          yield
        end
      else
        yield
      end
    end

    # Returns the installed tokenizer or the default.
    #
    def tokenizer
      @tokenizer || Indexes.tokenizer
    end

    # Define a source on the index.
    #
    # Parameter is a source, either one of the standard sources or
    # anything responding to #each and returning objects that
    # respond to id and the category names (or the category from option).
    #
    def source some_source = nil, &block
      some_source ||= block
      some_source ? (@source = Source.from(some_source, false, name)) : unblock_source
    end
    # Get the actual source if it is wrapped in a time
    # capsule, i.e. a block/lambda.
    #
    def unblock_source
      @source.respond_to?(:call) ? @source.call : @source
    end

    # Define a key_format on the index.
    #
    # Parameter is a method name to use on the key (e.g. :to_i, :to_s, :strip).
    #
    def key_format key_format = nil
      key_format ? (@key_format = key_format) : @key_format
    end

    # Define what to do after indexing.
    # (Only used in the Sources::DB)
    #
    def after_indexing after_indexing = nil
      after_indexing ? (@after_indexing = after_indexing) : @after_indexing
    end

  end

end
Something went wrong with that request. Please try again.