diff options
Diffstat (limited to 'lib/frame.cpp')
-rw-r--r-- | lib/frame.cpp | 89 |
1 files changed, 82 insertions, 7 deletions
diff --git a/lib/frame.cpp b/lib/frame.cpp index bc3f842..3ce95ec 100644 --- a/lib/frame.cpp +++ b/lib/frame.cpp | |||
@@ -1,21 +1,96 @@ | |||
1 | #include "frame.h" | 1 | #include "frame.h" |
2 | #include <sqlite3.h> | 2 | #include <sqlite3.h> |
3 | #include <json.hpp> | ||
3 | 4 | ||
4 | namespace verbly { | 5 | namespace verbly { |
5 | 6 | ||
6 | const object frame::objectType = object::frame; | 7 | const object frame::objectType = object::frame; |
7 | 8 | ||
8 | const std::list<std::string> frame::select = {"frame_id", "data"}; | 9 | const std::list<std::string> frame::select = {"frame_id", "data"}; |
9 | 10 | ||
10 | const field frame::id = field::integerField(object::frame, "frame_id"); | 11 | const field frame::id = field::integerField(object::frame, "frame_id"); |
11 | 12 | ||
12 | const field frame::group = field::joinThrough(object::frame, "frame_id", object::group, "groups_frames", "group_id"); | 13 | const field frame::group = field::joinThrough(object::frame, "frame_id", object::group, "groups_frames", "group_id"); |
13 | 14 | ||
14 | frame::frame(const database& db, sqlite3_stmt* row) : db_(&db), valid_(true) | 15 | frame::frame(const database& db, sqlite3_stmt* row) : db_(&db), valid_(true) |
15 | { | 16 | { |
16 | id_ = sqlite3_column_int(row, 0); | 17 | id_ = sqlite3_column_int(row, 0); |
17 | 18 | ||
18 | // TODO: Initialize frame data from row. | 19 | // TODO: Initialize frame data from row. |
20 | std::string partsJsonStr(reinterpret_cast<const char*>(sqlite3_column_blob(row, 1))); | ||
21 | nlohmann::json partsJson = nlohmann::json::parse(std::move(partsJsonStr)); | ||
22 | |||
23 | for (const nlohmann::json& partJson : partsJson) | ||
24 | { | ||
25 | part::type partType = static_cast<part::type>(partJson["type"].get<int>()); | ||
26 | |||
27 | switch (partType) | ||
28 | { | ||
29 | case part::type::noun_phrase: | ||
30 | { | ||
31 | std::set<std::string> synrestrs; | ||
32 | for (const nlohmann::json& synrestrJson : partJson["synrestrs"]) | ||
33 | { | ||
34 | synrestrs.insert(synrestrJson.get<std::string>()); | ||
35 | } | ||
36 | |||
37 | parts_.push_back(part::createNounPhrase( | ||
38 | partJson["role"].get<std::string>(), | ||
39 | selrestr(partJson["selrestrs"]), | ||
40 | std::move(synrestrs))); | ||
41 | |||
42 | break; | ||
43 | } | ||
44 | |||
45 | case part::type::preposition: | ||
46 | { | ||
47 | std::vector<std::string> choices; | ||
48 | for (const nlohmann::json& choiceJson : partJson["choices"]) | ||
49 | { | ||
50 | choices.push_back(choiceJson.get<std::string>()); | ||
51 | } | ||
52 | |||
53 | parts_.push_back(part::createPreposition( | ||
54 | std::move(choices), | ||
55 | partJson["literal"].get<bool>())); | ||
56 | |||
57 | break; | ||
58 | } | ||
59 | |||
60 | case part::type::verb: | ||
61 | { | ||
62 | parts_.push_back(part::createVerb()); | ||
63 | |||
64 | break; | ||
65 | } | ||
66 | |||
67 | case part::type::adjective: | ||
68 | { | ||
69 | parts_.push_back(part::createAdjective()); | ||
70 | |||
71 | break; | ||
72 | } | ||
73 | |||
74 | case part::type::adverb: | ||
75 | { | ||
76 | parts_.push_back(part::createAdverb()); | ||
77 | |||
78 | break; | ||
79 | } | ||
80 | |||
81 | case part::type::literal: | ||
82 | { | ||
83 | parts_.push_back(part::createLiteral(partJson["value"].get<std::string>())); | ||
84 | |||
85 | break; | ||
86 | } | ||
87 | |||
88 | case part::type::invalid: | ||
89 | { | ||
90 | throw std::domain_error("Invalid part data"); | ||
91 | } | ||
92 | } | ||
93 | } | ||
19 | } | 94 | } |
20 | 95 | ||
21 | }; | 96 | }; |