13.13.21 SearchDoc::returnsOnly()

Cette méthode permet d'indiquer quels sont les propriétés ou attributs que doit retourner la recherche.

13.13.21.1 Description

void returnsOnly (array $returns)

Cette méthode permet d'accélérer le traitement de la requête en indiquant un sous-ensemble d'attributs ou de propriétés. Ceci a deux avantages :

  1. Moins de données transférées entre la base de données et le serveur
  2. Moins de consommation mémoire

L'inconvénient est que les documents retournés ne sont pas complets. Ceci implique que ces documents ne peuvent faire l'objet de modification.

13.13.21.1.1 Avertissements

Si le mode est retour d'objet documentaire, les documents retournés sont marqués "incomplet" (doctype='I'). Ils ne peuvent pas être modifiés par la méthode Doc::store().

13.13.21.2 Liste des paramètres

(array) returns

Indique une liste de propriétés ou d'attribut à récupérer.

Si returns est vide, les 4 propriétés élémentaires du document sont retournées :

  • id
  • title
  • fromid
  • doctype

13.13.21.3 Valeur de retour

void

13.13.21.4 Erreurs / Exceptions

Aucune.

13.13.21.5 Historique

Aucun.

13.13.21.6 Exemples

13.13.21.6.1 Retour normal

$s=new SearchDoc("","ZOO_ANIMAL");
$s->setObjectReturn(true);
$s->setOrder('initid');
$s->search();
 
printf("Requête : %s\n",print_r($s->getSearchInfo(), true));
 
print("Résultats :\n");
$documentList=$s->getDocumentList();
foreach ($documentList as $docid=>$doc) {
  printf("%d) %-10s : %s\n", 
     $docid,
     $doc->getTitle(),
     $doc->getRawValue(\Dcp\AttributeIdentifiers\Zoo_Animal::an_espece));
}

La partie "select" contient toutes les propriétés et tous les attributs de la famille.

Résultat :

Requête : Array
(
    [count] => 3
    [query] => SELECT doc1053.id, owner, title, revision, version, initid, fromid, 
                      doctype, locked, allocated, archiveid, icon, lmodify, profid, 
                      usefor, cdate, adate, revdate, comment, classname, state, wid, 
                      postitid, domainid, lockdomainid, cvid, name, dprofid, views, atags,
                      prelid, confidential, ldapdn, 
                      an_nom, an_tatouage, an_espece, an_espece_title, an_ordre, 
                      an_classe, an_sexe, an_photo, an_gardien, an_naissance, 
                      an_entree, an_enfant, an_pere, an_mere, an_classe_title, 
                      an_pere_title, an_mere_title, VALUES, attrids  
               FROM doc1053  
               WHERE (doc1053.archiveid IS NULL) AND (doc1053.doctype != 'T') AND (doc1053.locked != -1) AND (views && '{2,0,11}') 
               ORDER BY initid LIMIT ALL OFFSET 0;
    [error] => 
    [delay] => 0.017s
)
Résultats :
1419) Rotor      : 1295
1420) Théodor    : 1295
1421) Éléonore   : 1295

13.13.21.7 Retour minimaliste

Dans cet exemple, seules les quatre propriétés nécessaires sont retournées.

$s=new SearchDoc("","ZOO_ANIMAL");
$s->setObjectReturn(true);
$s->returnsOnly(array());
printf("Retour : %s\n",print_r($s->getReturnsFields(), true));
$s->setOrder('initid');
$s->search();
 
printf("Requête : %s\n",print_r($s->getSearchInfo(), true));
 
print("Résultats :\n");
$documentList=$s->getDocumentList();
foreach ($documentList as $docid=>$doc) {
  printf("%d) %-10s : %s\n", 
     $docid,
     $doc->getTitle(),
     $doc->getRawValue(\Dcp\AttributeIdentifiers\Zoo_Animal::an_espece));
}

Résultat :

Retour : Array
(
    [0] => id
    [1] => title
    [2] => fromid
    [3] => doctype
)

 

