docs: function (e, table) {
              var h, i, args;
              if (isString(e)) {
                  //this should not be hit but here just for completeness
                  return this.stringToIdentifier(e);
              } else if (isArray(e)) {
                  return e.map(function (exp) {
                      return this._qualifiedExpression(exp, table);
                  }, this);
              } else if (isInstanceOf(e, Identifier)) {
                  return new QualifiedIdentifier(table, e);
              } else if (isInstanceOf(e, OrderedExpression)) {
                  return new OrderedExpression(this._qualifiedExpression(e.expression, table), e.descending,
                      {nulls: e.nulls});
              } else if (isInstanceOf(e, AliasedExpression)) {
                  return new AliasedExpression(this._qualifiedExpression(e.expression, table), e.alias);
              } else if (isInstanceOf(e, CaseExpression)) {
                  args = [this._qualifiedExpression(e.conditions, table), this._qualifiedExpression(e.def, table)];
                  if (e.hasExpression) {
                      args.push(this._qualifiedExpression(e.expression, table));
                  }
                  return CaseExpression.fromArgs(args);
              } else if (isInstanceOf(e, Cast)) {
                  return new Cast(this._qualifiedExpression(e.expr, table), e.type);
              } else if (isInstanceOf(e, SQLFunction)) {
                  return SQLFunction.fromArgs([e.f].concat(this._qualifiedExpression(e.args, table)));
              } else if (isInstanceOf(e, ComplexExpression)) {
                  return ComplexExpression.fromArgs([e.op].concat(this._qualifiedExpression(e.args, table)));
              } else if (isInstanceOf(e, SubScript)) {
                  return new SubScript(this._qualifiedExpression(e.f, table), this._qualifiedExpression(e.sub, table));
              } else if (isInstanceOf(e, PlaceHolderLiteralString)) {
                  args = [];
                  var eArgs = e.args;
                  if (isHash(eArgs)) {
                      h = {};
                      for (i in eArgs) {
                          h[i] = this._qualifiedExpression(eArgs[i], table);
                      }
                      args = h;
                  } else {
                      args = this._qualifiedExpression(eArgs, table);
                  }
                  return new PlaceHolderLiteralString(e.str, args, e.parens);
  
              } else if (isHash(e)) {
                  h = {};
                  for (i in e) {
                      h[this._qualifiedExpression(i, table) + ""] = this._qualifiedExpression(e[i], table);
                  }
                  return h;
              } else {
                  return e;
              }
          }