JEP-0059: Result Set Management

This document defines an XMPP protocol extension to enable entities to page through and otherwise manage the receipt of large result sets.


WARNING: This Standards-Track JEP is Experimental. Publication as a Jabber Enhancement Proposal does not imply approval of this proposal by the Jabber Software Foundation. Implementation of the protocol described herein is encouraged in exploratory implementations, but production systems should not deploy implementations of this protocol until it advances to a status of Draft.


JEP Information

Status: Experimental
Type: Standards Track
Number: 0059
Version: 0.8
Last Updated: 2006-08-22
JIG: Standards JIG
Approving Body: Jabber Council
Dependencies: None
Supersedes: None
Superseded By: None
Short Name: rsm
Wiki Page: <http://wiki.jabber.org/index.php/Result Set Management (JEP-0059)>

Author Information

Jean-Louis Seguineau

Email: jls@antepo.com
JID: jlseguineau@im.antepo.com

Peter Saint-Andre

Email: stpeter@jabber.org
JID: stpeter@jabber.org

Valerie Mercier

Email: valerie.mercier@francetelecom.com
JID: vmercier@jabber.com

Legal Notice

This Jabber Enhancement Proposal is copyright 1999 - 2006 by the Jabber Software Foundation (JSF) and is in full conformance with the JSF's Intellectual Property Rights Policy <http://www.jabber.org/jsf/ipr-policy.shtml>. This material may be distributed only subject to the terms and conditions set forth in the Creative Commons Attribution License (<http://creativecommons.org/licenses/by/2.5/>).

Discussion Venue

The preferred venue for discussion of this document is the Standards-JIG discussion list: <http://mail.jabber.org/mailman/listinfo/standards-jig>.

Relation to XMPP

The Extensible Messaging and Presence Protocol (XMPP) is defined in the XMPP Core (RFC 3920) and XMPP IM (RFC 3921) specifications contributed by the Jabber Software Foundation to the Internet Standards Process, which is managed by the Internet Engineering Task Force in accordance with RFC 2026. Any protocol defined in this JEP has been developed outside the Internet Standards Process and is to be understood as an extension to XMPP rather than as an evolution, development, or modification of XMPP itself.

Conformance Terms

The following keywords as used in this document are to be interpreted as described in RFC 2119: "MUST", "SHALL", "REQUIRED"; "MUST NOT", "SHALL NOT"; "SHOULD", "RECOMMENDED"; "SHOULD NOT", "NOT RECOMMENDED"; "MAY", "OPTIONAL".


Table of Contents

1. Introduction
2. Use Cases
2.1. Getting the Item Count
2.2. Limiting the Size of a Result Set
2.3. Paging Through a Result Set
2.4. Handling Dynamic Result Sets
3. Examples
4. Determining Support
5. Security Considerations
6. IANA Considerations
7. Jabber Registrar Considerations
7.1. Protocol Namespaces
8. XML Schema
9. Acknowledgements
Notes
Revision History


1. Introduction

In Jabber Search [1], Service Discovery [2], Publish-Subscribe [3], and perhaps other future XMPP extensions, it is possible to receive large result sets in response to information requests (e.g., a user directory search on a common first name or a service discovery items request sent to a Multi-User Chat [4] service). Thus it would be helpful to define an XMPP protocol extension that enables the following functionality:

  1. Discover the size of a potential result set without retrieving the items themselves.
  2. Limit the size of a result set.
  3. Page through a result set by retrieving the items in smaller subsets.

This document defines just such a protocol extension.

2. Use Cases

2.1 Getting the Item Count

In order to get the item count of a result set without retrieving the items themselves, the requesting entity specifies a request type of "count":

Example 1. Requesting the Item Count

<iq type='get' from='stpeter@jabber.org/roundabout' to='users.jabber.org' id='count1'>
  <query xmlns='jabber:iq:search'>
    <first>Peter</first>
    <count xmlns='http://jabber.org/protocol/rsm'/>
  </query>
