FieldBound work
This commit is contained in:
@@ -32,6 +32,83 @@
|
||||
|
||||
namespace mongo {
|
||||
|
||||
FieldBound::FieldBound( BSONElement e ) :
|
||||
lower_( minKey.firstElement() ),
|
||||
upper_( maxKey.firstElement() ) {
|
||||
if ( e.eoo() )
|
||||
return;
|
||||
if ( e.type() == RegEx ) {
|
||||
const char *r = e.simpleRegex();
|
||||
cout << "r: " << r << endl;
|
||||
if ( r ) {
|
||||
lower_ = addObj( BSON( "" << r ) ).firstElement();
|
||||
upper_ = addObj( BSON( "" << simpleRegexEnd( r ) ) ).firstElement();
|
||||
cout << "lower_: " << lower_ << endl;
|
||||
cout << "upper_: " << upper_ << endl;
|
||||
}
|
||||
return;
|
||||
}
|
||||
switch( e.getGtLtOp() ) {
|
||||
case JSMatcher::Equality:
|
||||
lower_ = e;
|
||||
upper_ = e;
|
||||
break;
|
||||
case JSMatcher::LT:
|
||||
case JSMatcher::LTE:
|
||||
upper_ = e;
|
||||
break;
|
||||
case JSMatcher::GT:
|
||||
case JSMatcher::GTE:
|
||||
lower_ = e;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
cout << "lower_: " << lower_ << endl;
|
||||
cout << "upper_: " << upper_ << endl;
|
||||
}
|
||||
|
||||
FieldBound &FieldBound::operator&=( const FieldBound &other ) {
|
||||
if ( other.upper_.woCompare( upper_, false ) < 0 )
|
||||
upper_ = other.upper_;
|
||||
if ( other.lower_.woCompare( lower_, false ) > 0 )
|
||||
lower_ = other.lower_;
|
||||
massert( "Invalid bounds", lower_.woCompare( upper_, false ) <= 0 );
|
||||
return *this;
|
||||
}
|
||||
|
||||
string FieldBound::simpleRegexEnd( string regex ) {
|
||||
++regex[ regex.length() - 1 ];
|
||||
return regex;
|
||||
}
|
||||
|
||||
BSONObj FieldBound::addObj( BSONObj o ) {
|
||||
cout << "o: " << o.toString() << endl;
|
||||
objData_.push_back( o );
|
||||
return o;
|
||||
}
|
||||
|
||||
FieldBoundSet::FieldBoundSet( BSONObj query ) :
|
||||
query_( query.copy() ) {
|
||||
BSONObjIterator i( query_ );
|
||||
while( i.more() ) {
|
||||
BSONElement e = i.next();
|
||||
if ( e.eoo() )
|
||||
break;
|
||||
if ( getGtLtOp( e ) == JSMatcher::Equality )
|
||||
bounds_[ e.fieldName() ] &= FieldBound( e );
|
||||
else {
|
||||
BSONObjIterator i( e.embeddedObject() );
|
||||
while( i.more() ) {
|
||||
BSONElement f = i.next();
|
||||
if ( f.eoo() )
|
||||
break;
|
||||
bounds_[ e.fieldName() ] &= FieldBound( f );
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
QueryPlan QueryOptimizer::getPlan(
|
||||
const char *ns,
|
||||
BSONObj* query,
|
||||
|
||||
Reference in New Issue
Block a user