Class: RSpec::Core::FilterableItemRepository::QueryOptimized

### Home Classes Methods

### In Files

- lib/rspec/core/metadata_filter.rb

### Parent

RSpec::Core::FilterableItemRepository::UpdateOptimized

### Methods

- ::new
- #append
- #find_items_for
- #items_for
- #prepend

### Class/Module Index

Quicksearch

- RSpec
- RSpec::Core
- RSpec::Core::AnonymousExampleGroup
- RSpec::Core::Backports
- RSpec::Core::Backports::Random
- RSpec::Core::Backports::Random::Implementation
- RSpec::Core::Backports::Random::MT19937
- RSpec::Core::BacktraceFormatter
- RSpec::Core::Configuration
- RSpec::Core::Configuration::DeprecationReporterBuffer
- RSpec::Core::Configuration::ExposeCurrentExample
- RSpec::Core::Configuration::MustBeConfiguredBeforeExampleGroupsError
- RSpec::Core::ConfigurationOptions
- RSpec::Core::DRbOptions
- RSpec::Core::DRbRunner
- RSpec::Core::DSL
- RSpec::Core::DSL::RSpec
- RSpec::Core::Example
- RSpec::Core::Example::ExecutionResult
- RSpec::Core::Example::Procsy
- RSpec::Core::ExampleGroup
- RSpec::Core::ExclusionRules
- RSpec::Core::FilterManager
- RSpec::Core::FilterRules
- RSpec::Core::FilterableItemRepository
- RSpec::Core::FilterableItemRepository::QueryOptimized
- RSpec::Core::FilterableItemRepository::UpdateOptimized
- RSpec::Core::FlatMap
- RSpec::Core::Formatters
- RSpec::Core::Formatters::BaseFormatter
- RSpec::Core::Formatters::BaseTextFormatter
- RSpec::Core::Formatters::ConsoleCodes
- RSpec::Core::Formatters::DeprecationFormatter
- RSpec::Core::Formatters::DeprecationFormatter::DelayedPrinter
- RSpec::Core::Formatters::DeprecationFormatter::FileStream
- RSpec::Core::Formatters::DeprecationFormatter::ImmediatePrinter
- RSpec::Core::Formatters::DeprecationFormatter::RaiseErrorStream
- RSpec::Core::Formatters::DocumentationFormatter
- RSpec::Core::Formatters::Helpers
- RSpec::Core::Formatters::HtmlFormatter
- RSpec::Core::Formatters::HtmlPrinter
- RSpec::Core::Formatters::JsonFormatter
- RSpec::Core::Formatters::Loader
- RSpec::Core::Formatters::ProfileFormatter
- RSpec::Core::Formatters::ProgressFormatter
- RSpec::Core::Formatters::Protocol
- RSpec::Core::Formatters::SnippetExtractor
- RSpec::Core::Formatters::SnippetExtractor::CoderayConverter
- RSpec::Core::Formatters::SnippetExtractor::NullConverter
- RSpec::Core::HashImitatable
- RSpec::Core::HashImitatable::ClassMethods
- RSpec::Core::Hooks
- RSpec::Core::Hooks::AfterContextHook
- RSpec::Core::Hooks::AfterHook
- RSpec::Core::Hooks::AroundHook
- RSpec::Core::Hooks::BeforeHook
- RSpec::Core::Hooks::Hook
- RSpec::Core::Hooks::HookCollections
- RSpec::Core::InclusionRules
- RSpec::Core::LegacyExampleGroupHash
- RSpec::Core::MemoizedHelpers
- RSpec::Core::MemoizedHelpers::ClassMethods
- RSpec::Core::MemoizedHelpers::ContextHookMemoizedHash
- RSpec::Core::MemoizedHelpers::ContextHookMemoizedHash::After
- RSpec::Core::MemoizedHelpers::ContextHookMemoizedHash::Before
- RSpec::Core::Metadata
- RSpec::Core::Metadata::ExampleGroupHash
- RSpec::Core::Metadata::ExampleHash
- RSpec::Core::Metadata::HashPopulator
- RSpec::Core::MetadataFilter
- RSpec::Core::MinitestAssertionsAdapter
- RSpec::Core::MockingAdapters
- RSpec::Core::MockingAdapters::Flexmock
- RSpec::Core::MockingAdapters::Mocha
- RSpec::Core::MockingAdapters::Null
- RSpec::Core::MockingAdapters::RR
- RSpec::Core::MockingAdapters::RSpec
- RSpec::Core::Notifications
- RSpec::Core::Notifications::DeprecationNotification
- RSpec::Core::Notifications::ExampleNotification
- RSpec::Core::Notifications::ExamplesNotification
- RSpec::Core::Notifications::FailedExampleNotification
- RSpec::Core::Notifications::NullColorizer
- RSpec::Core::Notifications::NullNotification
- RSpec::Core::Notifications::PendingExampleFailedAsExpectedNotification
- RSpec::Core::Notifications::PendingExampleFixedNotification
- RSpec::Core::Notifications::PendingExampleNotificationMethods
- RSpec::Core::Notifications::ProfileNotification
- RSpec::Core::Notifications::SeedNotification
- RSpec::Core::Notifications::SkippedExampleNotification
- RSpec::Core::Notifications::SummaryNotification
- RSpec::Core::NullReporter
- RSpec::Core::Ordering
- RSpec::Core::Ordering::ConfigurationManager
- RSpec::Core::Ordering::Custom
- RSpec::Core::Ordering::Identity
- RSpec::Core::Ordering::Random
- RSpec::Core::Ordering::Registry
- RSpec::Core::Parser
- RSpec::Core::Pending
- RSpec::Core::Pending::PendingExampleFixedError
- RSpec::Core::Pending::SkipDeclaredInExample
- RSpec::Core::ProjectInitializer
- RSpec::Core::RakeTask
- RSpec::Core::RandomNumberGenerator
- RSpec::Core::Reporter
- RSpec::Core::RubyProject
- RSpec::Core::Runner
- RSpec::Core::Sandbox
- RSpec::Core::SharedContext
- RSpec::Core::SharedExampleGroup
- RSpec::Core::SharedExampleGroup::Registry
- RSpec::Core::SharedExampleGroup::TopLevelDSL
- RSpec::Core::SharedExampleGroupInclusionStackFrame
- RSpec::Core::SharedExampleGroupModule
- RSpec::Core::SuiteHookContext
- RSpec::Core::TestUnitAssertionsAdapter
- RSpec::Core::Time
- RSpec::Core::Version
- RSpec::Core::Warnings
- RSpec::Core::World
- RSpec::ExampleGroups
- Object

