Условный (троичный) оператор не работает должным образом (Javascript) - PullRequest
0 голосов
/ 01 января 2019

У меня есть это условие, и я ожидаю увидеть результат, основанный на userId и name (Если userId представил поиск на основе userId и если имя представил поиск на основе имени), но что яполучаю то, что всегда возвращает else и не рассматривает userId

function findUsers(userId, name, skip, limit) {
  let queryString = (userId) ?
    'MATCH (user:User {userId:{userId}}) ' :
    'MATCH (user:User) ' +
    'WHERE ((user.username =~ {name}) OR (user.name =~ {name})) ' +
    'WITH user ' +
    'ORDER BY user.name ' +
    'RETURN DISTINCT user.userId, user.username, user.name ' +
    'SKIP {skip} LIMIT {limit}';

  let cypher = {
    query: queryString,
    params: {
      userId: userId,
      name: util.format('(?i).*%s.*', name),
      skip: skip,
      limit: limit
    }
  };

1 Ответ

0 голосов
/ 01 января 2019

Ternary имеет более низкий приоритет, чем +, поэтому все конкатенации помещаются в часть else.Используйте круглые скобки, чтобы вы могли выбрать соответствующий параметр MATCH на основе троичного символа.

  let queryString = (
        (userId) ?
        'MATCH (user:User {userId:{userId}}) ' :
        'MATCH (user:User) ') +
    'WHERE ((user.username =~ {name}) OR (user.name =~ {name})) ' +
    'WITH user ' +
    'ORDER BY user.name ' +
    'RETURN DISTINCT user.userId, user.username, user.name ' +
    'SKIP {skip} LIMIT {limit}';

Вы можете даже сузить его дополнительно:

  let queryString = 'MATCH (user:User ' + (userId ? '{userId:{userId}}' : '') + ') ' +
    'WHERE ((user.username =~ {name}) OR (user.name =~ {name})) ' +
    'WITH user ' +
    'ORDER BY user.name ' +
    'RETURN DISTINCT user.userId, user.username, user.name ' +
    'SKIP {skip} LIMIT {limit}';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...