1
0
Fork 0

allow for deleting array position in agency kv-store

This commit is contained in:
Kaveh Vahedipour 2017-05-15 12:22:15 +02:00
parent c14daad63a
commit 414db971cf
2 changed files with 63 additions and 8 deletions

View File

@ -464,24 +464,55 @@ bool Node::handle<PUSH>(VPackSlice const& slice) {
return true;
}
/// Remove element from any place in array by value array
template <>
bool Node::handle<ERASE>(VPackSlice const& slice) {
if (!slice.hasKey("val")) {
/// Remove element from any place in array by value or position
template <> bool Node::handle<ERASE>(VPackSlice const& slice) {
bool haveVal = slice.hasKey("val");
bool havePos = slice.hasKey("pos");
if (!haveVal && !havePos) {
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;
} 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;
{ VPackArrayBuilder t(&tmp);
if (this->slice().isArray()) {
for (auto const& old : VPackArrayIterator(this->slice())) {
if (old != slice.get("val")) {
tmp.add(old);
if (haveVal) {
for (auto const& old : VPackArrayIterator(this->slice())) {
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();
return true;
}

View File

@ -605,7 +605,9 @@ function agencyTestSuite () {
////////////////////////////////////////////////////////////////////////////////
testOpErase : function () {
writeAndCheck([[{"/version":{"op":"delete"}}]]);
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","val":3}}]]);
@ -629,6 +631,28 @@ function agencyTestSuite () {
writeAndCheck([[{"a":{"op":"erase","val":6}}],
[{"a":{"op":"erase","val":8}}]]);
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:[]}]);
},
////////////////////////////////////////////////////////////////////////////////