язык запросов hyperleder-composer СОДЕРЖИТ оператор с логическим выражением - PullRequest
0 голосов
/ 04 июля 2018

В моем приложении для составления гиперлогов я хочу написать именованный запрос, который возвращает всех людей с двумя указанными увлечениями.

Модель для «Персона» следующая:

participant Person identified by id {
  o String id
  o String firstName
  o String lastName
  o String email
  --> Hobby[] hobbies optional
}

Модель для "Хобби" следующая:

asset Hobby identified by id {
  o String id
  o String name
}

Именованный запрос имеет следующую структуру:

query selectPersonsByHobbies {
  description: "Select all persons with the two specified hobbies."
  statement:
      SELECT org.comp.myapp.Person
          WHERE //not sure what to put here//
}

Я не уверен, что ставить после оператора "ГДЕ", чтобы добиться того, чего я хочу.

Это правильно?:

query selectPersonsByHobbies {
      description: "Select all persons with the two specified hobbies."
      statement:
          SELECT org.comp.myapp.Person
              WHERE (hobbies CONTAINS ((name == _$hobby1) AND (name == _$hobby2)))
}

Или верно ли следующее:

query selectPersonsByHobbies {
      description: "Select all persons with the two specified hobbies."
      statement:
          SELECT org.comp.myapp.Person
              WHERE (hobbies CONTAINS (name == _$hobby1) AND CONTAINS (name == _$hobby2))
}

UPDATE:

Следуя ответу, предложенному Полом О'Махони, вот как я понимаю ситуацию:

Учитывая следующую модель для "Персона":

participant Person identified by id {
  o String id
  o String firstName
  o String lastName
  o String email
  o Hobby[] hobbies optional
}

и следующая модель для хобби:

asset Hobby identified by id {
  o String id
  o String name
}

следующий запрос успешно вернет всех людей с двумя указанными хобби:

query selectPersonsByHobbies {
  description: "Select all persons with the two specified hobbies."
  statement:
      SELECT org.comp.myapp.Person 
  WHERE ( hobbies CONTAINS [ _$hobby1,  _$hobby2] )
}

.... значения параметров, отправленные с запросом (и для вставки для _ $ hobby1 и _ $ hobby2, соответственно), будут идентификаторами соответствующих хобби, верно?

1 Ответ

0 голосов
/ 04 июля 2018

В настоящее время вы не можете на языке запросов Composer использовать агрегат «И» в «Концепциях» для СОДЕРЖИТ, в настоящее время предложенным способом (ИЛИ - хорошо, но вы не можете) - поле имени сравнивается для каждая запись класса (и она не может быть одновременно с AND). Начиная с версии 0.19.12 Composer - вы можете использовать getnativeAPI() из функции процессора Trxn, доступной только для чтения, чтобы сделать эквивалентный вызов CONTAINS изначально для языка запросов CouchDB.

AND (как указано выше) будет работать, если поле является массивом String, например, String[] hobbies например.

query selectPersonsByHobbies {
  description: "Select all persons with the two specified hobbies."
  statement:
      SELECT org.comp.myapp.Person 
  WHERE ( hobbies CONTAINS [ _$hobby1,  _$hobby2] )
}

но ваше поле на Person должно было бы быть Hobby[] hobbies optional (т.е. не массив отношений, т.е. идентификаторы отношений, как это в настоящее время -).

...