模块:Mongoid::Criteria::Queryable::Storable Private
- 定义于:
- lib/mongoid/criteria/queryable/storable.rb
Overview
该模块是私有 API 的一部分。 您应尽可能避免使用此模块,因为它将来可能会被删除或更改。
该模块封装了将查询表达式写入 Criteria 选择器的方法。
查询表达式必须已根据需要进行扩展。 此模块的方法不对表达式值执行处理。
此模块中的方法不处理否定 - 如果需要否定,则必须已在这些方法的上游进行处理。
实例方法摘要折叠
-
# add_field_expression (字段, value) ⇒ 可存储
private
将字段表达式添加到查询中。
-
# add_logic_operator_expression (操作符, op_expr) ⇒ 可存储
private
将逻辑操作符表达式添加到选择器。
-
# add_one_expression (字段, value) ⇒ 可存储
private
在查询中添加任意表达式。
-
# add_operator_expression (operator, op_expr) ⇒ 可存储
private
将操作符表达式添加到选择器。
实例方法详细信息
# add_field_expression (字段, value) ⇒可存储
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
将字段表达式添加到查询中。
field
必须是字段名,且必须是string 。 在调用此方法时,上游代码必须已将其他字段/键类型转换为简单string形式。
value
可以是任何类型,原样写入选择器。
此方法不对提供的字段值执行任何处理。
改变接收器。
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
# File 'lib/mongoid/criteria/queryable/storable.rb', line 36 def add_field_expression(字段, 值) 除非 字段.is_a?(字符串) 提高 ArgumentError, "字段必须是string : #{ field } " end if 字段.start_with?('$') 提高 ArgumentError, "字段不能是操作符(即以 $ 开头): #{ field } " end if 选择器[字段] # 我们已经对正在尝试的字段进行了限制 # 要限制,请组合限制。 if 值.is_a?(哈希) && 选择器[字段].is_a?(哈希) && 值.密钥.全部? { |key| key_s = key.to_s key_s.start_with?('$') && !选择器[字段].密钥.map(和:to_s).包括?(key_s) } then # 可以在同一字段上组合多个操作符 # 将它们添加到现有哈希中。 new_value = 选择器[字段].合并(merge)(值) 选择器.存储(字段, new_value) elsif 选择器[字段] != 值 add_operator_expression(' $and ', [{字段 => 值}]) end else 选择器.存储(字段, 值) end self end |
# add_logic_operator_expression (operator, op_expr) ⇒可存储
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
将逻辑操作符表达式添加到选择器。
此方法仅处理逻辑运算符($and、$nor 和 $or)。 如果使用另一个操作符调用,则会引发 ArgumentError。 请注意,在MQL中, $not 是字段级操作符,而不是查询级操作符,因此该方法不处理 $not 。
为了方便调用者,此方法将操作符和操作符值表达式分开使用。 它可以被视为处理存储哈希{操作符 => op_expr} 。
如果选择器由单个条件组成,即指定的操作符(在顶层),则 op_expr 中给出的新条件将添加到指定操作符的现有条件中。 示例,如果选择器当前是:
{'$or' => [{'hello' => 'world'}]}
… 且操作符为 '$or' 且 op_expr 为[{'test' => 123 '}] ,则生成的选择器将是:
{'$or' => [{'hello' => 'world'}, {'test' => 123}]}
此方法始终将新条件添加为附加要求;换句话说,它不实现 ActiveRecord 或/或接收者成为操作数之一的行为。 预计此方法的上游代码会实现此类行为。
此方法不会简化值(即,如果选择器当前为空且操作符为 $and,则 op_expr 将使用 $and 写入选择器,即使原则上可以省略 $and)。 上游代码也应已执行此类简化。
此方法会更改接收器。
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 |
# File 'lib/mongoid/criteria/queryable/storable.rb', line 108 def add_logic_operator_expression(运算符, op_expr) 除非 运算符.is_a?(字符串) 提高 ArgumentError, " Operator must be a string : #{ 操作符 } " end 除非 %w($and $nor $or).包括?(运算符) 提高 ArgumentError, "此方法仅处理逻辑运算符($and、$nor、$or)。给出的运算符: #{ 操作符 } " end 除非 op_expr.is_a?(阵列) 提高 Errors::InvalidQuery, " #{ Operator }参数必须是数组: #{ Errors :: InvalidQuery . truncate_expr ( op_expr ) } " end if 选择器.长度 == 1 && 选择器.密钥.first == 运算符 new_value = 选择器.values.first + op_expr 选择器.存储(运算符, new_value) elsif 运算符 == ' $and ' || 选择器.空? # $and 始终可以添加到顶层,并且它将被合并 # 无论是否存在其他条件。 if current_value = 选择器[运算符] new_value = current_value + op_expr 选择器.存储(运算符, new_value) else 选择器.存储(运算符, op_expr) end else # 其他操作符需要单独添加 if 选择器[运算符] add_logic_operator_expression(' $and ', [运算符 => op_expr]) else 选择器.存储(运算符, op_expr) end end self end |
# add_one_expression (字段, value) ⇒可存储
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
在查询中添加任意表达式。
Field 可以是字段名或操作符。
改变接收器。
223 224 225 226 227 228 229 230 231 232 233 |
# File 'lib/mongoid/criteria/queryable/storable.rb', line 223 def add_one_expression(字段, 值) 除非 字段.is_a?(字符串) 提高 ArgumentError, "字段必须是string : #{ field } " end if 字段.start_with?('$') add_operator_expression(字段, 值) else add_field_expression(字段, 值) end end |
# add_operator_expression (operator, op_expr) ⇒可存储
此方法是私有 API 的一部分。 您应尽可能避免使用此方法,因为它将来可能会被删除或更改。
将操作符表达式添加到选择器。
为了方便调用者,此方法将操作符和操作符值表达式分开使用。 它可以被视为处理存储哈希{操作符 => op_expr} 。
操作符值可以是任何类型。
如果选择器中已经有指定的操作符(在顶层),则 op_expr 中给出的新条件将添加到指定操作符的现有条件中。 这对于 $and 来说很简单;对于其他逻辑操作符,此方法的行为是将新条件添加到现有操作符。 示例,如果选择器当前是:
{'foo' => 'bar', '$or' => [{'hello' => 'world'}]}
… 且操作符为 '$or' 且 op_expr 为{'test' => 123 '} ,则生成的选择器将是:
{'foo' => 'bar', '$or' => [{'hello' => 'world'}, {'test' => 123}]}
这不会在现有选择器和新操作符表达式之间实现 OR - 处理这是上游方法的工作。 此方法只是将 op_expr 存储到选择器中,假设现有选择器已经是操作的正确左侧。
对于 $where 和 $text 等非逻辑查询级操作符,如果已经存在同名的顶级操作符,则会通过顶级 $and 操作符将 op_expr 添加到选择器,从而生成具有两个操作符值。
此方法不会简化值(即,如果选择器当前为空且操作符为 $and,则 op_expr 将使用 $and 写入选择器,即使原则上可以省略 $and)。
此方法会更改接收器。
188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 |
# File 'lib/mongoid/criteria/queryable/storable.rb', line 188 def add_operator_expression(运算符, op_expr) 除非 运算符.is_a?(字符串) 提高 ArgumentError, " Operator must be a string : #{ 操作符 } " end 除非 运算符.start_with?('$') 提高 ArgumentError, "操作符必须以 $ 开头: #{ 操作符 } " end if %w($and $nor $or).包括?(运算符) return add_logic_operator_expression(运算符, op_expr) end # 对于其他操作符,如果操作符已存在于 # 查询,使用 $and 添加新条件,否则添加 # 将新条件添加到顶层。 if 选择器[运算符] add_logic_operator_expression(' $and ', [{运算符 => op_expr}]) else 选择器.存储(运算符, op_expr) end self end |