这对于诸如 TestCase.Method 之类的非集合属性肯定是有用的。然而,WSAPI 2.0 集合摘要的开发是为了提供一种方便的方法来获取和汇总工件子集合的计数,而无需返回到 WSAPI 并查询集合本身。由于 WSAPI 2.0 出于性能原因删除了自动水合子集合的功能,因此摘要功能很重要。
因此,summary 方法可用于汇总 Artifact 上的子对象集合的属性计数,例如:
- 按状态总结缺陷任务:
https://rally1.rallydev.com/slm/webservice/v2.0/defect?fetch=Tasks:summary[State]&order=Rank
- 业主对故事的缺陷:
https://rally1.rallydev.com/slm/webservice/v2.0/hierarchicalrequirement?fetch=Defects:summary[Owner]&order=ScheduleState
要保存加载整个商店以获取属性计数,您可以通过 TestCase 方法在商店上设置过滤器,并使用单位页面大小来防止加载完整的记录集。然后使用getTotalCount()
来总结你想要的计数。
但是,由于必须加载 WsapiStore 并处理要汇总的每个属性的回调,这可能会有点麻烦。
不过,通过使用 Deft.js 和 Promises,它更容易接受。下面是一个使用 promises 和 Deft.Deferred 实现 _getCount(modelType, attribute, attrValue) 函数的基本示例:
Ext.define('CustomApp', {
extend: 'Rally.app.App',
componentCls: 'app',
items: [
{
xtype: 'container',
itemId: 'gridContainer',
columnWidth: 1
}
],
_summaryGrid: null,
launch: function() {
this._summarizeTestCaseCounts();
},
_summarizeTestCaseCounts: function() {
var me = this;
var promises = [];
var resultArray = [];
promises.push(me._getCount('TestCase', 'Method', 'Manual'));
promises.push(me._getCount('TestCase', 'LastVerdict', 'Failed'));
promises.push(me._getCount('TestCase', 'LastVerdict', 'Pass'));
Deft.Promise.all(promises).then({
success: function(results) {
Ext.Array.each(results, function(result) {
resultArray.push(result);
console.log(result);
});
// Create grid from summarized results
me._makeGrid(resultArray);
}
});
},
_getCount: function(modelType, attribute, attrValue) {
var deferred = Ext.create('Deft.Deferred');
var artifactStore = Ext.create('Rally.data.wsapi.Store', {
model: modelType,
pagesize: 1,
autoLoad: true,
filters: [
{
property: attribute,
operator: '=',
value: attrValue
}
],
sorters: [
{
property: 'FormattedID',
direction: 'ASC'
}
],
listeners: {
load: function(store, records) {
var manualCount = store.getTotalCount();
result = {
"ModelType": modelType,
"Attribute": attribute,
"Value": attrValue,
"Count": manualCount
};
deferred.resolve(result);
}
}
});
return deferred;
},
_makeGrid: function(results) {
var me = this;
if (me._summaryGrid) {
me._summaryGrid.destroy();
}
var gridStore = Ext.create('Rally.data.custom.Store', {
data: results,
pageSize: 5,
remoteSort: false
});
me._summaryGrid = Ext.create('Rally.ui.grid.Grid', {
itemId: 'artifactGrid',
store: gridStore,
columnCfgs: [
{
text: 'Artifact', dataIndex: 'ModelType'
},
{
text: 'Attribute', dataIndex: 'Attribute'
},
{
text: 'Value', dataIndex: 'Value'
},
{
text: 'Count', dataIndex: 'Count'
}
]
});
me.down('#gridContainer').add(me._summaryGrid);
me._summaryGrid.reconfigure(gridStore);
}
});
顺便说一句,Matt Greer最近写了一篇精彩的博客文章,概述了他对使用 Deft.js 承诺的深入研究。这对我在构建 Rally 应用程序时了解如何使用它们非常有帮助。