summaryrefslogtreecommitdiff
path: root/db/index.h
diff options
context:
space:
mode:
Diffstat (limited to 'db/index.h')
-rw-r--r--db/index.h153
1 files changed, 5 insertions, 148 deletions
diff --git a/db/index.h b/db/index.h
index 6965f11..a2d7e7e 100644
--- a/db/index.h
+++ b/db/index.h
@@ -18,157 +18,13 @@
#pragma once
-#include "../stdafx.h"
+#include "../pch.h"
#include "diskloc.h"
#include "jsobj.h"
-#include <map>
+#include "indexkey.h"
namespace mongo {
- class IndexSpec;
- class IndexType; // TODO: this name sucks
- class IndexPlugin;
- class IndexDetails;
-
- enum IndexSuitability { USELESS = 0 , HELPFUL = 1 , OPTIMAL = 2 };
-
- /**
- * this represents an instance of a index plugin
- * done this way so parsing, etc... can be cached
- * so if there is a FTS IndexPlugin, for each index using FTS
- * there will be 1 of these, and it can have things pre-parsed, etc...
- */
- class IndexType : boost::noncopyable {
- public:
- IndexType( const IndexPlugin * plugin , const IndexSpec * spec );
- virtual ~IndexType();
-
- virtual void getKeys( const BSONObj &obj, BSONObjSetDefaultOrder &keys ) const = 0;
- virtual auto_ptr<Cursor> newCursor( const BSONObj& query , const BSONObj& order , int numWanted ) const = 0;
-
- /** optional op : changes query to match what's in the index */
- virtual BSONObj fixKey( const BSONObj& in ) { return in; }
-
- /** optional op : compare 2 objects with regards to this index */
- virtual int compare( const BSONObj& l , const BSONObj& r ) const;
-
- /** @return plugin */
- const IndexPlugin * getPlugin() const { return _plugin; }
-
- const BSONObj& keyPattern() const;
-
- virtual IndexSuitability suitability( const BSONObj& query , const BSONObj& order ) const ;
-
- virtual bool scanAndOrderRequired( const BSONObj& query , const BSONObj& order ) const ;
-
- protected:
- const IndexPlugin * _plugin;
- const IndexSpec * _spec;
- };
-
- /**
- * this represents a plugin
- * a plugin could be something like full text search, sparse index, etc...
- * 1 of these exists per type of index per server
- * 1 IndexType is created per index using this plugin
- */
- class IndexPlugin : boost::noncopyable {
- public:
- IndexPlugin( const string& name );
- virtual ~IndexPlugin(){}
-
- virtual IndexType* generate( const IndexSpec * spec ) const = 0;
-
- static IndexPlugin* get( const string& name ){
- if ( ! _plugins )
- return 0;
- map<string,IndexPlugin*>::iterator i = _plugins->find( name );
- if ( i == _plugins->end() )
- return 0;
- return i->second;
- }
-
- string getName() const { return _name; }
- private:
- string _name;
- static map<string,IndexPlugin*> * _plugins;
- };
-
- /* precomputed details about an index, used for inserting keys on updates
- stored/cached in NamespaceDetailsTransient, or can be used standalone
- */
- class IndexSpec {
- public:
- BSONObj keyPattern; // e.g., { name : 1 }
- BSONObj info; // this is the same as IndexDetails::info.obj()
-
- IndexSpec()
- : _details(0) , _finishedInit(false){
- }
-
- IndexSpec( const BSONObj& k , const BSONObj& m = BSONObj() )
- : keyPattern(k) , info(m) , _details(0) , _finishedInit(false){
- _init();
- }
-
- /**
- this is a DiscLoc of an IndexDetails info
- should have a key field
- */
- IndexSpec( const DiskLoc& loc ){
- reset( loc );
- }
-
- void reset( const DiskLoc& loc );
- void reset( const IndexDetails * details );
-
- void getKeys( const BSONObj &obj, BSONObjSetDefaultOrder &keys ) const;
-
- BSONElement missingField() const { return _nullElt; }
-
- string getTypeName() const {
- if ( _indexType.get() )
- return _indexType->getPlugin()->getName();
- return "";
- }
-
- IndexType* getType() const {
- return _indexType.get();
- }
-
- const IndexDetails * getDetails() const {
- return _details;
- }
-
- IndexSuitability suitability( const BSONObj& query , const BSONObj& order ) const ;
-
- protected:
-
- IndexSuitability _suitability( const BSONObj& query , const BSONObj& order ) const ;
-
- void _getKeys( vector<const char*> fieldNames , vector<BSONElement> fixed , const BSONObj &obj, BSONObjSetDefaultOrder &keys ) const;
-
- BSONSizeTracker _sizeTracker;
-
- vector<const char*> _fieldNames;
- vector<BSONElement> _fixed;
- BSONObj _nullKey;
-
- BSONObj _nullObj;
- BSONElement _nullElt;
-
- shared_ptr<IndexType> _indexType;
-
- const IndexDetails * _details;
-
- void _init();
-
- public:
- bool _finishedInit;
-
- friend class IndexType;
- };
-
/* Details about a particular index. There is one of these effectively for each object in
system.namespaces (although this also includes the head pointer, which is not in that
collection).
@@ -275,7 +131,7 @@ namespace mongo {
const IndexSpec& getSpec() const;
- operator string() const {
+ string toString() const {
return info.obj().toString();
}
};
@@ -300,6 +156,7 @@ namespace mongo {
};
class NamespaceDetails;
- void getIndexChanges(vector<IndexChanges>& v, NamespaceDetails& d, BSONObj newObj, BSONObj oldObj);
+ // changedId should be initialized to false
+ void getIndexChanges(vector<IndexChanges>& v, NamespaceDetails& d, BSONObj newObj, BSONObj oldObj, bool &cangedId);
void dupCheck(vector<IndexChanges>& v, NamespaceDetails& d, DiskLoc curObjLoc);
} // namespace mongo