diff options
author | Greg Studer <greg@10gen.com> | 2014-09-19 13:30:00 -0400 |
---|---|---|
committer | Greg Studer <greg@10gen.com> | 2014-10-16 18:38:12 -0400 |
commit | 22f8b6259602a76f8d22cba8b1098f9e3c90a36f (patch) | |
tree | 7cf4bd3d8b5439c4e42ca1be7ee6161a69af73a2 /src/mongo/db/keypattern_test.cpp | |
parent | 02c1c52514c7d6b54ff2d6dd6a3c564c3543f0a5 (diff) | |
download | mongo-22f8b6259602a76f8d22cba8b1098f9e3c90a36f.tar.gz |
SERVER-14973 consolidate shard key parsing, cleanup shard key patterns
Diffstat (limited to 'src/mongo/db/keypattern_test.cpp')
-rw-r--r-- | src/mongo/db/keypattern_test.cpp | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/mongo/db/keypattern_test.cpp b/src/mongo/db/keypattern_test.cpp new file mode 100644 index 00000000000..63b9b325d75 --- /dev/null +++ b/src/mongo/db/keypattern_test.cpp @@ -0,0 +1,142 @@ +/* Copyright 2014 MongoDB Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License, version 3, + * as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + * + * As a special exception, the copyright holders give permission to link the + * code of portions of this program with the OpenSSL library under certain + * conditions as described in each individual source file and distribute + * linked combinations including the program with the OpenSSL library. You + * must comply with the GNU Affero General Public License in all respects + * for all of the code used other than as permitted herein. If you modify + * file(s) with this exception, you may extend this exception to your + * version of the file(s), but you are not obligated to do so. If you do not + * wish to do so, delete this exception statement from your version. If you + * delete this exception statement from all source files in the program, + * then also delete it in the license file. + */ + +#include "mongo/db/keypattern.h" + +#include "mongo/unittest/unittest.h" + +namespace { + + using namespace mongo; + + TEST(KeyPattern, ExtendRangeBound) { + + BSONObj bound = BSON("a" << 55); + BSONObj longBound = BSON("a" << 55 << "b" << 66); + + //test keyPattern shorter than bound, should fail + { + KeyPattern keyPat(BSON("a" << 1)); + ASSERT_THROWS(keyPat.extendRangeBound(longBound, false), MsgAssertionException); + } + + //test keyPattern doesn't match bound, should fail + { + KeyPattern keyPat(BSON("b" << 1)); + ASSERT_THROWS(keyPat.extendRangeBound(bound, false), MsgAssertionException); + } + { + KeyPattern keyPat(BSON("a" << 1 << "c" << 1)); + ASSERT_THROWS(keyPat.extendRangeBound(longBound, false), MsgAssertionException); + } + + //test keyPattern same as bound + { + KeyPattern keyPat(BSON("a" << 1)); + BSONObj newB = keyPat.extendRangeBound(bound, false); + ASSERT_EQUALS(newB, BSON("a" << 55)); + } + { + KeyPattern keyPat(BSON("a" << 1)); + BSONObj newB = keyPat.extendRangeBound(bound, false); + ASSERT_EQUALS(newB, BSON("a" << 55)); + } + + //test keyPattern longer than bound, simple + { + KeyPattern keyPat(BSON("a" << 1 << "b" << 1)); + BSONObj newB = keyPat.extendRangeBound(bound, false); + ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MINKEY)); + } + { + KeyPattern keyPat(BSON("a" << 1 << "b" << 1)); + BSONObj newB = keyPat.extendRangeBound(bound, true); + ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MAXKEY)); + } + + //test keyPattern longer than bound, more complex pattern directions + { + KeyPattern keyPat(BSON("a" << 1 << "b" << -1)); + BSONObj newB = keyPat.extendRangeBound(bound, false); + ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MAXKEY)); + } + { + KeyPattern keyPat(BSON("a" << 1 << "b" << -1)); + BSONObj newB = keyPat.extendRangeBound(bound, true); + ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MINKEY)); + } + { + + KeyPattern keyPat(BSON("a" << 1 << "b" << -1 << "c" << 1)); + BSONObj newB = keyPat.extendRangeBound(bound, false); + ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MAXKEY << "c" << MINKEY)); + } + { + KeyPattern keyPat(BSON("a" << 1 << "b" << -1 << "c" << 1)); + BSONObj newB = keyPat.extendRangeBound(bound, true); + ASSERT_EQUALS(newB, BSON("a" << 55 << "b" << MINKEY << "c" << MAXKEY)); + } + } + + TEST(KeyPattern, GlobalMinMax) { + + // + // Simple KeyPatterns + // + + ASSERT_EQUALS(KeyPattern(BSON("a" << 1)).globalMin(), BSON("a" << MINKEY)); + ASSERT_EQUALS(KeyPattern(BSON("a" << 1)).globalMax(), BSON("a" << MAXKEY)); + + ASSERT_EQUALS(KeyPattern(BSON("a" << -1)).globalMin(), BSON("a" << MAXKEY)); + ASSERT_EQUALS(KeyPattern(BSON("a" << -1)).globalMax(), BSON("a" << MINKEY)); + + ASSERT_EQUALS(KeyPattern(BSON("a" << 1 << "b" << 1.0)).globalMin(), + BSON("a" << MINKEY << "b" << MINKEY)); + ASSERT_EQUALS(KeyPattern(BSON("a" << 1 << "b" << 1.0)).globalMax(), + BSON("a" << MAXKEY << "b" << MAXKEY)); + + ASSERT_EQUALS(KeyPattern(BSON("a" << 1 << "b" << -1.0f)).globalMin(), + BSON("a" << MINKEY << "b" << MAXKEY)); + ASSERT_EQUALS(KeyPattern(BSON("a" << 1 << "b" << -1.0f)).globalMax(), + BSON("a" << MAXKEY << "b" << MINKEY)); + + ASSERT_EQUALS(KeyPattern(BSON("a" << "hashed")).globalMin(), BSON("a" << MINKEY)); + ASSERT_EQUALS(KeyPattern(BSON("a" << "hashed")).globalMax(), BSON("a" << MAXKEY)); + + // + // Nested KeyPatterns + // + + ASSERT_EQUALS(KeyPattern(BSON("a.b" << 1)).globalMin(), BSON("a.b" << MINKEY)); + ASSERT_EQUALS(KeyPattern(BSON("a.b" << 1)).globalMax(), BSON("a.b" << MAXKEY)); + + ASSERT_EQUALS(KeyPattern(BSON("a.b.c" << -1)).globalMin(), BSON("a.b.c" << MAXKEY)); + ASSERT_EQUALS(KeyPattern(BSON("a.b.c" << -1)).globalMax(), BSON("a.b.c" << MINKEY)); + } + +} + |