2012-10-17 6 views
3

Le nombre/la taille des résultats renvoyés sont-ils limités? Par exemple, j'ai interrogé pour tous les défauts et j'ai récupéré 185, lorsque le nombre réel est supérieur à 600. Y at-il un moyen que je peux détecter si la requête n'a pas pu obtenir tous les résultats?Ralliement: Java Rest Api: Limite sur les résultats renvoyés?

Editer: Il semble que j'atteigne la taille limite de 200 pages. Est-ce que quelqu'un sait comment créer une boucle pour obtenir les résultats suivants?

Voici mon code:

String rallyProjectOid = getRallyProjectOid(rallyApi, rallyProjectName); 
    // Get the list of Rally defects for the project 
    QueryRequest defectRequest = new QueryRequest("defect"); 
    defectRequest.setFetch(new Fetch("Project", "LastUpdateDate", "FormattedId", "SubmittedBy", "Owner")); 
    defectRequest.setProject(rallyProjectOid); 
    defectRequest.setQueryFilter(new QueryFilter("LastUpdateDate", ">", timestamp)); 
    QueryResponse projectDefects = rallyApi.query(defectRequest); 
+0

Dans l'exemple ici, ils définir une taille de page et limite. Peut-être que vous êtes limité par des valeurs par défaut? http://developer.rallydev.com/help/java-toolkit-rally-rest-api A partir du Javadoc, il semble que les valeurs par défaut soient 200 et 1 page. – Dan

+0

Cela aide beaucoup Dan. Il semble que 200 soit la taille maximale de la page, et le débogage de mon code, c'est la taille de la JsonArray qui est retournée. –

+0

Il semble que vous ayez à faire plusieurs requêtes pour obtenir tous les résultats chaque fois que vous augmentez le .setStart (int). Je pourrais me tromper là cependant. – Dan

Répondre

2

Il existe une méthode setLimit() sur QueryRequest qui vous permet de définir le nombre maximum d'enregistrements à retourner de la demande. Si cette valeur n'est pas spécifiée pour l'objet de requête, le comportement sera de renvoyer seulement une page de données (200 enregistrements).

Donc, si vous faites:

int queryLimit = 4000; 
    defectRequest.setLimit(queryLimit); 

Le RestApi devrait retourner un plus grand nombre de résultats, et page les automatiquement pour vous.

+0

Integer.MAX_VALUE devrait s'assurer que vous obtenez toujours tous les résultats ... –

2

Bien que la mise:

queryRequest.setLimit(Integer.MAX_VALUE);

ne prend en charge de nombreux types, il ne fonctionne pas pour tous les types.

Par exemple, les types défauts et Iteration semblent revenir des milliers de résultats dans une seule page (un seul appel de requête au Rallye), alors que d'autres types tels que utilisateur et HierarchicalRequirement ignoré cette limite, et à la place, m'a forcé à utiliser la pagination (réglage du début, puis une requery) pour obtenir tous les résultats.

Voici un exemple de la façon dont je gère les deux:

// NOTE : no pagination needed for defect or iteration, but required for hierarchicalrequirement or user 
QueryRequest queryRequest = new QueryRequest("hierarchicalrequirement"); 

queryRequest.setFetch(new Fetch(new String[] {"ObjectID", "CreationDate", "LastUpdateDate", "FormattedId"})); 
queryRequest.setQueryFilter(new QueryFilter("CreationDate", ">=", "2013-01-01T07:00:00.000Z")); 
queryRequest.setLimit(Integer.MAX_VALUE); 

int responseTotalResultsCount = Integer.MAX_VALUE;// So we enter while loop first time 
int actualResultsProcessedSoFar = 0; 

// Handle both cases 
while ((queryRequest.getStart()) < responseTotalResultsCount && actualResultsProcessedSoFar < responseTotalResultsCount) { 

    QueryResponse queryResponse = restApi.query(queryRequest); 

    responseTotalResultsCount = queryResponse.getTotalResultCount();// Set to correct value here 

    JsonArray results = queryResponse.getResults(); 

    if (results.size() == 0) { 
     return; 
    } else { 

     for (JsonElement jsonElement : queryResponse.getResults()) { 

      // Process this particular JsonElement here 

      // If no pagination required, this counter lets us exit while loop 
      actualResultsProcessedSoFar++; 

     }// end for loop 

    }// end if (results.size() == 0) 

    // Setting this to handle pagination, if required 
    queryRequest.setStart(queryRequest.getStart() + queryRequest.getPageSize()); 

} // end while loop 
+0

Il ne devrait pas être dépendant du type - il devrait gérer tous les pagination pareil. Si vous constatez un comportement incorrect pour les histoires, veuillez le signaler à l'assistance Rally afin que nous puissions signaler un problème et suivre ce problème. –

+0

a travaillé comme un charme .. merci –

Questions connexes