Sha256: f95def349c2f3ad87aac5645456549317232cdb9f85683261bfb5cc34fa1ba7a

Contents?: true

Size: 1.91 KB

Versions: 2

Compression:

Stored size: 1.91 KB

Contents

module Query

  # Combinations are a number of Combination-s.
  #
  # They are the core of an allocation.
  # An allocation consists of a number of combinations.
  #
  module Combinations # :nodoc:all

    # Redis Combinations contain specific methods for
    # calculating score and ids in memory.
    #
    class Redis < Base

      # Connect to the backend.
      #
      # TODO Use specific Picky Redis wrapper.
      #
      def self.redis
        @redis ||= ::Redis.new :db => 15
      end

      attr_reader :redis

      #
      #
      def initialize combinations
        super combinations

        @redis = self.class.redis
      end

      # Returns the result ids for the allocation.
      #
      def ids amount, offset
        return [] if @combinations.empty?

        identifiers = @combinations.inject([]) do |identifiers, combination|
          identifiers << "#{combination.identifier}"
        end

        result_id = generate_intermediate_result_id

        # Intersect and store.
        #
        redis.zinterstore result_id, identifiers

        # Get the stored result.
        #
        results = redis.zrange result_id, offset, (offset + amount)

        # Delete the stored result as it was only for temporary purposes.
        #
        # Note: I could also not delete it, but that would not be clean at all.
        #
        redis.del result_id

        results
      end

      # Generate a multiple host/process safe result id.
      #
      # Note: Generated when this class loads.
      #
      require 'socket'
      def self.extract_host
        @host ||= Socket.gethostname
      end
      def host
        self.class.extract_host
      end
      extract_host
      def pid
        @pid ||= Process.pid
      end
      # Use the host and pid (generated lazily in child processes) for the result.
      #
      def generate_intermediate_result_id
        :"#{host}:#{pid}:picky:result"
      end

    end

  end

end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
picky-2.7.0 lib/picky/query/combinations/redis.rb
picky-2.6.0 lib/picky/query/combinations/redis.rb