Sha256: cac200a57e2ea44dbca24b6c4faaa49c70398ef708892b2f70a678e3115b7559

Contents?: true

Size: 1.88 KB

Versions: 1

Compression:

Stored size: 1.88 KB

Contents

module Query

  # An allocation has a number of combinations:
  # [token, index] [other_token, other_index], ...
  #
  class Allocation # :nodoc:all

    attr_reader :count, :ids, :score, :combinations, :result_identifier

    #
    #
    def initialize combinations, result_identifier
      @combinations      = combinations
      @result_identifier = result_identifier
    end

    def hash
      @combinations.hash
    end
    def eql? other_allocation
      true # FIXME
      # @combinations.eql? other_allocation.combinations
    end

    # Scores its combinations and caches the result.
    #
    def calculate_score weights
      @score ||= @combinations.calculate_score(weights)
    end

    # Asks the combinations for the (intersected) ids.
    #
    def calculate_ids amount, offset
      @combinations.ids amount, offset # Calculate as many ids as are necessary.
    end

    # This starts the searching process.
    #
    def process! amount, offset
      ids    = calculate_ids amount, offset
      @count = ids.size                         # cache the count before throwing away the ids
      @ids   = ids.slice!(offset, amount) || [] # slice out the relevant part
    end

    #
    #
    def keep identifiers = [] # categories
      @combinations.keep identifiers
    end
    #
    #
    def remove identifiers = [] # categories
      @combinations.remove identifiers
    end

    # Sort highest score first.
    #
    def <=> other_allocation
       other_allocation.score <=> self.score
    end

    # Transform the allocation into result form.
    #
    def to_result
      [self.result_identifier, self.score, self.count, @combinations.to_result, self.ids] if self.count > 0
    end

    # Json representation of this allocation.
    #
    # Note: Delegates to to_result.
    #
    def to_json
      to_result.to_json
    end

    #
    #
    def to_s
      "Allocation(#{to_result})"
    end

  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
picky-2.7.0 lib/picky/query/allocation.rb