4

jsonPathとpick関数を使用して、現在のドメインに基づいてルールを実行する必要があるかどうかを判断しようとしています。私がやっていることの簡略版はここにあります:

    global 
{
    dataset shopscotchMerchants <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
}

rule checkdataset is active
{
    select when pageview ".*" setting ()
    pre
    {
        merchantData = shopscotchMerchants.pick("$.merchants[?(@.merchant=='Telefora')]");
    }
    emit 
    <|
        console.log(merchantData);
    |>
}

私が期待するコンソール出力はteleforaオブジェクトですが、代わりにjsonファイルから3つのオブジェクトすべてを取得します。

Merchant=='Telefora'の代わりにmerchantID==16を使用すると、うまく機能します。jsonPathは文字列にも一致する可能性があると思いました。上記の例はjsonのmerchantDomain部分を検索していませんが、同じ問題が発生しています。

4

1 に答える 1

5

あなたの問題は、ドキュメントに記載されているように、文字列等価演算子がeqneq、およびlike. ==数字専用です。あなたの場合、ある文字列が別の文字列と等しいかどうかをテストする必要があります。これは、eq文字列等価演算子の仕事です。

JSONpath フィルター式を交換==するだけで、準備完了です。eq

    global 
{
    dataset shopscotchMerchants <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
}

rule checkdataset is active
{
    select when pageview ".*" setting ()
    pre
    {
        merchantData = shopscotchMerchants.pick("$.merchants[?(@.merchant eq 'Telefora')]"); // replace == with eq
    }
    emit 
    <|
        console.log(merchantData);
    |>
}

私はこれを自分のテストルールセットでテストしました。そのソースは以下のとおりです。

ruleset a369x175 {
  meta {
    name "test-json-filtering"
    description <<

    >>
    author "AKO"
    logging on
  }

  dispatch {
      domain "exampley.com"
  }

  global {
    dataset merchant_dataset <- "https://s3.amazonaws.com/app-files/dev/merchantJson.json" cachable for 2 seconds
  }

  rule filter_some_delicous_json {
    select when pageview "exampley.com"
    pre {
        merchant_data = merchant_dataset.pick("$.merchants[?(@.merchant eq 'Telefora')]");
    }
    {
        emit <|
            try { console.log(merchant_data); } catch(e) { }
        |>;
    }
  }
}
于 2011-04-06T01:57:32.310 に答える