Line | Branch | Exec | Source |
---|---|---|---|
1 | #include <core.h> | ||
2 | #include <interface.h> | ||
3 | |||
4 | #include <inline_core.h> | ||
5 | |||
6 | static char *msgKeyNotFound = "key not found"; | ||
7 | |||
8 | static napi_value | ||
9 | 4 | esEdge(napi_env env, napi_callback_info cbInfo, glibGtreeNodeGetterFunc getterFunc) { | |
10 | napi_value esThis; | ||
11 | 4 | size_t argc = 0; | |
12 | |||
13 |
1/6✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | NAPI_CALL(env, false, napi_get_cb_info(env, cbInfo, &argc, NULL, &esThis, NULL)); |
14 | |||
15 | BTree_t *btree; | ||
16 |
1/6✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | EXTRACT_BTREE(env, esThis, btree); |
17 | |||
18 | 4 | GTreeNode *node = getterFunc(btree->nativeTree); | |
19 | |||
20 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 2 times.
|
4 | if (node) { |
21 | 2 | return cloneInternalEsObject(env, getEsGTreeNode(node)->esKeyValue); | |
22 | } | ||
23 | else { | ||
24 | 2 | return getEsUndef(env); | |
25 | } | ||
26 | 4 | } | |
27 | |||
28 | napi_value | ||
29 | 2 | esFirst(napi_env env, napi_callback_info cbInfo) { | |
30 | 2 | return esEdge(env, cbInfo, g_tree_node_first); | |
31 | } | ||
32 | |||
33 | napi_value | ||
34 | 2 | esLast(napi_env env, napi_callback_info cbInfo) { | |
35 | 2 | return esEdge(env, cbInfo, g_tree_node_last); | |
36 | } | ||
37 | |||
38 | napi_value | ||
39 | 12 | esSearch(napi_env env, napi_callback_info cbInfo, glibGtreeNodeStepFunc stepFunc) { | |
40 | napi_value esThis, argv[2], searchKey, esSkipFirst; | ||
41 | 12 | size_t argc = 2; | |
42 | 12 | bool skipFirst = FALSE; | |
43 | |||
44 |
1/6✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
12 | NAPI_CALL(env, false, napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL)); |
45 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 12 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
12 | CHECK_ARGC(1, msgTooFewArguments); |
46 | |||
47 | 12 | searchKey = argv[0]; | |
48 | |||
49 |
2/2✓ Branch 0 taken 8 times.
✓ Branch 1 taken 4 times.
|
12 | if (argc > 1) { |
50 | 4 | esSkipFirst = argv[1]; | |
51 |
1/6✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | NAPI_CALL(env, false, |
52 | napi_coerce_to_bool(env, esSkipFirst, &esSkipFirst)); | ||
53 |
1/6✓ Branch 0 taken 4 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | NAPI_CALL(env, false, |
54 | napi_get_value_bool(env, esSkipFirst, &skipFirst)); | ||
55 | 4 | } | |
56 | |||
57 | BTree_t *btree; | ||
58 |
1/6✓ Branch 0 taken 12 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
12 | EXTRACT_BTREE(env, esThis, btree); |
59 | |||
60 | BTree_t *newBtree; | ||
61 | 12 | napi_value newEsTree = cloneBtreeWrapper(env, esThis, &newBtree); | |
62 | |||
63 | 12 | GTreeNode *current = btreeLookup(env, btree, searchKey); | |
64 | |||
65 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 2 times.
|
12 | if (!current) { |
66 |
1/6✓ Branch 0 taken 2 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
2 | NAPI_CALL(env, false, |
67 | napi_throw_error(env, NULL, msgKeyNotFound)); | ||
68 | |||
69 | 2 | return NULL; | |
70 | } | ||
71 | |||
72 |
2/2✓ Branch 0 taken 6 times.
✓ Branch 1 taken 4 times.
|
10 | if (skipFirst) { |
73 | 4 | current = stepFunc(current); | |
74 | 4 | } | |
75 | |||
76 | BTreeNode newNode; | ||
77 | |||
78 |
2/2✓ Branch 0 taken 23 times.
✓ Branch 1 taken 10 times.
|
33 | while (current) { |
79 | 23 | newNode = cloneBTreeNode(env, newBtree, current); | |
80 | |||
81 | 23 | g_tree_replace(newBtree->nativeTree, newNode, newNode); | |
82 | |||
83 | 23 | current = stepFunc(current); | |
84 | } | ||
85 | |||
86 | 10 | return newEsTree; | |
87 | 12 | } | |
88 | |||
89 | napi_value | ||
90 | 6 | esBefore(napi_env env, napi_callback_info cbInfo) { | |
91 | 6 | return esSearch(env, cbInfo, g_tree_node_previous); | |
92 | } | ||
93 | |||
94 | napi_value | ||
95 | 6 | esAfter(napi_env env, napi_callback_info cbInfo) { | |
96 | 6 | return esSearch(env, cbInfo, g_tree_node_next); | |
97 | } | ||
98 | |||
99 | napi_value | ||
100 | 11 | esBetween(napi_env env, napi_callback_info cbInfo) { | |
101 | napi_value esThis, argv[3], lowerSearchKey, upperSearchKey, esSkipEdges; | ||
102 | 11 | size_t argc = 3; | |
103 | 11 | bool skipEdges = FALSE; | |
104 | |||
105 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
11 | NAPI_CALL(env, false, napi_get_cb_info(env, cbInfo, &argc, argv, &esThis, NULL)); |
106 |
1/8✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
✗ Branch 6 not taken.
✗ Branch 7 not taken.
|
11 | CHECK_ARGC(2, msgTooFewArguments); |
107 | |||
108 | 11 | lowerSearchKey = argv[0]; | |
109 | 11 | upperSearchKey = argv[1]; | |
110 | |||
111 |
2/2✓ Branch 0 taken 7 times.
✓ Branch 1 taken 4 times.
|
11 | if (argc > 2) { |
112 | 4 | esSkipEdges = argv[2]; | |
113 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | NAPI_CALL(env, false, |
114 | napi_coerce_to_bool(env, esSkipEdges, &esSkipEdges)); | ||
115 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 4 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
4 | NAPI_CALL(env, false, |
116 | napi_get_value_bool(env, esSkipEdges, &skipEdges)); | ||
117 | 4 | } | |
118 | |||
119 | BTree_t *btree; | ||
120 |
1/6✗ Branch 0 not taken.
✓ Branch 1 taken 11 times.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
11 | EXTRACT_BTREE(env, esThis, btree); |
121 | |||
122 | 11 | GTreeNode *lowerGNode = btreeLookup(env, btree, lowerSearchKey); | |
123 |
2/2✓ Branch 0 taken 10 times.
✓ Branch 1 taken 1 times.
|
11 | if (!lowerGNode) { |
124 |
1/6✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1 | NAPI_CALL(env, false, |
125 | napi_throw_error(env, NULL, "lower key not found in tree")); | ||
126 | |||
127 | 1 | return NULL; | |
128 | } | ||
129 | |||
130 | 10 | GTreeNode *upperGNode = btreeLookup(env, btree, upperSearchKey); | |
131 |
2/2✓ Branch 0 taken 9 times.
✓ Branch 1 taken 1 times.
|
10 | if (!upperGNode) { |
132 |
1/6✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
✗ Branch 4 not taken.
✗ Branch 5 not taken.
|
1 | NAPI_CALL(env, false, |
133 | napi_throw_error(env, NULL, "upper key not found in tree")); | ||
134 | |||
135 | 1 | return NULL; | |
136 | } | ||
137 | |||
138 | 9 | gint compareResult = compareGTreeNodes(lowerGNode, upperGNode, btree); | |
139 | |||
140 | BTree_t *newBtree; | ||
141 | BTreeNode newNode; | ||
142 | 9 | napi_value newEsTree = cloneBtreeWrapper(env, esThis, &newBtree); | |
143 | |||
144 | // lower key == upper key | ||
145 |
2/2✓ Branch 0 taken 7 times.
✓ Branch 1 taken 2 times.
|
9 | if (compareResult == 0) { |
146 |
2/2✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
|
2 | if (!skipEdges) { |
147 | 1 | newNode = cloneBTreeNode(env, newBtree, lowerGNode); | |
148 | 1 | g_tree_replace(newBtree->nativeTree, newNode, newNode); | |
149 | 1 | } | |
150 | |||
151 | 2 | return newEsTree; | |
152 | } | ||
153 | |||
154 | // lower key > upper key | ||
155 |
2/2✓ Branch 0 taken 5 times.
✓ Branch 1 taken 2 times.
|
7 | if (compareResult > 0) { |
156 | 2 | GTreeNode *tmp = lowerGNode; | |
157 | 2 | lowerGNode = upperGNode; | |
158 | 2 | upperGNode = tmp; | |
159 | 2 | } | |
160 | |||
161 | // lower key < upper key | ||
162 | 7 | GTreeNode *current = lowerGNode; | |
163 | 7 | GTreeNode *last = upperGNode; | |
164 | |||
165 |
2/2✓ Branch 0 taken 4 times.
✓ Branch 1 taken 3 times.
|
7 | if (skipEdges) { |
166 | 3 | current = g_tree_node_next(lowerGNode); | |
167 | |||
168 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 1 times.
|
3 | if (current == last) { |
169 | 1 | return newEsTree; // return empty tree | |
170 | } | ||
171 | 2 | } | |
172 | |||
173 | |||
174 |
2/2✓ Branch 0 taken 16 times.
✓ Branch 1 taken 6 times.
|
22 | while (current != last) { |
175 | 16 | newNode = cloneBTreeNode(env, newBtree, current); | |
176 | |||
177 | 16 | g_tree_replace(newBtree->nativeTree, newNode, newNode); | |
178 | |||
179 | 16 | current = g_tree_node_next(current); | |
180 | } | ||
181 | |||
182 |
2/2✓ Branch 0 taken 2 times.
✓ Branch 1 taken 4 times.
|
6 | if (!skipEdges) { |
183 | 4 | newNode = cloneBTreeNode(env, newBtree, last); | |
184 | 4 | g_tree_replace(newBtree->nativeTree, newNode, newNode); | |
185 | 4 | } | |
186 | |||
187 | 6 | return newEsTree; | |
188 | 11 | } | |
189 |