/**
   * Given the TupleExpr, replace the existence of a UnaryTupleOperator with the provided unary
   * operator. If there is nothing in the model that matches, the provided unary operator will be
   * placed at the root of the model.
   *
   * @param theExpr the expression
   * @param theNewProj the operator to replace the projectino with
   * @return the expression w/ the projection operator removed
   */
  public TupleExpr replace(final TupleExpr theExpr, final UnaryTupleOperator theNewProj) {
    Visitor aVisitor = new Visitor();

    try {
      theExpr.visit(aVisitor);
    } catch (Exception e) {
      // we really should not get an exception here
      throw new RuntimeException(e);
    }

    UnaryTupleOperator aProj = mOperator;

    if (aProj == null && insertIfNotPresent) {
      theNewProj.setArg(theExpr);

      return theNewProj;
    } else if (aProj != null && aProj.getParentNode() != null) {
      aProj.replaceWith(theNewProj);

      return theExpr;
    } else if (aProj != null) {
      theNewProj.setArg(aProj.getArg());
      return theNewProj;
    } else {
      return theExpr;
    }
  }
 public long getCardinality(UnaryTupleOperator op, BindingSet bindings) {
   return getCardinality(op.getArg(), bindings);
 }