diff options
author | Kelly Rauchenberger <fefferburbia@gmail.com> | 2016-03-16 11:27:16 -0400 |
---|---|---|
committer | Kelly Rauchenberger <fefferburbia@gmail.com> | 2016-03-16 11:27:16 -0400 |
commit | 3aceae8ab1eb5992110ea57a9479bbc3177feb21 (patch) | |
tree | 13167a266805344efb7bb1d900486f782c23285e /verbly/data.h | |
parent | e1be2716746e75cf6ed37e86461a7f580a964564 (diff) | |
download | furries-3aceae8ab1eb5992110ea57a9479bbc3177feb21.tar.gz furries-3aceae8ab1eb5992110ea57a9479bbc3177feb21.tar.bz2 furries-3aceae8ab1eb5992110ea57a9479bbc3177feb21.zip |
Added more inflections, word relationships, and pronunciations
Nouns, adjectives, and adverbs now have inflected forms. A large number of WordNet word relationships (all noun-noun relationships, plus synonymy and antonymy for all word types except verbs) have been added. Additionally, CMUDICT is now being used to store word pronunciations for rhyming purposes. Verbly is now also a compiled library rather than being header-only due to the complexity of the query interface.
Diffstat (limited to 'verbly/data.h')
-rw-r--r-- | verbly/data.h | 275 |
1 files changed, 24 insertions, 251 deletions
diff --git a/verbly/data.h b/verbly/data.h index e901cba..37092d7 100644 --- a/verbly/data.h +++ b/verbly/data.h | |||
@@ -1,273 +1,46 @@ | |||
1 | #ifndef DATA_H_C4AEC3DD | 1 | #ifndef DATA_H_C4AEC3DD |
2 | #define DATA_H_C4AEC3DD | 2 | #define DATA_H_C4AEC3DD |
3 | 3 | ||
4 | #include "verb.h" | ||
5 | #include <sqlite3.h> | 4 | #include <sqlite3.h> |
6 | #include <stdexcept> | 5 | #include <stdexcept> |
7 | 6 | ||
8 | namespace verbly { | 7 | namespace verbly { |
9 | 8 | ||
9 | class data; | ||
10 | class word; | ||
11 | class adjective; | ||
12 | class noun; | ||
13 | class verb; | ||
14 | class adverb; | ||
15 | class adjective_query; | ||
16 | class adverb_query; | ||
17 | class noun_query; | ||
18 | class verb_query; | ||
19 | |||
10 | class data { | 20 | class data { |
11 | private: | 21 | private: |
12 | sqlite3* ppdb; | 22 | sqlite3* ppdb; |
13 | 23 | ||
14 | public: | 24 | friend class adjective_query; |
15 | class verb_query { | 25 | friend class noun_query; |
16 | public: | 26 | friend class verb_query; |
17 | const static int unlimited = -1; | 27 | friend class adverb_query; |
18 | |||
19 | private: | ||
20 | const data& database; | ||
21 | int m_limit = unlimited; | ||
22 | bool m_random = false; | ||
23 | |||
24 | public: | ||
25 | verb_query(const data& database) : database(database) | ||
26 | { | ||
27 | |||
28 | } | ||
29 | |||
30 | verb_query& limit(int m_limit) | ||
31 | { | ||
32 | if ((m_limit > 0) || (m_limit == unlimited)) | ||
33 | { | ||
34 | this->m_limit = m_limit; | ||
35 | } | ||
36 | |||
37 | return *this; | ||
38 | } | ||
39 | |||
40 | verb_query& random(bool m_random) | ||
41 | { | ||
42 | this->m_random = m_random; | ||
43 | |||
44 | return *this; | ||
45 | } | ||
46 | |||
47 | std::list<verb> run() const | ||
48 | { | ||
49 | std::stringstream construct; | ||
50 | construct << "SELECT verb_id, infinitive, past_tense, past_participle, ing_form, s_form FROM verbs"; | ||
51 | |||
52 | if (m_random) | ||
53 | { | ||
54 | construct << " ORDER BY RANDOM()"; | ||
55 | } | ||
56 | |||
57 | if (m_limit != unlimited) | ||
58 | { | ||
59 | construct << " LIMIT " << m_limit; | ||
60 | } | ||
61 | |||
62 | sqlite3_stmt* ppstmt; | ||
63 | std::string query = construct.str(); | ||
64 | if (sqlite3_prepare_v2(database.ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
65 | { | ||
66 | throw std::runtime_error(sqlite3_errmsg(database.ppdb)); | ||
67 | } | ||
68 | |||
69 | std::list<verb> output; | ||
70 | while (sqlite3_step(ppstmt) == SQLITE_ROW) | ||
71 | { | ||
72 | verb tnc {sqlite3_column_int(ppstmt, 0)}; | ||
73 | tnc.infinitive = std::string(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 1))); | ||
74 | tnc.past_tense = std::string(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 2))); | ||
75 | tnc.past_participle = std::string(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 3))); | ||
76 | tnc.ing_form = std::string(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 4))); | ||
77 | tnc.s_form = std::string(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 5))); | ||
78 | |||
79 | output.push_back(tnc); | ||
80 | } | ||
81 | |||
82 | sqlite3_finalize(ppstmt); | ||
83 | |||
84 | return output; | ||
85 | } | ||
86 | |||
87 | }; | ||
88 | |||
89 | class adjective_query { | ||
90 | public: | ||
91 | const static int unlimited = -1; | ||
92 | |||
93 | private: | ||
94 | const data& database; | ||
95 | int m_limit = unlimited; | ||
96 | bool m_random = false; | ||
97 | |||
98 | public: | ||
99 | adjective_query(const data& database) : database(database) | ||
100 | { | ||
101 | |||
102 | } | ||
103 | |||
104 | adjective_query& limit(int m_limit) | ||
105 | { | ||
106 | if ((m_limit > 0) || (m_limit == unlimited)) | ||
107 | { | ||
108 | this->m_limit = m_limit; | ||
109 | } | ||
110 | |||
111 | return *this; | ||
112 | } | ||
113 | |||
114 | adjective_query& random(bool m_random) | ||
115 | { | ||
116 | this->m_random = m_random; | ||
117 | |||
118 | return *this; | ||
119 | } | ||
120 | |||
121 | std::list<adjective> run() const | ||
122 | { | ||
123 | std::stringstream construct; | ||
124 | construct << "SELECT adjective_id, form FROM adjectives"; | ||
125 | |||
126 | if (m_random) | ||
127 | { | ||
128 | construct << " ORDER BY RANDOM()"; | ||
129 | } | ||
130 | |||
131 | if (m_limit != unlimited) | ||
132 | { | ||
133 | construct << " LIMIT " << m_limit; | ||
134 | } | ||
135 | |||
136 | sqlite3_stmt* ppstmt; | ||
137 | std::string query = construct.str(); | ||
138 | if (sqlite3_prepare_v2(database.ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
139 | { | ||
140 | throw std::runtime_error(sqlite3_errmsg(database.ppdb)); | ||
141 | } | ||
142 | |||
143 | std::list<adjective> output; | ||
144 | while (sqlite3_step(ppstmt) == SQLITE_ROW) | ||
145 | { | ||
146 | adjective tnc {sqlite3_column_int(ppstmt, 0)}; | ||
147 | tnc.form = std::string(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 1))); | ||
148 | |||
149 | output.push_back(tnc); | ||
150 | } | ||
151 | |||
152 | sqlite3_finalize(ppstmt); | ||
153 | |||
154 | return output; | ||
155 | } | ||
156 | |||
157 | }; | ||
158 | |||
159 | class adverb_query { | ||
160 | public: | ||
161 | const static int unlimited = -1; | ||
162 | |||
163 | private: | ||
164 | const data& database; | ||
165 | int m_limit = unlimited; | ||
166 | bool m_random = false; | ||
167 | |||
168 | public: | ||
169 | adverb_query(const data& database) : database(database) | ||
170 | { | ||
171 | |||
172 | } | ||
173 | |||
174 | adverb_query& limit(int m_limit) | ||
175 | { | ||
176 | if ((m_limit > 0) || (m_limit == unlimited)) | ||
177 | { | ||
178 | this->m_limit = m_limit; | ||
179 | } | ||
180 | |||
181 | return *this; | ||
182 | } | ||
183 | |||
184 | adverb_query& random(bool m_random) | ||
185 | { | ||
186 | this->m_random = m_random; | ||
187 | |||
188 | return *this; | ||
189 | } | ||
190 | |||
191 | std::list<adverb> run() const | ||
192 | { | ||
193 | std::stringstream construct; | ||
194 | construct << "SELECT adverb_id, form FROM adverbs"; | ||
195 | |||
196 | if (m_random) | ||
197 | { | ||
198 | construct << " ORDER BY RANDOM()"; | ||
199 | } | ||
200 | |||
201 | if (m_limit != unlimited) | ||
202 | { | ||
203 | construct << " LIMIT " << m_limit; | ||
204 | } | ||
205 | |||
206 | sqlite3_stmt* ppstmt; | ||
207 | std::string query = construct.str(); | ||
208 | if (sqlite3_prepare_v2(database.ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
209 | { | ||
210 | throw std::runtime_error(sqlite3_errmsg(database.ppdb)); | ||
211 | } | ||
212 | |||
213 | std::list<adverb> output; | ||
214 | while (sqlite3_step(ppstmt) == SQLITE_ROW) | ||
215 | { | ||
216 | adverb tnc {sqlite3_column_int(ppstmt, 0)}; | ||
217 | tnc.form = std::string(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 1))); | ||
218 | |||
219 | output.push_back(tnc); | ||
220 | } | ||
221 | |||
222 | sqlite3_finalize(ppstmt); | ||
223 | |||
224 | return output; | ||
225 | } | ||
226 | |||
227 | }; | ||
228 | 28 | ||
229 | data(std::string datafile) | 29 | public: |
230 | { | 30 | data(std::string datafile); |
231 | if (sqlite3_open_v2(datafile.c_str(), &ppdb, SQLITE_OPEN_READONLY, NULL) != SQLITE_OK) | ||
232 | { | ||
233 | throw std::invalid_argument(sqlite3_errmsg(ppdb)); | ||
234 | } | ||
235 | } | ||
236 | 31 | ||
237 | data(const data& other) = delete; | 32 | data(const data& other) = delete; |
238 | data& operator=(const data& other) = delete; | 33 | data& operator=(const data& other) = delete; |
239 | 34 | ||
240 | data(data&& other) | 35 | data(data&& other); |
241 | { | 36 | data& operator=(data&& other); |
242 | ppdb = other.ppdb; | ||
243 | } | ||
244 | |||
245 | data& operator=(data&& other) | ||
246 | { | ||
247 | ppdb = other.ppdb; | ||
248 | |||
249 | return *this; | ||
250 | } | ||
251 | |||
252 | ~data() | ||
253 | { | ||
254 | sqlite3_close_v2(ppdb); | ||
255 | } | ||
256 | |||
257 | verb_query verbs() const | ||
258 | { | ||
259 | return verb_query(*this); | ||
260 | } | ||
261 | 37 | ||
262 | adjective_query adjectives() const | 38 | ~data(); |
263 | { | ||
264 | return adjective_query(*this); | ||
265 | } | ||
266 | 39 | ||
267 | adverb_query adverbs() const | 40 | verb_query verbs() const; |
268 | { | 41 | adjective_query adjectives() const; |
269 | return adverb_query(*this); | 42 | adverb_query adverbs() const; |
270 | } | 43 | noun_query nouns() const; |
271 | 44 | ||
272 | }; | 45 | }; |
273 | 46 | ||