2012-08-24 53 views
2

有沒有一種方法可以使用QueryFilter來獲取自時間戳以來更新的缺陷?事情是這樣的:Rally Rest Api:QueryFilter:通過時間戳獲取缺陷

String timeStamp = "2012-08-24T19:10:09.154Z"; 
QueryRequest defectRequest = new QueryRequest("defect"); 
defectRequest.setFetch(new Fetch("LastUpdateDate")); 
defectRequest.setQueryFilter(new QueryFilter("LastUpdateDate", ">", timeStamp); 
QueryResponse projectDefects = rallyApi.query(defectRequest); 
+0

您的代碼示例看起來很棒。你沒有看到你期望的結果嗎? – 2012-08-24 20:48:43

+0

哇,你是對的,它正在工作,因爲我把它放到問題中。我在更復雜的查詢中肯定有錯。謝謝! –

回答

4

Rally Web Services API介紹頁面有幾個與編寫複雜的查詢陷阱的解釋(看看在查詢語法對象集合屬性和查詢部分)。 Java版本很容易處理鏈表達式,但有點難以閱讀。下面是整理了自8月1日開放的缺陷,具有高嚴重程度或優先級的查詢:

String timeStamp = "2012-08-01T19:10:09.154Z"; 

Map<String, QueryFilter> filters = new HashMap<String, QueryFilter>(); 

filters.put("LastUpdateDate", new QueryFilter("LastUpdateDate", ">", timeStamp)); 
filters.put("State", new QueryFilter("State", "=", "Open")); 
filters.put("Severity", new QueryFilter("Severity", "<=", "Major Problem")); 
filters.put("Priority", new QueryFilter("Priority", "<=", "High Attention")); 

// Evaluates to ((Severity <= Major Problem) OR (Priority <= High Attention)) AND ((LastUpdateDate > timeStamp) AND (State = Open)) 
QueryFilter complexFilter = filters.get("Severity").or(filters.get("Priority")).and(filters.get("LastUpdateDate").and(filters.get("State"))); 

一大疑難雜症的查詢是集合(如在用戶故事任務)屬性。將查詢鏈接在一起會給你帶來錯誤的結果。例如,如果您正在查找包含任務正在進行且被阻止的任務的用戶故事,則查詢將以OR語句的形式評估該表達式。發生這種情況是因爲查詢將其轉換爲「查找集合中具有阻塞狀態的任何任務,然後查找正在進行的任何任務」。該查詢不會縮小第一個表達式之後的列表範圍;每個表達式查詢集合中的所有任務。

解決這個問題的方法之一是執行其中一個查詢(假設我們獲取所有正在進行的任務)。然後,我們過濾該列表以獲取所有被阻止的任務。獲得過濾列表後,您可以找出每個這些任務屬於哪個用戶故事。

參考文獻:

上面鏈接的Rally Web Services API。

http://developer.rallydev.com/help/java-toolkit-rally-rest-api(我使用了頁面末尾的最後一個例子作爲創建上面查詢過濾器的基礎)。