get the insertion of facts working
This commit is contained in:
parent
3bc6ebe4d8
commit
494080f303
@ -61,6 +61,7 @@ void obelisk::KnowledgeBase::createTable(std::function<const char*()> function)
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: change these to throw errors instead of return int
|
||||
int obelisk::KnowledgeBase::addEntities(std::vector<obelisk::Entity>& entities)
|
||||
{
|
||||
for (auto& entity : entities)
|
||||
@ -88,6 +89,24 @@ int obelisk::KnowledgeBase::addFacts(std::vector<obelisk::Fact>& facts)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int obelisk::KnowledgeBase::getEntity(obelisk::Entity& entity)
|
||||
{
|
||||
entity.selectEntity(dbConnection_);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int obelisk::KnowledgeBase::getVerb(obelisk::Verb& verb)
|
||||
{
|
||||
verb.selectVerb(dbConnection_);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int obelisk::KnowledgeBase::getFact(obelisk::Fact& fact)
|
||||
{
|
||||
fact.selectFact(dbConnection_);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// TODO: log files?
|
||||
void obelisk::KnowledgeBase::logSqliteError(int result)
|
||||
{
|
||||
|
@ -41,6 +41,10 @@ namespace obelisk
|
||||
int addVerbs(std::vector<obelisk::Verb>& verbs);
|
||||
int addFacts(std::vector<obelisk::Fact>& facts);
|
||||
|
||||
int getEntity(obelisk::Entity& entity);
|
||||
int getVerb(obelisk::Verb& verb);
|
||||
int getFact(obelisk::Fact& fact);
|
||||
|
||||
void getDouble(double& result, float var1, float var2);
|
||||
void getFloat(float& result1, float& result2, double var);
|
||||
};
|
||||
|
@ -11,8 +11,7 @@ const char* obelisk::Entity::createTable()
|
||||
)";
|
||||
}
|
||||
|
||||
obelisk::Entity obelisk::Entity::selectEntity(sqlite3* dbConnection,
|
||||
std::string name)
|
||||
int obelisk::Entity::selectEntity(sqlite3* dbConnection)
|
||||
{
|
||||
// TODO: check if database is open
|
||||
sqlite3_stmt* ppStmt = nullptr;
|
||||
@ -33,7 +32,8 @@ obelisk::Entity obelisk::Entity::selectEntity(sqlite3* dbConnection,
|
||||
// TODO: Something was not used... throw an error
|
||||
}
|
||||
|
||||
result = sqlite3_bind_text(ppStmt, 1, name.c_str(), -1, SQLITE_TRANSIENT);
|
||||
result
|
||||
= sqlite3_bind_text(ppStmt, 1, getName().c_str(), -1, SQLITE_TRANSIENT);
|
||||
if (result != SQLITE_OK)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
@ -47,15 +47,15 @@ obelisk::Entity obelisk::Entity::selectEntity(sqlite3* dbConnection,
|
||||
|
||||
if (result == SQLITE_ROW)
|
||||
{
|
||||
auto id = sqlite3_column_int(ppStmt, 0);
|
||||
std::string name((char*) sqlite3_column_text(ppStmt, 1));
|
||||
setId(sqlite3_column_int(ppStmt, 0));
|
||||
setName((char*) sqlite3_column_text(ppStmt, 1));
|
||||
|
||||
result = sqlite3_finalize(ppStmt);
|
||||
if (result != SQLITE_OK)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
return Entity(id, name);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -64,7 +64,7 @@ obelisk::Entity obelisk::Entity::selectEntity(sqlite3* dbConnection,
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
return Entity();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -72,11 +72,12 @@ int obelisk::Entity::insertEntity(sqlite3* dbConnection)
|
||||
{
|
||||
// TODO: check if database is open
|
||||
|
||||
if (selectEntity(dbConnection, getName()).getId() != 0)
|
||||
/*selectEntity(dbConnection);
|
||||
if (getId() != 0)
|
||||
{
|
||||
// TODO: already exists in database, throw an error? Or skip past it?
|
||||
return -1;
|
||||
}
|
||||
}*/
|
||||
|
||||
sqlite3_stmt* ppStmt = nullptr;
|
||||
const char* pzTail = nullptr;
|
||||
@ -108,8 +109,10 @@ int obelisk::Entity::insertEntity(sqlite3* dbConnection)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
|
||||
setId((int) sqlite3_last_insert_rowid(dbConnection));
|
||||
else
|
||||
{
|
||||
setId((int) sqlite3_last_insert_rowid(dbConnection));
|
||||
}
|
||||
|
||||
result = sqlite3_finalize(ppStmt);
|
||||
if (result != SQLITE_OK)
|
||||
|
@ -46,7 +46,7 @@ namespace obelisk
|
||||
std::string& getName();
|
||||
void setName(std::string name);
|
||||
|
||||
Entity selectEntity(sqlite3* dbConnection, std::string name);
|
||||
int selectEntity(sqlite3* dbConnection);
|
||||
int insertEntity(sqlite3* dbConnection);
|
||||
};
|
||||
} // namespace obelisk
|
||||
|
@ -16,10 +16,7 @@ const char* obelisk::Fact::createTable()
|
||||
)";
|
||||
}
|
||||
|
||||
obelisk::Fact obelisk::Fact::selectFact(sqlite3* dbConnection,
|
||||
int idLeftEntity,
|
||||
int idRightEntity,
|
||||
int idVerb)
|
||||
int obelisk::Fact::selectFact(sqlite3* dbConnection)
|
||||
{
|
||||
// TODO: check if database is open
|
||||
|
||||
@ -67,17 +64,17 @@ obelisk::Fact obelisk::Fact::selectFact(sqlite3* dbConnection,
|
||||
|
||||
if (result == SQLITE_ROW)
|
||||
{
|
||||
auto id = sqlite3_column_int(ppStmt, 0);
|
||||
auto leftEntity = sqlite3_column_int(ppStmt, 1);
|
||||
auto rightEntity = sqlite3_column_int(ppStmt, 2);
|
||||
auto verb = sqlite3_column_int(ppStmt, 3);
|
||||
setId(sqlite3_column_int(ppStmt, 0));
|
||||
getLeftEntity().setId(sqlite3_column_int(ppStmt, 1));
|
||||
getRightEntity().setId(sqlite3_column_int(ppStmt, 2));
|
||||
getVerb().setId(sqlite3_column_int(ppStmt, 3));
|
||||
|
||||
result = sqlite3_finalize(ppStmt);
|
||||
if (result != SQLITE_OK)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
return Fact(id, leftEntity, rightEntity, verb);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -86,7 +83,7 @@ obelisk::Fact obelisk::Fact::selectFact(sqlite3* dbConnection,
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
return Fact();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -95,16 +92,12 @@ int obelisk::Fact::insertFact(sqlite3* dbConnection)
|
||||
// TODO: make sure database is open
|
||||
|
||||
// check if the fact id exists, based on the ids of the entities and verb
|
||||
if (selectFact(dbConnection,
|
||||
getLeftEntity().getId(),
|
||||
getRightEntity().getId(),
|
||||
getVerb().getId())
|
||||
.getId()
|
||||
!= 0)
|
||||
/*selectFact(dbConnection);
|
||||
if (getId() != 0)
|
||||
{
|
||||
// TODO: Verb is already in database, throw an error? Or just skip it?
|
||||
return -1;
|
||||
}
|
||||
}*/
|
||||
|
||||
// TODO: verify that verbId, leftEntityId, and rightEntityId are not 0
|
||||
|
||||
@ -149,8 +142,10 @@ int obelisk::Fact::insertFact(sqlite3* dbConnection)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
|
||||
setId((int) sqlite3_last_insert_rowid(dbConnection));
|
||||
else
|
||||
{
|
||||
setId((int) sqlite3_last_insert_rowid(dbConnection));
|
||||
}
|
||||
|
||||
result = sqlite3_finalize(ppStmt);
|
||||
if (result != SQLITE_OK)
|
||||
|
@ -69,11 +69,7 @@ namespace obelisk
|
||||
Verb& getVerb();
|
||||
void setVerb(obelisk::Verb verb);
|
||||
|
||||
Fact selectFact(sqlite3* dbConnection,
|
||||
int idLeftEntity,
|
||||
int idRightEntity,
|
||||
int idVerb);
|
||||
|
||||
int selectFact(sqlite3* dbConnection);
|
||||
int insertFact(sqlite3* dbConnection);
|
||||
};
|
||||
} // namespace obelisk
|
||||
|
@ -13,7 +13,7 @@ const char* obelisk::Verb::createTable()
|
||||
)";
|
||||
}
|
||||
|
||||
obelisk::Verb obelisk::Verb::selectVerb(sqlite3* dbConnection, std::string name)
|
||||
int obelisk::Verb::selectVerb(sqlite3* dbConnection)
|
||||
{
|
||||
// TODO: check if database is open
|
||||
|
||||
@ -35,7 +35,8 @@ obelisk::Verb obelisk::Verb::selectVerb(sqlite3* dbConnection, std::string name)
|
||||
// TODO: Something was not used... throw an error
|
||||
}
|
||||
|
||||
result = sqlite3_bind_text(ppStmt, 1, name.c_str(), -1, SQLITE_TRANSIENT);
|
||||
result
|
||||
= sqlite3_bind_text(ppStmt, 1, getName().c_str(), -1, SQLITE_TRANSIENT);
|
||||
if (result != SQLITE_OK)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
@ -49,15 +50,15 @@ obelisk::Verb obelisk::Verb::selectVerb(sqlite3* dbConnection, std::string name)
|
||||
|
||||
if (result == SQLITE_ROW)
|
||||
{
|
||||
auto id = sqlite3_column_int(ppStmt, 0);
|
||||
std::string name((char*) sqlite3_column_text(ppStmt, 1));
|
||||
setId(sqlite3_column_int(ppStmt, 0));
|
||||
setName((char*) sqlite3_column_text(ppStmt, 1));
|
||||
|
||||
result = sqlite3_finalize(ppStmt);
|
||||
if (result != SQLITE_OK)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
return Verb(id, name);
|
||||
return 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -66,7 +67,7 @@ obelisk::Verb obelisk::Verb::selectVerb(sqlite3* dbConnection, std::string name)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
return Verb();
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -74,11 +75,12 @@ int obelisk::Verb::insertVerb(sqlite3* dbConnection)
|
||||
{
|
||||
// TODO: make sure database is open
|
||||
|
||||
if (selectVerb(dbConnection, getName()).getId() != 0)
|
||||
/*selectVerb(dbConnection);
|
||||
if (getId() != 0)
|
||||
{
|
||||
// TODO: Verb is already in database, throw an error? Or just skip it?
|
||||
return -1;
|
||||
}
|
||||
}*/
|
||||
|
||||
sqlite3_stmt* ppStmt = nullptr;
|
||||
const char* pzTail = nullptr;
|
||||
@ -110,8 +112,10 @@ int obelisk::Verb::insertVerb(sqlite3* dbConnection)
|
||||
{
|
||||
// TODO: Something is wrong... throw an error
|
||||
}
|
||||
|
||||
setId((int) sqlite3_last_insert_rowid(dbConnection));
|
||||
else
|
||||
{
|
||||
setId((int) sqlite3_last_insert_rowid(dbConnection));
|
||||
}
|
||||
|
||||
result = sqlite3_finalize(ppStmt);
|
||||
if (result != SQLITE_OK)
|
||||
|
@ -46,7 +46,7 @@ namespace obelisk
|
||||
std::string& getName();
|
||||
void setName(std::string name);
|
||||
|
||||
Verb selectVerb(sqlite3* dbConnection, std::string name);
|
||||
int selectVerb(sqlite3* dbConnection);
|
||||
int insertVerb(sqlite3* dbConnection);
|
||||
};
|
||||
} // namespace obelisk
|
||||
|
@ -366,10 +366,39 @@ void obelisk::Parser::handleFact(std::unique_ptr<obelisk::KnowledgeBase>& kb)
|
||||
kb->addEntities(entities);
|
||||
fact.setLeftEntity(entities.front());
|
||||
|
||||
// the id was not inserted, so check if it exists in the database
|
||||
if (fact.getLeftEntity().getId() == 0)
|
||||
{
|
||||
obelisk::Entity entity = fact.getLeftEntity();
|
||||
kb->getEntity(entity);
|
||||
if (entity.getId() == 0)
|
||||
{
|
||||
// TODO: throw an error here, it was not inserted, and doesn't exist in the database
|
||||
}
|
||||
else
|
||||
{
|
||||
fact.setLeftEntity(entity);
|
||||
}
|
||||
}
|
||||
|
||||
entities = {fact.getRightEntity()};
|
||||
kb->addEntities(entities);
|
||||
fact.setRightEntity(entities.front());
|
||||
|
||||
if (fact.getRightEntity().getId() == 0)
|
||||
{
|
||||
obelisk::Entity entity = fact.getRightEntity();
|
||||
kb->getEntity(entity);
|
||||
if (entity.getId() == 0)
|
||||
{
|
||||
// TODO: throw an error here, it was not inserted, and doesn't exist in the database
|
||||
}
|
||||
else
|
||||
{
|
||||
fact.setRightEntity(entity);
|
||||
}
|
||||
}
|
||||
|
||||
if (verbId == 0)
|
||||
{
|
||||
std::vector<obelisk::Verb> verbs = {fact.getVerb()};
|
||||
|
Loading…
Reference in New Issue
Block a user