</iq>
    

The responding entity then returns the item count, which MAY be approximate rather than precise (since determining the exact number of items may be resource-intensive):

Example 2. Returning the Item Count

<iq type='result' from='users.jabber.org' to='stpeter@jabber.org/roundabout' id='count1'>
  <query xmlns='jabber:iq:search'>
    <count xmlns='http://jabber.org/protocol/rsm'>800</count>
  </query>
</iq>
    

If no items match, the responding entity MUST return a response that adheres to the definition of the wrapper protocol (e.g., "jabber:iq:search", "http://jabber.org/protocol/disco#items", or "http://jabber.org/protocol/pubsub"). For both JEP-0055 and JEP-0030, that means the responding entity shall return an empty <query/> element; for JEP-0060, that means the responding entity shall return an empty <pubsub/> element.

2.2 Limiting the Size of a Result Set

In order to limit the number of items to be returned in a result set, the requesting entity specifies a request type of "set" and the maximum size of the desired result set (via XML character data of the <max/> element):

Example 3. Requesting a Limit to the Result Set

<iq type='get' from='stpeter@jabber.org/roundabout' to='users.jabber.org' id='limit1'>
  <query xmlns='jabber:iq:search'>
    <first>Peter</first>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>10</max>
    </set>
  </query>
</iq>
    

The responding entity then returns a result set limited to the requested size:

Example 4. Returning a Limited Result Set

<iq type='result' from='users.jabber.org' to='stpeter@jabber.org/roundabout' id='limit1'>
  <query xmlns='jabber:iq:search'>
    <item jid='stpeter@jabber.org'>
      <first>Peter</first>
      <last>Saint-Andre</last>
      <nick>stpeter</nick>
    </item>
    .
    [8 more items]
    .
    <item jid='peterpan@neverland.lit'>
      <first>Peter</first>
      <last>Pan</last>
      <nick>petie</nick>
    </item>
  </query>
</iq>
    

2.3 Paging Through a Result Set

In order to page through a result set, the requesting entity specifies a request type of "set" as well as the item after which the page shall start (which defaults to "0") and the maximum number of items to return:

Example 5. Requesting the First Page of a Result Set

<iq type='get' from='stpeter@jabber.org/roundabout' to='users.jabber.org' id='page1'>
  <query xmlns='jabber:iq:search'>
    <first>Peter</first>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>10</max>
    </set>
  </query>
</iq>
    

The responding entity then returns the first page of the result set:

Example 6. Returning the First Page of a Result Set

<iq type='result' from='users.jabber.org' to='stpeter@jabber.org/roundabout' id='page1'>
  <query xmlns='jabber:iq:search'>
    <item jid='stpeter@jabber.org'>
      <first>Peter</first>
      <last>Saint-Andre</last>
      <nick>stpeter</nick>
    </item>
    .
    [8 more items]
    .
    <item jid='peterpan@neverland.lit'>
      <first>Peter</first>
      <last>Pan</last>
      <nick>petie</nick>
    </item>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>10</max>
    </set>
    <count xmlns='http://jabber.org/protocol/rsm'>800</count>
  </query>
</iq>
    

As shown in the previous example, the responding entity MAY include the item count with the first result set (or any future result set, although returning the count with the first result set is probably most helpful).

Naturally, the requesting entity can then ask for the next page in the result set:

Example 7. Requesting the Second Page of a Result Set

<iq type='get' from='stpeter@jabber.org/roundabout' to='users.jabber.org' id='page2'>
  <query xmlns='jabber:iq:search'>
    <first>Peter</first>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>10</max>
    </set>
  </query>
</iq>
    

The responding entity then returns the second page of the result set:

Example 8. Returning the Second Page of a Result Set

