Código de ejemplo para realizar una búsqueda paginada con resultados clasificados

Utilice el código de ejemplo y los gráficos de datos para realizar una búsqueda paginada con resultados clasificados utilizando los objetos de datos SortControl y PageControl.

En este fragmento de código de ejemplo se incluyen los pasos siguientes:

  1. Establezca las propiedades en SearchControl y la base de búsqueda para realizar la búsqueda.
  2. Establezca SortControl para especificar la propiedad con la que desea clasificar los resultados. Asegúrese de que la clave de clasificación usada por SortControl se haya añadido a SearchControl. En el código de ejemplo siguiente, la clasificación se realiza en la clave, sn.
  3. Establezca PageControl para paginar los resultados de búsqueda. Puede definir el tamaño de paginación. En el ejemplo de código siguiente, está establecido en 2.
Nota: para el código de ejemplo para realizar sólo una búsqueda paginada o sólo una búsqueda clasificada, lea los temas Realización de una búsqueda paginada y Realización de una búsqueda clasificada.

Requisitos previos

Asegúrese de leer la información y completar los pasos que se describen en el tema Requisitos previos de programación.

Código de ejemplo

Añada el código de ejemplo siguiente al código de aplicación y sustituta las variables por los valores reales que desea utilizar.

    /**
     * Escenario de prueba para buscar con control de página y control de clasificación
     * Estas pruebas clasifican los resultados de búsqueda según la clave de clasificación proporcionada.
     * Los resultados clasificados se pueden paginar aplicando control de página y puede establecerse
     * el tamaño de página en el control de página para devolver la salida deseada.
     */
    @SuppressWarnings("unchecked")
    public static void testPageSortControl() throws Exception
    {
        DataObject root = SDOHelper.createRootDataObject();
        
        DataObject searchCtrl = root.createDataObject(SchemaConstants.DO_CONTROLS, 
                SchemaConstants.WIM_NS_URI, SchemaConstants.DO_SEARCH_CONTROL);
        // Establezca las propiedades que deben recuperarse para las entidades
        // como parte de la operación de búsqueda
        searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
        searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn"); 
        // Establezca el filtro de búsqueda para buscar entidades que tengan un
        // uid que empiece con SalesPerson
        searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "//entities[@xsi:type='PersonAccount' 
                and uid='SalesPerson*']");
        // Añadir la base de búsqueda en la que se realizará la búsqueda
        searchCtrl.getList(SchemaConstants.PROP_SEARCH_BASES).add("o=SalesPerson,dc=yourco,dc=com");
        // Añadir el control de clasificación para clasificar los resultados
        DataObject sortCtrl = root.createDataObject(SchemaConstants.DO_CONTROLS, SchemaConstants.WIM_NS_URI, 
                SchemaConstants.DO_SORT_CONTROL);
        // Especificar la clave de clasificación como “sn” según la que se realizará la clasificación
        sortCtrl.setString(SchemaConstants.PROP_SORT_LOCALE, "en-US");
        DataObject sortKey  = sortCtrl.createDataObject(SchemaConstants.DO_SORT_KEYS, SchemaConstants.WIM_NS_URI, 
                SchemaConstants.DO_SORT_KEY_TYPE);
        sortKey.setString(SchemaConstants.PROP_PROPERTY_NAME,"sn");
        // Establecer el orden como ascendente de modo que los resultados devueltos se
        // clasifiquen en orden ascendente
        sortKey.setBoolean(SchemaConstants.PROP_ASCENDING_ORDER, true);
        // Añadir el control de página a los resultados clasificados
        DataObject pageCtrl = root.createDataObject(SchemaConstants.DO_CONTROLS, SchemaConstants.WIM_NS_URI, 
                SchemaConstants.DO_PAGE_CONTROL);
        // Establecer el tamaño de página en dos, para que no se devuelvan más de 2 resultados por tamaño de página
        pageCtrl.setInt(SchemaConstants.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) {
                // Establecer la cookie recuperada del control de respuesta, en PageControl del objeto de datos de entrada
                pageCtrl.setBytes(SchemaConstants.PROP_COOKIE, cookie);
                //Suprimir el control de búsqueda del objeto de datos de entrada para la llamada siguiente
                				searchCtrl.delete();
            }
            System.out.println("Input datagraph" + printDO(root));
            			returnDO = service.search(root);
            System.out.println("Output datagraph" + printDO(returnDO));
            			List entities = returnDO.getList(SchemaConstants.DO_ENTITIES );
            			Map ctrlMap = getControlMap(returnDO);
            // Desde la correlación de control obtener el control de respuesta de página
            // y establecer la cookie utilizándolo
            DataObject responseCtrl = (DataObject)ctrlMap.get(SchemaConstants.DO_PAGE_RESPONSE_CONTROL);
            			if (responseCtrl != null) {
                cookie = responseCtrl.getBytes(SchemaConstants.PROP_COOKIE);
            } else {
                				cookie = null;
            }
        }    

    /**
     * Obtener ControlMap
     * Método de programa de utilidad para crear una correlación de todos los controles
     * disponible en DataObject.
     */
    public static Map getControlMap(DataObject root)
    {
        Map ctrlMap = new HashMap();
        // Obtener todos los controles y crear una correlación de los tipos de control
        List controls = 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;
    }

