本文整理汇总了C++中UnsetNode类的典型用法代码示例。如果您正苦于以下问题:C++ UnsetNode类的具体用法?C++ UnsetNode怎么用?C++ UnsetNode使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了UnsetNode类的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: TEST_F
TEST_F(UnsetNodeTest, ApplyCannotRemoveRequiredPartOfDBRef) {
auto update = fromjson("{$unset: {'a.$id': true}}");
boost::intrusive_ptr<ExpressionContextForTest> expCtx(new ExpressionContextForTest());
UnsetNode node;
ASSERT_OK(node.init(update["$unset"]["a.$id"], expCtx));
mutablebson::Document doc(fromjson("{a: {$ref: 'c', $id: 0}}"));
setPathTaken("a.$id");
ASSERT_THROWS_CODE_AND_WHAT(node.apply(getApplyParams(doc.root()["a"]["$id"])),
AssertionException,
ErrorCodes::InvalidDBRef,
"The DBRef $ref field must be followed by a $id field");
}
开发者ID:EvgeniyPatlan,项目名称:percona-server-mongodb,代码行数:13,代码来源:unset_node_test.cpp
示例2: TEST_F
TEST_F(UnsetNodeTest, ApplyCannotRemoveRequiredPartOfDBRef) {
auto update = fromjson("{$unset: {'a.$id': true}}");
const CollatorInterface* collator = nullptr;
UnsetNode node;
ASSERT_OK(node.init(update["$unset"]["a.$id"], collator));
mutablebson::Document doc(fromjson("{a: {$ref: 'c', $id: 0}}"));
setPathTaken("a.$id");
ASSERT_THROWS_CODE_AND_WHAT(node.apply(getApplyParams(doc.root()["a"]["$id"])),
AssertionException,
ErrorCodes::InvalidDBRef,
"The DBRef $ref field must be followed by a $id field");
}
开发者ID:mpobrien,项目名称:mongo,代码行数:13,代码来源:unset_node_test.cpp
示例3: toFieldRef
UpdateNode::ApplyResult RenameNode::apply(ApplyParams applyParams) const {
// It would make sense to store fromFieldRef and toFieldRef as members during
// RenameNode::init(), but FieldRef is not copyable.
auto fromFieldRef = std::make_shared<FieldRef>(_val.fieldName());
FieldRef toFieldRef(_val.valueStringData());
mutablebson::Document& document = applyParams.element.getDocument();
size_t fromIdxFound;
mutablebson::Element fromElement(document.end());
auto status =
pathsupport::findLongestPrefix(*fromFieldRef, document.root(), &fromIdxFound, &fromElement);
if (!status.isOK() || !fromElement.ok() || fromIdxFound != (fromFieldRef->numParts() - 1)) {
// We could safely remove this restriction (thereby treating a rename with a non-viable
// source path as a no-op), but most updates fail on an attempt to update a non-viable path,
// so we throw an error for consistency.
if (status == ErrorCodes::PathNotViable) {
uassertStatusOK(status);
MONGO_UNREACHABLE; // The previous uassertStatusOK should always throw.
}
// The element we want to rename does not exist. When that happens, we treat the operation
// as a no-op. The attempted from/to paths are still considered modified.
if (applyParams.modifiedPaths) {
applyParams.modifiedPaths->keepShortest(*fromFieldRef);
applyParams.modifiedPaths->keepShortest(toFieldRef);
}
return ApplyResult::noopResult();
}
// Renaming through an array is prohibited. Check that our source path does not contain an
// array. (The element being renamed may be an array, however.)
for (auto currentElement = fromElement.parent(); currentElement != document.root();
currentElement = currentElement.parent()) {
invariant(currentElement.ok());
if (BSONType::Array == currentElement.getType()) {
auto idElem = mutablebson::findFirstChildNamed(document.root(), "_id");
uasserted(ErrorCodes::BadValue,
str::stream() << "The source field cannot be an array element, '"
<< fromFieldRef->dottedField()
<< "' in doc with "
<< (idElem.ok() ? idElem.toString() : "no id")
<< " has an array field called '"
<< currentElement.getFieldName()
<< "'");
}
}
// Check that our destination path does not contain an array. (If the rename will overwrite an
// existing element, that element may be an array. Iff pathToCreate is empty, "element"
// represents an element that we are going to overwrite.)
for (auto currentElement = applyParams.pathToCreate->empty() ? applyParams.element.parent()
: applyParams.element;
currentElement != document.root();
currentElement = currentElement.parent()) {
invariant(currentElement.ok());
if (BSONType::Array == currentElement.getType()) {
auto idElem = mutablebson::findFirstChildNamed(document.root(), "_id");
uasserted(ErrorCodes::BadValue,
str::stream() << "The destination field cannot be an array element, '"
<< toFieldRef.dottedField()
<< "' in doc with "
<< (idElem.ok() ? idElem.toString() : "no id")
<< " has an array field called '"
<< currentElement.getFieldName()
<< "'");
}
}
// Once we've determined that the rename is valid and found the source element, the actual work
// gets broken out into a $set operation and an $unset operation. Note that, generally, we
// should call the init() method of a ModifierNode before calling its apply() method, but the
// init() methods of SetElementNode and UnsetNode don't do anything, so we can skip them.
SetElementNode setElement(fromElement);
auto setElementApplyResult = setElement.apply(applyParams);
ApplyParams unsetParams(applyParams);
unsetParams.element = fromElement;
unsetParams.pathToCreate = std::make_shared<FieldRef>();
unsetParams.pathTaken = fromFieldRef;
UnsetNode unsetElement;
auto unsetElementApplyResult = unsetElement.apply(unsetParams);
// Determine the final result based on the results of the $set and $unset.
ApplyResult applyResult;
applyResult.indexesAffected =
setElementApplyResult.indexesAffected || unsetElementApplyResult.indexesAffected;
// The $unset would only be a no-op if the source element did not exist, in which case we would
// have exited early with a no-op result.
invariant(!unsetElementApplyResult.noop);
return applyResult;
}
开发者ID:EvgeniyPatlan,项目名称:percona-server-mongodb,代码行数:96,代码来源:rename_node.cpp
示例4: DEATH_TEST
using namespace mongo;
using mongo::mutablebson::Document;
using mongo::mutablebson::Element;
using mongo::mutablebson::countChildren;
DEATH_TEST(UnsetNodeTest, InitFailsForEmptyElement, "Invariant failure modExpr.ok()") {
auto update = fromjson("{$unset: {}}");
const CollatorInterface* collator = nullptr;
UnsetNode node;
node.init(update["$unset"].embeddedObject().firstElement(), collator).transitional_ignore();
}
DEATH_TEST(UnsetNodeTest, ApplyToRootFails, "Invariant failure parent.ok()") {
auto update = fromjson("{$unset: {}}");
const CollatorInterface* collator = nullptr;
UnsetNode node;
ASSERT_OK(node.init(update["$unset"], collator));
Document doc(fromjson("{a: 5}"));
FieldRef pathToCreate("");
FieldRef pathTaken("");
StringData matchedField;
auto fromReplication = false;
auto validateForStorage = true;
FieldRefSet immutablePaths;
const UpdateIndexData* indexData = nullptr;
LogBuilder* logBuilder = nullptr;
auto indexesAffected = false;
auto noop = false;
node.apply(doc.root(),
&pathToCreate,
开发者ID:vnvizitiu,项目名称:mongo,代码行数:31,代码来源:unset_node_test.cpp
注:本文中的UnsetNode类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论