diff options
author | Jacob Evans <jacob.evans@10gen.com> | 2020-06-29 18:10:10 -0400 |
---|---|---|
committer | Evergreen Agent <no-reply@evergreen.mongodb.com> | 2020-07-13 17:07:48 +0000 |
commit | 5679ec1dc597df81cbf7e2bf153b5859489521c9 (patch) | |
tree | 565f8fdbb33bd6cd22bca25c880df8eb4d620f2b /src/mongo/db/cst | |
parent | 09d1ea41fb25867e7cb2510b06933c3aa6757306 (diff) | |
download | mongo-5679ec1dc597df81cbf7e2bf153b5859489521c9.tar.gz |
SERVER-49042 Add all BSON types to CST
Diffstat (limited to 'src/mongo/db/cst')
-rw-r--r-- | src/mongo/db/cst/SConscript | 1 | ||||
-rw-r--r-- | src/mongo/db/cst/c_node.cpp | 70 | ||||
-rw-r--r-- | src/mongo/db/cst/c_node.h | 46 |
3 files changed, 112 insertions, 5 deletions
diff --git a/src/mongo/db/cst/SConscript b/src/mongo/db/cst/SConscript index 64a446694b9..52a88dc0406 100644 --- a/src/mongo/db/cst/SConscript +++ b/src/mongo/db/cst/SConscript @@ -13,6 +13,7 @@ env.Library( ], LIBDEPS=[ "$BUILD_DIR/mongo/base", + '$BUILD_DIR/mongo/db/query/datetime/date_time_support', ] ) diff --git a/src/mongo/db/cst/c_node.cpp b/src/mongo/db/cst/c_node.cpp index df00694cfb3..84fb55d04b2 100644 --- a/src/mongo/db/cst/c_node.cpp +++ b/src/mongo/db/cst/c_node.cpp @@ -27,12 +27,15 @@ * it in the license file. */ -#include <numeric> -#include <type_traits> - #include "mongo/db/cst/c_node.h" +#include "mongo/bson/bsontypes.h" +#include "mongo/db/query/datetime/date_time_support.h" +#include "mongo/util/hex.h" #include "mongo/util/visit_helper.h" +#include <numeric> +#include <type_traits> + namespace mongo { using namespace std::string_literals; namespace { @@ -92,7 +95,66 @@ std::string CNode::toStringHelper(int numTabs) const { }, [numTabs](const UserString& userString) { return tabs(numTabs) + "<UserString " + userString + ">"; - }}, + }, + [numTabs](const UserBinary& userBinary) { + return tabs(numTabs) + "<UserBinary " + typeName(userBinary.type) + ", " + + toHex(userBinary.data, userBinary.length) + ">"; + }, + [numTabs](const UserUndefined& userUndefined) { + return tabs(numTabs) + "<UserUndefined>"; + }, + [numTabs](const UserObjectId& userObjectId) { + return tabs(numTabs) + "<UserObjectId " + userObjectId.toString() + ">"; + }, + [numTabs](const UserBoolean& userBoolean) { + return tabs(numTabs) + "<UserBoolean " + std::to_string(userBoolean) + ">"; + }, + [numTabs](const UserDate& userDate) { + return tabs(numTabs) + "<UserDate " + + [&] { + if (auto string = TimeZoneDatabase::utcZone().formatDate( + "%Y-%m-%dT%H:%M:%S.%LZ", userDate); + string.isOK()) + return string.getValue(); + else + return "illegal date"s; + }() + + ">"; + }, + [numTabs](const UserNull& userNull) { return tabs(numTabs) + "<UserNull>"; }, + [numTabs](const UserRegex& userRegex) { + return tabs(numTabs) + "<UserRegex " + "/" + userRegex.pattern + "/" + + userRegex.flags + ">"; + }, + [numTabs](const UserDBPointer& userDBPointer) { + return tabs(numTabs) + "<UserDBPointer " + userDBPointer.ns + ", " + + userDBPointer.oid.toString() + ">"; + }, + [numTabs](const UserJavascript& userJavascript) { + return tabs(numTabs) + "<UserJavascript " + userJavascript.code + ">"; + }, + [numTabs](const UserSymbol& userSymbol) { + return tabs(numTabs) + "<UserSymbol " + userSymbol.symbol + ">"; + }, + [numTabs](const UserJavascriptWithScope& userJavascriptWithScope) { + return tabs(numTabs) + "<UserJavascriptWithScope " + userJavascriptWithScope.code + + ", "; + userJavascriptWithScope.scope.toString() + ">"; + }, + [numTabs](const UserInt& userInt) { + return tabs(numTabs) + "<UserInt " + std::to_string(userInt) + ">"; + }, + [numTabs](const UserTimestamp& userTimestamp) { + return tabs(numTabs) + "<UserTimestamp " + userTimestamp.toString() + ">"; + }, + [numTabs](const UserLong& userLong) { + return tabs(numTabs) + "<UserLong " + std::to_string(userLong) + ">"; + }, + [numTabs](const UserDecimal& userDecimal) { + return tabs(numTabs) + "<UserDecimal " + userDecimal.toString() + ">"; + }, + [numTabs](const UserMinKey& userMinKey) { return tabs(numTabs) + "<UserMinKey>"; }, + [numTabs](const UserMaxKey& userMaxKey) { return tabs(numTabs) + "<UserMaxKey>"; }}, payload); } diff --git a/src/mongo/db/cst/c_node.h b/src/mongo/db/cst/c_node.h index 0d0e717ab84..773eb49e801 100644 --- a/src/mongo/db/cst/c_node.h +++ b/src/mongo/db/cst/c_node.h @@ -35,15 +35,38 @@ #include <utility> #include <vector> +#include "mongo/bson/bsonmisc.h" +#include "mongo/bson/oid.h" +#include "mongo/bson/timestamp.h" #include "mongo/db/cst/key_fieldname.h" #include "mongo/db/cst/key_value.h" +#include "mongo/platform/decimal128.h" #include "mongo/stdx/variant.h" +#include "mongo/util/time_support.h" namespace mongo { using UserFieldname = std::string; +// These are the non-compound types from bsonspec.org. using UserDouble = double; using UserString = std::string; +using UserBinary = BSONBinData; +struct UserUndefined {}; +using UserObjectId = OID; +using UserBoolean = bool; +using UserDate = Date_t; +struct UserNull {}; +using UserRegex = BSONRegEx; +using UserDBPointer = BSONDBRef; +using UserJavascript = BSONCode; +using UserSymbol = BSONSymbol; +using UserJavascriptWithScope = BSONCodeWScope; +using UserInt = int; +using UserTimestamp = Timestamp; +using UserLong = long long; +using UserDecimal = Decimal128; +struct UserMinKey {}; +struct UserMaxKey {}; struct CNode { static auto noopLeaf() { @@ -60,7 +83,28 @@ private: public: using Fieldname = stdx::variant<KeyFieldname, UserFieldname>; using Children = std::vector<std::pair<Fieldname, CNode>>; - stdx::variant<Children, KeyValue, UserDouble, UserString> payload; + stdx::variant<Children, + KeyValue, + UserDouble, + UserString, + UserBinary, + UserUndefined, + UserObjectId, + UserBoolean, + UserDate, + UserNull, + UserRegex, + UserDBPointer, + UserJavascript, + UserSymbol, + UserJavascriptWithScope, + UserInt, + UserTimestamp, + UserLong, + UserDecimal, + UserMinKey, + UserMaxKey> + payload; }; } // namespace mongo |