fix some tests, implement event classes for types, and re-implement logging
This commit is contained in:
parent
c92f987496
commit
142a5ada60
24
src/Transaction.js
Normal file
24
src/Transaction.js
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
|
||||||
|
export default class Transaction {
|
||||||
|
constructor (y) {
|
||||||
|
this.y = y
|
||||||
|
// types added during transaction
|
||||||
|
this.newTypes = new Set()
|
||||||
|
// changed types (does not include new types)
|
||||||
|
// maps from type to parentSubs (item.parentSub = null for array elements)
|
||||||
|
this.changedTypes = new Map()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function transactionTypeChanged (y, type, sub) {
|
||||||
|
if (type !== y && !type._deleted) {
|
||||||
|
const changedTypes = y._transaction.changedTypes
|
||||||
|
let subs = changedTypes.get(type)
|
||||||
|
if (subs === undefined) {
|
||||||
|
// create if it doesn't exist yet
|
||||||
|
subs = new Set()
|
||||||
|
changedTypes.set(type, subs)
|
||||||
|
}
|
||||||
|
subs.add(sub)
|
||||||
|
}
|
||||||
|
}
|
16
src/Type/y-xml/YXmlEvent.js
Normal file
16
src/Type/y-xml/YXmlEvent.js
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
|
||||||
|
export default class YXmlEvent {
|
||||||
|
constructor (target, subs, remote) {
|
||||||
|
this.target = target
|
||||||
|
this.childListChanged = false
|
||||||
|
this.attributesChanged = new Set()
|
||||||
|
this.remote = remote
|
||||||
|
subs.forEach((sub) => {
|
||||||
|
if (sub === null) {
|
||||||
|
this.childListChanged = true
|
||||||
|
} else {
|
||||||
|
this.attributesChanged.add(sub)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
57
src/Util/defragmentItemContent.js
Normal file
57
src/Util/defragmentItemContent.js
Normal file
@ -0,0 +1,57 @@
|
|||||||
|
|
||||||
|
import ID from '../Util/ID.js'
|
||||||
|
import ItemJSON from '../Struct/ItemJSON.js'
|
||||||
|
import ItemString from '../Struct/ItemString.js'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Try to merge all items in os with their successors.
|
||||||
|
*
|
||||||
|
* Some transformations (like delete) fragment items.
|
||||||
|
* Item(c: 'ab') + Delete(1,1) + Delete(0, 1) -> Item(c: 'a',deleted);Item(c: 'b',deleted)
|
||||||
|
*
|
||||||
|
* This functions merges the fragmented nodes together:
|
||||||
|
* Item(c: 'a',deleted);Item(c: 'b',deleted) -> Item(c: 'ab', deleted)
|
||||||
|
*
|
||||||
|
* TODO: The Tree implementation does not support deletions in-spot.
|
||||||
|
* This is why all deletions must be performed after the traversal.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
export function defragmentItemContent (y) {
|
||||||
|
const os = y.os
|
||||||
|
if (os.length < 2) {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
let deletes = []
|
||||||
|
let node = os.findSmallestNode()
|
||||||
|
let next = node.next()
|
||||||
|
while (next !== null) {
|
||||||
|
let a = node.val
|
||||||
|
let b = next.val
|
||||||
|
if (
|
||||||
|
(a instanceof ItemJSON || a instanceof ItemString) &&
|
||||||
|
a.constructor === b.constructor &&
|
||||||
|
a._deleted === b._deleted &&
|
||||||
|
a._right === b &&
|
||||||
|
(new ID(a._id.user, a._id.clock + a._length)).equals(b._id)
|
||||||
|
) {
|
||||||
|
a._right = b._right
|
||||||
|
if (a instanceof ItemJSON) {
|
||||||
|
a._content = a._content.concat(b._content)
|
||||||
|
} else if (a instanceof ItemString) {
|
||||||
|
a._content += b._content
|
||||||
|
}
|
||||||
|
// delete b later
|
||||||
|
deletes.push(b._id)
|
||||||
|
// do not iterate node!
|
||||||
|
// !(node = next)
|
||||||
|
} else {
|
||||||
|
// not able to merge node, get next node
|
||||||
|
node = next
|
||||||
|
}
|
||||||
|
// update next
|
||||||
|
next = next.next()
|
||||||
|
}
|
||||||
|
for (let i = deletes.length - 1; i >= 0; i--) {
|
||||||
|
os.delete(deletes[i])
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user