Commit 5368b260f7cabad0bf9d35cd4525524ae4bf8efe
cleanup
wanderer committed on 8/4/2017, 8:06:42 PMParent: 9aeb50b928d404dec97a93aa0c1143d8e3ddd114
Files changed
index.js | changed |
index.js | |||
---|---|---|---|
@@ -31,85 +31,64 @@ | |||
31 | 31 … | ||
32 | 32 … | async _get (key) { | |
33 | 33 … | let index = 0 | |
34 | 34 … | let root = this.root | |
35 | - let extensionIndex = 0 | ||
36 | 35 … | while (key.length > index) { | |
37 | - extensionIndex = 0 | ||
38 | - let nextRoot | ||
39 | - | ||
40 | 36 … | if (root['/'].extension) { | |
37 … | + let extensionIndex = 0 | ||
41 | 38 … | const extension = this.toTypedArray(root['/'].extension) | |
42 | 39 … | 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 | ||
44 | 43 … | if (this.radix === 2) { | |
45 | 44 … | subKey = key.slice(index, index + extension.length) | |
46 | - subKeyLen = subKey.length | ||
45 … | + padLen = subKey.length | ||
47 | 46 … | subKey = new this.ArrayConstructor(subKey.buffer) | |
48 | - subKeyLen = subKey.length - subKeyLen | ||
47 … | + padLen = subKey.length - padLen | ||
49 | 48 … | } else { | |
50 | 49 … | subKey = key.subarray(index, extension.length) | |
51 | 50 … | } | |
51 … | + // checks the extension against the key | ||
52 | 52 … | while (extensionIndex < extension.length && extension[extensionIndex] === subKey[extensionIndex]) { | |
53 | 53 … | extensionIndex++ | |
54 | 54 … | } | |
55 | - index += extensionIndex - subKeyLen | ||
55 … | + index += extensionIndex - padLen | ||
56 … | + // check if we compelete travered the extension | ||
56 | 57 … | if (extensionIndex !== extension.length) { | |
57 | 58 … | return { | |
58 | 59 … | extensionIndex: extensionIndex, | |
59 | 60 … | root: root, | |
60 | 61 … | index: index | |
61 | 62 … | } | |
62 | 63 … | } | |
64 … | + } | ||
63 | 65 … | ||
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] | ||
87 | 71 … | } | |
88 | 72 … | ||
89 | 73 … | index++ | |
90 | 74 … | } | |
75 … | + | ||
76 … | + const node = getBranch(root) | ||
77 … | + // get the value | ||
91 | 78 … | 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] | ||
98 | 81 … | } else { | |
99 | - if (Array.isArray(root['/'])) { | ||
100 | - value = root['/'][root.length - 1] | ||
101 | - } else { | ||
102 | - value = root['/'] | ||
103 | - } | ||
82 … | + value = node | ||
104 | 83 … | } | |
84 … | + | ||
105 | 85 … | if (value.length >= 32) { | |
106 | 86 … | value = await this.graph.get(root, root.length - 1) | |
107 | 87 … | } | |
108 | 88 … | ||
109 | 89 … | return { | |
110 | 90 … | value: value, | |
111 | - extensionIndex: extensionIndex, | ||
112 | 91 … | root: root, | |
113 | 92 … | index: index | |
114 | 93 … | } | |
115 | 94 … | } | |
@@ -136,41 +115,34 @@ | |||
136 | 115 … | let root = result.root | |
137 | 116 … | let keySegment = key[result.index] | |
138 | 117 … | ||
139 | 118 … | if (result.extensionIndex !== undefined) { | |
119 … | + // split the extension node in two | ||
140 | 120 … | let extension = this.toTypedArray(root['/'].extension) | |
141 | - // save the common part of the extension | ||
142 | 121 … | const extensionKey = extension[result.extensionIndex + 1] | |
143 | 122 … | const remExtension = extension.subarray(1 - result.extensionIndex) | |
144 | 123 … | extension = extension.subarray(0, result.extensionIndex) | |
124 … | + | ||
145 | 125 … | const node = root['/'].node | |
146 | - | ||
126 … | + let newNode | ||
127 … | + // create the new extension node | ||
147 | 128 … | if (extension.length) { | |
148 | 129 … | 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 | ||
156 | 141 … | } | |
157 | - } else { | ||
158 | - root['/'].node[extensionKey] = node | ||
159 | 142 … | } | |
160 | 143 … | } 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 | ||
173 | 145 … | } | |
174 | 146 … | } | |
175 | 147 … | ||
176 | 148 … | let newNode | |
@@ -186,71 +158,61 @@ | |||
186 | 158 … | } else { | |
187 | 159 … | newNode = value | |
188 | 160 … | } | |
189 | 161 … | ||
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 | ||
201 | 167 … | } else { | |
202 | - if (keySegment === undefined) { | ||
203 | - root['/'][this.radix] = newNode | ||
204 | - } else { | ||
205 | - root['/'][keySegment] = newNode | ||
206 | - } | ||
168 … | + targetNode[keySegment] = newNode | ||
207 | 169 … | } | |
208 | 170 … | } | |
209 | 171 … | ||
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 … | + // } | ||
237 | 199 … | ||
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 … | + // } | ||
253 | 215 … | isEmptyNode (node) { | |
254 | 216 … | return node.evey(el => !el) | |
255 | 217 … | } | |
256 | 218 … | formatKey (key) { | |
@@ -260,8 +222,12 @@ | |||
260 | 222 … | return new this.ArrayConstructor(key.buffer) | |
261 | 223 … | } | |
262 | 224 … | } | |
263 | 225 … | ||
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 … | + } | ||
267 | 232 … | } | |
233 … | + |
Built with git-ssb-web