Requête : Array
(
    [count] => 3
    [query] => SELECT doc1053.id, title, fromid, doctype  
               FROM doc1053  
               WHERE (doc1053.archiveid IS NULL) AND (doc1053.doctype != 'T') AND (doc1053.locked != -1) AND (views && '{2,0,11}') 
               ORDER BY initid LIMIT ALL OFFSET 0;
    [error] => 
    [delay] => 0.003s
)
Résultats :
1419) Rotor      : 
1420) Théodor    : 
1421) Éléonore   : 

Note : Puisque an_espece n'est pas demandé par returnsOnly, sa valeur n'est pas disponible.

13.13.21.7.1 Retour spécifique

$s=new SearchDoc("","ZOO_ANIMAL");
$s->setObjectReturn(true);
$s->returnsOnly(array(
    'locked',
    \Dcp\AttributeIdentifiers\Zoo_Animal::an_classe,
    \Dcp\AttributeIdentifiers\Zoo_Animal::an_espece
));
printf("Retour : %s\n",print_r($s->getReturnsFields(), true));
$s->setOrder('initid');
$s->search();
 
printf("Requête : %s\n",print_r($s->getSearchInfo(), true));
 
print("Résultats :\n");
$documentList=$s->getDocumentList();
foreach ($documentList as $docid=>$doc) {
  printf("%d) %-10s : [lock uid : %d] %d/%d\n", 
     $docid,
     $doc->getTitle(),
     $doc->getProperty('locked'),
     $doc->getRawValue(\Dcp\AttributeIdentifiers\Zoo_Animal::an_classe),
     $doc->getRawValue(\Dcp\AttributeIdentifiers\Zoo_Animal::an_espece));
}

Résultat :

Retour : Array
(
    [0] => id
    [1] => title
    [2] => fromid
    [3] => doctype
    [4] => locked
    [5] => an_classe
    [6] => an_espece
)

 

Requête : Array
(
    [query] => SELECT doc1053.id, title, fromid, doctype, locked, an_classe, an_espece
               FROM doc1053
               WHERE (doc1053.archiveid IS NULL) AND (doc1053.doctype != 'T') AND (doc1053.locked != -1) AND (views && '{2,0,11}')
               ORDER BY initid LIMIT ALL OFFSET 0;
    [error] => 
    [delay] => 0.003s
)
Résultats :
1419) Rotor      : [lock uid : 0]  1291/1295
1420) Théodor    : [lock uid : 11] 1291/1295
1421) Éléonore   : [lock uid : 0]  1291/1295

Dans ces exemples, le temps

13.13.21.8 Notes

Les quatre propriétés: suivantes sont toujours retournées :

  • id
  • initid
  • doctype
  • fromid

Les champs (propriétés ou attributs) non conforme à la famille sont ignorés. Si la recherche ne porte pas sur une famille spécifique, seules les propriétés peuvent être indiquées dans le paramètre.

La gain de performance est d'autant plus grand que le nombre d'éléments est retourné est important.

Exemple : récupération de tous les documents sur une base de 55084 documents volumineux :

Avec un retour "normal" : > 6 min

Requête : Array
(
    [count] => 55084
    [query] => SELECT docread.id, owner, title, revision, version, initid, fromid,
                    doctype, locked, allocated, archiveid, icon, lmodify, profid, usefor, cdate, 
                    adate, revdate, comment, classname, state, wid, postitid, domainid, lockdomainid, 
                    cvid, name, dprofid, atags, prelid, confidential, ldapdn, VALUES, svalues, attrids
               FROM docread
               WHERE (docread.archiveid IS NULL) AND (docread.doctype != 'Z') AND (docread.doctype != 'T') AND (docread.locked != -1) 
               ORDER BY initid LIMIT ALL OFFSET 0;
    [error] => 
    [delay] => 367.984s
)

Avec un retour "minimaliste" : < 200ms

Requête : Array
(
    [count] => 55084
    [query] => SELECT docread.id, title, fromid, doctype
               FROM docread
               WHERE (docread.archiveid IS NULL) AND (docread.doctype != 'Z') AND (docread.doctype != 'T') AND (docread.locked != -1)
               ORDER BY initid LIMIT ALL OFFSET 0;
    [error] => 
    [delay] => 0.192s
)

13.13.21.9 Voir aussi

×
nouveauté