docs: function (source) {
              source = argsToArray(arguments);
              var tableAliasNum = 0, sources = [];
              source.forEach(function (s) {
                  if (isInstanceOf(s, Dataset)) {
                      sources.push(new AliasedExpression(s, this._datasetAlias(++tableAliasNum)));
                  } else if (isHash(s)) {
                      for (var i in s) {
                          sources.push(new AliasedExpression(new Identifier(i), s[i]));
                      }
                  } else if (isString(s)) {
                      sources.push(this.stringToIdentifier(s));
                  } else {
                      sources.push(s);
                  }
              }, this);
  
              var o = {from: sources.length ? sources : null};
              if (tableAliasNum) {
                  o.numDatasetSources = tableAliasNum;
              }
              return this.mergeOptions(o);
          }