Exemple de code pour effectuer une recherche paginée avec les résultats triés

Utilisez l'exemple de code et les graphiques de données pour effectuer une recherche paginée avec les résultats triés à l'aide des objets métier SortControl et PageControl.

Les étapes suivantes sont abordées dans cet exemple de fragment de code :

  1. Définissez les propriétés dans SearchControl et la base de recherche pour effectuer la recherche.
  2. Définissez SortControl de sorte à spécifier la propriété avec laquelle vous souhaitez trier les résultats. Vérifiez que la clé de tri utilisée par SortControl a été ajoutée dans SearchControl. Dans l'exemple de code ci-après, e tri est effectué sur la clé sn.
  3. Définissez PageControl pour paginer les résultats de la recherche. Vous pouvez définir la taille de pagination. Dans l'exemple de code ci-après, elle est de 2.
Remarque : Pour un exemple de code permettant d'effectuer uniquement une recherche paginée ou une recherche triée, voir les rubriques Exécution d'une recherche paginée et Exécution d'une recherche triée.

Conditions prérequises

Assurez-vous d'avoir bien lu les informations et effectué les étapes décrites dans la rubrique Prérequis pour la programmation.

Exemple de code

Ajoutez l'exemple de code ci-après à votre code d'application, puis remplacez les variables par les valeurs réelles à utiliser.

    /**
     * Scénario de test pour la recherche avec le contrôle des pages et le contrôle de tri 
     * Ce test trie les résultats de la recherche en fonction de la clé de tri fournie.
     * Les résultats triés peuvent être paginés en appliquant le contrôle des pages et la taille de page peut être définie 
     * sur le contrôle de page pour renvoyer la sortie souhaitée.
     */
    @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);
        // Définition des propriétés à extraire pour les entités
        // dans le cadre de l'opération de recherche
        searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("uid");
        searchCtrl.getList(SchemaConstants.PROP_PROPERTIES).add("sn"); 
        // Définition du filtre de recherche pour rechercher les entités dont 
        // l'uid commence par SalesPerson
        searchCtrl.setString(SchemaConstants.PROP_SEARCH_EXPRESSION, "//entities[@xsi:type='PersonAccount' 
                and uid='SalesPerson*']");
        // Ajout de la base de recherche dans laquelle la recherche sera effectuée
        searchCtrl.getList(SchemaConstants.PROP_SEARCH_BASES).add("o=SalesPerson,dc=yourco,dc=com");
        // Ajout du contrôle de tri pour trier les résultats
        DataObject sortCtrl = root.createDataObject(SchemaConstants.DO_CONTROLS, SchemaConstants.WIM_NS_URI, 
                SchemaConstants.DO_SORT_CONTROL);
        // Spécification de “sn” comme clé de tri sur laquelle le tri sera effectué
        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");
        // Définition de l'ordre croissant de sorte que les résultats renvoyés soient
        // triés dans l'ordre croissant
        sortKey.setBoolean(SchemaConstants.PROP_ASCENDING_ORDER, true);
        // Ajout du contrôle des pages pour paginer les résultats triés
        DataObject pageCtrl = root.createDataObject(SchemaConstants.DO_CONTROLS, SchemaConstants.WIM_NS_URI, 
                SchemaConstants.DO_PAGE_CONTROL);
        // Spécification d'une taille de page de deux, pour qu'il n'y ait pas plus de deux résultats renvoyés par taille de page
        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) {
                // Définissez le cookie extrait du contrôle de réponse, sur le contrôle de page de l'objet de données d'entrée
                pageCtrl.setBytes(SchemaConstants.PROP_COOKIE, cookie);
                //Supprimez le contrôle de recherche de l'objet de données d'entrée pour l'appel suivant
                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);
            // Dans la mappe de contrôle, extrayez le contrôle de réponse de page
            // et définissez le cookie à partir de là
            DataObject responseCtrl = (DataObject)ctrlMap.get(SchemaConstants.DO_PAGE_RESPONSE_CONTROL);
            if (responseCtrl != null) {
                cookie = responseCtrl.getBytes(SchemaConstants.PROP_COOKIE);
            } else {
                cookie = null;
            }
        }    

    /**
     * Extraction de la mappe de contrôle
     * Méthode d'utilitaire permettant de créer une mappe de tous les contrôles
     * disponibles sur le DataObject. 
     */
    public static Map getControlMap(DataObject root)
    {
        Map ctrlMap = new HashMap();
        // Extraction de tous les contrôles et création d'une mappe des types de contrôle
        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;
    }

Graphiques de données d'entrée et de sortie

Graphique de données d'entrée pour une recherche paginée avec les résultats triés (premier appel) :
<?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>
Graphique de données de sortie pour une recherche paginée avec les résultats triés :
<?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>
Graphique de données d'entrée pour une recherche paginée avec les résultats triés (deuxième appel) :
<?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>
Graphique de données de sortie pour une recherche paginée avec les résultats triés :
<?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>


Conditions d'utilisation | Commentaires