From 7d46ca28a08ee5f22adf56052c66e2036a0211e2 Mon Sep 17 00:00:00 2001 From: Bhaskar Muppana Date: Fri, 1 Feb 2019 15:33:41 -0800 Subject: [PATCH] Resolved #62: Fix command name handling with mixed case. --- src/ExtCmd.actor.cpp | 14 --------- src/ExtMsg.actor.cpp | 9 +++++- .../correctness/unit/find_and_modify_tests.py | 29 +++++++++++++++++++ 3 files changed, 37 insertions(+), 15 deletions(-) create mode 100644 test/correctness/unit/find_and_modify_tests.py diff --git a/src/ExtCmd.actor.cpp b/src/ExtCmd.actor.cpp index 112cdaf..9021deb 100644 --- a/src/ExtCmd.actor.cpp +++ b/src/ExtCmd.actor.cpp @@ -361,7 +361,6 @@ ACTOR static Future internal_doDropIndexesActor(Reference t ACTOR static Future Internal_doDropCollection(Reference tr, Reference query, Reference mm) { - query->ns.second = query->query.getField("drop").String(); state Reference unbound = wait(mm->getUnboundCollectionContext(tr, query->ns)); int _ = wait(internal_doDropIndexesActor(tr, query->ns, mm)); Void _ = wait(unbound->collectionDirectory->remove(tr->tr)); @@ -436,7 +435,6 @@ struct GetCountCmd { static Future> call(Reference ec, Reference query, Reference reply) { - query->ns.second = query->query.getField("count").String(); return getStreamCount(ec, query, reply); } }; @@ -552,7 +550,6 @@ struct FindAndModifyCmd { static Future> call(Reference ec, Reference query, Reference reply) { - query->ns.second = query->query.getField("findandmodify").String(); return doFindAndModify(ec, query, reply); } }; @@ -659,7 +656,6 @@ struct DropIndexesCmd { static Future> call(Reference nmc, Reference query, Reference reply) { - query->ns.second = query->query.getField("dropIndexes").String(); return doDropIndexesActor(nmc, query, reply); } }; @@ -671,7 +667,6 @@ struct DeleteIndexesCmd { static Future> call(Reference nmc, Reference query, Reference reply) { - query->ns.second = query->query.getField("deleteIndexes").String(); return doDropIndexesActor(nmc, query, reply); } }; @@ -700,7 +695,6 @@ struct CreateIndexesCmd { static Future> call(Reference ec, Reference query, Reference reply) { - query->ns.second = query->query.getStringField("createIndexes"); return doCreateIndexes(ec, query, reply); } }; @@ -807,7 +801,6 @@ struct CollectionStatsCmd { static Future> call(Reference ec, Reference query, Reference reply) { - query->ns.second = query->query.getField("collstats").String(); return getCollectionStats(ec, query, reply); } }; @@ -846,7 +839,6 @@ struct CreateCollectionCmd { static Future> call(Reference ec, Reference query, Reference reply) { - query->ns.second = query->query.getField("create").String(); return doCreateCollection(ec, query, reply); } }; @@ -1058,7 +1050,6 @@ struct InsertCmd { static Future> call(Reference nmc, Reference query, Reference reply) { - query->ns.second = query->query.getField("insert").String(); return insertAndReply(nmc, query, reply); } }; @@ -1101,7 +1092,6 @@ struct DeleteCmd { static Future> call(Reference nmc, Reference query, Reference reply) { - query->ns.second = query->query.getField("delete").String(); return deleteAndReply(nmc, query, reply); } }; @@ -1154,7 +1144,6 @@ struct UpdateCmd { static Future> call(Reference nmc, Reference query, Reference reply) { - query->ns.second = query->query.getField("update").String(); return updateAndReply(nmc, query, reply); } }; @@ -1287,8 +1276,6 @@ struct ListIndexesCmd { state Reference dtr = ec->getOperationTransaction(); loop { try { - msg->ns.second = msg->query.getStringField("listIndexes"); - Reference unbound = wait(ec->mm->indexesCollection(dtr, msg->ns.first)); auto getIndexesPlan = getIndexesForCollectionPlan(unbound, msg->ns); @@ -1390,7 +1377,6 @@ struct GetDistinctCmd { static Future> call(Reference ec, Reference query, Reference reply) { - query->ns.second = query->query.getField("distinct").String(); return getStreamDistinct(ec, query, reply); } }; diff --git a/src/ExtMsg.actor.cpp b/src/ExtMsg.actor.cpp index f3cc2ef..8fb9ee5 100644 --- a/src/ExtMsg.actor.cpp +++ b/src/ExtMsg.actor.cpp @@ -240,8 +240,15 @@ ACTOR Future runCommand(Reference nmc, Reference query, PromiseStream> replyStream) { state Reference errReply(new ExtMsgReply(query->header)); - state std::string cmd = getFirstKey(query->query); + + // For OP_QUERY commands, first elements field name is the command name. And the value contains + // the collection name if the command is at collection level. + auto firstElement = query->query.begin().next(); + state std::string cmd = firstElement.fieldName(); std::transform(cmd.begin(), cmd.end(), cmd.begin(), ::tolower); + if (firstElement.isString()) { + query->ns.second = firstElement.String(); + } try { Reference reply = wait(ExtCmd::call(cmd, nmc, query, errReply)); diff --git a/test/correctness/unit/find_and_modify_tests.py b/test/correctness/unit/find_and_modify_tests.py new file mode 100644 index 0000000..4519549 --- /dev/null +++ b/test/correctness/unit/find_and_modify_tests.py @@ -0,0 +1,29 @@ +def test_simple_remove(collection): + collection.insert({'A': 'Hello', 'B': 'World'}) + collection.insert({'A': 'Hello', 'B': 'California'}) + collection.find_and_modify({'A': 'Hello'}, remove=True) + return collection.count() == 1 + + +def test_simple_update(collection): + collection.insert({'A': 'Hello', 'B': 'World'}) + collection.insert({'A': 'Hello', 'B': 'California'}) + + collection.find_and_modify({'A': 'Hello'}, remove=True) + if collection.count() != 1: + return False + + collection.find_and_modify({'A': 'Hello'}, update={'A': 'Bye'}) + return collection.count({'A': 'Hello'}) == 0 + + +tests = [locals()[attr] for attr in dir() if attr.startswith('test_')] + + +def test_all(collection1, collection2): + print "findAndModify tests only use first collection specified" + okay = True + for t in tests: + collection1.remove() + okay = t(collection1) and okay + return okay