mirror of https://gitee.com/bigwinds/arangodb
allow for deleting array position in agency kv-store
This commit is contained in:
parent
c14daad63a
commit
414db971cf
|
@ -464,24 +464,55 @@ bool Node::handle<PUSH>(VPackSlice const& slice) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove element from any place in array by value array
|
/// Remove element from any place in array by value or position
|
||||||
template <>
|
template <> bool Node::handle<ERASE>(VPackSlice const& slice) {
|
||||||
bool Node::handle<ERASE>(VPackSlice const& slice) {
|
bool haveVal = slice.hasKey("val");
|
||||||
if (!slice.hasKey("val")) {
|
bool havePos = slice.hasKey("pos");
|
||||||
|
|
||||||
|
if (!haveVal && !havePos) {
|
||||||
LOG_TOPIC(WARN, Logger::AGENCY)
|
LOG_TOPIC(WARN, Logger::AGENCY)
|
||||||
<< "Operator erase without value to be erased: " << slice.toJson();
|
<< "Operator erase without value or position to be erased is illegal: "
|
||||||
|
<< slice.toJson();
|
||||||
return false;
|
return false;
|
||||||
|
} else if (haveVal && havePos) {
|
||||||
|
LOG_TOPIC(WARN, Logger::AGENCY)
|
||||||
|
<< "Operator erase with value and position to be erased is illegal: "
|
||||||
|
<< slice.toJson();
|
||||||
|
return false;
|
||||||
|
} else if (havePos &&
|
||||||
|
(!slice.get("pos").isUInt() && !slice.get("pos").isSmallInt())) {
|
||||||
|
LOG_TOPIC(WARN, Logger::AGENCY)
|
||||||
|
<< "Operator erase with non-positive integer position is illegal: "
|
||||||
|
<< slice.toJson();
|
||||||
}
|
}
|
||||||
|
|
||||||
Builder tmp;
|
Builder tmp;
|
||||||
{ VPackArrayBuilder t(&tmp);
|
{ VPackArrayBuilder t(&tmp);
|
||||||
|
|
||||||
if (this->slice().isArray()) {
|
if (this->slice().isArray()) {
|
||||||
for (auto const& old : VPackArrayIterator(this->slice())) {
|
if (haveVal) {
|
||||||
if (old != slice.get("val")) {
|
for (auto const& old : VPackArrayIterator(this->slice())) {
|
||||||
tmp.add(old);
|
if (old != slice.get("val")) {
|
||||||
|
tmp.add(old);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
size_t pos = slice.get("pos").getNumber<size_t>();
|
||||||
|
if (pos >= this->slice().length()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
size_t n = 0;
|
||||||
|
for (const auto& old : VPackArrayIterator(this->slice())) {
|
||||||
|
if (n != pos) {
|
||||||
|
tmp.add(old);
|
||||||
|
}
|
||||||
|
++n;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
*this = tmp.slice();
|
*this = tmp.slice();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
|
@ -605,7 +605,9 @@ function agencyTestSuite () {
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
testOpErase : function () {
|
testOpErase : function () {
|
||||||
|
|
||||||
writeAndCheck([[{"/version":{"op":"delete"}}]]);
|
writeAndCheck([[{"/version":{"op":"delete"}}]]);
|
||||||
|
|
||||||
writeAndCheck([[{"/a":[0,1,2,3,4,5,6,7,8,9]}]]); // none before
|
writeAndCheck([[{"/a":[0,1,2,3,4,5,6,7,8,9]}]]); // none before
|
||||||
assertEqual(readAndCheck([["/a"]]), [{a:[0,1,2,3,4,5,6,7,8,9]}]);
|
assertEqual(readAndCheck([["/a"]]), [{a:[0,1,2,3,4,5,6,7,8,9]}]);
|
||||||
writeAndCheck([[{"a":{"op":"erase","val":3}}]]);
|
writeAndCheck([[{"a":{"op":"erase","val":3}}]]);
|
||||||
|
@ -629,6 +631,28 @@ function agencyTestSuite () {
|
||||||
writeAndCheck([[{"a":{"op":"erase","val":6}}],
|
writeAndCheck([[{"a":{"op":"erase","val":6}}],
|
||||||
[{"a":{"op":"erase","val":8}}]]);
|
[{"a":{"op":"erase","val":8}}]]);
|
||||||
assertEqual(readAndCheck([["/a"]]), [{a:[]}]);
|
assertEqual(readAndCheck([["/a"]]), [{a:[]}]);
|
||||||
|
|
||||||
|
writeAndCheck([[{"/a":[0,1,2,3,4,5,6,7,8,9]}]]); // none before
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[0,1,2,3,4,5,6,7,8,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":3}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[0,1,2,4,5,6,7,8,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":0}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[1,2,4,5,6,7,8,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":0}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[2,4,5,6,7,8,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":2}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[2,4,6,7,8,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":4}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[2,4,6,7,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":2}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[2,4,7,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":2}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[2,4,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":0}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[4,9]}]);
|
||||||
|
writeAndCheck([[{"a":{"op":"erase","pos":1}}],
|
||||||
|
[{"a":{"op":"erase","pos":0}}]]);
|
||||||
|
assertEqual(readAndCheck([["/a"]]), [{a:[]}]);
|
||||||
},
|
},
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
Loading…
Reference in New Issue