我尝试制作一个Composer事务,根据我作为事务参数引入的资产,它会搜索另一种类型的资产,以获得具有一些共同参数的资产。
型号:
namespace org.acme.sample
abstract asset Generic identified by ID {
o String ID
--> Owner owner
}
asset Asset1 extends Generic{
o Boolean done
}
asset Asset2 extends Generic{
}
participant Owner identified by ownerID{
o String ownerID
o String ownerName
}
transaction Transaction {
--> Asset2 in
}
所以,鉴于该模型,我想做的是以下(至少这样的事情):
function Transaction (tx){
var aux = query('org.acme.sample.Asset1', {owner.ownerID : tx.in.owner.ownerID})
aux.done = true
return getAssetRegistry('org.acme.sample.Asset1')
.then(function (assetRegistry) {
return assetRegistry.update(aux);
})
}
这比伪代码更接近于其他任何东西(我不相信查询的工作方式就像那样,但那是我最大的不确定性) 让我们假设查询足够精确,只能找到一个有效资产。
理论上,这将使得一个Asset1与参数中给出的Asset2具有相同的ownerID,并且它会改变它的完成布尔值。问题是,我尝试的一切都不会工作,我不知道如何在交易中使用这样的查询(我也尝试过单独的查询,但我没有运气使它工作)。
我希望有人能够帮助我:D
答案 0 :(得分:0)
首先,您需要定义一个查询。您可以通过在Composer项目的主目录中添加queries.qry
文件来完成此操作。例如,查询可以是这样的:
query getSpecificAsset1 {
description: "Get a specific task with id"
statement:
SELECT org.acme.sample.Asset1
WHERE (owner == _$ownerID)
}
然后,您可以在事务处理器函数中使用此查询,例如:
function updateAsset(tx) {
// tx.in.owner is the ID from Asset2
// this query will return a Asset1 with the same ID
return query('getSpecificAsset1', { owner: tx.in.owner })
.then(function (asset) {
var serializer = getSerializer();
var json = serializer.toJSON(asset);
json.done = true
return getAssetRegistry("org.acme.sample.Asset1")
.then(function(asset1Registry) {
return asset1Registry.updateAll([json]);
})
})
.catch(function(error) {
// Add optional error handling here.
throw new Error(error);
});
}