diff options
| -rw-r--r-- | .gitignore | 5 | ||||
| -rw-r--r-- | generator/database.cpp | 173 | ||||
| -rw-r--r-- | generator/database.h | 73 | ||||
| -rw-r--r-- | generator/field.cpp | 193 | ||||
| -rw-r--r-- | generator/field.h | 76 | ||||
| -rw-r--r-- | generator/form.h | 1 | ||||
| -rw-r--r-- | generator/generator.cpp | 161 | ||||
| -rw-r--r-- | generator/generator.h | 2 | ||||
| -rw-r--r-- | generator/notion.cpp | 17 | ||||
| -rw-r--r-- | generator/notion.h | 2 | ||||
| -rw-r--r-- | lib/util.h | 61 |
11 files changed, 105 insertions, 659 deletions
| diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..73d4d61 --- /dev/null +++ b/.gitignore | |||
| @@ -0,0 +1,5 @@ | |||
| 1 | CMakeFiles | ||
| 2 | CMakeCache.txt | ||
| 3 | cmake_install.cmake | ||
| 4 | Makefile | ||
| 5 | .DS_Store | ||
| diff --git a/generator/database.cpp b/generator/database.cpp deleted file mode 100644 index 188fa2a..0000000 --- a/generator/database.cpp +++ /dev/null | |||
| @@ -1,173 +0,0 @@ | |||
| 1 | #include "database.h" | ||
| 2 | #include <sqlite3.h> | ||
| 3 | #include <cassert> | ||
| 4 | #include <fstream> | ||
| 5 | #include <stdexcept> | ||
| 6 | #include <cstdio> | ||
| 7 | #include <sstream> | ||
| 8 | #include "field.h" | ||
| 9 | #include "../lib/util.h" | ||
| 10 | |||
| 11 | namespace verbly { | ||
| 12 | namespace generator { | ||
| 13 | |||
| 14 | sqlite3_error::sqlite3_error( | ||
| 15 | const std::string& what, | ||
| 16 | const std::string& db_err) : | ||
| 17 | what_(what + " (" + db_err + ")"), | ||
| 18 | db_err_(db_err) | ||
| 19 | { | ||
| 20 | } | ||
| 21 | |||
| 22 | const char* sqlite3_error::what() const noexcept | ||
| 23 | { | ||
| 24 | return what_.c_str(); | ||
| 25 | } | ||
| 26 | |||
| 27 | const char* sqlite3_error::db_err() const noexcept | ||
| 28 | { | ||
| 29 | return db_err_.c_str(); | ||
| 30 | } | ||
| 31 | |||
| 32 | database::database(std::string path) | ||
| 33 | { | ||
| 34 | // If there is already a file at this path, overwrite it. | ||
| 35 | if (std::ifstream(path)) | ||
| 36 | { | ||
| 37 | if (std::remove(path.c_str())) | ||
| 38 | { | ||
| 39 | throw std::logic_error("Could not overwrite file at path"); | ||
| 40 | } | ||
| 41 | } | ||
| 42 | |||
| 43 | if (sqlite3_open_v2(path.c_str(), &ppdb_, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE, NULL) != SQLITE_OK) | ||
| 44 | { | ||
| 45 | // We still have to free the resources allocated. In the event that | ||
| 46 | // allocation failed, ppdb will be null and sqlite3_close_v2 will just | ||
| 47 | // ignore it. | ||
| 48 | std::string errmsg(sqlite3_errmsg(ppdb_)); | ||
| 49 | sqlite3_close_v2(ppdb_); | ||
| 50 | |||
| 51 | throw sqlite3_error("Could not create output datafile", errmsg); | ||
| 52 | } | ||
| 53 | } | ||
| 54 | |||
| 55 | database::database(database&& other) : database() | ||
| 56 | { | ||
| 57 | swap(*this, other); | ||
| 58 | } | ||
| 59 | |||
| 60 | database& database::operator=(database&& other) | ||
| 61 | { | ||
| 62 | swap(*this, other); | ||
| 63 | |||
| 64 | return *this; | ||
| 65 | } | ||
| 66 | |||
| 67 | void swap(database& first, database& second) | ||
| 68 | { | ||
| 69 | std::swap(first.ppdb_, second.ppdb_); | ||
| 70 | } | ||
| 71 | |||
| 72 | database::~database() | ||
| 73 | { | ||
| 74 | sqlite3_close_v2(ppdb_); | ||
| 75 | } | ||
| 76 | |||
| 77 | void database::runQuery(std::string query) | ||
| 78 | { | ||
| 79 | // This can only happen when doing bad things with move semantics. | ||
| 80 | assert(ppdb_ != nullptr); | ||
| 81 | |||
| 82 | sqlite3_stmt* ppstmt; | ||
| 83 | |||
| 84 | if (sqlite3_prepare_v2(ppdb_, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) | ||
| 85 | { | ||
| 86 | throw sqlite3_error("Error writing to database", sqlite3_errmsg(ppdb_)); | ||
| 87 | } | ||
| 88 | |||
| 89 | int result = sqlite3_step(ppstmt); | ||
| 90 | sqlite3_finalize(ppstmt); | ||
| 91 | |||
| 92 | if (result != SQLITE_DONE) | ||
| 93 | { | ||
| 94 | throw sqlite3_error("Error writing to database", sqlite3_errmsg(ppdb_)); | ||
| 95 | } | ||
| 96 | } | ||
| 97 | |||
| 98 | void database::insertIntoTable(std::string table, std::list<field> fields) | ||
| 99 | { | ||
| 100 | // This can only happen when doing bad things with move semantics. | ||
| 101 | assert(ppdb_ != nullptr); | ||
| 102 | |||
| 103 | // This shouldn't happen. | ||
| 104 | assert(!fields.empty()); | ||
| 105 | |||
| 106 | std::list<std::string> fieldNames; | ||
| 107 | std::list<std::string> qs; | ||
| 108 | for (field& f : fields) | ||
| 109 | { | ||
| 110 | fieldNames.push_back(f.getName()); | ||
| 111 | qs.push_back("?"); | ||
| 112 | } | ||
| 113 | |||
| 114 | std::ostringstream query; | ||
| 115 | query << "INSERT INTO "; | ||
| 116 | query << table; | ||
| 117 | query << " ("; | ||
| 118 | query << implode(std::begin(fieldNames), std::end(fieldNames), ", "); | ||
| 119 | query << ") VALUES ("; | ||
| 120 | query << implode(std::begin(qs), std::end(qs), ", "); | ||
| 121 | query << ")"; | ||
| 122 | |||
| 123 | std::string query_str = query.str(); | ||
| 124 | |||
| 125 | sqlite3_stmt* ppstmt; | ||
| 126 | |||
| 127 | if (sqlite3_prepare_v2(ppdb_, query_str.c_str(), query_str.length(), &ppstmt, NULL) != SQLITE_OK) | ||
| 128 | { | ||
| 129 | throw sqlite3_error("Error writing to database", sqlite3_errmsg(ppdb_)); | ||
| 130 | } | ||
| 131 | |||
| 132 | int i = 1; | ||
| 133 | for (field& f : fields) | ||
| 134 | { | ||
| 135 | switch (f.getType()) | ||
| 136 | { | ||
| 137 | case field::type::integer: | ||
| 138 | { | ||
| 139 | sqlite3_bind_int(ppstmt, i, f.getInteger()); | ||
| 140 | |||
| 141 | break; | ||
| 142 | } | ||
| 143 | |||
| 144 | case field::type::string: | ||
| 145 | { | ||
| 146 | sqlite3_bind_text(ppstmt, i, f.getString().c_str(), f.getString().length(), SQLITE_TRANSIENT); | ||
| 147 | |||
| 148 | break; | ||
| 149 | } | ||
| 150 | |||
| 151 | case field::type::invalid: | ||
| 152 | { | ||
| 153 | // Fields can only be invalid when doing bad things with move semantics. | ||
| 154 | assert(false); | ||
| 155 | |||
| 156 | break; | ||
| 157 | } | ||
| 158 | } | ||
| 159 | |||
| 160 | i++; | ||
| 161 | } | ||
| 162 | |||
| 163 | int result = sqlite3_step(ppstmt); | ||
| 164 | sqlite3_finalize(ppstmt); | ||
| 165 | |||
| 166 | if (result != SQLITE_DONE) | ||
| 167 | { | ||
| 168 | throw sqlite3_error("Error writing to database", sqlite3_errmsg(ppdb_)); | ||
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | }; | ||
| 173 | }; | ||
| diff --git a/generator/database.h b/generator/database.h deleted file mode 100644 index 7906304..0000000 --- a/generator/database.h +++ /dev/null | |||
| @@ -1,73 +0,0 @@ | |||
| 1 | #ifndef DATABASE_H_0B0A47D2 | ||
| 2 | #define DATABASE_H_0B0A47D2 | ||
| 3 | |||
| 4 | #include <string> | ||
| 5 | #include <exception> | ||
| 6 | #include <list> | ||
| 7 | |||
| 8 | struct sqlite3; | ||
| 9 | |||
| 10 | namespace verbly { | ||
| 11 | namespace generator { | ||
| 12 | |||
| 13 | class field; | ||
| 14 | |||
| 15 | class sqlite3_error : public std::exception { | ||
| 16 | public: | ||
| 17 | |||
| 18 | sqlite3_error(const std::string& what, const std::string& db_err); | ||
| 19 | |||
| 20 | const char* what() const noexcept override; | ||
| 21 | const char* db_err() const noexcept; | ||
| 22 | |||
| 23 | private: | ||
| 24 | std::string what_; | ||
| 25 | std::string db_err_; | ||
| 26 | |||
| 27 | }; | ||
| 28 | |||
| 29 | class database { | ||
| 30 | public: | ||
| 31 | |||
| 32 | // Constructor | ||
| 33 | |||
| 34 | explicit database(std::string path); | ||
| 35 | |||
| 36 | // Disable copying | ||
| 37 | |||
| 38 | database(const database& other) = delete; | ||
| 39 | database& operator=(const database& other) = delete; | ||
| 40 | |||
| 41 | // Move constructor and move assignment | ||
| 42 | |||
| 43 | database(database&& other); | ||
| 44 | database& operator=(database&& other); | ||
| 45 | |||
| 46 | // Swap | ||
| 47 | |||
| 48 | friend void swap(database& first, database& second); | ||
| 49 | |||
| 50 | // Destructor | ||
| 51 | |||
| 52 | ~database(); | ||
| 53 | |||
| 54 | // Actions | ||
| 55 | |||
| 56 | void runQuery(std::string query); | ||
| 57 | |||
| 58 | void insertIntoTable(std::string table, std::list<field> fields); | ||
| 59 | |||
| 60 | private: | ||
| 61 | |||
| 62 | database() | ||
| 63 | { | ||
| 64 | } | ||
| 65 | |||
| 66 | sqlite3* ppdb_ = nullptr; | ||
| 67 | |||
| 68 | }; | ||
| 69 | |||
| 70 | }; | ||
| 71 | }; | ||
| 72 | |||
| 73 | #endif /* end of include guard: DATABASE_H_0B0A47D2 */ | ||
| diff --git a/generator/field.cpp b/generator/field.cpp deleted file mode 100644 index 84b2f91..0000000 --- a/generator/field.cpp +++ /dev/null | |||
| @@ -1,193 +0,0 @@ | |||
| 1 | #include "field.h" | ||
| 2 | #include <stdexcept> | ||
| 3 | #include <utility> | ||
| 4 | |||
| 5 | namespace verbly { | ||
| 6 | namespace generator { | ||
| 7 | |||
| 8 | field::field(const field& other) | ||
| 9 | { | ||
| 10 | type_ = other.type_; | ||
| 11 | name_ = other.name_; | ||
| 12 | |||
| 13 | switch (type_) | ||
| 14 | { | ||
| 15 | case type::integer: | ||
| 16 | { | ||
| 17 | integer_ = other.integer_; | ||
| 18 | |||
| 19 | break; | ||
| 20 | } | ||
| 21 | |||
| 22 | case type::string: | ||
| 23 | { | ||
| 24 | new(&string_) std::string(other.string_); | ||
| 25 | |||
| 26 | break; | ||
| 27 | } | ||
| 28 | |||
| 29 | case type::invalid: | ||
| 30 | { | ||
| 31 | break; | ||
| 32 | } | ||
| 33 | } | ||
| 34 | } | ||
| 35 | |||
| 36 | field::field(field&& other) : field() | ||
| 37 | { | ||
| 38 | swap(*this, other); | ||
| 39 | } | ||
| 40 | |||
| 41 | field& field::operator=(field other) | ||
| 42 | { | ||
| 43 | swap(*this, other); | ||
| 44 | |||
| 45 | return *this; | ||
| 46 | } | ||
| 47 | |||
| 48 | void swap(field& first, field& second) | ||
| 49 | { | ||
| 50 | using type = field::type; | ||
| 51 | |||
| 52 | type tempType = first.type_; | ||
| 53 | std::string tempName = std::move(first.name_); | ||
| 54 | int tempInteger; | ||
| 55 | std::string tempString; | ||
| 56 | |||
| 57 | switch (first.type_) | ||
| 58 | { | ||
| 59 | case type::integer: | ||
| 60 | { | ||
| 61 | tempInteger = first.integer_; | ||
| 62 | |||
| 63 | break; | ||
| 64 | } | ||
| 65 | |||
| 66 | case type::string: | ||
| 67 | { | ||
| 68 | tempString = std::move(tempString); | ||
| 69 | |||
| 70 | break; | ||
| 71 | } | ||
| 72 | |||
| 73 | case type::invalid: | ||
| 74 | { | ||
| 75 | break; | ||
| 76 | } | ||
| 77 | } | ||
| 78 | |||
| 79 | first.~field(); | ||
| 80 | |||
| 81 | first.type_ = second.type_; | ||
| 82 | first.name_ = std::move(second.name_); | ||
| 83 | |||
| 84 | switch (second.type_) | ||
| 85 | { | ||
| 86 | case type::integer: | ||
| 87 | { | ||
| 88 | first.integer_ = second.integer_; | ||
| 89 | |||
| 90 | break; | ||
| 91 | } | ||
| 92 | |||
| 93 | case type::string: | ||
| 94 | { | ||
| 95 | new(&first.string_) std::string(std::move(second.string_)); | ||
| 96 | |||
| 97 | break; | ||
| 98 | } | ||
| 99 | |||
| 100 | case type::invalid: | ||
| 101 | { | ||
| 102 | break; | ||
| 103 | } | ||
| 104 | } | ||
| 105 | |||
| 106 | second.~field(); | ||
| 107 | |||
| 108 | second.type_ = tempType; | ||
| 109 | second.name_ = std::move(tempName); | ||
| 110 | |||
| 111 | switch (tempType) | ||
| 112 | { | ||
| 113 | case type::integer: | ||
| 114 | { | ||
| 115 | second.integer_ = tempInteger; | ||
| 116 | |||
| 117 | break; | ||
| 118 | } | ||
| 119 | |||
| 120 | case type::string: | ||
| 121 | { | ||
| 122 | new(&second.string_) std::string(std::move(tempString)); | ||
| 123 | |||
| 124 | break; | ||
| 125 | } | ||
| 126 | |||
| 127 | case type::invalid: | ||
| 128 | { | ||
| 129 | break; | ||
| 130 | } | ||
| 131 | } | ||
| 132 | } | ||
| 133 | |||
| 134 | field::~field() | ||
| 135 | { | ||
| 136 | switch (type_) | ||
| 137 | { | ||
| 138 | case type::string: | ||
| 139 | { | ||
| 140 | using string_type = std::string; | ||
| 141 | string_.~string_type(); | ||
| 142 | |||
| 143 | break; | ||
| 144 | } | ||
| 145 | |||
| 146 | case type::integer: | ||
| 147 | case type::invalid: | ||
| 148 | { | ||
| 149 | break; | ||
| 150 | } | ||
| 151 | } | ||
| 152 | } | ||
| 153 | |||
| 154 | field::field( | ||
| 155 | std::string name, | ||
| 156 | int arg) : | ||
| 157 | type_(type::integer), | ||
| 158 | name_(name), | ||
| 159 | integer_(arg) | ||
| 160 | { | ||
| 161 | } | ||
| 162 | |||
| 163 | int field::getInteger() const | ||
| 164 | { | ||
| 165 | if (type_ != type::integer) | ||
| 166 | { | ||
| 167 | throw std::domain_error("field::getInteger called on non-integer field"); | ||
| 168 | } | ||
| 169 | |||
| 170 | return integer_; | ||
| 171 | } | ||
| 172 | |||
| 173 | field::field( | ||
| 174 | std::string name, | ||
| 175 | std::string arg) : | ||
| 176 | type_(type::string), | ||
| 177 | name_(name) | ||
| 178 | { | ||
| 179 | new(&string_) std::string(arg); | ||
| 180 | } | ||
| 181 | |||
| 182 | std::string field::getString() const | ||
| 183 | { | ||
| 184 | if (type_ != type::string) | ||
| 185 | { | ||
| 186 | throw std::domain_error("field::getString called on non-string field"); | ||
| 187 | } | ||
| 188 | |||
| 189 | return string_; | ||
| 190 | } | ||
| 191 | |||
| 192 | }; | ||
| 193 | }; | ||
| diff --git a/generator/field.h b/generator/field.h deleted file mode 100644 index aaca3fa..0000000 --- a/generator/field.h +++ /dev/null | |||
| @@ -1,76 +0,0 @@ | |||
| 1 | #ifndef BINDING_H_CAE0B18E | ||
| 2 | #define BINDING_H_CAE0B18E | ||
| 3 | |||
| 4 | #include <string> | ||
| 5 | |||
| 6 | namespace verbly { | ||
| 7 | namespace generator { | ||
| 8 | |||
| 9 | class field { | ||
| 10 | public: | ||
| 11 | enum class type { | ||
| 12 | invalid, | ||
| 13 | integer, | ||
| 14 | string | ||
| 15 | }; | ||
| 16 | |||
| 17 | // Copy and move constructors | ||
| 18 | |||
| 19 | field(const field& other); | ||
| 20 | field(field&& other); | ||
| 21 | |||
| 22 | // Assignment | ||
| 23 | |||
| 24 | field& operator=(field other); | ||
| 25 | |||
| 26 | // Swap | ||
| 27 | |||
| 28 | friend void swap(field& first, field& second); | ||
| 29 | |||
| 30 | // Destructor | ||
| 31 | |||
| 32 | ~field(); | ||
| 33 | |||
| 34 | // Generic accessors | ||
| 35 | |||
| 36 | type getType() const | ||
| 37 | { | ||
| 38 | return type_; | ||
| 39 | } | ||
| 40 | |||
| 41 | std::string getName() const | ||
| 42 | { | ||
| 43 | return name_; | ||
| 44 | } | ||
| 45 | |||
| 46 | // Integer | ||
| 47 | |||
| 48 | field(std::string name, int arg); | ||
| 49 | |||
| 50 | int getInteger() const; | ||
| 51 | |||
| 52 | // String | ||
| 53 | |||
| 54 | field(std::string name, std::string arg); | ||
| 55 | |||
| 56 | std::string getString() const; | ||
| 57 | |||
| 58 | private: | ||
| 59 | |||
| 60 | field() | ||
| 61 | { | ||
| 62 | } | ||
| 63 | |||
| 64 | union { | ||
| 65 | int integer_; | ||
| 66 | std::string string_; | ||
| 67 | }; | ||
| 68 | |||
| 69 | type type_ = type::invalid; | ||
| 70 | std::string name_; | ||
| 71 | }; | ||
| 72 | |||
| 73 | }; | ||
| 74 | }; | ||
| 75 | |||
| 76 | #endif /* end of include guard: BINDING_H_CAE0B18E */ | ||
| diff --git a/generator/form.h b/generator/form.h index 5a2de30..37fd3cc 100644 --- a/generator/form.h +++ b/generator/form.h | |||
| @@ -8,7 +8,6 @@ namespace verbly { | |||
| 8 | namespace generator { | 8 | namespace generator { |
| 9 | 9 | ||
| 10 | class pronunciation; | 10 | class pronunciation; |
| 11 | class database; | ||
| 12 | 11 | ||
| 13 | class form { | 12 | class form { |
| 14 | public: | 13 | public: |
| diff --git a/generator/generator.cpp b/generator/generator.cpp index d774bd9..e34ca69 100644 --- a/generator/generator.cpp +++ b/generator/generator.cpp | |||
| @@ -594,7 +594,12 @@ namespace verbly { | |||
| 594 | fields.emplace_back("major", DATABASE_MAJOR_VERSION); | 594 | fields.emplace_back("major", DATABASE_MAJOR_VERSION); |
| 595 | fields.emplace_back("minor", DATABASE_MINOR_VERSION); | 595 | fields.emplace_back("minor", DATABASE_MINOR_VERSION); |
| 596 | 596 | ||
| 597 | db_.insertIntoTable("version", std::move(fields)); | 597 | db_.insertIntoTable( |
| 598 | "version", | ||
| 599 | { | ||
| 600 | { "major", DATABASE_MAJOR_VERSION }, | ||
| 601 | { "minor", DATABASE_MINOR_VERSION } | ||
| 602 | }); | ||
| 598 | } | 603 | } |
| 599 | 604 | ||
| 600 | void generator::dumpObjects() | 605 | void generator::dumpObjects() |
| @@ -689,11 +694,12 @@ namespace verbly { | |||
| 689 | word& word1 = *wordByWnidAndWnum_.at(lookup1); | 694 | word& word1 = *wordByWnidAndWnum_.at(lookup1); |
| 690 | word& word2 = *wordByWnidAndWnum_.at(lookup2); | 695 | word& word2 = *wordByWnidAndWnum_.at(lookup2); |
| 691 | 696 | ||
| 692 | std::list<field> fields; | 697 | db_.insertIntoTable( |
| 693 | fields.emplace_back("antonym_1_id", word1.getId()); | 698 | "antonymy", |
| 694 | fields.emplace_back("antonym_2_id", word2.getId()); | 699 | { |
| 695 | 700 | { "antonym_1_id", word1.getId() }, | |
| 696 | db_.insertIntoTable("antonymy", std::move(fields)); | 701 | { "antonym_2_id", word2.getId() } |
| 702 | }); | ||
| 697 | } | 703 | } |
| 698 | } | 704 | } |
| 699 | } | 705 | } |
| @@ -721,11 +727,12 @@ namespace verbly { | |||
| 721 | notion& notion1 = *notionByWnid_.at(lookup1); | 727 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 722 | notion& notion2 = *notionByWnid_.at(lookup2); | 728 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 723 | 729 | ||
| 724 | std::list<field> fields; | 730 | db_.insertIntoTable( |
| 725 | fields.emplace_back("noun_id", notion1.getId()); | 731 | "variation", |
| 726 | fields.emplace_back("adjective_id", notion2.getId()); | 732 | { |
| 727 | 733 | { "noun_id", notion1.getId() } | |
| 728 | db_.insertIntoTable("variation", std::move(fields)); | 734 | { "adjective_id", notion2.getId() } |
| 735 | }); | ||
| 729 | } | 736 | } |
| 730 | } | 737 | } |
| 731 | } | 738 | } |
| @@ -786,11 +793,12 @@ namespace verbly { | |||
| 786 | { | 793 | { |
| 787 | for (int word2 : rightJoin) | 794 | for (int word2 : rightJoin) |
| 788 | { | 795 | { |
| 789 | std::list<field> fields; | 796 | db_.insertIntoTable( |
| 790 | fields.emplace_back("term_id", word1); | 797 | table_name, |
| 791 | fields.emplace_back("domain_id", word2); | 798 | { |
| 792 | 799 | { "term_id", word1 }, | |
| 793 | db_.insertIntoTable(table_name, std::move(fields)); | 800 | { "domain_id", word2 } |
| 801 | }); | ||
| 794 | } | 802 | } |
| 795 | } | 803 | } |
| 796 | } | 804 | } |
| @@ -819,11 +827,12 @@ namespace verbly { | |||
| 819 | notion& notion1 = *notionByWnid_.at(lookup1); | 827 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 820 | notion& notion2 = *notionByWnid_.at(lookup2); | 828 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 821 | 829 | ||
| 822 | std::list<field> fields; | 830 | db_.insertIntoTable( |
| 823 | fields.emplace_back("effect_id", notion1.getId()); | 831 | "causality", |
| 824 | fields.emplace_back("cause_id", notion2.getId()); | 832 | { |
| 825 | 833 | { "effect_id", notion1.getId() }, | |
| 826 | db_.insertIntoTable("causality", std::move(fields)); | 834 | { "cause_id", notion2.getId() } |
| 835 | }); | ||
| 827 | } | 836 | } |
| 828 | } | 837 | } |
| 829 | } | 838 | } |
| @@ -851,11 +860,12 @@ namespace verbly { | |||
| 851 | notion& notion1 = *notionByWnid_.at(lookup1); | 860 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 852 | notion& notion2 = *notionByWnid_.at(lookup2); | 861 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 853 | 862 | ||
| 854 | std::list<field> fields; | 863 | db_.insertIntoTable( |
| 855 | fields.emplace_back("given_id", notion1.getId()); | 864 | "entailment", |
| 856 | fields.emplace_back("entailment_id", notion2.getId()); | 865 | { |
| 857 | 866 | { "given_id", notion1.getId() }, | |
| 858 | db_.insertIntoTable("entailment", std::move(fields)); | 867 | { "entailment_id", notion2.getId() } |
| 868 | }); | ||
| 859 | } | 869 | } |
| 860 | } | 870 | } |
| 861 | } | 871 | } |
| @@ -883,11 +893,12 @@ namespace verbly { | |||
| 883 | notion& notion1 = *notionByWnid_.at(lookup1); | 893 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 884 | notion& notion2 = *notionByWnid_.at(lookup2); | 894 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 885 | 895 | ||
| 886 | std::list<field> fields; | 896 | db_.insertIntoTable( |
| 887 | fields.emplace_back("hyponym_id", notion1.getId()); | 897 | "hypernymy", |
| 888 | fields.emplace_back("hypernym_id", notion2.getId()); | 898 | { |
| 889 | 899 | { "hyponym_id", notion1.getId() }, | |
| 890 | db_.insertIntoTable("hypernymy", std::move(fields)); | 900 | { "hypernym_id", notion2.getId() } |
| 901 | }); | ||
| 891 | } | 902 | } |
| 892 | } | 903 | } |
| 893 | } | 904 | } |
| @@ -915,11 +926,12 @@ namespace verbly { | |||
| 915 | notion& notion1 = *notionByWnid_.at(lookup1); | 926 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 916 | notion& notion2 = *notionByWnid_.at(lookup2); | 927 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 917 | 928 | ||
| 918 | std::list<field> fields; | 929 | db_.insertIntoTable( |
| 919 | fields.emplace_back("instance_id", notion1.getId()); | 930 | "instantiation", |
| 920 | fields.emplace_back("class_id", notion2.getId()); | 931 | { |
| 921 | 932 | { "instance_id", notion1.getId() }, | |
| 922 | db_.insertIntoTable("instantiation", std::move(fields)); | 933 | { "class_id", notion2.getId() } |
| 934 | }); | ||
| 923 | } | 935 | } |
| 924 | } | 936 | } |
| 925 | } | 937 | } |
| @@ -947,11 +959,12 @@ namespace verbly { | |||
| 947 | notion& notion1 = *notionByWnid_.at(lookup1); | 959 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 948 | notion& notion2 = *notionByWnid_.at(lookup2); | 960 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 949 | 961 | ||
| 950 | std::list<field> fields; | 962 | db_.insertIntoTable( |
| 951 | fields.emplace_back("holonym_id", notion1.getId()); | 963 | "member_meronymy", |
| 952 | fields.emplace_back("meronym_id", notion2.getId()); | 964 | { |
| 953 | 965 | { "holonym_id", notion1.getId() }, | |
| 954 | db_.insertIntoTable("member_meronymy", std::move(fields)); | 966 | { "meronym_id", notion2.getId() } |
| 967 | }); | ||
| 955 | } | 968 | } |
| 956 | } | 969 | } |
| 957 | } | 970 | } |
| @@ -979,11 +992,12 @@ namespace verbly { | |||
| 979 | notion& notion1 = *notionByWnid_.at(lookup1); | 992 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 980 | notion& notion2 = *notionByWnid_.at(lookup2); | 993 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 981 | 994 | ||
| 982 | std::list<field> fields; | 995 | db_.insertIntoTable( |
| 983 | fields.emplace_back("holonym_id", notion1.getId()); | 996 | "part_meronymy", |
| 984 | fields.emplace_back("meronym_id", notion2.getId()); | 997 | { |
| 985 | 998 | { "holonym_id", notion1.getId() }, | |
| 986 | db_.insertIntoTable("part_meronymy", std::move(fields)); | 999 | { "meronym_id", notion2.getId() } |
| 1000 | }); | ||
| 987 | } | 1001 | } |
| 988 | } | 1002 | } |
| 989 | } | 1003 | } |
| @@ -1011,11 +1025,12 @@ namespace verbly { | |||
| 1011 | notion& notion1 = *notionByWnid_.at(lookup1); | 1025 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 1012 | notion& notion2 = *notionByWnid_.at(lookup2); | 1026 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 1013 | 1027 | ||
| 1014 | std::list<field> fields; | 1028 | db_.insertIntoTable( |
| 1015 | fields.emplace_back("holonym_id", notion1.getId()); | 1029 | "substance_meronymy", |
| 1016 | fields.emplace_back("meronym_id", notion2.getId()); | 1030 | { |
| 1017 | 1031 | { "holonym_id", notion1.getId() }, | |
| 1018 | db_.insertIntoTable("substance_meronymy", std::move(fields)); | 1032 | { "meronym_id", notion2.getId() } |
| 1033 | }); | ||
| 1019 | } | 1034 | } |
| 1020 | } | 1035 | } |
| 1021 | } | 1036 | } |
| @@ -1045,18 +1060,20 @@ namespace verbly { | |||
| 1045 | 1060 | ||
| 1046 | if (word1.getNotion().getPartOfSpeech() == part_of_speech::adjective) | 1061 | if (word1.getNotion().getPartOfSpeech() == part_of_speech::adjective) |
| 1047 | { | 1062 | { |
| 1048 | std::list<field> fields; | 1063 | db_.insertIntoTable( |
| 1049 | fields.emplace_back("pertainym_id", word1.getId()); | 1064 | "pertainymy", |
| 1050 | fields.emplace_back("noun_id", word2.getId()); | 1065 | { |
| 1051 | 1066 | { "pertainym_id", word1.getId() }, | |
| 1052 | db_.insertIntoTable("pertainymy", std::move(fields)); | 1067 | { "noun_id", word2.getId() } |
| 1068 | }); | ||
| 1053 | } else if (word1.getNotion().getPartOfSpeech() == part_of_speech::adverb) | 1069 | } else if (word1.getNotion().getPartOfSpeech() == part_of_speech::adverb) |
| 1054 | { | 1070 | { |
| 1055 | std::list<field> fields; | 1071 | db_.insertIntoTable( |
| 1056 | fields.emplace_back("mannernym_id", word1.getId()); | 1072 | "mannernymy", |
| 1057 | fields.emplace_back("adjective_id", word2.getId()); | 1073 | { |
| 1058 | 1074 | { "mannernym_id", word1.getId() }, | |
| 1059 | db_.insertIntoTable("mannernymy", std::move(fields)); | 1075 | { "adjective_id", word2.getId() } |
| 1076 | }); | ||
| 1060 | } | 1077 | } |
| 1061 | } | 1078 | } |
| 1062 | } | 1079 | } |
| @@ -1085,11 +1102,12 @@ namespace verbly { | |||
| 1085 | word& word1 = *wordByWnidAndWnum_.at(lookup1); | 1102 | word& word1 = *wordByWnidAndWnum_.at(lookup1); |
| 1086 | word& word2 = *wordByWnidAndWnum_.at(lookup2); | 1103 | word& word2 = *wordByWnidAndWnum_.at(lookup2); |
| 1087 | 1104 | ||
| 1088 | std::list<field> fields; | 1105 | db_.insertIntoTable( |
| 1089 | fields.emplace_back("general_id", word1.getId()); | 1106 | "specification", |
| 1090 | fields.emplace_back("specific_id", word2.getId()); | 1107 | { |
| 1091 | 1108 | { "general_id", word1.getId() }, | |
| 1092 | db_.insertIntoTable("specification", std::move(fields)); | 1109 | { "specific_id", word2.getId() } |
| 1110 | }); | ||
| 1093 | } | 1111 | } |
| 1094 | } | 1112 | } |
| 1095 | } | 1113 | } |
| @@ -1117,11 +1135,12 @@ namespace verbly { | |||
| 1117 | notion& notion1 = *notionByWnid_.at(lookup1); | 1135 | notion& notion1 = *notionByWnid_.at(lookup1); |
| 1118 | notion& notion2 = *notionByWnid_.at(lookup2); | 1136 | notion& notion2 = *notionByWnid_.at(lookup2); |
| 1119 | 1137 | ||
| 1120 | std::list<field> fields; | 1138 | db_.insertIntoTable( |
| 1121 | fields.emplace_back("adjective_1_id", notion1.getId()); | 1139 | "similarity", |
| 1122 | fields.emplace_back("adjective_2_id", notion2.getId()); | 1140 | { |
| 1123 | 1141 | { "adjective_1_id", notion1.getId() }, | |
| 1124 | db_.insertIntoTable("similarity", std::move(fields)); | 1142 | { "adjective_2_id", notion2.getId() } |
| 1143 | }); | ||
| 1125 | } | 1144 | } |
| 1126 | } | 1145 | } |
| 1127 | } | 1146 | } |
| diff --git a/generator/generator.h b/generator/generator.h index 5458c97..52073bc 100644 --- a/generator/generator.h +++ b/generator/generator.h | |||
| @@ -120,7 +120,7 @@ namespace verbly { | |||
| 120 | 120 | ||
| 121 | // Output | 121 | // Output |
| 122 | 122 | ||
| 123 | database db_; | 123 | hatkirby::database db_; |
| 124 | 124 | ||
| 125 | // Data | 125 | // Data |
| 126 | 126 | ||
| diff --git a/generator/notion.cpp b/generator/notion.cpp index 1878ba9..35ba7b1 100644 --- a/generator/notion.cpp +++ b/generator/notion.cpp | |||
| @@ -46,10 +46,11 @@ namespace verbly { | |||
| 46 | { | 46 | { |
| 47 | // First, serialize the notion | 47 | // First, serialize the notion |
| 48 | { | 48 | { |
| 49 | std::list<field> fields; | 49 | std::list<hatkirby::column> fields; |
| 50 | 50 | ||
| 51 | fields.emplace_back("notion_id", arg.getId()); | 51 | fields.emplace_back("notion_id", arg.getId()); |
| 52 | fields.emplace_back("part_of_speech", static_cast<int>(arg.getPartOfSpeech())); | 52 | fields.emplace_back("part_of_speech", |
| 53 | static_cast<int>(arg.getPartOfSpeech())); | ||
| 53 | 54 | ||
| 54 | if (arg.hasWnid()) | 55 | if (arg.hasWnid()) |
| 55 | { | 56 | { |
| @@ -69,12 +70,12 @@ namespace verbly { | |||
| 69 | { | 70 | { |
| 70 | for (std::string group : arg.getPrepositionGroups()) | 71 | for (std::string group : arg.getPrepositionGroups()) |
| 71 | { | 72 | { |
| 72 | std::list<field> fields; | 73 | db.insertIntoTable( |
| 73 | 74 | "is_a", | |
| 74 | fields.emplace_back("notion_id", arg.getId()); | 75 | { |
| 75 | fields.emplace_back("groupname", group); | 76 | { "notion_id", arg.getId() }, |
| 76 | 77 | { "groupname", group } | |
| 77 | db.insertIntoTable("is_a", std::move(fields)); | 78 | }); |
| 78 | } | 79 | } |
| 79 | } | 80 | } |
| 80 | 81 | ||
| diff --git a/generator/notion.h b/generator/notion.h index 6e38497..817e66a 100644 --- a/generator/notion.h +++ b/generator/notion.h | |||
| @@ -9,8 +9,6 @@ | |||
| 9 | namespace verbly { | 9 | namespace verbly { |
| 10 | namespace generator { | 10 | namespace generator { |
| 11 | 11 | ||
| 12 | class database; | ||
| 13 | |||
| 14 | class notion { | 12 | class notion { |
| 15 | public: | 13 | public: |
| 16 | 14 | ||
| diff --git a/lib/util.h b/lib/util.h deleted file mode 100644 index 9db8678..0000000 --- a/lib/util.h +++ /dev/null | |||
| @@ -1,61 +0,0 @@ | |||
| 1 | #ifndef UTIL_H_15DDCA2D | ||
| 2 | #define UTIL_H_15DDCA2D | ||
| 3 | |||
| 4 | #include <string> | ||
| 5 | #include <sstream> | ||
| 6 | #include <iterator> | ||
| 7 | |||
| 8 | namespace verbly { | ||
| 9 | |||
| 10 | template <class InputIterator> | ||
| 11 | std::string implode(InputIterator first, InputIterator last, std::string delimiter) | ||
| 12 | { | ||
| 13 | std::stringstream result; | ||
| 14 | |||
| 15 | for (InputIterator it = first; it != last; it++) | ||
| 16 | { | ||
| 17 | if (it != first) | ||
| 18 | { | ||
| 19 | result << delimiter; | ||
| 20 | } | ||
| 21 | |||
| 22 | result << *it; | ||
| 23 | } | ||
| 24 | |||
| 25 | return result.str(); | ||
| 26 | } | ||
| 27 | |||
| 28 | template <class OutputIterator> | ||
| 29 | void split(std::string input, std::string delimiter, OutputIterator out) | ||
| 30 | { | ||
| 31 | while (!input.empty()) | ||
| 32 | { | ||
| 33 | int divider = input.find(delimiter); | ||
| 34 | if (divider == std::string::npos) | ||
| 35 | { | ||
| 36 | *out = input; | ||
| 37 | out++; | ||
| 38 | |||
| 39 | input = ""; | ||
| 40 | } else { | ||
| 41 | *out = input.substr(0, divider); | ||
| 42 | out++; | ||
| 43 | |||
| 44 | input = input.substr(divider+delimiter.length()); | ||
| 45 | } | ||
| 46 | } | ||
| 47 | } | ||
| 48 | |||
| 49 | template <class Container> | ||
| 50 | Container split(std::string input, std::string delimiter) | ||
| 51 | { | ||
| 52 | Container result; | ||
| 53 | |||
| 54 | split(input, delimiter, std::back_inserter(result)); | ||
| 55 | |||
| 56 | return result; | ||
| 57 | } | ||
| 58 | |||
| 59 | }; | ||
| 60 | |||
| 61 | #endif /* end of include guard: UTIL_H_15DDCA2D */ | ||