<iq type='result' from='users.jabber.org' to='stpeter@jabber.org/roundabout' id='page2'>
  <query xmlns='jabber:iq:search'>
    <item jid='peter@pixyland.org'>
      <first>Peter</first>
      <last>Pan</last>
      <nick>peterpan</nick>
    </item>
    <item jid='peter@rabbit.lit'>
      <first>Peter</first>
      <last>Rabbit</last>
      <nick>prabbit</nick>
    </item>
    .
    [8 more items]
    .
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>10</max>
    </set>
  </query>
</iq>
    

If the result set contains the last items that meet the provided criteria, the responding entitity SHOULD include an empty <end/> element:

Example 9. Returning the Last Page of a Result Set

<iq type='result' from='users.jabber.org' to='stpeter@jabber.org/roundabout' id='lastpage'>
  <query xmlns='jabber:iq:search'>
    [the last items]
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>10</max>
      <end/>
    </set>
  </query>
</iq>
    

2.4 Handling Dynamic Result Sets

The set of items that match a query may change over time, even during the time that a requesting entity pages through a result set (e.g., a set of chatrooms, since rooms can be created and destroyed at any time). By following the method outlined in this section, a responding entity implementation can make it more likely that the requesting entity will receive up-to-date search results and not receive duplicate items. (Note: Support for this method is OPTIONAL.)

First, in the result set it returns, the responding entity includes a <last/> element that specifies a unique ID (UID) for the last item in the result set. The responding entity can generate this UID in any way, as long as the ID is unique in the context of the full result set; one possible method, shown below, is to serialize the XML of the last item in the result set and then hash it according to the SHA-1 algorithm (see RFC 3174 [5]).

Example 10. Returning a Limited Result Set

<iq type='result' from='conference.jabber.org' to='stpeter@jabber.org/roundabout' id='ex2'>
  <query xmlns='http://jabber.org/protocol/disco#items'>
    <item jid='12@conference.jabber.org'/>
    <item jid='adium@conference.jabber.org'/>
    <item jid='airhitch@conference.jabber.org'/>
    <item jid='alphaville@conference.jabber.org'/>
    <item jid='apache@conference.jabber.org'/>
    <item jid='argia@conference.jabber.org'/>
    <item jid='armagetron@conference.jabber.org'/>
    <item jid='atticroom123@conference.jabber.org'/>
    <item jid='banquise@conference.jabber.org'/>
    <item jid='bar_paradise@conference.jabber.org'/>
    <item jid='beer@conference.jabber.org'/>
    <item jid='blondie@conference.jabber.org'/>
    <item jid='bpnops@conference.jabber.org'/>
    <item jid='brasileiros@conference.jabber.org'/>
    <item jid='bulgaria@conference.jabber.org'/>
    <item jid='cantinalivre@conference.jabber.org'/>
    <item jid='casablanca@conference.jabber.org'/>
    <item jid='chinortpcrew@conference.jabber.org'/>
    <item jid='coffeetalk@conference.jabber.org'/>
    <item jid='council@conference.jabber.org'/>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>20</max>
      <last>4da91d4b330112f683dddaebf93180b1bd25e95f</last>
    </set>
  </query>
</iq>
    

If the requesting entity cares about receiving up-to-date results and not receiving duplicate items, it can then specify the UID of the last item as the XML character data of an <after/> element in its next request:

Example 11. Requesting a Page Beginning After the Last Item Received

<iq type='get' from='stpeter@jabber.org/roundabout' to='conference.jabber.org' id='ex3'>
  <query xmlns='http://jabber.org/protocol/disco#items'>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>20</max>
      <after>4da91d4b330112f683dddaebf93180b1bd25e95f</after>
    </set>
  </query>
</iq>
    

The responding entity then MUST begin the next page in the result set with the item that follows the last item received by the requesting entity.

3. Examples

The foregoing examples show the use of result set management in the context of JEP-0055: Jabber Search.. Therefore in the following examples we show the use of result set management in the context of JEP-0030: Service Discovery. A future version of this document may also include examples from JEP-0060: Publish-Subscribe and other XMPP protocol extensions.

