Storage Engine API
wiredtiger_index.h
Go to the documentation of this file.
1 
29 #pragma once
30 
31 #include <wiredtiger.h>
32 
33 #include "mongo/base/status_with.h"
40 
41 namespace mongo {
42 
43 class IndexCatalogEntry;
44 class IndexDescriptor;
45 struct WiredTigerItem;
46 
48 public:
54  static StatusWith<std::string> parseIndexOptions(const BSONObj& options);
55 
61  static std::string generateAppMetadataString(const IndexDescriptor& desc);
62 
75  static StatusWith<std::string> generateCreateString(const std::string& engineName,
76  const std::string& sysIndexConfig,
77  const std::string& collIndexConfig,
78  const IndexDescriptor& desc,
79  bool isPrefixed);
80 
85  static int Create(OperationContext* opCtx, const std::string& uri, const std::string& config);
86 
87  WiredTigerIndex(OperationContext* ctx,
88  const std::string& uri,
89  const IndexDescriptor* desc,
90  KVPrefix prefix,
91  bool readOnly);
92 
93  virtual Status insert(OperationContext* opCtx,
94  const BSONObj& key,
95  const RecordId& id,
96  bool dupsAllowed);
97 
98  virtual void unindex(OperationContext* opCtx,
99  const BSONObj& key,
100  const RecordId& id,
101  bool dupsAllowed);
102 
103  virtual void fullValidate(OperationContext* opCtx,
104  long long* numKeysOut,
105  ValidateResults* fullResults) const;
106  virtual bool appendCustomStats(OperationContext* opCtx,
107  BSONObjBuilder* output,
108  double scale) const;
109  virtual Status dupKeyCheck(OperationContext* opCtx, const BSONObj& key, const RecordId& id);
110 
111  virtual bool isEmpty(OperationContext* opCtx);
112 
113  virtual Status touch(OperationContext* opCtx) const;
114 
115  virtual long long getSpaceUsedBytes(OperationContext* opCtx) const;
116 
117  virtual Status initAsEmpty(OperationContext* opCtx);
118 
119  virtual Status compact(OperationContext* opCtx);
120 
121  const std::string& uri() const {
122  return _uri;
123  }
124 
125  // WiredTigerIndex additions
126 
127  virtual bool isDup(OperationContext* opCtx,
128  WT_CURSOR* c,
129  const BSONObj& key,
130  const RecordId& id);
131 
132  uint64_t tableId() const {
133  return _tableId;
134  }
135  Ordering ordering() const {
136  return _ordering;
137  }
138 
140  return _keyStringVersion;
141  }
142 
143  std::string collectionNamespace() const {
144  return _collectionNamespace;
145  }
146 
147  std::string indexName() const {
148  return _indexName;
149  }
150 
151  bool isIdIndex() const {
152  return _isIdIndex;
153  }
154 
155  virtual bool unique() const = 0;
156  virtual bool isTimestampSafeUniqueIdx() const = 0;
157 
158  Status dupKeyError(const BSONObj& key);
159 
160 protected:
161  virtual Status _insert(OperationContext* opCtx,
162  WT_CURSOR* c,
163  const BSONObj& key,
164  const RecordId& id,
165  bool dupsAllowed) = 0;
166 
167  virtual void _unindex(OperationContext* opCtx,
168  WT_CURSOR* c,
169  const BSONObj& key,
170  const RecordId& id,
171  bool dupsAllowed) = 0;
172 
173  void setKey(WT_CURSOR* cursor, const WT_ITEM* item);
174 
175  class BulkBuilder;
176  class StandardBulkBuilder;
178 
179  const Ordering _ordering;
180  // The keystring and data format version are effectively const after the WiredTigerIndex
181  // instance is constructed.
184  std::string _uri;
185  uint64_t _tableId;
186  std::string _collectionNamespace;
187  std::string _indexName;
190 };
191 
193 public:
194  WiredTigerIndexUnique(OperationContext* ctx,
195  const std::string& uri,
196  const IndexDescriptor* desc,
197  KVPrefix prefix,
198  bool readOnly = false);
199 
200  std::unique_ptr<SortedDataInterface::Cursor> newCursor(OperationContext* opCtx,
201  bool forward) const override;
202 
203  SortedDataBuilderInterface* getBulkBuilder(OperationContext* opCtx, bool dupsAllowed) override;
204 
205  bool unique() const override {
206  return true;
207  }
208 
209  bool isTimestampSafeUniqueIdx() const override;
210 
211  bool isDup(OperationContext* opCtx,
212  WT_CURSOR* c,
213  const BSONObj& key,
214  const RecordId& id) override;
215 
216  Status _insert(OperationContext* opCtx,
217  WT_CURSOR* c,
218  const BSONObj& key,
219  const RecordId& id,
220  bool dupsAllowed) override;
221 
222  Status _insertTimestampUnsafe(OperationContext* opCtx,
223  WT_CURSOR* c,
224  const BSONObj& key,
225  const RecordId& id,
226  bool dupsAllowed);
227 
228  Status _insertTimestampSafe(OperationContext* opCtx,
229  WT_CURSOR* c,
230  const BSONObj& key,
231  const RecordId& id,
232  bool dupsAllowed);
233 
234  void _unindex(OperationContext* opCtx,
235  WT_CURSOR* c,
236  const BSONObj& key,
237  const RecordId& id,
238  bool dupsAllowed) override;
239 
240  void _unindexTimestampUnsafe(OperationContext* opCtx,
241  WT_CURSOR* c,
242  const BSONObj& key,
243  const RecordId& id,
244  bool dupsAllowed);
245 
246  void _unindexTimestampSafe(OperationContext* opCtx,
247  WT_CURSOR* c,
248  const BSONObj& key,
249  const RecordId& id,
250  bool dupsAllowed);
251 
252 private:
253  bool _partial;
254 };
255 
257 public:
258  WiredTigerIndexStandard(OperationContext* ctx,
259  const std::string& uri,
260  const IndexDescriptor* desc,
261  KVPrefix prefix,
262  bool readOnly = false);
263 
264  std::unique_ptr<SortedDataInterface::Cursor> newCursor(OperationContext* opCtx,
265  bool forward) const override;
266 
267  SortedDataBuilderInterface* getBulkBuilder(OperationContext* opCtx, bool dupsAllowed) override;
268 
269  bool unique() const override {
270  return false;
271  }
272 
273  bool isTimestampSafeUniqueIdx() const override {
274  return false;
275  }
276 
277  Status _insert(OperationContext* opCtx,
278  WT_CURSOR* c,
279  const BSONObj& key,
280  const RecordId& id,
281  bool dupsAllowed) override;
282 
283  void _unindex(OperationContext* opCtx,
284  WT_CURSOR* c,
285  const BSONObj& key,
286  const RecordId& id,
287  bool dupsAllowed) override;
288 };
289 
290 } // namespace
virtual std::unique_ptr< Cursor > newCursor(OperationContext *opCtx, bool isForward=true) const =0
Returns an unpositioned cursor over &#39;this&#39; index.
Status dupKeyError(const BSONObj &key)
Definition: wiredtiger_index.cpp:129
void setKey(WT_CURSOR *cursor, const WT_ITEM *item)
Definition: wiredtiger_index.cpp:138
Definition: wiredtiger_index.h:256
virtual bool isDup(OperationContext *opCtx, WT_CURSOR *c, const BSONObj &key, const RecordId &id)
Definition: wiredtiger_index.cpp:513
std::string collectionNamespace() const
Definition: wiredtiger_index.h:143
bool isTimestampSafeUniqueIdx() const override
Definition: wiredtiger_index.h:273
Definition: record_store.h:671
bool _isIdIndex
Definition: wiredtiger_index.h:189
Copyright (C) 2014 MongoDB Inc.
Definition: bson_collection_catalog_entry.cpp:38
WiredTigerIndex(OperationContext *ctx, const std::string &uri, const IndexDescriptor *desc, KVPrefix prefix, bool readOnly)
Definition: wiredtiger_index.cpp:270
static StatusWith< std::string > generateCreateString(const std::string &engineName, const std::string &sysIndexConfig, const std::string &collIndexConfig, const IndexDescriptor &desc, bool isPrefixed)
Creates a configuration string suitable for &#39;config&#39; parameter in WT_SESSION::create().
Definition: wiredtiger_index.cpp:195
OperationContext Database StringData BSONObj CollectionOptions::ParseKind bool const BSONObj &idIndex Status
Definition: database_impl.cpp:956
virtual Status touch(OperationContext *opCtx) const
Attempt to bring the entirety of &#39;this&#39; index into memory.
Definition: wiredtiger_index.cpp:464
static StatusWith< std::string > parseIndexOptions(const BSONObj &options)
Parses index options for wired tiger configuration string suitable for table creation.
Definition: wiredtiger_index.cpp:147
bool _partial
Definition: wiredtiger_index.h:253
Version
Selects version of KeyString to use.
Definition: key_string.h:52
BSONObj key
Definition: btree_interface.cpp:334
int _dataFormatVersion
Definition: wiredtiger_index.h:183
KeyString::Version keyStringVersion() const
Definition: wiredtiger_index.h:139
Bulk builds a unique index.
Definition: wiredtiger_index.cpp:672
const std::string & uri() const
Definition: wiredtiger_index.h:121
static int Create(OperationContext *opCtx, const std::string &uri, const std::string &config)
Creates a WiredTiger table suitable for implementing a MongoDB index.
Definition: wiredtiger_index.cpp:260
virtual bool isEmpty(OperationContext *opCtx)
Return true if &#39;this&#39; index is empty, and false otherwise.
Definition: wiredtiger_index.cpp:444
virtual Status initAsEmpty(OperationContext *opCtx)
Definition: wiredtiger_index.cpp:545
virtual SortedDataBuilderInterface * getBulkBuilder(OperationContext *opCtx, bool dupsAllowed)=0
Return a bulk builder for &#39;this&#39; index.
bool unique() const override
Definition: wiredtiger_index.h:269
std::string indexName() const
Definition: wiredtiger_index.h:147
std::string _collectionNamespace
Definition: wiredtiger_index.h:186
static std::string generateAppMetadataString(const IndexDescriptor &desc)
Creates the "app_metadata" string for the index from the index descriptor, to be stored in WiredTiger...
Definition: wiredtiger_index.cpp:168
uint64_t tableId() const
Definition: wiredtiger_index.h:132
std::string _uri
Definition: wiredtiger_index.h:184
A version-hiding wrapper around the bulk builder for the Btree.
Definition: sorted_data_interface.h:394
std::string _indexName
Definition: wiredtiger_index.h:187
virtual void unindex(OperationContext *opCtx, const BSONObj &key, const RecordId &id, bool dupsAllowed)
Remove the entry from the index with the specified key and RecordId.
Definition: wiredtiger_index.cpp:334
Definition: index_key_validate.h:40
virtual Status _insert(OperationContext *opCtx, WT_CURSOR *c, const BSONObj &key, const RecordId &id, bool dupsAllowed)=0
virtual bool isTimestampSafeUniqueIdx() const =0
virtual void _unindex(OperationContext *opCtx, WT_CURSOR *c, const BSONObj &key, const RecordId &id, bool dupsAllowed)=0
virtual bool unique() const =0
Definition: wiredtiger_index.h:192
bool unique() const override
Definition: wiredtiger_index.h:205
Ordering ordering() const
Definition: wiredtiger_index.h:135
bool isIdIndex() const
Definition: wiredtiger_index.h:151
KVPrefix _prefix
Definition: wiredtiger_index.h:188
virtual Status dupKeyCheck(OperationContext *opCtx, const BSONObj &key, const RecordId &id)
Return ErrorCodes::DuplicateKey if &#39;key&#39; already exists in &#39;this&#39; index at a RecordId other than &#39;loc...
Definition: wiredtiger_index.cpp:430
virtual void fullValidate(OperationContext *opCtx, long long *numKeysOut, ValidateResults *fullResults) const
TODO: expose full set of args for testing?
Definition: wiredtiger_index.cpp:350
virtual Status insert(OperationContext *opCtx, const BSONObj &key, const RecordId &id, bool dupsAllowed)
Insert an entry into the index with the specified key and RecordId.
Definition: wiredtiger_index.cpp:315
OperationContext Database StringData BSONObj options
Definition: database_impl.cpp:949
A KVPrefix may be prepended to the keys of entries in an underlying KV store.
Definition: kv_prefix.h:44
Bulk builds a non-unique index.
Definition: wiredtiger_index.cpp:624
const Ordering _ordering
Definition: wiredtiger_index.h:177
Base class for WiredTigerIndex bulk builders.
Definition: wiredtiger_index.cpp:567
uint64_t _tableId
Definition: wiredtiger_index.h:185
virtual bool appendCustomStats(OperationContext *opCtx, BSONObjBuilder *output, double scale) const
Definition: wiredtiger_index.cpp:390
Collection *const OperationContext *const opCtx
Definition: collection_impl.cpp:80
virtual Status compact(OperationContext *opCtx)
Attempt to reduce the storage space used by this index via compaction.
Definition: wiredtiger_index.cpp:550
OperationContext const IndexDescriptor * desc
Definition: index_catalog_impl.cpp:97
KeyString::Version _keyStringVersion
Definition: wiredtiger_index.h:182
Definition: wiredtiger_index.h:47
This interface is a work in progress.
Definition: sorted_data_interface.h:64
virtual long long getSpaceUsedBytes(OperationContext *opCtx) const
Return the number of bytes consumed by &#39;this&#39; index.
Definition: wiredtiger_index.cpp:473