Realización de una búsqueda paginada

Utilice el método search(DataObject) y PageControl DataObject para establecer el número de elementos devueltos en cualquier momento durante una búsqueda.

Acerca de esta tarea

El tamaño de página se transfiere desde PageControl. Se devuelve desde PageResponseControl una cookie que se utiliza para llamadas posteriores. Si decide no seguir obteniendo los resultados paginados, deberá establecer el tamaño de página en 0 con la cookie. A continuación, el servidor de virtual member manager limpia los resultados restantes.
Para utilizar una función de búsqueda paginada en una búsqueda, añada el siguiente código de ejemplo al código de la aplicación y sustituya las variables por los valores reales que desea utilizar para esta entidad:
public static Map getControlMap(DataGraph dataGraph)
{
        Map ctrlMap = new HashMap();
        List controls = dataGraph.getRootObject().getDataObject(SchemaConstants.DO_ROOT).getList(
                SchemaConstants.DO_CONTROLS);
        		if (controls != null) {
            			for (int i = 0; i < controls.size(); i++) {
                		  		DataObject control = (DataObject)controls.get(i);
                String type = control.getType().getName(); 
                if (ctrlMap.get(type) == null) {
                    ctrlMap.put(type, control);
                }
            }
        }
        return ctrlMap;
} 
DataObject root = SDOHelper.createRootDataObject();
		
		DataObject searchCtrl = root.createDataObject(DO_CONTROLS, WIM_NS_URI, DO_SEARCH_CONTROL);
		searchCtrl.getList(PROP_PROPERTIES).add("uid");
		searchCtrl.getList(PROP_PROPERTIES).add("sn"); 
		searchCtrl.setString(PROP_SEARCH_EXPRESSION, "//entities[@xsi:type='PersonAccount' and uid='SalesPerson*']");
	searchCtrl.getList(PROP_SEARCH_BASES).add("o=Sales,cn=users,dc=yourco,dc=com");
		DataObject pageCtrl = root.createDataObject(DO_CONTROLS, WIM_NS_URI, DO_PAGE_CONTROL);
		
		pageCtrl.setInt(PROP_SIZE, 2);
		boolean first = true;
		byte[] cookie = null;
		DataObject returnDO = null;
		int pageCount = 0;
		while (first || cookie != null) {
			first = false;
			pageCount++;
			if (cookie != null)
			{
				pageCtrl.setBytes(PROP_COOKIE, cookie);
				pageCtrl.setInt(PROP_SIZE, 3);
				searchCtrl.delete();
			}
			SDOUtils.printDataGraph(INPUT_DATAGRAPH, root);
			returnDO = service.search(root);
			SDOUtils.printDataGraph(OUTPUT_DATAGRAPH, returnDO);
			List entities = returnDO.getList(SchemaConstants.DO_ENTITIES );
			Map ctrlMap = getControlMap(returnDO);
			DataObject responseCtrl = (DataObject)ctrlMap.get(DO_PAGE_RESPONSE_CONTROL);
			if (responseCtrl != null) {
				cookie = responseCtrl.getBytes("cookie");
			} else {
				cookie = null;
			}
		}

Gráficos de ejemplo de datos de entrada y salida

Para este ejemplo concreto, el gráfico de datos de entrada es:
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:sdo="commonj.sdo" 
    xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:controls xsi:type="wim:SearchControl" 
                expression="//entities[@xsi:type='PersonAccount' and uid='SalesPerson*']">
      <wim:properties>uid</wim:properties>
      <wim:properties>sn</wim:properties>
      <wim:searchBases>o=Sales,cn=users,dc=yourco,dc=com</wim:searchBases>
    </wim:controls>
    <wim:controls xsi:type="wim:PageControl" size="2"/>
  </wim:Root>
</sdo:datagraph>
El gráfico de datos de salida resultante para la primera llamada en este ejemplo es el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:sdo="commonj.sdo" 
               xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:entities xsi:type="wim:PersonAccount">
      <wim:identifier externalName="uid=SalesPerson3,ou=US,o=Sales,cn=users,dc=yourco,dc=com"
                      repositoryId="LDAP1" 
                      uniqueId="13ae346f-1e4c-40cd-8896-1c7f0b2b3079" 
                      uniqueName="uid=SalesPerson3,ou=US,o=Sales,cn=users,dc=yourco,dc=com"/>
      <wim:uid>SalesPerson3</wim:uid>
      <wim:sn>SalesPerson3Sn</wim:sn>
    </wim:entities>
    <wim:entities xsi:type="wim:PersonAccount">
      <wim:identifier externalName="uid=SalesPerson2,ou=CA,o=Sales,cn=users,dc=yourco,dc=com"
                      repositoryId="LDAP1" 
                      uniqueId="a3f9e8a1-117a-4252-840f-6d0cb079a7fb" 
                      uniqueName="uid=SalesPerson2,ou=CA,o=Sales,cn=users,dc=yourco,dc=com"/>
      <wim:uid>SalesPerson2</wim:uid>
      <wim:sn>SalesPerson2Sn</wim:sn>
    </wim:entities>
    <wim:controls xsi:type="wim:PageResponseControl" 
                  cookie="57494D53656172636843616368654E616D6574696D653A31313239353538343136383636"
        totalSize="4"/>
  </wim:Root>
</sdo:datagraph>
El gráfico de datos de entrada para la segunda llamada en este ejemplo es el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:sdo="commonj.sdo" 
               xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:controls xsi:type="wim:PageControl" 
             cookie="57494D53656172636843616368654E616D6574696D653A31313239353538343136383636"
        size="3"/>
  </wim:Root>
</sdo:datagraph>
El gráfico de datos de salida resultante para la segunda llamada en este ejemplo es el siguiente:
<?xml version="1.0" encoding="UTF-8"?>
<sdo:datagraph xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
               xmlns:sdo="commonj.sdo" 
               xmlns:wim="http://www.ibm.com/websphere/wim">
  <wim:Root>
    <wim:entities xsi:type="wim:PersonAccount">
      <wim:identifier externalName="uid=SalesPerson1,ou=CA,o=Sales,cn=users,dc=yourco,dc=com"
                      repositoryId="LDAP1" 
                      uniqueId="e7db8c0e-d2b3-43fe-be14-1475125606f4" 
                      uniqueName="uid=SalesPerson1,ou=CA,o=Sales,cn=users,dc=yourco,dc=com"/>
      <wim:uid>SalesPerson1</wim:uid>
      <wim:sn>SalesPerson1Sn</wim:sn>
    </wim:entities>
    <wim:entities xsi:type="wim:PersonAccount">
      <wim:identifier externalName="uid=SalesPerson4,ou=US,o=Sales,cn=users,dc=yourco,dc=com"
                      repositoryId="LDAP1" 
                      uniqueId="a2d1be42-212e-44f0-8396-0bfc2d7d346d" 
                      uniqueName="uid=SalesPerson4,ou=US,o=Sales,cn=users,dc=yourco,dc=com"/>
      <wim:uid>SalesPerson4</wim:uid>
      <wim:sn>SalesPerson4Sn</wim:sn>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>

Consulte también el tema, Código de ejemplo para realizar una búsqueda paginada con resultados clasificados.



Condiciones de uso | Comentarios