git ssb

0+

wanderer🌟 / js-dfinity-radix-tree



Commit 505be22b05bfc9c59a2685b0a10ee5b56e122957

fix intial insertion bug

Signed-off-by: wanderer <mjbecze@gmail.com>
wanderer committed on 8/7/2017, 7:59:37 PM
Parent: 1d810cea4ca68ef589435c4e4c4d1a1f98a071f7

Files changed

index.jschanged
tests/index.jschanged
index.jsView
@@ -129,37 +129,41 @@
129129 if (value.length > 32) {
130130 value = {'/': value}
131131 }
132132
133- const result = await this._get(key)
134- let root = result.root
135-
136- if (result.value) {
137- setValue(root, value)
133 + if (isEmpty(this.root)) {
134 + this.root['/'] = createNode(key, [], value)['/']
138135 } else {
139- if (result.extensionIndex !== undefined) {
140- // split the extension node in two
141- let extension = getExtension(root)
142- const extensionKey = extension[result.extensionIndex]
143- const remExtension = extension.subarray(result.extensionIndex + 1)
144- extension = extension.subarray(0, result.extensionIndex)
136 + const result = await this._get(key)
137 + let root = result.root
145138
146- setExtension(root, remExtension)
147- const branch = []
148- branch[extensionKey] = {'/': root['/']}
149- root['/'] = createNode(extension, branch)['/']
150- }
139 + if (result.value) {
140 + setValue(root, value)
141 + } else {
142 + if (result.extensionIndex !== undefined) {
143 + // split the extension node in two
144 + let extension = getExtension(root)
145 + const extensionKey = extension[result.extensionIndex]
146 + const remExtension = extension.subarray(result.extensionIndex + 1)
147 + extension = extension.subarray(0, result.extensionIndex)
151148
152- // if there are remaning key segments create an extension node
153- if (result.index < key.length) {
154- const keySegment = key[result.index]
155- const extension = key.subarray(result.index + 1, key.length)
156- const newNode = createNode(extension, [], value)
157- const rootBranch = getBranch(root)
158- rootBranch[keySegment] = newNode
159- setBranch(root, rootBranch)
160- } else {
161- setValue(root, value)
149 + setExtension(root, remExtension)
150 + const branch = []
151 + branch[extensionKey] = {'/': root['/']}
152 + root['/'] = createNode(extension, branch)['/']
153 + }
154 +
155 + // if there are remaning key segments create an extension node
156 + if (result.index < key.length) {
157 + const keySegment = key[result.index]
158 + const extension = key.subarray(result.index + 1, key.length)
159 + const newNode = createNode(extension, [], value)
160 + const rootBranch = getBranch(root)
161 + rootBranch[keySegment] = newNode
162 + setBranch(root, rootBranch)
163 + } else {
164 + setValue(root, value)
165 + }
162166 }
163167 }
164168 }
165169
@@ -302,4 +306,9 @@
302306 if (val !== undefined) {
303307 node['/'][VALUE] = val
304308 }
305309 }
310 +
311 +function isEmpty (node) {
312 + const branch = getBranch(node)
313 + return node['/'].length === 2 && branch[0] === undefined && branch[1] === undefined
314 +}
tests/index.jsView
@@ -63,8 +63,9 @@
6363 await tree.set(key0, 'cat')
6464 let key1 = new RadixTree.ArrayConstructor([0, 1])
6565 await tree.set(key1, 'cat2')
6666
67 + // console.log(JSON.stringify(tree.root, null, 2))
6768 let key2 = new RadixTree.ArrayConstructor([1, 0])
6869 await tree.set(key2, 'cat')
6970 let key3 = new RadixTree.ArrayConstructor([0, 0])
7071 await tree.set(key3, 'cat3')
@@ -76,9 +77,8 @@
7677 val = await tree.get(key2)
7778 t.equals(val, 'cat')
7879 val = await tree.get(key3)
7980 t.equals(val, 'cat3')
80- // console.log(JSON.stringify(tree.root, null, 2))
8181
8282 t.end()
8383 })
8484

Built with git-ssb-web