Sha256: 62d6252aaee532ad18ac9c27a592a6f3c39bb442e0658e7fb0e71623914f07bb

Contents?: true

Size: 1.3 KB

Versions: 16

Compression:

Stored size: 1.3 KB

Contents

# frozen_string_literal: true

module Thredded
  module UsersProvider
    module_function

    def call(user_names, scope)
      DbTextSearch::CaseInsensitive
        .new(scope, Thredded.user_name_column)
        .in(user_names)
    end
  end

  class UsersProviderWithCache
    def initialize
      @mutex = Mutex.new
      @cache = {}
    end

    def call(names, scope)
      # This is not the same as the database lowercasing but it's OK.
      # The worst that can happen is some cache misses.
      names_with_lowercase = names.zip(names.map(&:downcase))
      cached = uncached = nil
      result = @mutex.synchronize do
        scope_cache = (@cache[scope.to_sql] ||= {})
        cached, uncached = names_with_lowercase.partition { |(_, lowercase)| scope_cache.key?(lowercase) }
        fetched = UsersProvider.call(uncached.map(&:first), scope)
        fetched.each do |user|
          scope_cache[user.send(Thredded.user_name_column).downcase] = user
        end
        cached.map { |(_, lowercase)| scope_cache[lowercase] }.concat(fetched)
      end
      result.uniq!
      result.compact!
      Rails.logger.info(
        "  [Thredded::UsersProviderWithCache] #{names.size} user names => #{result.size} users "\
          "(#{cached.size} cached, #{uncached.size} uncached)"
      )
      result
    end
  end
end

Version data entries

16 entries across 16 versions & 1 rubygems

Version Path
thredded-1.1.0 lib/thredded/users_provider.rb
thredded-1.0.1 lib/thredded/users_provider.rb
thredded-1.0.0 lib/thredded/users_provider.rb
thredded-0.16.16 lib/thredded/users_provider.rb
thredded-0.16.15 lib/thredded/users_provider.rb
thredded-0.16.14 lib/thredded/users_provider.rb
thredded-0.16.13 lib/thredded/users_provider.rb
thredded-0.16.12 lib/thredded/users_provider.rb
thredded-0.16.11 lib/thredded/users_provider.rb
thredded-0.16.10 lib/thredded/users_provider.rb
thredded-0.16.9 lib/thredded/users_provider.rb
thredded-0.16.8 lib/thredded/users_provider.rb
thredded-0.16.7 lib/thredded/users_provider.rb
thredded-0.16.6 lib/thredded/users_provider.rb
thredded-0.16.5 lib/thredded/users_provider.rb
thredded-0.16.4 lib/thredded/users_provider.rb