Поиск определенного актива внутри транзакции

Я пытаюсь сделать транзакцию 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);
   })
}

Это больше похоже на псевдокод, чем на что-либо еще (я не верю, что запросы работают так, но это моя большая неопределенность). Давайте представим, что запрос достаточно точен, чтобы найти только один действительный ресурс.

Теоретически это поместит в aux объект Asset1 с тем же идентификатором владельца, что и объект Asset2, указанный в параметрах, и изменит его логическое значение done. Проблема в том, что все, что я пытаюсь сделать, не работает, я не знаю, как использовать такой запрос внутри транзакции (я также пытался сделать отдельный запрос, но мне не удалось заставить его работать).

Я надеюсь, что кто-то сможет помочь мне с этим :D


person buislu    schedule 11.10.2017    source источник
comment
Вам нужно прочитать документацию для запросов и описать, что вы пробовали, ошибки, которые вы получаете, и включить ссылки на ваш код, чтобы мы могли вам помочь.   -  person Dan Selman    schedule 12.10.2017


Ответы (1)


Сначала вам нужно определить запрос. Вы можете сделать это, добавив файл queries.qry в основной каталог вашего проекта Composer. Например, запрос может быть таким:

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);
  });
}
person TheOkayCoder    schedule 26.10.2017