35 #include "mongo/base/static_assert.h" 36 #include "mongo/bson/bsonmisc.h" 37 #include "mongo/bson/bsonobj.h" 38 #include "mongo/bson/bsonobjbuilder.h" 39 #include "mongo/bson/ordering.h" 40 #include "mongo/bson/timestamp.h" 41 #include "mongo/db/record_id.h" 42 #include "mongo/platform/decimal128.h" 43 #include "mongo/util/assert_util.h" 71 static const uint8_t kMaxBytesNeeded = 127;
72 static const uint32_t kMaxKeyBytes = 1024;
73 static const uint32_t kMaxTypeBitsPerDecimal = 17;
74 static const uint32_t kBytesForTypeAndEmptyKey = 2;
75 static const uint32_t kMaxDecimalsPerKey =
76 kMaxKeyBytes / (
sizeof(Decimal128::Value) + kBytesForTypeAndEmptyKey);
77 MONGO_STATIC_ASSERT_MSG(
78 kMaxTypeBitsPerDecimal* kMaxDecimalsPerKey < kMaxBytesNeeded * 8UL,
79 "encoding needs change to contain all type bits for worst case key");
80 static const uint8_t kStoredDecimalExponentBits = 6;
81 static const uint32_t kStoredDecimalExponentMask = (1U << kStoredDecimalExponentBits) - 1;
129 return getSize() == 1 ? _buf + 1 : _buf;
133 dassert(_buf[1] == 0);
137 uint8_t rawSize = getSizeByte();
138 dassert(rawSize >= 1);
139 if (rawSize == 1 && !(_buf[1] & 0x80)) {
151 static const uint8_t kString = 0x0;
152 static const uint8_t kSymbol = 0x1;
154 static const uint8_t kInt = 0x0;
155 static const uint8_t kLong = 0x1;
156 static const uint8_t kDouble = 0x2;
157 static const uint8_t kDecimal = 0x3;
158 static const uint8_t kSpecialZeroPrefix = 0x3;
159 static const uint8_t kNegativeDoubleZero = 0x3;
160 static const uint8_t kV0NegativeDoubleZero = 0x3;
164 static const uint8_t kV1NegativeDoubleZero = 0x18;
166 static const uint8_t kUnusedEncoding = 0x19;
169 static const uint8_t kDecimalZero0xxx = 0x1a;
170 static const uint8_t kDecimalZero1xxx = 0x1b;
171 static const uint8_t kDecimalZero2xxx = 0x1c;
172 static const uint8_t kDecimalZero3xxx = 0x1d;
173 static const uint8_t kDecimalZero4xxx = 0x1e;
174 static const uint8_t kDecimalZero5xxx = 0x1f;
191 appendBit(kDouble >> 1);
192 appendBit(kDouble & 1);
195 appendBit(kInt >> 1);
199 appendBit(kLong >> 1);
200 appendBit(kLong & 1);
203 appendBit(kDecimal >> 1);
204 appendBit(kDecimal & 1);
206 void appendZero(uint8_t zeroType);
207 void appendDecimalZero(uint32_t whichZero);
208 void appendDecimalExponent(uint8_t storedExponentBits);
221 uint8_t highBit = readBit();
222 return (highBit << 1) | readBit();
228 uint32_t readDecimalZero(uint8_t zeroType);
231 uint8_t readDecimalExponent();
247 return _buf[0] & 0x7f;
252 uassert(ErrorCodes::KeyTooLong,
"The key is too long", size < kMaxBytesNeeded);
253 _buf[0] = 0x80 | size;
256 void appendBit(uint8_t oneOrZero);
265 uint8_t _buf[1 + kMaxBytesNeeded];
315 static BSONObj
toBson(
const char* buffer,
319 static BSONObj
toBsonSafe(
const char* buffer,
size_t len, Ordering ord,
const TypeBits& types);
343 void resetToKey(
const BSONObj& obj, Ordering ord, RecordId recordId);
347 memcpy(
_buffer.skip(size), buffer, size);
418 template <
typename T>
419 void _append(
const T& thing,
bool invert);
420 void _appendBytes(
const void* source,
size_t bytes,
bool invert);
447 return !(lhs == rhs);
void reset()
Definition: key_string.h:176
void resetToKey(const BSONObj &obj, Ordering ord, RecordId recordId)
Definition: key_string.cpp:325
bool operator<(const KeyString &lhs, const KeyString &rhs)
Definition: key_string.h:426
KeyString(Version version)
Definition: key_string.h:284
void _appendBinData(const BSONBinData &val, bool invert)
Definition: key_string.cpp:486
void appendNumberDouble()
Definition: key_string.h:190
void _appendSymbol(StringData val, bool invert)
Definition: key_string.cpp:469
void appendRecordId(RecordId loc)
Definition: key_string.cpp:385
TypeBits _typeBits
Definition: key_string.h:422
void _appendStringLike(StringData str, bool invert)
– lowest level
Definition: key_string.cpp:859
void _appendDoubleWithoutTypeBits(const double num, DecimalContinuationMarker dcm, bool invert)
Definition: key_string.cpp:539
static BSONObj toBson(StringData data, Ordering ord, const TypeBits &types)
Definition: key_string.cpp:2070
void _appendNumberInt(const int num, bool invert)
Definition: key_string.cpp:617
bool operator==(const IndexKeyEntry &lhs, const IndexKeyEntry &rhs)
Definition: index_entry_comparison.h:54
void _appendAllElementsForIndexing(const BSONObj &obj, Ordering ord, Discriminator discriminator)
Definition: key_string.cpp:340
void _appendBson(const BSONObj &obj, bool invert)
Definition: key_string.cpp:875
Reader(const TypeBits &typeBits)
Passed in TypeBits must outlive this Reader instance.
Definition: key_string.h:215
size_t _curBit
Definition: key_string.h:258
static BSONObj toBsonSafe(const char *buffer, size_t len, Ordering ord, const TypeBits &types)
Definition: key_string.cpp:2038
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
void _appendBytes(const void *source, size_t bytes, bool invert)
Definition: key_string.cpp:1067
size_t getSize() const
Definition: key_string.h:131
Definition: key_string.h:280
void _appendInteger(const long long num, bool invert)
Definition: key_string.cpp:1024
static RecordId decodeRecordId(BufReader *reader)
Decodes a RecordId, consuming all bytes needed from reader.
Definition: key_string.cpp:2085
Definition: key_string.h:47
static RecordId decodeRecordIdAtEnd(const void *buf, size_t size)
Decodes a RecordId from the end of a buffer.
Definition: key_string.cpp:2074
void resetFromBuffer(const void *buffer, size_t size)
Definition: key_string.h:345
Discriminator
Definition: key_string.h:268
Definition: key_string.h:269
Definition: key_string.h:278
const TypeBits & _typeBits
Definition: key_string.h:237
Version
Selects version of KeyString to use.
Definition: key_string.h:52
bool isAllZeros() const
If true, no bits have been set to one.
Definition: key_string.h:101
static const Version kLatestVersion
Provides the latest version of KeyString available.
Definition: key_string.h:60
uint8_t getSizeByte() const
size only includes data bytes, not the size byte itself.
Definition: key_string.h:246
const TypeBits & getTypeBits() const
Definition: key_string.h:360
bool operator!=(const IndexKeyEntry &lhs, const IndexKeyEntry &rhs)
Definition: index_entry_comparison.h:58
Definition: key_string.h:279
uint8_t readStringLike()
Definition: key_string.h:217
bool operator>=(const KeyString &lhs, const KeyString &rhs)
Definition: key_string.h:442
void _appendRegex(const BSONRegEx &val, bool invert)
Definition: key_string.cpp:500
void _appendObject(const BSONObj &val, bool invert)
Definition: key_string.cpp:525
void appendSymbol()
Definition: key_string.h:186
void _appendString(StringData val, bool invert)
Definition: key_string.cpp:463
void appendNumberInt()
Definition: key_string.h:194
std::shared_ptr< void > data
Definition: ephemeral_for_test_record_store_test.cpp:74
StackBufBuilder _buffer
Definition: key_string.h:423
void _appendCodeWString(const BSONCodeWScope &val, bool invert)
Definition: key_string.cpp:480
const Version version
Definition: key_string.h:240
void _appendTimestamp(Timestamp val, bool invert)
Definition: key_string.cpp:453
static size_t getKeySize(const char *buffer, size_t len, Ordering ord, const TypeBits &typeBits)
Definition: key_string.cpp:2015
DecimalContinuationMarker
Encodes the kind of NumberDecimal that is stored.
Definition: key_string.h:277
Definition: key_string.h:210
Definition: key_string.h:270
void _appendBsonValue(const BSONElement &elem, bool invert, const StringData *name)
Definition: key_string.cpp:776
void _appendDate(Date_t val, bool invert)
Definition: key_string.cpp:445
Definition: key_string.h:281
void _appendDBRef(const BSONDBRef &val, bool invert)
Definition: key_string.cpp:509
void _appendSmallDouble(double value, DecimalContinuationMarker dcm, bool invert)
Definition: key_string.cpp:885
void appendString()
Definition: key_string.h:183
void _appendNumberDouble(const double num, bool invert)
Definition: key_string.cpp:530
std::ostream & operator<<(std::ostream &stream, const IndexKeyEntry &entry)
Definition: index_entry_comparison.cpp:37
static StringData versionToString(Version version)
Definition: key_string.h:53
bool isEmpty() const
Definition: key_string.h:356
int compare(const KeyString &other) const
Definition: key_string.cpp:2107
void _appendTinyDecimalWithoutTypeBits(const Decimal128 dec, const double bin, bool invert)
Definition: key_string.cpp:948
bool _isAllZeros
Definition: key_string.h:259
bool operator>(const KeyString &lhs, const KeyString &rhs)
Definition: key_string.h:438
std::string toString() const
Definition: key_string.cpp:2103
void appendTypeBits(const TypeBits &bits)
Definition: key_string.cpp:431
const uint8_t * getBuffer() const
These methods return a buffer and size which encodes all of the type bits in this instance...
Definition: key_string.h:128
Definition: key_string.h:271
TypeBits(Version version)
Definition: key_string.h:83
Encodes info needed to restore the original BSONTypes from a KeyString.
Definition: key_string.h:67
void resetToEmpty()
Resets to an empty state.
Definition: key_string.h:338
void _appendOID(OID val, bool invert)
Definition: key_string.cpp:458
void _appendArray(const BSONArray &val, bool invert)
Definition: key_string.cpp:516
void appendNumberLong()
Definition: key_string.h:198
void _appendHugeDecimalWithoutTypeBits(const Decimal128 dec, bool invert)
Definition: key_string.cpp:1005
void _appendNumberDecimal(const Decimal128 num, bool invert)
Definition: key_string.cpp:622
bool operator<=(const KeyString &lhs, const KeyString &rhs)
Definition: key_string.h:430
KeyString(Version version, RecordId rid)
Definition: key_string.h:299
uint8_t readNumeric()
Definition: key_string.h:220
void appendNumberDecimal()
Definition: key_string.h:202
size_t getSize() const
Definition: key_string.h:353
void _appendCode(StringData val, bool invert)
Definition: key_string.cpp:475
Database *const OperationContext *const const StringData name
Definition: database_impl.cpp:82
KeyString(Version version, const BSONObj &obj, Ordering ord, Discriminator discriminator=kInclusive)
Definition: key_string.h:291
size_t _curBit
Definition: key_string.h:236
void _appendLargeDouble(double value, DecimalContinuationMarker dcm, bool invert)
Definition: key_string.cpp:923
const Version version
Version to use for conversion to/from KeyString.
Definition: key_string.h:375
void _appendPreshiftedIntegerPortion(uint64_t value, bool isNegative, bool invert)
Definition: key_string.cpp:1043
static TypeBits fromBuffer(Version version, BufReader *reader)
Definition: key_string.h:92
void _appendBool(bool val, bool invert)
Definition: key_string.cpp:441
void _append(const T &thing, bool invert)
Definition: key_string.cpp:1063
KeyString(Version version, const BSONObj &obj, Ordering ord, RecordId recordId)
Definition: key_string.h:286
void setSizeByte(uint8_t size)
Definition: key_string.h:249
void resetFromBuffer(BufReader *reader)
If there are no bytes remaining, assumes AllZeros.
Definition: key_string.cpp:2129
const char * getBuffer() const
Definition: key_string.h:350
void _appendNumberLong(const long long num, bool invert)
Definition: key_string.cpp:612