2017-05-30 3 views
0

J'ai un scénario commun avec les employés travaillant dans les départements:OrientDB: Comment retourner les résultats de la première ou de la deuxième requête (si le premier n'a renvoyé aucune ligne)

    employé
  • a son département parent fixé par MY_PARENT_IS relation
  • la même relation est utilisée par les ministères contre leurs ministères d'attache.

Le gestionnaire d'un employé en particulier peut être:

  • situé directement à l'aide IS_SPECIFIED_LEADER_FOR
  • première personne qui est définie comme IN_CHARGE_PERSON sur le département des parents de l'employé (nous remontons la structure de l'employé donné jusqu'à ce que nous trouvions un département avec IN_CHARGE_PERSON ensemble de relations).

Exemple de structure:

Example structure

Pour atteindre cet objectif, j'ai 2 requêtes:

1ère requête pour obtenir spécifié chef de file pour la personne:

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ème requête trouve premier responsable de la structure (IN_CHARGE_PERSON)

La question est de savoir comment combiner ces 2 requêtes en une instruction qui retournera les résultats du premier ou du second, mais seulement si le premier n'a donné aucun résultat?

J'ai joué avec LET mais ne peut pas obtenir ce travail 100% (ce qui jette erreur d'analyse de requête):

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)) 

Le problème est à la condition, lorsque je retire la comparaison, au moins aucune erreur est signalé mais cela ne fonctionne pas comme prévu. Pourquoi ne puis-je pas utiliser la comparaison .size() > 0 dans l'instruction if?

Répondre

0

OK, résolu, il s'est avéré que j'ai manqué eval() et n'a pas lu ce contenu de eval doit être mis entre guillemets. La requête de travail est la suivante:

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))