git ssb

0+

wanderer🌟 / js-dfinity-radix-tree



Commit 5368b260f7cabad0bf9d35cd4525524ae4bf8efe

cleanup

wanderer committed on 8/4/2017, 8:06:42 PM
Parent: 9aeb50b928d404dec97a93aa0c1143d8e3ddd114

Files changed

index.jschanged
index.jsView
@@ -31,85 +31,64 @@
3131
3232 async _get (key) {
3333 let index = 0
3434 let root = this.root
35- let extensionIndex = 0
3635 while (key.length > index) {
37- extensionIndex = 0
38- let nextRoot
39-
4036 if (root['/'].extension) {
37 + let extensionIndex = 0
4138 const extension = this.toTypedArray(root['/'].extension)
4239 let subKey
43- let subKeyLen
40 + // alll extension are padded to 8 bit alignment. So we need to update
41 + // the index later to count for the added padding
42 + let padLen
4443 if (this.radix === 2) {
4544 subKey = key.slice(index, index + extension.length)
46- subKeyLen = subKey.length
45 + padLen = subKey.length
4746 subKey = new this.ArrayConstructor(subKey.buffer)
48- subKeyLen = subKey.length - subKeyLen
47 + padLen = subKey.length - padLen
4948 } else {
5049 subKey = key.subarray(index, extension.length)
5150 }
51 + // checks the extension against the key
5252 while (extensionIndex < extension.length && extension[extensionIndex] === subKey[extensionIndex]) {
5353 extensionIndex++
5454 }
55- index += extensionIndex - subKeyLen
55 + index += extensionIndex - padLen
56 + // check if we compelete travered the extension
5657 if (extensionIndex !== extension.length) {
5758 return {
5859 extensionIndex: extensionIndex,
5960 root: root,
6061 index: index
6162 }
6263 }
64 + }
6365
64- let keySegment = key[index]
65- if (Array.isArray(root['/'].node) && keySegment) {
66- await this.graph.get(root['/'].node, keySegment)
67- nextRoot = root['/'].node[keySegment]
68- if (!nextRoot) {
69- return {
70- root: root,
71- index: index
72- }
73- }
74- root = nextRoot
75- }
76- } else {
77- let keySegment = key[index]
78- await this.graph.get(root, keySegment)
79- nextRoot = root['/'][keySegment]
80- if (!nextRoot) {
81- return {
82- root: root,
83- index: index
84- }
85- }
86- root = nextRoot
66 + let keySegment = key[index]
67 + if (keySegment) {
68 + const branch = getBranch(root)
69 + await this.graph.get(branch, keySegment)
70 + root = branch[keySegment]
8771 }
8872
8973 index++
9074 }
75 +
76 + const node = getBranch(root)
77 + // get the value
9178 let value
92- if (root['/'].extension) {
93- if (Array.isArray(root['/'].node)) {
94- value = root['/'].node[root['/'].node.length - 1]
95- } else {
96- value = root['/'].node
97- }
79 + if (Array.isArray(node)) {
80 + value = node[node.length - 1]
9881 } else {
99- if (Array.isArray(root['/'])) {
100- value = root['/'][root.length - 1]
101- } else {
102- value = root['/']
103- }
82 + value = node
10483 }
84 +
10585 if (value.length >= 32) {
10686 value = await this.graph.get(root, root.length - 1)
10787 }
10888
10989 return {
11090 value: value,
111- extensionIndex: extensionIndex,
11291 root: root,
11392 index: index
11493 }
11594 }
@@ -136,41 +115,34 @@
136115 let root = result.root
137116 let keySegment = key[result.index]
138117
139118 if (result.extensionIndex !== undefined) {
119 + // split the extension node in two
140120 let extension = this.toTypedArray(root['/'].extension)
141- // save the common part of the extension
142121 const extensionKey = extension[result.extensionIndex + 1]
143122 const remExtension = extension.subarray(1 - result.extensionIndex)
144123 extension = extension.subarray(0, result.extensionIndex)
124 +
145125 const node = root['/'].node
146-
126 + let newNode
127 + // create the new extension node
147128 if (extension.length) {
148129 root['/'].extension = new Buffer(extension.buffer)
149- root['/'].node = []
150- if (remExtension.length) {
151- root['/'].node[extensionKey] = {
152- '/': {
153- extension: new Buffer(remExtension.buffer),
154- node: node
155- }
130 + newNode = root['/'].node = []
131 + } else {
132 + newNode = root['/'] = []
133 + }
134 +
135 + // save the remainer of the extension node
136 + if (remExtension.length) {
137 + newNode[extensionKey] = {
138 + '/': {
139 + extension: new Buffer(remExtension.buffer),
140 + node: node
156141 }
157- } else {
158- root['/'].node[extensionKey] = node
159142 }
160143 } else {
161- // there is no extension
162- root['/'] = []
163- if (remExtension.length) {
164- root['/'][extensionKey] = {
165- '/': {
166- extension: remExtension,
167- node: node
168- }
169- }
170- } else {
171- root['/'][extensionKey] = node
172- }
144 + newNode[extensionKey] = node
173145 }
174146 }
175147
176148 let newNode
@@ -186,71 +158,61 @@
186158 } else {
187159 newNode = value
188160 }
189161
190- if (root['/'].extension) {
191- if (!Array.isArray(root['/'].node)) {
192- const val = root['/'].node
193- root['/'].node = []
194- root['/'].node[this.radix] = val
195- }
196- if (keySegment === undefined) {
197- root['/'].node[this.radix] = newNode
198- } else {
199- root['/'].node[keySegment] = newNode
200- }
162 + let targetNode = getBranch(root)
163 +
164 + // set the value
165 + if (keySegment === undefined) {
166 + targetNode[this.radix] = newNode
201167 } else {
202- if (keySegment === undefined) {
203- root['/'][this.radix] = newNode
204- } else {
205- root['/'][keySegment] = newNode
206- }
168 + targetNode[keySegment] = newNode
207169 }
208170 }
209171
210- async delete (key) {
211- key = new this.ArrayConstructor(key)
212- const results = await this._get(key)
213- const root = results.root
214- if (results.value) {
215- if (results.extensionIndex) {
216- key = key.subarray(-results.extensionIndex)
217- }
218- const keySegment = key[key.length - 1]
219- delete root[keySegment]
220- if (this.isEmptyNode(root) && results.parent) {
221- delete results.parent[results.parentKey]
222- } else if (!root[root.length - 1]) {
223- let oneNode = false
224- let rNodeIndex
225- for (let i = 0; i < root.length - 1; i++) {
226- const el = root[i]
227- if (el) {
228- if (!oneNode) {
229- rNodeIndex = i
230- oneNode = true
231- } else {
232- oneNode = false
233- break
234- }
235- }
236- }
172 + // async delete (key) {
173 + // key = new this.ArrayConstructor(key)
174 + // const results = await this._get(key)
175 + // const root = results.root
176 + // if (results.value) {
177 + // if (results.extensionIndex) {
178 + // key = key.subarray(-results.extensionIndex)
179 + // }
180 + // const keySegment = key[key.length - 1]
181 + // delete root[keySegment]
182 + // if (this.isEmptyNode(root) && results.parent) {
183 + // delete results.parent[results.parentKey]
184 + // } else if (!root[root.length - 1]) {
185 + // let oneNode = false
186 + // let rNodeIndex
187 + // for (let i = 0; i < root.length - 1; i++) {
188 + // const el = root[i]
189 + // if (el) {
190 + // if (!oneNode) {
191 + // rNodeIndex = i
192 + // oneNode = true
193 + // } else {
194 + // oneNode = false
195 + // break
196 + // }
197 + // }
198 + // }
237199
238- if (oneNode) {
239- let extension = root[rNodeIndex].extension || []
240- extension = concat([rNodeIndex], extension)
241- const parentExtenstion = results.parent[results.parentIndex].extension
242- if (parentExtenstion) {
243- extension = concat(parentExtenstion, extension)
244- }
245- results.parent[results.parentIndex] = {
246- extension: extension,
247- root: root
248- }
249- }
250- }
251- }
252- }
200 + // if (oneNode) {
201 + // let extension = root[rNodeIndex].extension || []
202 + // extension = concat([rNodeIndex], extension)
203 + // const parentExtenstion = results.parent[results.parentIndex].extension
204 + // if (parentExtenstion) {
205 + // extension = concat(parentExtenstion, extension)
206 + // }
207 + // results.parent[results.parentIndex] = {
208 + // extension: extension,
209 + // root: root
210 + // }
211 + // }
212 + // }
213 + // }
214 + // }
253215 isEmptyNode (node) {
254216 return node.evey(el => !el)
255217 }
256218 formatKey (key) {
@@ -260,8 +222,12 @@
260222 return new this.ArrayConstructor(key.buffer)
261223 }
262224 }
263225
264-function concat(a, b) {}
265-function readData (data) {
266- return new Uint8Array(data)
226 +function getBranch (node) {
227 + if (node['/'].extension) {
228 + return node['/'].node
229 + } else {
230 + return root['/']
231 + }
267232 }
233 +

Built with git-ssb-web