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 :
- Moins de données transférées entre la base de données et le serveur
- 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 )