Sha256: 9f36141c9563522920c20b14d7fb1be402222961b1db8a84259fa2b9c2f96030

Contents?: true

Size: 1.9 KB

Versions: 1

Compression:

Stored size: 1.9 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.join(', ')}"
    end

  end
  
end

Version data entries

1 entries across 1 versions & 1 rubygems

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