FieldBound work

This commit is contained in:
Aaron
2009-02-17 15:53:19 -05:00
parent a11da1eaa7
commit 0e38bc5a8f
9 changed files with 119 additions and 7 deletions

View File

@@ -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,