Skip to content

Commit 062ea95

Browse files
committed
Simplified json_facade
1 parent 22b0d09 commit 062ea95

File tree

3 files changed

+29
-69
lines changed

3 files changed

+29
-69
lines changed

include/json_facade.h

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -38,18 +38,12 @@ class JsonQuery {
3838
class JsonFacade {
3939
public:
4040
virtual ~JsonFacade() = default;
41-
virtual void Parse(std::string_view jsonStr) = 0;
42-
virtual std::optional<std::string_view> GetString(std::string_view key) const = 0;
41+
virtual bool EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) = 0;
4342
};
4443

4544
class RapidJsonFacade : public JsonFacade {
4645
public:
47-
void Parse(std::string_view jsonStr) override;
48-
std::optional<std::string_view> GetString(std::string_view key) const override;
49-
50-
private:
51-
rapidjson::Document doc_;
52-
std::unordered_map<std::string_view, std::string_view> key_value_map_;
46+
virtual bool EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) override;
5347
};
5448

5549
class JsonQueryDriver {

src/sparser/json_facade.cpp

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#include "json_facade.h"
22

3-
#include <optional>
3+
#include <cstring>
44
#include <sstream>
55
#include <stdexcept>
66
#include <string>
@@ -36,47 +36,47 @@ std::ostream& operator<<(std::ostream& os, const JsonQuery& query) {
3636
return os;
3737
}
3838

39-
void RapidJsonFacade::Parse(std::string_view jsonStr) {
40-
rapidjson::ParseResult ok = doc_.Parse(jsonStr.data(), jsonStr.size());
41-
if (!ok || !doc_.IsObject()) {
42-
throw std::runtime_error("Failed to parse JSON string");
43-
}
44-
key_value_map_.clear();
39+
bool RapidJsonFacade::EvaluateQuery(std::string_view jsonStr, const JsonQuery& query) {
40+
rapidjson::Document doc;
41+
rapidjson::ParseResult ok = doc.Parse(jsonStr.data(), jsonStr.size());
4542

46-
for (auto it = doc_.MemberBegin(); it != doc_.MemberEnd(); ++it) {
47-
const char* key = it->name.GetString();
48-
if (it->value.IsString()) {
49-
key_value_map_[key] = it->value.GetString();
50-
}
43+
if (!ok || !doc.IsObject()) {
44+
#ifndef NDEBUG
45+
throw std::runtime_error("Failed to parse JSON string");
46+
#endif
47+
return false;
5148
}
52-
}
5349

54-
std::optional<std::string_view> RapidJsonFacade::GetString(std::string_view key) const {
55-
auto it = key_value_map_.find(key);
56-
if (it == key_value_map_.end()) {
57-
return std::nullopt;
58-
}
59-
return it->second;
60-
}
61-
62-
bool JsonQueryDriver::RunQuery(std::string_view buffer, const JsonQuery& query) {
63-
json_facade_->Parse(buffer);
50+
bool ans = false;
6451

6552
for (const auto& conjunction : query.GetDisjunction().conjunctions) {
6653
bool all_predicates_satisfied = true;
6754

6855
for (const auto& predicate : conjunction.predicates) {
69-
auto value = json_facade_->GetString(predicate.key);
70-
if (!value.has_value() || !value.value().contains(predicate.value)) {
56+
auto itr = doc.FindMember(predicate.key.c_str());
57+
58+
if (itr == doc.MemberEnd()) {
59+
#ifndef NDEBUG
60+
throw std::runtime_error("Key not found: " + predicate.key);
61+
#endif
62+
return false;
63+
}
64+
65+
if (!itr->value.IsString() || !strstr(itr->value.GetString(), predicate.value.c_str())) {
7166
all_predicates_satisfied = false;
7267
break;
7368
}
7469
}
7570

7671
if (all_predicates_satisfied) {
77-
return true;
72+
ans = true;
73+
break;
7874
}
7975
}
8076

81-
return false;
77+
return ans;
78+
}
79+
80+
bool JsonQueryDriver::RunQuery(std::string_view buffer, const JsonQuery& query) {
81+
return json_facade_->EvaluateQuery(buffer, query);
8282
}

tests/sparser_test.cpp

Lines changed: 0 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -92,40 +92,6 @@ TEST(RawFilterQueryGenerator, GenerateRawFilters_GenerateRawFiltersForSinglePred
9292
}
9393
}
9494

95-
TEST(RapidJsonFacade, Parse_ValidJson_SuccessfulParsing) {
96-
RapidJsonFacade facade;
97-
std::string_view validJson = R"({"name":"John","age":"30"})";
98-
facade.Parse(validJson);
99-
100-
auto nameValue = facade.GetString("name");
101-
ASSERT_TRUE(nameValue.has_value());
102-
EXPECT_EQ(*nameValue, "John");
103-
104-
auto ageValue = facade.GetString("age");
105-
ASSERT_TRUE(ageValue.has_value());
106-
EXPECT_EQ(*ageValue, "30");
107-
}
108-
109-
TEST(RapidJsonFacade, Parse_InvalidJson_ThrowsException) {
110-
RapidJsonFacade facade;
111-
std::string_view invalidJson = R"({invalid json})"; // Missing quotes, braces, etc.
112-
EXPECT_ANY_THROW(facade.Parse(invalidJson)) << "Should fail to parse invalid JSON";
113-
EXPECT_FALSE(facade.GetString("randomKey").has_value());
114-
}
115-
116-
TEST(RapidJsonFacade, GetString_ExistingAndMissingKeys_BehavesCorrectly) {
117-
RapidJsonFacade facade;
118-
std::string_view json = R"({"fruit":"apple"})";
119-
facade.Parse(json);
120-
121-
auto fruitVal = facade.GetString("fruit");
122-
ASSERT_TRUE(fruitVal.has_value());
123-
EXPECT_EQ(*fruitVal, "apple");
124-
125-
auto colorVal = facade.GetString("color");
126-
EXPECT_FALSE(colorVal.has_value());
127-
}
128-
12995
TEST(JsonQueryDriver, RunQuery_AllPredicatesMatch_ReturnsTrue) {
13096
auto facade = std::make_unique<RapidJsonFacade>();
13197
JsonQueryDriver driver(std::move(facade));

0 commit comments

Comments
 (0)