Hyperledger作曲家,查询超过2个WHERE条件

时间:2018-02-22 11:23:42

标签: hyperledger-fabric hyperledger-composer

这是我的查询

query Q_BUY_SELL{
  description: "Select filtered Orders "
  statement:
    SELECT namespace.Order
        WHERE ((((orderType != _$filterType AND orderStatus == _$filterStatus) AND bidTokenPrice == _$bidTokenPrice) AND orderer != _$orderer) AND property == _$property )
}

以下是我如何使用它

return query('Q_BUY_SELL', {
      filterStatus: 'PENDING', 
      filterType: 'SELL', 
      bidTokenPrice: 10, 
      orderer:'resource:com.contrachain.User#o1',
      property:'resource:com.contrachain.Property#p2' 
      })
      .then(function (assets) {
            console.log(assets);
            // Some alterations to assets

这是我的数据库中唯一的资产,由于' orderer'而我在结果中没有预料到这一点。领域。 (请参阅查询中的orderer != _$orderer

{
  "$class": "com.contrachain.Order",
  "orderId": "Thu Feb 22 2018 15:57:05 GMT+0530 (IST)-30",
  "orderType": "BUY",
  "orderStatus": "PENDING",
  "bidTokenPrice": 10,
  "tokenQuantity": 30,
  "orderTime": "2018-02-22T10:27:05.089Z",
  "orderer": "resource:com.contrachain.User#o1",
  "property": "resource:com.contrachain.Property#p2"
}

但它在控制台的响应中仍然存在。

enter image description here

TLDR;我在查询Q_BUY_SELL中有5个条件(1,2,3,4,5),其中(1,5)工作正常,但2nd, 3rd and 4th条件未应用于结果。

我觉得发布这个问题很愚蠢,因为问题似乎微不足道,但我现在已经坚持了一段时间,需要一些外部视角来确定我在这里缺少的东西。

**更新:模型的相关部分**

asset Property identified by propertyId {
    o String propertyId
    --> User owner
}

asset Order identified by orderId {
    o String orderId
    o OrderType orderType
    o OrderStatus orderStatus default = 'PENDING'
    o Double bidTokenPrice
    o Double tokenQuantity
    o DateTime orderTime
    --> User orderer
    --> Property property
}

abstract participant Account identified by emailId {
    o String emailId
    o String name default = ''
    o DateTime joiningDate
    o Boolean isActive default=false
}

participant User extends Account {
    o Double balanceINR default=0.0
}

transaction PlaceOrder {
    o OrderType orderType
    o Double bidTokenPrice
    o Double tokenQuantity
    o DateTime orderTime
    --> User orderer
    --> Property property
}

enum OrderType {
    o BUY
    o SELL
}

enum OrderStatus {
    o PENDING
    o SUCCESSFUL
    o VOID
}

2 个答案:

答案 0 :(得分:2)

没有模型,很难复制。但我建议在查询中将其“重新”回到4个标准(例如,删除属性资源比较),看看它是否确实/不返回orderer(如你所写)。在任何情况下 - 我也会创建第二个记录,所以查询确实返回'某些东西',它是一个匹配的东西(希望省略不匹配的记录),用于测试 - 只是这样你就可以看到查询返回符合您条件的订购者等等 - 首先尝试查看查询是否适用于4个条件,包括orderer check。我建议的是看标准的汇总是否有破坏(或不是)。

在事务中构建查询并在此处显示解析的示例FYI - > https://github.com/hyperledger/composer/blob/master/packages/composer-tests-functional/systest/data/transactions.queries.js

答案 1 :(得分:0)

只是说我没有看到你因为多重标准而遇到的问题 - 我已经尝试了5和6,混合 - 一切正常吗?也许你可以提供反馈。

我去测试了一些查询如下,参数化查询带有条件(基本上和你做的一样,对于不同的商业网络) - 在线游乐场(所以我创建queries.qry文件然后调用查询我的TP功能(FYI和样本功能代码位于底部):

数字(下方)代表左侧'字段'在查询定义中(这些字段显示在下面的查询中(序数,从左到右)) - 我的数据'在底部 - 基本上我总是(除了一个测试)'错过'在tradingSymbol ==" 1"

的记录中
query myQryTest {
  description: "Select all commodities"
  statement:
      SELECT org.acme.trading.Commodity
         WHERE (tradingSymbol != _$tradingSymbol AND (description == _$description OR description == _$description) AND mainExchange == _$mainExchange AND quantity == _$quantity AND owner == _$owner )

}


}

结果:

(1 AND 2 AND 3 AND 4和5) - 即所有的' =='比较。(因此,第一个标准将变为tradeSymbol ==" 1"以上 - 仅用于此一个测试)。一切正常。 1条记录。

(!= 1 AND 2 AND 3 AND 4 AND = 5) - 所以标准中有一个否定。工作得很好。得到了我想要的结果(2条记录 - 见下面的样本数据)

(!= 1 AND(2 =" 2" OR 2 ==" 3")和3和4和5) - 6个标准,如上所示 - 括号中的一个(其中字段匹配是OR)。工作得很好。得到了正确的结果。我将记录3中的描述更改为" 4"我得到一条记录,

{   " $ class":" org.acme.trading.Commodity",   " tradingSymbol":" 1",   "说明":" 2",   " mainExchange":" 3",   "数量":4,   "所有者":"资源:org.acme.trading.Trader#1" }

{   " $ class":" org.acme.trading.Commodity",   " tradingSymbol":" 2",   "说明":" 2",   " mainExchange":" 3",   "数量":4,   "所有者":"资源:org.acme.trading.Trader#1" }

{   " $ class":" org.acme.trading.Commodity",   " tradingSymbol":" 3",   "说明":" 2",   " mainExchange":" 3",   "数量":4,   "所有者":"资源:org.acme.trading.Trader#1" }

您可以自己尝试一下 - 您可以通过在线游乐场https://composer-playground.mybluemix.net/(部署贸易网络样本)的交易网络尝试这一点,并在参与者中创建交易者交易者1记录。

/** * Try access elements of an array of B assets * @param {org.acme.trading.Qry} qry - function to access A elements (and B assets) * @transaction */ function myQryfunc(qry) {

return query('myQryTest', { "tradingSymbol": "1", "description": "2", "mainExchange": "3", "quantity": 4, "owner": "resource:org.acme.trading.Trader#1" }) .then(function (results) {

       var promises = [];

       for (var n = 0; n < results.length; n++) {
        var asset = results[n];
               console.log('Query result is ' + (n+1) + ', object is ' +  asset);
               console.log('Asset identifier is ' + asset.getIdentifier());

       }

   }); 

}

var promises = []; for (var n = 0; n < results.length; n++) { var asset = results[n]; console.log('Query result is ' + (n+1) + ', object is ' + asset); console.log('Asset identifier is ' + asset.getIdentifier()); } });

我的Qry交易的模型定义(在操场上调用)是

transaction Qry { --> Commodity commodity

相关问题