diff options
Diffstat (limited to 'lib/word.cpp')
| -rw-r--r-- | lib/word.cpp | 85 |
1 files changed, 11 insertions, 74 deletions
| diff --git a/lib/word.cpp b/lib/word.cpp index 6f0fe22..60657ba 100644 --- a/lib/word.cpp +++ b/lib/word.cpp | |||
| @@ -1,5 +1,4 @@ | |||
| 1 | #include "word.h" | 1 | #include "word.h" |
| 2 | #include <sqlite3.h> | ||
| 3 | #include "form.h" | 2 | #include "form.h" |
| 4 | #include "util.h" | 3 | #include "util.h" |
| 5 | #include "database.h" | 4 | #include "database.h" |
| @@ -45,89 +44,27 @@ namespace verbly { | |||
| 45 | return field::joinThroughWhere(object::word, "lemma_id", object::form, "lemmas_forms", "form_id", "category", static_cast<int>(category)); | 44 | return field::joinThroughWhere(object::word, "lemma_id", object::form, "lemmas_forms", "form_id", "category", static_cast<int>(category)); |
| 46 | } | 45 | } |
| 47 | 46 | ||
| 48 | word::word(const database& db, sqlite3_stmt* row) : db_(&db), valid_(true) | 47 | word::word(const database& db, hatkirby::row row) : db_(db), valid_(true) |
| 49 | { | 48 | { |
| 50 | id_ = sqlite3_column_int(row, 0); | 49 | id_ = mpark::get<int>(row[0]); |
| 51 | notionId_ = sqlite3_column_int(row, 1); | ||
| 52 | lemmaId_ = sqlite3_column_int(row, 2); | ||
| 53 | 50 | ||
| 54 | if (sqlite3_column_type(row, 3) != SQLITE_NULL) | 51 | notion_ = db.notions(notion::id == mpark::get<int>(row[1])).first(); |
| 55 | { | ||
| 56 | hasTagCount_ = true; | ||
| 57 | tagCount_ = sqlite3_column_int(row, 3); | ||
| 58 | } | ||
| 59 | |||
| 60 | if (sqlite3_column_type(row, 4) != SQLITE_NULL) | ||
| 61 | { | ||
| 62 | adjectivePosition_ = static_cast<positioning>(sqlite3_column_int(row, 4)); | ||
| 63 | } | ||
| 64 | |||
| 65 | if (sqlite3_column_type(row, 5) != SQLITE_NULL) | ||
| 66 | { | ||
| 67 | hasGroup_ = true; | ||
| 68 | groupId_ = sqlite3_column_int(row, 5); | ||
| 69 | } | ||
| 70 | } | ||
| 71 | |||
| 72 | const notion& word::getNotion() const | ||
| 73 | { | ||
| 74 | if (!valid_) | ||
| 75 | { | ||
| 76 | throw std::domain_error("Bad access to uninitialized word"); | ||
| 77 | } | ||
| 78 | 52 | ||
| 79 | if (!notion_.isValid()) | 53 | if (!mpark::holds_alternative<std::nullptr_t>(row[3])) |
| 80 | { | 54 | { |
| 81 | notion_ = db_->notions(notion::id == notionId_).first(); | 55 | hasTagCount_ = true; |
| 82 | } | 56 | tagCount_ = mpark::get<int>(row[3]); |
| 83 | |||
| 84 | return notion_; | ||
| 85 | } | ||
| 86 | |||
| 87 | bool word::hasFrames() const | ||
| 88 | { | ||
| 89 | if (!valid_) | ||
| 90 | { | ||
| 91 | throw std::domain_error("Bad access to uninitialized word"); | ||
| 92 | } | ||
| 93 | |||
| 94 | if (!hasGroup_) | ||
| 95 | { | ||
| 96 | return false; | ||
| 97 | } | ||
| 98 | |||
| 99 | if (!initializedFrames_) | ||
| 100 | { | ||
| 101 | initializeFrames(); | ||
| 102 | } | ||
| 103 | |||
| 104 | return !frames_.empty(); | ||
| 105 | } | ||
| 106 | |||
| 107 | const std::vector<frame>& word::getFrames() const | ||
| 108 | { | ||
| 109 | if (!valid_) | ||
| 110 | { | ||
| 111 | throw std::domain_error("Bad access to uninitialized word"); | ||
| 112 | } | 57 | } |
| 113 | 58 | ||
| 114 | if (!hasGroup_) | 59 | if (!mpark::holds_alternative<std::nullptr_t>(row[4])) |
| 115 | { | 60 | { |
| 116 | throw std::domain_error("Word does not have a group"); | 61 | adjectivePosition_ = static_cast<positioning>(mpark::get<int>(row[4])); |
| 117 | } | 62 | } |
| 118 | 63 | ||
| 119 | if (!initializedFrames_) | 64 | if (!mpark::holds_alternative<std::nullptr_t>(row[5])) |
| 120 | { | 65 | { |
| 121 | initializeFrames(); | 66 | frames_ = db.frames(*this).all(); |
| 122 | } | 67 | } |
| 123 | |||
| 124 | return frames_; | ||
| 125 | } | ||
| 126 | |||
| 127 | void word::initializeFrames() const | ||
| 128 | { | ||
| 129 | initializedFrames_ = true; | ||
| 130 | frames_ = db_->frames(*this, {}, -1).all(); | ||
| 131 | } | 68 | } |
| 132 | 69 | ||
| 133 | const form& word::getBaseForm() const | 70 | const form& word::getBaseForm() const |
| @@ -167,7 +104,7 @@ namespace verbly { | |||
| 167 | 104 | ||
| 168 | void word::initializeForm(inflection infl) const | 105 | void word::initializeForm(inflection infl) const |
| 169 | { | 106 | { |
| 170 | forms_[infl] = db_->forms(form::words(infl) %= *this, verbly::form::id, -1).all(); | 107 | forms_[infl] = db_.forms(form::words(infl) %= *this, verbly::form::id, -1).all(); |
| 171 | } | 108 | } |
| 172 | 109 | ||
| 173 | filter word::synonyms_field::operator%=(filter joinCondition) const | 110 | filter word::synonyms_field::operator%=(filter joinCondition) const |
