Skip to content

Commit 1cf4fe4

Browse files
authored
Fixing issue 602 (simdjson#621)
1 parent 6b8f5d3 commit 1cf4fe4

File tree

1 file changed

+56
-62
lines changed

1 file changed

+56
-62
lines changed

benchmark/statisticalmodel.cpp

Lines changed: 56 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -41,76 +41,70 @@ struct stat_s {
4141

4242
using stat_t = struct stat_s;
4343

44+
45+
46+
really_inline void simdjson_process_atom(stat_t &s,
47+
simdjson::document::element element) {
48+
if (element.is_integer()) {
49+
s.integer_count++;
50+
} else if(element.is_string()) {
51+
s.string_count++;
52+
} else if(element.is_float()) {
53+
s.float_count++;
54+
} else if (element.is_bool()) {
55+
if (element.as_bool()) {
56+
s.true_count++;
57+
} else {
58+
s.false_count++;
59+
}
60+
} else if (element.is_null()) {
61+
s.null_count++;
62+
}
63+
}
64+
65+
void simdjson_recurse(stat_t &s, simdjson::document::element element) {
66+
if (element.is_array()) {
67+
s.array_count++;
68+
auto [array, array_error] = element.as_array();
69+
for (auto child : array) {
70+
if (child.is_array() || child.is_object()) {
71+
simdjson_recurse(s, child);
72+
} else {
73+
simdjson_process_atom(s, child);
74+
}
75+
}
76+
} else if (element.is_object()) {
77+
s.object_count++;
78+
auto [object, object_error] = element.as_object();
79+
for (auto [key, value] : object) {
80+
s.string_count++; // for key
81+
if (value.is_array() || value.is_object()) {
82+
simdjson_recurse(s, value);
83+
} else {
84+
simdjson_process_atom(s, value);
85+
}
86+
}
87+
} else {
88+
simdjson_process_atom(s, element);
89+
}
90+
}
91+
4492
stat_t simdjson_compute_stats(const simdjson::padded_string &p) {
45-
stat_t answer;
46-
simdjson::ParsedJson pj = simdjson::build_parsed_json(p);
47-
answer.valid = pj.is_valid();
48-
if (!answer.valid) {
93+
stat_t answer{};
94+
simdjson::document::parser parser;
95+
auto [doc, error] = parser.parse(p);
96+
if (error) {
97+
answer.valid = false;
4998
return answer;
5099
}
100+
answer.valid = true;
51101
answer.backslash_count =
52102
count_backslash(reinterpret_cast<const uint8_t *>(p.data()), p.size());
53103
answer.non_ascii_byte_count = count_nonasciibytes(
54104
reinterpret_cast<const uint8_t *>(p.data()), p.size());
55105
answer.byte_count = p.size();
56-
answer.integer_count = 0;
57-
answer.float_count = 0;
58-
answer.object_count = 0;
59-
answer.array_count = 0;
60-
answer.null_count = 0;
61-
answer.true_count = 0;
62-
answer.false_count = 0;
63-
answer.string_count = 0;
64-
answer.structural_indexes_count = pj.n_structural_indexes;
65-
size_t tape_idx = 0;
66-
uint64_t tape_val = pj.doc.tape[tape_idx++];
67-
uint8_t type = (tape_val >> 56);
68-
size_t how_many = 0;
69-
assert(type == 'r');
70-
how_many = tape_val & simdjson::internal::JSON_VALUE_MASK;
71-
for (; tape_idx < how_many; tape_idx++) {
72-
tape_val = pj.doc.tape[tape_idx];
73-
// uint64_t payload = tape_val & simdjson::internal::JSON_VALUE_MASK;
74-
type = (tape_val >> 56);
75-
switch (type) {
76-
case 'l': // we have a long int
77-
answer.integer_count++;
78-
tape_idx++; // skipping the integer
79-
break;
80-
case 'u': // we have a long uint
81-
answer.integer_count++;
82-
tape_idx++; // skipping the integer
83-
break;
84-
case 'd': // we have a double
85-
answer.float_count++;
86-
tape_idx++; // skipping the double
87-
break;
88-
case 'n': // we have a null
89-
answer.null_count++;
90-
break;
91-
case 't': // we have a true
92-
answer.true_count++;
93-
break;
94-
case 'f': // we have a false
95-
answer.false_count++;
96-
break;
97-
case '{': // we have an object
98-
answer.object_count++;
99-
break;
100-
case '}': // we end an object
101-
break;
102-
case '[': // we start an array
103-
answer.array_count++;
104-
break;
105-
case ']': // we end an array
106-
break;
107-
case '"': // we have a string
108-
answer.string_count++;
109-
break;
110-
default:
111-
break; // ignore
112-
}
113-
}
106+
answer.structural_indexes_count = parser.n_structural_indexes;
107+
simdjson_recurse(answer, doc.root());
114108
return answer;
115109
}
116110

0 commit comments

Comments
 (0)