2017-10-11 8 views
0

J'essaie de faire une transaction Composer qui, étant donné l'actif que je présente en tant que paramètre pour la transaction, recherche un autre type d'actif pour celui qui a des paramètres communs.Rechercher un actif spécifique dans une transaction

Modèle:

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 
} 

Ainsi, étant donné que le modèle, ce que je veux faire est (quelque chose comme ça, au moins) suivant:

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); 
    }) 
} 

Ceci est plus proche de pseudo- code que toute autre chose (je ne crois pas que les requêtes fonctionnent comme ça, mais c'est ma grande incertitude) Imaginons que la requête est suffisamment précise pour juste trouver un actif valide. Cela, théoriquement, mettrait dans un Asset1 qui a le même ownerID que l'Asset2 donné dans les paramètres, et il changerait son booléen done. Le problème est, tout ce que j'essaie de ne pas travailler, je ne sais pas comment utiliser une telle requête dans une transaction (j'ai aussi essayé de faire une requête séparée, mais je n'ai pas eu de chance de le faire fonctionner).

J'espère que quelqu'un est capable de me aider: D

+0

Vous devez lire la documentation pour les requêtes et décrire ce que vous » Nous avons essayé, les erreurs que vous obtenez et inclure des liens vers votre code afin que nous puissions vous aider. –

Répondre

0

D'abord, vous devez définir une requête. Vous pouvez le faire en ajoutant un fichier queries.qry dans le répertoire principal de votre projet Composer. Par exemple, la requête peut être comme tel:

query getSpecificAsset1 { 
    description: "Get a specific task with id" 
    statement: 
    SELECT org.acme.sample.Asset1 
     WHERE (owner == _$ownerID) 
} 

Ensuite, vous pouvez utiliser cette requête dans une fonction de traitement de transaction, par exemple:

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); 
    }); 
}