2017-10-11 112 views
0

我正在尝试进行一项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); 
    }) 
} 

这是更接近伪代码比其他任何东西都好(我不认为查询是这样工作的,但那是我的很大不确定性) 让我们假设查询足够精确以找到一个有效资产。

理论上,这会在辅助资产1中放置一个与参数中给定的资产2相同的所有者ID,并且它将更改其完成的布尔值。问题是,我尝试的所有东西都无法工作,我不知道如何在事务内部使用这样的查询(我也试着做一个单独的查询,但我没有使它工作)。

我希望别人的能帮助我: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); 
    }); 
}