Skip to content

Commit d273c5a

Browse files
committed
Add SimdJsonFacade and integrate simdjson for JSON query evaluation
1 parent 8953dd8 commit d273c5a

File tree

6 files changed

+66
-7
lines changed

6 files changed

+66
-7
lines changed

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ endif()
2020

2121
find_package(GTest CONFIG REQUIRED)
2222
find_package(RapidJSON CONFIG REQUIRED)
23+
find_package(simdjson CONFIG REQUIRED)
2324

2425
enable_testing()
2526

include/json_facade.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,11 @@ class RapidJsonFacade : public JsonFacade {
4343
[[nodiscard]] virtual bool EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) override;
4444
};
4545

46+
class SimdJsonFacade : public JsonFacade {
47+
public:
48+
[[nodiscard]] virtual bool EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) override;
49+
};
50+
4651
class JsonQueryDriver {
4752
public:
4853
explicit JsonQueryDriver(std::unique_ptr<JsonFacade>&& json_facade = {}) : json_facade_(std::move(json_facade)) {}

src/main.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,11 @@ int main(int argc, char* argv[]) {
2222

2323
auto facade = std::make_unique<RapidJsonFacade>();
2424
auto json_query_driver = std::make_unique<JsonQueryDriver>(std::move(facade));
25-
auto sparser = Sparser(std::move(json_query_driver));
25+
26+
auto simdjsonfacade = std::make_unique<SimdJsonFacade>();
27+
auto simdjson_query_driver = std::make_unique<JsonQueryDriver>(std::move(simdjsonfacade));
28+
29+
auto sparser = Sparser(std::move(simdjson_query_driver));
2630
sparser.Run(filename, JsonQuery(disj));
2731

2832
} catch (const std::exception& e) {

src/sparser/CMakeLists.txt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,7 @@
11
file(GLOB SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
22
add_library(SparserCpp ${SRC_FILES})
33
target_include_directories(SparserCpp PUBLIC ${CMAKE_SOURCE_DIR}/include)
4-
target_link_libraries(SparserCpp PUBLIC rapidjson)
4+
target_link_libraries(SparserCpp PUBLIC
5+
rapidjson
6+
simdjson::simdjson
7+
)

src/sparser/json_facade.cpp

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
#include "json_facade.h"
22

3+
#include <simdjson.h>
4+
35
#include <cstring>
46
#include <sstream>
5-
#include <stdexcept>
67
#include <string>
78
#include <string_view>
89

@@ -77,6 +78,50 @@ bool RapidJsonFacade::EvaluateQuery(std::string_view jsonStr, const JsonQuery& q
7778
return ans;
7879
}
7980

81+
bool SimdJsonFacade::EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) {
82+
simdjson::ondemand::parser parser;
83+
auto json = simdjson::padded_string(jsonStr);
84+
85+
try {
86+
auto doc = parser.iterate(json);
87+
auto obj = doc.get_object();
88+
89+
bool ans = false;
90+
for (const auto& conjunction : query.GetDisjunction().conjunctions) {
91+
bool all_predicates_satisfied = true;
92+
93+
for (const auto& predicate : conjunction.predicates) {
94+
simdjson::ondemand::value field;
95+
auto error = obj[predicate.key].get(field);
96+
97+
if (error || !field.is_string()) {
98+
all_predicates_satisfied = false;
99+
break;
100+
}
101+
102+
std::string_view field_str;
103+
error = field.get_string().get(field_str);
104+
if (error || field_str.find(predicate.value) == std::string_view::npos) {
105+
all_predicates_satisfied = false;
106+
break;
107+
}
108+
}
109+
110+
if (all_predicates_satisfied) {
111+
ans = true;
112+
break;
113+
}
114+
}
115+
return ans;
116+
117+
} catch (const simdjson::simdjson_error& e) {
118+
#ifndef NDEBUG
119+
throw std::runtime_error(e.what());
120+
#endif
121+
return false;
122+
}
123+
}
124+
80125
bool JsonQueryDriver::RunQuery(std::string_view buffer, const JsonQuery& query) {
81126
return json_facade_->EvaluateQuery(buffer, query);
82127
}

vcpkg.json

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{
2-
"dependencies": [
3-
"gtest",
4-
"rapidjson"
5-
]
2+
"dependencies": [
3+
"gtest",
4+
"rapidjson",
5+
"simdjson"
6+
]
67
}

0 commit comments

Comments
 (0)