GCC Code Coverage Report


Directory: src/
File: src/btree/search.c
Date: 2023-03-02 23:19:03
Exec Total Coverage
Lines: 94 94 100.0%
Functions: 7 7 100.0%
Branches: 45 124 36.3%

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