From 9bd863c9002b525b7827f9158d9136143393be5c Mon Sep 17 00:00:00 2001 From: Kelly Rauchenberger Date: Mon, 23 Jan 2017 11:49:51 -0500 Subject: Added verb frame parsing --- lib/frame.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 7 deletions(-) (limited to 'lib/frame.cpp') 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 @@ #include "frame.h" #include +#include namespace verbly { - + const object frame::objectType = object::frame; - + const std::list frame::select = {"frame_id", "data"}; - + const field frame::id = field::integerField(object::frame, "frame_id"); - + const field frame::group = field::joinThrough(object::frame, "frame_id", object::group, "groups_frames", "group_id"); - + frame::frame(const database& db, sqlite3_stmt* row) : db_(&db), valid_(true) { id_ = sqlite3_column_int(row, 0); - + // TODO: Initialize frame data from row. + std::string partsJsonStr(reinterpret_cast(sqlite3_column_blob(row, 1))); + nlohmann::json partsJson = nlohmann::json::parse(std::move(partsJsonStr)); + + for (const nlohmann::json& partJson : partsJson) + { + part::type partType = static_cast(partJson["type"].get()); + + switch (partType) + { + case part::type::noun_phrase: + { + std::set synrestrs; + for (const nlohmann::json& synrestrJson : partJson["synrestrs"]) + { + synrestrs.insert(synrestrJson.get()); + } + + parts_.push_back(part::createNounPhrase( + partJson["role"].get(), + selrestr(partJson["selrestrs"]), + std::move(synrestrs))); + + break; + } + + case part::type::preposition: + { + std::vector choices; + for (const nlohmann::json& choiceJson : partJson["choices"]) + { + choices.push_back(choiceJson.get()); + } + + parts_.push_back(part::createPreposition( + std::move(choices), + partJson["literal"].get())); + + break; + } + + case part::type::verb: + { + parts_.push_back(part::createVerb()); + + break; + } + + case part::type::adjective: + { + parts_.push_back(part::createAdjective()); + + break; + } + + case part::type::adverb: + { + parts_.push_back(part::createAdverb()); + + break; + } + + case part::type::literal: + { + parts_.push_back(part::createLiteral(partJson["value"].get())); + + break; + } + + case part::type::invalid: + { + throw std::domain_error("Invalid part data"); + } + } + } } - + }; -- cgit 1.4.1