模块:Mongoid::Criteria::Queryable::Storable Private

包含在:
Mongoid::Criteria::Queryable
定义于:
lib/mongoid/criteria/queryable/storable.rb

Overview

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

该模块封装了将查询表达式写入 Criteria 选择器的方法。

查询表达式必须已根据需要进行扩展。 此模块的方法不对表达式值执行处理。

此模块中的方法不处理否定 - 如果需要否定,则必须已在这些方法的上游进行处理。

实例方法摘要折叠

实例方法详细信息

# add_field_expression (字段, value) ⇒可存储

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

将字段表达式添加到查询中。

field 必须是字段名,且必须是string 。 在调用此方法时,上游代码必须已将其他字段/键类型转换为简单string形式。

value 可以是任何类型,原样写入选择器。

此方法不对提供的字段值执行任何处理。

改变接收器。

参数:

  • 字段 ( string )

    字段名称。

  • ( Object )

    字段值。

返回:



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)。 上游代码也应已执行此类简化。

此方法会更改接收器。

参数:

  • 运算符 ( string )

    要添加的操作符。

  • op_expr ( Array<Hash> )

    要添加的操作符值。

返回:



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 可以是字段名或操作符。

改变接收器。

参数:

  • 字段 ( string )

    字段名称或操作符名称。

  • ( Object )

    字段值或操作符表达式。

返回:



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)。

此方法会更改接收器。

参数:

  • 运算符 ( string )

    要添加的操作符。

  • op_expr ( Object )

    要添加的操作符值。

返回:



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