code: private IQTree liftTree(IQTree queryTree, VariableGenerator variableGenerator) {
          if (queryTree instanceof UnaryIQTree)
              return liftUnary((UnaryIQTree) queryTree, variableGenerator);
          else if (queryTree instanceof NaryIQTree)
              return liftNary((NaryIQTree) queryTree, variableGenerator);
          else if (queryTree instanceof BinaryNonCommutativeIQTree)
              return liftBinaryNonCommutative((BinaryNonCommutativeIQTree) queryTree, variableGenerator);
          // Leaf node
          else
              return queryTree;
      }
docs: Recursive (to reach the descendency but does not loop over itself)