类:Mongoid::Contextual::Mongo::DocumentsLoader Private

继承:
对象
  • 对象
显示全部
扩展方式:
可转发
包括:
Association::EagerLoadable
定义于:
lib/mongoid/contextual/ mongo /documents_loader.rb

Overview

此类是私有 API 的一部分。 应尽可能避免使用此类,因为它将来可能会被删除或更改。

根据提供的条件加载文档。

实例属性摘要折叠

类方法摘要折叠

实例方法摘要折叠

Association::EagerLoadable 中包含的方法

#eager_load#eager_loadable? , #preload

构造函数详情

#initialize (view, klass,riteria, executor: self.class.executor) ⇒ DocumentsLoader

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

实例化文档加载器实例,并立即使用提供的执行器安排其执行。

参数:

  • 查看 ( Mongo::Collection::View )

    该集合视图从数据库中获取记录。

  • klass ( class )

    用于实例化文档的 Mongoid 模型类。 如果可能,从数据库获取的所有记录都将转换为此类的实例。

  • 条件 ( Mongoid::Criteria )

    指定应加载哪些文档的条件。

  • 执行者 ( Concurrent::AbstractExecutorService ) (默认为: self.class.executor

    能够运行“Concurrent::Promises::Future”实例的执行程序。



89
90
91
92
93
94
95
96
97
98
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 89

def 初始化(查看, klass, 条件, 执行器: self.class.执行者)
  @view = 查看
  @klass = klass
  @criteria = 条件
  @mutex = 互斥锁.new
  @state = :pending
  @future = 并发::Promises.future_on(执行者) do
    开始 && 执行
  end
end

实例属性详细信息

#criteriaMongoid::Criteria

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回指定应加载哪些文档的条件。 此处公开是因为“Association::EagerLoadable”中的“eager_loadable?”方法期望该方法可用。

返回:

  • ( Mongoid::Criteria )

    指定应加载哪些文档的条件。 此处公开是因为“Association::EagerLoadable”中的“eager_loadable?”方法期望该方法可用。



75
76
77
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 75

def 条件
  @criteria
end

类方法详细信息

executor (名称 = Mongoid.async_query_executor) ⇒ Concurrent::ImmediateExecutor | Concurrent::ThreadPoolExecutor

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

根据 Mongoid 配置选项返回合适的执行程序。

参数:

  • 名称 string | 符号 (默认为: Mongoid.async_query_executor

    查询执行程序名称,可以是 :immediate 或 :global_thread_pool。 默认为 'async_query_executor` 配置选项。

返回:

  • ( Concurrent::ImmediateExecutor | Concurrent::ThreadPoolExecutor )

    用于执行文档加载任务的执行程序。

引发:



61
62
63
64
65
66
67
68
69
70
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 61

def self.执行者(名称 = Mongoid.async_query_executor)
  案例 名称.to_sym
  when :immediate
    immediate_executor
  when :global_thread_pool
    global_thread_pool_async_query_executor
  else
    提高 Errors::InvalidQueryExecutor.new(名称)
  end
end

global_thread_pool_async_query_executorConcurrent::ThreadPoolExecutor

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

当 async_query_executor 配置选项设置为 :global_thread_pool 时,返回要使用的异步执行程序。 此执行程序使用线程池在后台线程上运行操作。

返回:

  • ( Concurrent::ThreadPoolExecutor )

    用于执行文档加载任务的执行程序。



32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 32

def self.global_thread_pool_async_query_executor
  create_pool = Proc.new do |并发|
    并发::ThreadPoolExecutor.new(
      min_threads: 0,
      max_threads: 并发,
      max_queue: 并发 * 4,
      Fallback_policy: :caller_runs
    )
  end
  并发 = Mongoid.global_executor_concurrency || 4
  @@global_thread_pool_async_query_executor ||= create_pool.调用(并发)
  if @@global_thread_pool_async_query_executor.max_length != 并发
    old_pool = @@global_thread_pool_async_query_executor
    @@global_thread_pool_async_query_executor = create_pool.调用(并发)
    old_pool.shutdown
  end
  @@global_thread_pool_async_query_executor
end

immediate_executorConcurrent::ImmediateExecutor

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

返回当 async_query_executor 配置选项设立为 :immediate 时要使用的同步执行程序。 此执行器在当前线程上运行所有操作,并根据需要进行阻塞。

返回:

  • ( Concurrent::ImmediateExecutor )

    用于执行文档加载任务的执行程序。



22
23
24
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 22

def self.immediate_executor
  @@immediate_executor ||= 并发::ImmediateExecutor.new
end

实例方法详细信息

#executeArray< Mongoid::Document >

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

从数据库加载“@criteria”指定的记录,并将其转换为“@klass”类型的 Mongoid 文档。

此方法由创建加载器实例时计划的任务(可能是异步)调用。 但是,如果希望立即在调用者线程上执行加载,则可以直接调用此方法。

调用此方法不会更改加载程序的状态。

返回:



152
153
154
155
156
157
158
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 152

def 执行
  文档 = @view.map do |doc|
    工厂.from_db(@klass, doc, @criteria)
  end
  ager_load(文档) if ager_loadable?
  文档
end

#待处理?true | false

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

无论加载程序处于挂起状态,都返回 false 或 true。

待处理状态表示加载程序的执行已安排,但尚未启动。

返回:

  • ( true | false )

    如果加载程序处于挂起状态,则为 true,否则为 false。



107
108
109
110
111
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 107

def 待处理?
  @mutex.同步 do
    @state == :pending
  end
end

#已启动?true | false

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

无论加载程序处于启动状态,都返回 false 或 true。

已启动状态表示加载程序已开始执行。 请注意,即使执行完成(成功或失败),加载器也会保持此状态。

返回:

  • ( true | false )

    如果加载程序处于已启动状态,则为 true,否则为 false。



121
122
123
124
125
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 121

def 开始?
  @mutex.同步 do
    @state == :started
  end
end

# unschedule对象

此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。

将加载器标记为未计划。

如果加载器被标记为未调度,则不会执行。 加载文档的唯一选项是直接调用“execute”方法。

请注意,如果任务已经开始执行,则取消计划没有任何影响。



134
135
136
137
138
# File 'lib/mongoid/contextual/ mongo /documents_loader.rb', line 134

def 取消安排
  @mutex.同步 do
    @state = :canceled 除非 @state == :started
  end
end