From 5cf8d20cf690c0818da30cd0a56b5bbd4e0f9f01 Mon Sep 17 00:00:00 2001 From: Kevin Jahns Date: Thu, 26 Oct 2017 20:53:17 +0200 Subject: [PATCH] delete child if parent is deleted --- src/Store/DeleteStore.js | 13 ------------- src/Struct/Delete.js | 11 ++++++++--- src/Struct/Item.js | 4 +++- src/Type/y-xml/YXmlElement.js | 4 +++- test/y-xml.tests.js | 16 ++++++++++++++++ tests-lib/helper.js | 3 ++- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/src/Store/DeleteStore.js b/src/Store/DeleteStore.js index 9256fecf..0ac64507 100644 --- a/src/Store/DeleteStore.js +++ b/src/Store/DeleteStore.js @@ -29,19 +29,6 @@ export default class DeleteStore extends Tree { var n = this.findWithUpperBound(id) return n !== null && n._id.user === id.user && id.clock < n._id.clock + n.len } - // TODO: put this in function (and all other methods) - applyMissingDeletesOnStruct (struct) { - const strID = struct._id - // find most right delete - let n = this.findWithUpperBound(new ID(strID.user, strID.clock + struct._length - 1)) - if (n === null || n._id.user !== strID.user || n._id.clock + n.len <= strID.clock) { - // struct is not deleted - return null - } - // TODO: - // * iterate to the right and apply new Delete's - throw new Error('Not implemented!') - } /* * Mark an operation as deleted. returns the deleted node */ diff --git a/src/Struct/Delete.js b/src/Struct/Delete.js index e750c04c..88a562b8 100644 --- a/src/Struct/Delete.js +++ b/src/Struct/Delete.js @@ -39,15 +39,20 @@ export function deleteItemRange (y, user, clock, range) { */ export default class Delete { constructor () { - this._targetID = null + this._target = null this._length = null } _fromBinary (y, decoder) { // TODO: set target, and add it to missing if not found // There is an edge case in p2p networks! - this._targetID = decoder.readID() + const targetID = decoder.readID() + this._targetID = targetID this._length = decoder.readVarUint() - return [] + if (y.os.getItem(targetID) === null) { + return [targetID] + } else { + return [] + } } _toBinary (encoder) { encoder.writeUint8(getReference(this.constructor)) diff --git a/src/Struct/Item.js b/src/Struct/Item.js index a430b5ef..ef6e41b4 100644 --- a/src/Struct/Item.js +++ b/src/Struct/Item.js @@ -196,6 +196,9 @@ export default class Item { right._left = this } } + if (parent._deleted) { + this._delete(y, false) + } y.os.put(this) transactionTypeChanged(y, parent, parentSub) if (this._id.user !== RootFakeUserID) { @@ -205,7 +208,6 @@ export default class Item { if (y.persistence !== null) { y.persistence.saveOperations(this) } - y.ds.applyMissingDeletesOnStruct(this) } } _toBinary (encoder) { diff --git a/src/Type/y-xml/YXmlElement.js b/src/Type/y-xml/YXmlElement.js index 7686063a..b0f7955c 100644 --- a/src/Type/y-xml/YXmlElement.js +++ b/src/Type/y-xml/YXmlElement.js @@ -80,7 +80,9 @@ export default class YXmlElement extends YXmlFragment { keys.push(key) } keys.sort() - for (let key in keys) { + const keysLen = keys.length + for (let i = 0; i < keysLen; i++) { + const key = keys[i] stringBuilder.push(key + '="' + attrs[key] + '"') } const nodeName = this.nodeName.toLocaleLowerCase() diff --git a/test/y-xml.tests.js b/test/y-xml.tests.js index a3d84472..7c838c55 100644 --- a/test/y-xml.tests.js +++ b/test/y-xml.tests.js @@ -352,3 +352,19 @@ test('y-xml: Random tests (46)', async function xmlRandom46 (t) { test('y-xml: Random tests (47)', async function xmlRandom47 (t) { await applyRandomTests(t, xmlTransactions, 47) }) + +test('y-xml: Random tests (100)', async function xmlRandom100 (t) { + await applyRandomTests(t, xmlTransactions, 100) +}) + +test('y-xml: Random tests (200)', async function xmlRandom200 (t) { + await applyRandomTests(t, xmlTransactions, 200) +}) + +test('y-xml: Random tests (500)', async function xmlRandom500 (t) { + await applyRandomTests(t, xmlTransactions, 500) +}) + +test('y-xml: Random tests (1000)', async function xmlRandom1000 (t) { + await applyRandomTests(t, xmlTransactions, 1000) +}) diff --git a/tests-lib/helper.js b/tests-lib/helper.js index e70a396f..cbef8ea5 100644 --- a/tests-lib/helper.js +++ b/tests-lib/helper.js @@ -106,7 +106,8 @@ export async function compareUsers (t, users) { left: op._left === null ? null : op._left._lastId, right: op._right === null ? null : op._right._id, length: op._length, - deleted: op._deleted + deleted: op._deleted, + parent: op._parent._id } if (op instanceof ItemJSON || op instanceof ItemString) { json.content = op._content