모듈: Mongoid::Criteria::Queryable::Storable Private
- 포함 항목:
- Mongoid::Criteria::Queryable
- 다음에 정의됨:
- lib/mongoid/criteria/queryable/storable.rb
개요
이 모듈은 비공개 API의 일부입니다. 이 모듈은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
이 모듈은 쿼리 표현식을 기준 선택기에 쓰는 메서드를 캡슐화합니다.
쿼리 표현식은 필요에 따라 이미 확장되어 있어야 합니다. 이 모듈의 메서드는 표현식 값에 대한 처리를 수행하지 않습니다.
이 모듈의 메서드는 부정을 처리하지 않습니다. 부정이 필요한 경우 이러한 메서드의 업스트림에서 이미 처리된 상태여야 합니다.
인스턴스 메서드 요약 접기
-
#add_field_expression(필드, value) ⇒ 저장 가능
비공개
쿼리에 필드 표현식을 추가합니다.
-
#add_logical_operator_expression(연산자, op_expr) ⇒ 저장 가능
비공개
선택기에 논리 연산자 표현식 을 추가합니다.
-
#add_one_expression(필드, value) ⇒ 저장 가능
비공개
쿼리 에 임의의 표현식 을 추가합니다.
-
#add_operator_expression(연산자, op_expr) ⇒ 저장 가능
비공개
선택기에 연산자 표현식을 추가합니다.
인스턴스 메서드 세부 정보
#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 |
# 파일 'lib/mongoid/criteria/queryable/storable.rb', 줄 36 def add_field_expression(필드, value) 하지 않는 한 필드.is_a?(문자열) 올리다 ArgumentError, "필드는 string 이어야 합니다: #{필드}" end 만약 필드.start_with?('$') 올리다 ArgumentError, "필드는 연산자(예: $로 시작): #{필드}" end 만약 선택기[필드] # 시도하는 필드에 이미 제한이 있습니다. # 제한하려면 제한을 결합합니다. 만약 value.is_a?(해시) && 선택기[필드].is_a?(해시) && value.키.모두? { |키| key_s = 키.to_s key_s.start_with?('$') && !선택기[필드].키.map(&:to_s).포함?(key_s) } then # 동일한 필드에서 여러 연산자를 다음과 같이 결합할 수 있습니다. # 기존 해시에 추가합니다. new_value = 선택기[필드].merge(value) 선택기.저장(필드, new_value) elsif 선택기[필드] != value add_operator_expression('$and', [{필드 => value}]) end other 선택기.저장(필드, value) end self end |
#add_logical_operator_expression(연산자, 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인 경우 원칙적으로 $and를 생략할 수 있는 경우에도 op_expr이 선택기에 $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 |
# 파일 'lib/mongoid/criteria/queryable/storable.rb', 줄 108 def add_logical_operator_expression(연산자, op_expr) 하지 않는 한 연산자.is_a?(문자열) 올리다 ArgumentError, "연산자는 string 이어야 합니다: #{연산자}" end 하지 않는 한 %w($and $nor $or).포함?(연산자) 올리다 ArgumentError, "이 메서드는 논리 연산자($and, $nor, $or)만 처리합니다. 연산자 지정: #{연산자}" end 하지 않는 한 op_expr.is_a?(배열) 올리다 오류::InvalidQuery, "#{연산자} 인수는 배열이어야 합니다: #{Errors::InvalidQuery.truncate_expr(op_expr)}" end 만약 선택기.분량 == 1 && 선택기.키.first == 연산자 new_value = 선택기.values.first + op_expr 선택기.저장(연산자, new_value) elsif 연산자 == '$and' || 선택기.비어 있나요? # $and는 항상 최상위 수준에 추가될 수 있으며 다음과 같이 결합됩니다. # 다른 조건이 무엇이든 상관없이 사용할 수 있습니다. 만약 current_value = 선택기[연산자] new_value = current_value + op_expr 선택기.저장(연산자, new_value) other 선택기.저장(연산자, op_expr) end other # 다른 연산자는 별도로 추가해야 합니다. 만약 선택기[연산자] add_logical_operator_expression('$and', [연산자 => op_expr]) other 선택기.저장(연산자, op_expr) end end self end |
#add_one_expression(필드, value) ⇒ 저장가능
이 메서드는 비공개 API의 일부입니다. 이 방법은 향후 제거되거나 변경될 수 있으므로 가능하면 사용하지 않는 것이 좋습니다.
쿼리 에 임의의 표현식 을 추가합니다.
필드는 필드 이름 또는 연산자 일 수 있습니다.
수신자를 변경합니다.
223 224 225 226 227 228 229 230 231 232 233 |
# 파일 'lib/mongoid/criteria/queryable/storable.rb', 줄 223 def add_one_expression(필드, value) 하지 않는 한 필드.is_a?(문자열) 올리다 ArgumentError, "필드는 string 이어야 합니다: #{필드}" end 만약 필드.start_with?('$') add_operator_expression(필드, value) other add_field_expression(필드, value) end end |
#add_operator_expression(연산자, 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인 경우 원칙적으로 $and를 생략할 수 있는 경우에도 op_expr이 선택기에 $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 |
# 파일 'lib/mongoid/criteria/queryable/storable.rb', 줄 188 def add_operator_expression(연산자, op_expr) 하지 않는 한 연산자.is_a?(문자열) 올리다 ArgumentError, "연산자는 string 이어야 합니다: #{연산자}" end 하지 않는 한 연산자.start_with?('$') 올리다 ArgumentError, "연산자는 $로 시작해야 합니다: #{연산자}" end 만약 %w($and $nor $or).포함?(연산자) 반환 add_logical_operator_expression(연산자, op_expr) end # 다른 연산자의 경우 연산자 가 이미 존재하는 경우 # 쿼리 를 실행하고 $and를 사용하여 새 조건을 추가하고, 그렇지 않으면 다음을 추가합니다. # 새 조건을 최상위 수준으로 설정합니다. 만약 선택기[연산자] add_logical_operator_expression('$and', [{연산자 => op_expr}]) other 선택기.저장(연산자, op_expr) end self end |