implemented xml type for new event system

This commit is contained in:
Kevin Jahns
2017-10-19 17:36:28 +02:00
parent 1311c7a0d8
commit 755c9eb16e
38 changed files with 1272 additions and 322 deletions

View File

@@ -3,25 +3,26 @@ import ID from '../Util/ID.js'
class DSNode {
constructor (id, len, gc) {
this.id = id
this._id = id
this.len = len
this.gc = gc
}
clone () {
return new DSNode(this.id, this.len, this.gc)
return new DSNode(this._id, this.len, this.gc)
}
}
export default class DeleteStore extends Tree {
isDeleted (id) {
var n = this.ds.findWithUpperBound(id)
return n != null && n.id[0] === id[0] && id[1] < n.id[1] + n.len
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.length <= strID.clock) {
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
}
@@ -37,22 +38,22 @@ export default class DeleteStore extends Tree {
throw new Error('length must be defined')
}
var n = this.findWithUpperBound(id)
if (n != null && n.id.user === id.user) {
if (n.id.clock <= id.clock && id.clock <= n.id.clock + n.len) {
if (n != null && n._id.user === id.user) {
if (n._id.clock <= id.clock && id.clock <= n._id.clock + n.len) {
// id is in n's range
var diff = id.clock + length - (n.id.clock + n.len) // overlapping right
var diff = id.clock + length - (n._id.clock + n.len) // overlapping right
if (diff > 0) {
// id+length overlaps n
if (!n.gc) {
n.len += diff
} else {
diff = n.id.clock + n.len - id.clock // overlapping left (id till n.end)
diff = n._id.clock + n.len - id.clock // overlapping left (id till n.end)
if (diff < length) {
// a partial deletion
let nId = id.clone()
nId.clock += diff
n = new DSNode(nId, length - diff, false)
this.ds.put(n)
this.put(n)
} else {
// already gc'd
throw new Error(
@@ -67,21 +68,21 @@ export default class DeleteStore extends Tree {
} else {
// cannot extend left (there is no left!)
n = new DSNode(id, length, false)
this.ds.put(n) // TODO: you double-put !!
this.put(n) // TODO: you double-put !!
}
} else {
// cannot extend left
n = new DSNode(id, length, false)
this.ds.put(n)
this.put(n)
}
// can extend right?
var next = this.ds.findNext(n.id)
var next = this.findNext(n._id)
if (
next != null &&
n.id.user === next.id.user &&
n.id.clock + n.len >= next.id.clock
n._id.user === next._id.user &&
n._id.clock + n.len >= next._id.clock
) {
diff = n.id.clock + n.len - next.id.clock // from next.start to n.end
diff = n._id.clock + n.len - next._id.clock // from next.start to n.end
while (diff >= 0) {
// n overlaps with next
if (next.gc) {
@@ -92,7 +93,7 @@ export default class DeleteStore extends Tree {
diff = diff - next.len // missing range after next
if (diff > 0) {
this.put(n) // unneccessary? TODO!
this.markDeleted(new ID(next.id.user, next.id.clock + next.len), diff)
this.markDeleted(new ID(next._id.user, next._id.clock + next.len), diff)
}
}
break
@@ -101,19 +102,19 @@ export default class DeleteStore extends Tree {
if (diff > next.len) {
// n is even longer than next
// get next.next, and try to extend it
var _next = this.findNext(next.id)
this.delete(next.id)
if (_next == null || n.id.user !== _next.id.user) {
var _next = this.findNext(next._id)
this.delete(next._id)
if (_next == null || n._id.user !== _next._id.user) {
break
} else {
next = _next
diff = n.id.clock + n.len - next.id.clock // from next.start to n.end
diff = n._id.clock + n.len - next._id.clock // from next.start to n.end
// continue!
}
} else {
// n just partially overlaps with next. extend n, delete next, and break this loop
n.len += next.len - diff
this.delete(next.id)
this.delete(next._id)
break
}
}