summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacob Evans <jacob.evans@10gen.com>2020-06-29 18:10:10 -0400
committerEvergreen Agent <no-reply@evergreen.mongodb.com>2020-07-13 17:07:48 +0000
commit5679ec1dc597df81cbf7e2bf153b5859489521c9 (patch)
tree565f8fdbb33bd6cd22bca25c880df8eb4d620f2b
parent09d1ea41fb25867e7cb2510b06933c3aa6757306 (diff)
downloadmongo-5679ec1dc597df81cbf7e2bf153b5859489521c9.tar.gz
SERVER-49042 Add all BSON types to CST
-rw-r--r--src/mongo/db/cst/SConscript1
-rw-r--r--src/mongo/db/cst/c_node.cpp70
-rw-r--r--src/mongo/db/cst/c_node.h46
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