Example 12. Requesting the Item Count

<iq type='get' from='stpeter@jabber.org/roundabout' to='conference.jabber.org' id='ex1'>
  <query xmlns='http://jabber.org/protocol/disco#items'>
    <count xmlns='http://jabber.org/protocol/rsm'/>
  </query>
</iq>
  

Example 13. Returning the Item Count

<iq type='result' from='conference.jabber.org' to='stpeter@jabber.org/roundabout' id='ex1'>
  <query xmlns='http://jabber.org/protocol/disco#items'>
    <count xmlns='http://jabber.org/protocol/rsm'>150</count>
  </query>
</iq>
  

Example 14. Requesting a Limit to the Result Set

<iq type='get' from='stpeter@jabber.org/roundabout' to='conference.jabber.org' id='ex2'>
  <query xmlns='http://jabber.org/protocol/disco#items'>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>20</max>
    </set>
  </query>
</iq>
  

Example 15. Returning a Limited Result Set

<iq type='result' from='conference.jabber.org' to='stpeter@jabber.org/roundabout' id='ex2'>
  <query xmlns='http://jabber.org/protocol/disco#items'>
    <item jid='12@conference.jabber.org'/>
    <item jid='adium@conference.jabber.org'/>
    <item jid='airhitch@conference.jabber.org'/>
    <item jid='alphaville@conference.jabber.org'/>
    <item jid='apache@conference.jabber.org'/>
    <item jid='argia@conference.jabber.org'/>
    <item jid='armagetron@conference.jabber.org'/>
    <item jid='atticroom123@conference.jabber.org'/>
    <item jid='banquise@conference.jabber.org'/>
    <item jid='bar_paradise@conference.jabber.org'/>
    <item jid='beer@conference.jabber.org'/>
    <item jid='blondie@conference.jabber.org'/>
    <item jid='bpnops@conference.jabber.org'/>
    <item jid='brasileiros@conference.jabber.org'/>
    <item jid='bulgaria@conference.jabber.org'/>
    <item jid='cantinalivre@conference.jabber.org'/>
    <item jid='casablanca@conference.jabber.org'/>
    <item jid='chinortpcrew@conference.jabber.org'/>
    <item jid='coffeetalk@conference.jabber.org'/>
    <item jid='council@conference.jabber.org'/>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>20</max>
      <last>4da91d4b330112f683dddaebf93180b1bd25e95f</last>
    </set>
  </query>
</iq>
  

Example 16. Requesting a Page Beginning After the Last Item Received

<iq type='get' from='stpeter@jabber.org/roundabout' to='conference.jabber.org' id='ex3'>
  <query xmlns='http://jabber.org/protocol/disco#items'>
    <set xmlns='http://jabber.org/protocol/rsm'>
      <max>20</max>
      <after>4da91d4b330112f683dddaebf93180b1bd25e95f</after>
    </set>
  </query>
</iq>
  

4. Determining Support

In order for a requesting entity to determine if a responding entity supports result set management, it SHOULD send a Service Discovery information request to the responding entity:

Example 17. Requesting entity queries responding entity regarding protocol support

<iq from='stpeter@jabber.org/roundabout'
    to='conference.jabber.org'
    id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'/>
</iq>
  

Example 18. Responding entity communicates protocol support

<iq from='conference.jabber.org'
    to='stpeter@jabber.org/roundabout'
    id='disco1'>
  <query xmlns='http://jabber.org/protocol/disco#info'>
    ...
    <feature var='http://jabber.org/protocol/rsm'/>
    ...
  </query>
</iq>
  

A requesting entity SHOULD NOT include result set management extensions if it does not have positive knowledge that the responding entity supports the protocol defined herein. If the responding entity does not understand result set management, it MUST ignore the extension.

