Skip to content

Commit

Permalink
Add SimdJsonFacade and integrate simdjson for JSON query evaluation
Browse files Browse the repository at this point in the history
  • Loading branch information
jkurdek committed Feb 9, 2025
1 parent 8953dd8 commit d273c5a
Show file tree
Hide file tree
Showing 6 changed files with 66 additions and 7 deletions.
1 change: 1 addition & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ endif()

find_package(GTest CONFIG REQUIRED)
find_package(RapidJSON CONFIG REQUIRED)
find_package(simdjson CONFIG REQUIRED)

enable_testing()

Expand Down
5 changes: 5 additions & 0 deletions include/json_facade.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,11 @@ class RapidJsonFacade : public JsonFacade {
[[nodiscard]] virtual bool EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) override;
};

class SimdJsonFacade : public JsonFacade {
public:
[[nodiscard]] virtual bool EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) override;
};

class JsonQueryDriver {
public:
explicit JsonQueryDriver(std::unique_ptr<JsonFacade>&& json_facade = {}) : json_facade_(std::move(json_facade)) {}
Expand Down
6 changes: 5 additions & 1 deletion src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,11 @@ int main(int argc, char* argv[]) {

auto facade = std::make_unique<RapidJsonFacade>();
auto json_query_driver = std::make_unique<JsonQueryDriver>(std::move(facade));
auto sparser = Sparser(std::move(json_query_driver));

auto simdjsonfacade = std::make_unique<SimdJsonFacade>();
auto simdjson_query_driver = std::make_unique<JsonQueryDriver>(std::move(simdjsonfacade));

auto sparser = Sparser(std::move(simdjson_query_driver));
sparser.Run(filename, JsonQuery(disj));

} catch (const std::exception& e) {
Expand Down
5 changes: 4 additions & 1 deletion src/sparser/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,7 @@
file(GLOB SRC_FILES "${CMAKE_CURRENT_SOURCE_DIR}/*.cpp")
add_library(SparserCpp ${SRC_FILES})
target_include_directories(SparserCpp PUBLIC ${CMAKE_SOURCE_DIR}/include)
target_link_libraries(SparserCpp PUBLIC rapidjson)
target_link_libraries(SparserCpp PUBLIC
rapidjson
simdjson::simdjson
)
47 changes: 46 additions & 1 deletion src/sparser/json_facade.cpp
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
#include "json_facade.h"

#include <simdjson.h>

#include <cstring>
#include <sstream>
#include <stdexcept>
#include <string>
#include <string_view>

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

bool SimdJsonFacade::EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) {
simdjson::ondemand::parser parser;
auto json = simdjson::padded_string(jsonStr);

try {
auto doc = parser.iterate(json);
auto obj = doc.get_object();

bool ans = false;
for (const auto& conjunction : query.GetDisjunction().conjunctions) {
bool all_predicates_satisfied = true;

for (const auto& predicate : conjunction.predicates) {
simdjson::ondemand::value field;
auto error = obj[predicate.key].get(field);

if (error || !field.is_string()) {
all_predicates_satisfied = false;
break;
}

std::string_view field_str;
error = field.get_string().get(field_str);
if (error || field_str.find(predicate.value) == std::string_view::npos) {
all_predicates_satisfied = false;
break;
}
}

if (all_predicates_satisfied) {
ans = true;
break;
}
}
return ans;

} catch (const simdjson::simdjson_error& e) {
#ifndef NDEBUG
throw std::runtime_error(e.what());
#endif
return false;
}
}

bool JsonQueryDriver::RunQuery(std::string_view buffer, const JsonQuery& query) {
return json_facade_->EvaluateQuery(buffer, query);
}
9 changes: 5 additions & 4 deletions vcpkg.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
{
"dependencies": [
"gtest",
"rapidjson"
]
"dependencies": [
"gtest",
"rapidjson",
"simdjson"
]
}

0 comments on commit d273c5a

Please sign in to comment.