OrientDB: как вернуть результаты из первого или второго запроса (если первый не вернул строк)

У меня есть общий сценарий с сотрудниками, занятыми в отделах:

  • У сотрудника есть родительский отдел, установленный отношением MY_PARENT_IS
  • такое же отношение используется отделами по отношению к их родительским отделам.

Руководителем конкретного сотрудника может быть:

  • установить напрямую с помощью IS_SPECIFIED_LEADER_FOR
  • первое лицо, которое установлено как IN_CHARGE_PERSON в родительском отделе сотрудника (мы идем вверх по структуре от данного сотрудника, пока не найдем отдел с набором отношений IN_CHARGE_PERSON).

Пример структуры:

Пример структуры

Для достижения этой цели у меня есть 2 запроса:

1-й запрос для получения указанного лидера для человека:

SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
          where: (Name = 'Sales Berseker 1' AND in('IS_SPECIFIED_LEADER_FOR').size() > 0)}.in('IS_SPECIFIED_LEADER_FOR')
          {as: manager} RETURN manager)

2-й запрос находит первого менеджера вверх по структуре (IN_CHARGE_PERSON)

SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
          where: (Name = 'Sales Berseker 1')}.out('MY_PARENT_IS')
          {while: (out('IN_CHARGE_PERSON').size() == 0), 
          where: (out('IN_CHARGE_PERSON').size() > 0)}.out('IN_CHARGE_PERSON')
          {as: manager} RETURN manager)

Вопрос в том, как объединить эти 2 запроса в 1 оператор, который либо вернет результаты первого, либо второго, но только в том случае, если первый не вернул результатов?

Я поиграл с LET, но не могу заставить это работать на 100% (это приводит к ошибке синтаксического анализа запроса):

SELECT if($specMgr.size()>0,$specMgr,$depMgr)
LET $specMgr = (SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
          where: (Name = 'Sales Berseker 1' AND in('IS_SPECIFIED_LEADER_FOR').size() > 0)}.in('IS_SPECIFIED_LEADER_FOR')
          {as: manager} RETURN manager)),
$depMgr = (SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
          where: (Name = 'Sales Berseker 1')}.out('MY_PARENT_IS')
          {while: (out('IN_CHARGE_PERSON').size() == 0), 
          where: (out('IN_CHARGE_PERSON').size() > 0)}.out('IN_CHARGE_PERSON')
          {as: manager} RETURN manager))

Проблема с условием, когда я убираю сравнение, то хоть об ошибке не сообщается, но работает не так, как ожидалось. Почему я не могу использовать сравнение .size() > 0 в операторе if?


person Tobiasz    schedule 30.05.2017    source источник


Ответы (1)


ОК, решил, оказалось я пропустил eval() и не читал, что содержимое eval нужно заключать в кавычки. Рабочий запрос выглядит следующим образом:

SELECT EXPAND(if(eval('$specMgr.size() > 0'),$specMgr,$depMgr))
LET $specMgr = (SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
          where: (Name = 'Sales Berseker 1' AND in('IS_SPECIFIED_LEADER_FOR').size() > 0)}.in('IS_SPECIFIED_LEADER_FOR')
          {as: manager} RETURN manager)),
$depMgr = (SELECT expand(manager) FROM (MATCH {class:HRUnitPersonCompany, 
          where: (Name = 'Sales Berseker 1')}.out('MY_PARENT_IS')
          {while: (out('IN_CHARGE_PERSON').size() == 0), 
          where: (out('IN_CHARGE_PERSON').size() > 0)}.out('IN_CHARGE_PERSON')
          {as: manager} RETURN manager))
person Tobiasz    schedule 30.05.2017