Gráficos de datos de entrada y salida

Gráfico de datos de entrada para una búsqueda paginada con resultados clasificados (primera llamada):
<?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=SalesPerson,dc=yourco,dc=com</wim:searchBases>
    </wim:controls>
    <wim:controls xsi:type="wim:SortControl">
      <wim:sortKeys>
        <wim:propertyName>sn</wim:propertyName>
        <wim:ascendingOrder>true</wim:ascendingOrder>
      </wim:sortKeys>
      <wim:locale>en-US</wim:locale>
    </wim:controls>
    <wim:controls xsi:type="wim:PageControl" size="2"/>
  </wim:Root>
</sdo:datagraph>
Gráfico de datos de salida para una búsqueda paginada con resultados clasificados:
<?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,o=SalesPerson,dc=yourco,dc=com" 
          repositoryId="ldapRepo" uniqueId="e0db3534-a0ec-4c8b-bfff-a399895a7ca3" 
          uniqueName="uid=SalesPerson1,o=SalesPerson,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=SalesPerson2,o=SalesPerson,dc=yourco,dc=com"
          repositoryId="ldapRepo" uniqueId="7130a46b-d896-4bdd-8f2c-04d9374908c6" 
          uniqueName="uid=SalesPerson2,o=SalesPerson,dc=yourco,dc=com"/>
      <wim:uid>SalesPerson2</wim:uid>
      <wim:sn>SalesPerson2sn</wim:sn>
    </wim:entities>
    <wim:controls xsi:type="wim:PageResponseControl" 
        cookie="57494D53656172636843616368654E616D6574696D653A31323938333535393336343933"
        totalSize="3"/>
  </wim:Root>
</sdo:datagraph>
Gráfico de datos de entrada para una búsqueda paginada con resultados clasificados (segunda llamada):
<?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:SortControl">
      <wim:sortKeys>
        <wim:propertyName>sn</wim:propertyName>
        <wim:ascendingOrder>true</wim:ascendingOrder>
      </wim:sortKeys>
      <wim:locale>en-US</wim:locale>
    </wim:controls>
    <wim:controls xsi:type="wim:PageControl" 
        cookie="57494D53656172636843616368654E616D6574696D653A31323938333535393336343933"
        size="2"/>
  </wim:Root>
</sdo:datagraph>
Gráfico de datos de salida para una búsqueda paginada con resultados clasificados:
<?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,o=SalesPerson,dc=yourco,dc=com" 
          repositoryId="ldapRepo" uniqueId="f3fe184d-e51a-4d02-a5c2-4e2e79e79fea" 
          uniqueName="uid=SalesPerson3,o=SalesPerson,dc=yourco,dc=com"/>
      <wim:uid>SalesPerson3</wim:uid>
      <wim:sn>SalesPerson3sn</wim:sn>
    </wim:entities>
  </wim:Root>
</sdo:datagraph>


Condiciones de uso | Comentarios