Note: Even if a responding entity understands the result set management protocol, its support for result set management in the context of any given using protocol is OPTIONAL (e.g., an implementation could support it in the context of the 'jabber:iq:search' namespace but not in the context of the 'http://jabber.org/protocol/disco#items' namespace). Currently the only way for a requesting entity to determine if a responding entity supports result set management in the context of a given using protocol is to include result set management extensions in its request. If the responding entity does not include result set management extensions in its response, then the requesting entity SHOULD NOT include such extensions in future requests wrapped by the using protocol namespace.

5. Security Considerations

Security considerations are the responsibility of the using ("wrapper") protocol, such as JEP-0030 for the 'http://jabber.org/protocol/disco#items' namespace and JEP-0055 for the 'jabber:iq:search' namespace.

6. IANA Considerations

This JEP requires no interaction with the Internet Assigned Numbers Authority (IANA) [6].

7. Jabber Registrar Considerations

7.1 Protocol Namespaces

The Jabber Registrar [7] shall include 'http://jabber.org/protocol/rsm' in its registry of protocol namespaces.

8. XML Schema

<?xml version='1.0' encoding='UTF-8'?>

<xs:schema
    xmlns:xs='http://www.w3.org/2001/XMLSchema'
    targetNamespace='http://jabber.org/protocol/rsm'
    xmlns='http://jabber.org/protocol/rsm'
    elementFormDefault='qualified'>

  <xs:element name='count' type='xs:string'/>

  <xs:element name='set'>
    <xs:complexType>
      <xs:sequence>
        <xs:element name='max' type='xs:int' minOccurs='1' maxOccurs='1'/>
        <xs:choice minOccurs='0' maxOccurs='1'/>
          <xs:element name='last' type='xs:string'/>
          <xs:element name='after' type='xs:string'/>
          <xs:element name='end' type='empty'/>
        </xs:choice>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:simpleType name='empty'>
    <xs:restriction base='xs:string'>
      <xs:enumeration value=''/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>
  

9. Acknowledgements

Thanks to Ian Paterson, Jon Perlow, and Andrew Plotkin for their feedback.


Notes

1. JEP-0055: Jabber Search <http://www.jabber.org/jeps/jep-0055.html>.

2. JEP-0030: Service Discovery <http://www.jabber.org/jeps/jep-0030.html>.

3. JEP-0060: Publish-Subscribe <http://www.jabber.org/jeps/jep-0060.html>.

4. JEP-0045: Multi-User Chat <http://www.jabber.org/jeps/jep-0045.html>.

5. RFC 3174: US Secure Hash Algorithm 1 (SHA1) <http://www.ietf.org/rfc/rfc3174.txt>.

6. The Internet Assigned Numbers Authority (IANA) is the central coordinator for the assignment of unique parameter values for Internet protocols, such as port numbers and URI schemes. For further information, see <http://www.iana.org/>.

7. The Jabber Registrar maintains a list of reserved Jabber protocol namespaces as well as registries of parameters used in the context of protocols approved by the Jabber Software Foundation. For further information, see <http://www.jabber.org/registrar/>.


Revision History

Version 0.8 (2006-08-22)

Added optional method for handling dynamic result sets.

(psa)

Version 0.7 (2006-08-10)

Updated implementation note to clarify handling of result sets (static vs. dynamic).

(psa)

Version 0.6 (2006-07-12)

Updated implementation note to clarify handling of result sets (static vs. dynamic).

(psa)

Version 0.5 (2006-05-02)

Clarified error handling, determination of support in the context of using protocols, and security considerations.

(psa)

Version 0.4 (2006-04-24)

Specified that an item count may be approximate; specified that an item count may be returned with a page of results.

(psa)

Version 0.3 (2006-04-21)

Added <end/> element to specify last result set; added service discovery information; added more examples.

(psa/vm)

Version 0.2 (2005-12-22)

Revived and renamed the JEP; modified syntax; added use case for getting number of items; defined XML schema.

(psa/vm)

Version 0.1 (2002-11-12)

Initial version.

(jls)


END