Использование jsonPath для поиска строки - PullRequest
4 голосов
/ 06 апреля 2011

Я пытаюсь использовать 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 object, вместо этого я получаю все три объекта из файла json.

Если вместо merchant == 'Telefora' я использую merchantID == 16, то это прекрасно работает. Я думал, что jsonPath может также сопоставлять строки. Хотя в приведенном выше примере поиск не выполняется в части json с merchantDomain, у меня возникла та же проблема.

1 Ответ

5 голосов
/ 06 апреля 2011

Ваша проблема связана с тем, что, как указано в документации , операторы равенства строк: eq, neq и like.== только для цифр.В вашем случае вы хотите проверить, равна ли одна строка другой строке, что является заданием оператора eq равенства строк.

Просто замените == на eq в своем выражении фильтра JSONpath, и вы будете готовы пойти на это:

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