No matching classes.

# RSpec::Core::FilterableItemRepository::QueryOptimized

This implementation is much more complex, and is optimized for rare (or hopefully no) updates once the queries start. Updates incur a cost as it has to clear the memoization and keep track of applicable keys. Queries will be O(N) the first time an item is provided with a given set of applicable metadata; subsequent queries with items with the same set of applicable metadata will be O(1) due to internal memoization.

This is ideal for use by config, where filterable items (e.g. hooks) are typically added at the start of the process (e.g. in `spec_helper`) and then repeatedly queried as example groups and examples are defined. @private

### Public Class Methods

new(applies_predicate) click to toggle source

    # File lib/rspec/core/metadata_filter.rb, line 148
    def initialize(applies_predicate)
      super
      @applicable_keys   = Set.new
      @proc_keys         = Set.new
      @memoized_lookups  = Hash.new do |hash, applicable_metadata|
        hash[applicable_metadata] = find_items_for(applicable_metadata)
      end
    end

### Public Instance Methods

append(item, metadata) click to toggle source

    # File lib/rspec/core/metadata_filter.rb, line 157
    def append(item, metadata)
      super
      handle_mutation(metadata)
    end

find_items_for(metadata) click to toggle source
Alias for: items_for
items_for(metadata) click to toggle source

    # File lib/rspec/core/metadata_filter.rb, line 167
    def items_for(metadata)
      # The filtering of `metadata` to `applicable_metadata` is the key thing
      # that makes the memoization actually useful in practice, since each
      # example and example group have different metadata (e.g. location and
      # description). By filtering to the metadata keys our items care about,
      # we can ignore extra metadata keys that differ for each example/group.
      # For example, given `config.include DBHelpers, :db`, example groups
      # can be split into these two sets: those that are tagged with `:db` and those
      # that are not. For each set, this method for the first group in the set is
      # still an `O(N)` calculation, but all subsequent groups in the set will be
      # constant time lookups when they call this method.
      applicable_metadata = applicable_metadata_from(metadata)

      if applicable_metadata.any? { |k, _| @proc_keys.include?(k) }
        # It's unsafe to memoize lookups involving procs (since they can
        # be non-deterministic), so we skip the memoization in this case.
        find_items_for(applicable_metadata)
      else
        @memoized_lookups[applicable_metadata]
      end
    end

Also aliased as: find_items_for
prepend(item, metadata) click to toggle source

    # File lib/rspec/core/metadata_filter.rb, line 162
    def prepend(item, metadata)
      super
      handle_mutation(metadata)
    end

[Validate]

Generated with the Darkfish Rdoc Generator 2.