summary refs log tree commit diff stats
path: root/lib/word.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/word.cpp')
-rw-r--r--lib/word.cpp65
1 files changed, 39 insertions, 26 deletions
diff --git a/lib/word.cpp b/lib/word.cpp index d75159c..4dea569 100644 --- a/lib/word.cpp +++ b/lib/word.cpp
@@ -16,7 +16,6 @@ namespace verbly {
16 const field word::adjectivePosition = field::integerField(object::word, "position", true); 16 const field word::adjectivePosition = field::integerField(object::word, "position", true);
17 17
18 const field word::notions = field::joinField(object::word, "notion_id", object::notion); 18 const field word::notions = field::joinField(object::word, "notion_id", object::notion);
19 const field word::lemmas = field::joinField(object::word, "lemma_id", object::lemma);
20 const field word::frames = field::joinField(object::word, "group_id", object::frame, true); 19 const field word::frames = field::joinField(object::word, "group_id", object::frame, true);
21 20
22 const field word::antonyms = field::selfJoin(object::word, "word_id", "antonymy", "antonym_2_id", "antonym_1_id"); 21 const field word::antonyms = field::selfJoin(object::word, "word_id", "antonymy", "antonym_2_id", "antonym_1_id");
@@ -39,6 +38,11 @@ namespace verbly {
39 const field word::regionalTerms = field::selfJoin(object::word, "word_id", "regionality", "domain_id", "term_id"); 38 const field word::regionalTerms = field::selfJoin(object::word, "word_id", "regionality", "domain_id", "term_id");
40 const field word::regionalDomains = field::selfJoin(object::word, "word_id", "regionality", "term_id", "domain_id"); 39 const field word::regionalDomains = field::selfJoin(object::word, "word_id", "regionality", "term_id", "domain_id");
41 40
41 field word::forms(inflection category)
42 {
43 return field::joinThroughWhere(object::word, "lemma_id", object::form, "lemmas_forms", "form_id", "category", static_cast<int>(category));
44 }
45
42 word::word(const database& db, sqlite3_stmt* row) : db_(&db), valid_(true) 46 word::word(const database& db, sqlite3_stmt* row) : db_(&db), valid_(true)
43 { 47 {
44 id_ = sqlite3_column_int(row, 0); 48 id_ = sqlite3_column_int(row, 0);
@@ -78,21 +82,6 @@ namespace verbly {
78 return notion_; 82 return notion_;
79 } 83 }
80 84
81 const lemma& word::getLemma() const
82 {
83 if (!valid_)
84 {
85 throw std::domain_error("Bad access to uninitialized word");
86 }
87
88 if (!lemma_)
89 {
90 lemma_ = db_->lemmas(lemma::id == lemmaId_).first();
91 }
92
93 return lemma_;
94 }
95
96 bool word::hasFrames() const 85 bool word::hasFrames() const
97 { 86 {
98 if (!valid_) 87 if (!valid_)
@@ -133,26 +122,50 @@ namespace verbly {
133 return frames_; 122 return frames_;
134 } 123 }
135 124
136 std::string word::getBaseForm() const 125 void word::initializeFrames() const
137 { 126 {
138 return getLemma().getBaseForm().getText(); 127 initializedFrames_ = true;
128 frames_ = db_->frames(*this, {}, -1).all();
139 } 129 }
140 130
141 std::vector<std::string> word::getInflections(inflection category) const 131 const form& word::getBaseForm() const
142 { 132 {
143 std::vector<std::string> result; 133 if (!valid_)
144 for (const form& infl : getLemma().getInflections(category))
145 { 134 {
146 result.push_back(infl.getText()); 135 throw std::domain_error("Bad access to uninitialized word");
147 } 136 }
148 137
149 return result; 138 if (!forms_.count(inflection::base))
139 {
140 initializeForm(inflection::base);
141 }
142
143 return forms_.at(inflection::base).front();
150 } 144 }
151 145
152 void word::initializeFrames() const 146 bool word::hasInflection(inflection category) const
153 { 147 {
154 initializedFrames_ = true; 148 return !getInflections(category).empty();
155 frames_ = db_->frames(*this, {}, -1).all(); 149 }
150
151 const std::vector<form>& word::getInflections(inflection category) const
152 {
153 if (!valid_)
154 {
155 throw std::domain_error("Bad access to uninitialized word");
156 }
157
158 if (!forms_.count(category))
159 {
160 initializeForm(category);
161 }
162
163 return forms_.at(category);
164 }
165
166 void word::initializeForm(inflection infl) const
167 {
168 forms_[infl] = db_->forms(form::words(infl) %= *this, verbly::form::id, -1).all();
156 } 169 }
157 170
158}; 171};