Class: Net::IMAP::ESearchResult

Inherits:
Object
  • Object
show all
Defined in:
lib/net/imap/esearch_result.rb

Overview

An “extended search” response (ESEARCH). ESearchResult should be returned (instead of SearchResult) by IMAP#search, IMAP#uid_search, IMAP#sort, and IMAP#uid_sort under any of the following conditions:

  • Return options were specified for IMAP#search or IMAP#uid_search. The server must support a search extension which allows RFC4466 return options, such as ESEARCH, PARTIAL, or IMAP4rev2.

  • Return options were specified for IMAP#sort or IMAP#uid_sort. The server must support the ESORT extension [RFC5267].

    NOTE: IMAP#search and IMAP#uid_search do not support ESORT yet.

  • The server supports IMAP4rev2 but not IMAP4rev1, or IMAP4rev2 has been enabled. IMAP4rev2 requires ESEARCH results.

Note that some servers may claim to support a search extension which requires an ESEARCH result, such as PARTIAL, but still only return a SEARCH result when return options are specified.

Some search extensions may result in the server sending ESearchResult responses after the initiating command has completed. Use IMAP#add_response_handler to handle these responses.

Defined Under Namespace

Classes: PartialResult

Instance Method Summary collapse

Constructor Details

#initialize(tag: nil, uid: nil, data: nil) ⇒ ESearchResult

Returns a new instance of ESearchResult.



29
30
31
32
33
34
# File 'lib/net/imap/esearch_result.rb', line 29

def initialize(tag: nil, uid: nil, data: nil)
  tag  => String       | nil; tag = -tag if tag
  uid  => true | false | nil; uid = !!uid
  data => Array        | nil; data ||= []; data.freeze
  super
end

Instance Method Details

#allObject

:call-seq: all -> sequence set or nil

A SequenceSet containing all message sequence numbers or UIDs that satisfy the SEARCH criteria.

Returns nil when the associated search command has no results, or when the ALL return option was not specified but other return options were.

Requires ESEARCH [RFC4731] or IMAP4rev2 [RFC9051].

See also: #to_a



147
# File 'lib/net/imap/esearch_result.rb', line 147

def all;        data.assoc("ALL")&.last        end

#countObject

:call-seq: count -> integer or nil

Returns the number of messages that satisfy the SEARCH criteria.

Returns nil when the associated search command has no results, or when the COUNT return option wasn’t specified.

Requires ESEARCH [RFC4731] or IMAP4rev2 [RFC9051].



158
# File 'lib/net/imap/esearch_result.rb', line 158

def count;      data.assoc("COUNT")&.last      end

#eachObject

When either #all or #partial contains a SequenceSet of message sequence numbers or UIDs, each yields each integer in the set.

When both #all and #partial are nil, either because the server returned no results or because ALL and PARTIAL were not included in the IMAP#search RETURN options, #each does not yield.

Note that SearchResult also implements #each, so it can be used without checking if the server returned SEARCH or ESEARCH data.

Related: #to_sequence_set, #to_a, #all, #partial



80
81
82
83
84
# File 'lib/net/imap/esearch_result.rb', line 80

def each(&)
  return to_enum(__callee__) unless block_given?
  to_sequence_set.each_number(&)
  self
end

#maxObject

:call-seq: max -> integer or nil

The highest message number/UID that satisfies the SEARCH criteria.

Returns nil when the associated search command has no results, or when the MAX return option wasn’t specified.

Requires ESEARCH [RFC4731] or IMAP4rev2 [RFC9051].



133
# File 'lib/net/imap/esearch_result.rb', line 133

def max;        data.assoc("MAX")&.last        end

#minObject

:call-seq: min -> integer or nil

The lowest message number/UID that satisfies the SEARCH criteria.

Returns nil when the associated search command has no results, or when the MIN return option wasn’t specified.

Requires ESEARCH [RFC4731] or IMAP4rev2 [RFC9051].



122
# File 'lib/net/imap/esearch_result.rb', line 122

def min;        data.assoc("MIN")&.last        end

#modseqObject

:call-seq: modseq -> integer or nil

The highest mod-sequence of all messages being returned.

Returns nil when the associated search command has no results, or when the MODSEQ search criterion wasn’t specified.

Note that there is no search return option for MODSEQ. It will be returned whenever the CONDSTORE extension has been enabled. Using the MODSEQ search criteria will implicitly enable CONDSTORE.

Requires CONDSTORE [RFC7162] and ESEARCH [RFC4731].



173
# File 'lib/net/imap/esearch_result.rb', line 173

def modseq;     data.assoc("MODSEQ")&.last     end

#partialObject

:call-seq: partial -> PartialResult or nil

A PartialResult containing a subset of the message sequence numbers or UIDs that satisfy the SEARCH criteria.

Requires PARTIAL [RFC9394] or CONTEXT=SEARCH/CONTEXT=SORT [RFC5267]

See also: #to_a



215
# File 'lib/net/imap/esearch_result.rb', line 215

def partial;    data.assoc("PARTIAL")&.last    end

#to_aObject

:call-seq: to_a -> Array of integers

When either #all or #partial contains a SequenceSet of message sequence numbers or UIDs, to_a returns that set as an array of integers.

When both #all and #partial are nil, either because the server returned no results or because neither ALL or PARTIAL were included in the IMAP#search RETURN options, #to_a returns an empty array.

Note that SearchResult also implements to_a, so it can be used without checking if the server returned SEARCH or ESEARCH data.

Related: #each, #to_sequence_set, #all, #partial



49
# File 'lib/net/imap/esearch_result.rb', line 49

def to_a; to_sequence_set.numbers end

#to_sequence_setObject

:call-seq: to_sequence_set -> SequenceSet or nil

When either #all or #partial contains a SequenceSet of message sequence numbers or UIDs, to_sequence_set returns that sequence set.

When both #all and #partial are nil, either because the server returned no results or because neither ALL or PARTIAL were included in the IMAP#search RETURN options, #to_sequence_set returns SequenceSet.empty.

Note that SearchResult also implements to_sequence_set, so it can be used without checking if the server returned SEARCH or ESEARCH data.

Related: #each, #to_a, #all, #partial



65
66
67
# File 'lib/net/imap/esearch_result.rb', line 65

def to_sequence_set
  all || partial&.to_sequence_set || SequenceSet.empty
end