summary refs log tree commit diff stats
path: root/lib/noun_query.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'lib/noun_query.cpp')
-rw-r--r--lib/noun_query.cpp73
1 files changed, 65 insertions, 8 deletions
diff --git a/lib/noun_query.cpp b/lib/noun_query.cpp index 19a1297..b4336b6 100644 --- a/lib/noun_query.cpp +++ b/lib/noun_query.cpp
@@ -33,7 +33,7 @@ namespace verbly {
33 33
34 noun_query& noun_query::rhymes_with(const word& _word) 34 noun_query& noun_query::rhymes_with(const word& _word)
35 { 35 {
36 for (auto rhyme : _word.rhyme_phonemes()) 36 for (auto rhyme : _word.get_rhymes())
37 { 37 {
38 _rhymes.push_back(rhyme); 38 _rhymes.push_back(rhyme);
39 } 39 }
@@ -53,6 +53,34 @@ namespace verbly {
53 return *this; 53 return *this;
54 } 54 }
55 55
56 noun_query& noun_query::has_rhyming_noun()
57 {
58 _has_rhyming_noun = true;
59
60 return *this;
61 }
62
63 noun_query& noun_query::has_rhyming_adjective()
64 {
65 _has_rhyming_adjective = true;
66
67 return *this;
68 }
69
70 noun_query& noun_query::has_rhyming_adverb()
71 {
72 _has_rhyming_adverb = true;
73
74 return *this;
75 }
76
77 noun_query& noun_query::has_rhyming_verb()
78 {
79 _has_rhyming_verb = true;
80
81 return *this;
82 }
83
56 noun_query& noun_query::with_singular_form(std::string _arg) 84 noun_query& noun_query::with_singular_form(std::string _arg)
57 { 85 {
58 _with_singular_form.push_back(_arg); 86 _with_singular_form.push_back(_arg);
@@ -483,16 +511,37 @@ namespace verbly {
483 511
484 if (!_rhymes.empty()) 512 if (!_rhymes.empty())
485 { 513 {
486 std::list<std::string> clauses(_rhymes.size(), "pronunciation LIKE ?"); 514 std::list<std::string> clauses(_rhymes.size(), "(prerhyme != ? AND rhyme = ?)");
487 std::string cond = "noun_id IN (SELECT noun_id FROM noun_pronunciations WHERE " + verbly::implode(std::begin(clauses), std::end(clauses), " OR ") + ")"; 515 std::string cond = "noun_id IN (SELECT noun_id FROM noun_pronunciations WHERE " + verbly::implode(std::begin(clauses), std::end(clauses), " OR ") + ")";
488 conditions.push_back(cond); 516 conditions.push_back(cond);
489 517
490 for (auto rhyme : _rhymes) 518 for (auto rhy : _rhymes)
491 { 519 {
492 bindings.emplace_back("%" + rhyme); 520 bindings.emplace_back(rhy.get_prerhyme());
521 bindings.emplace_back(rhy.get_rhyme());
493 } 522 }
494 } 523 }
495 524
525 if (_has_rhyming_noun)
526 {
527 conditions.push_back("noun_id IN (SELECT a.noun_id FROM nouns AS a INNER JOIN noun_pronunciations AS curp ON curp.noun_id = a.noun_id INNER JOIN noun_pronunciations AS rhmp ON rhmp.prerhyme != curp.prerhyme AND rhmp.rhyme = curp.rhyme AND rhmp.noun_id != curp.noun_id)");
528 }
529
530 if (_has_rhyming_adjective)
531 {
532 conditions.push_back("noun_id IN (SELECT a.noun_id FROM nouns AS a INNER JOIN noun_pronunciations AS curp ON curp.noun_id = a.noun_id INNER JOIN adjective_pronunciations AS rhmp ON rhmp.prerhyme != curp.prerhyme AND rhmp.rhyme = curp.rhyme)");
533 }
534
535 if (_has_rhyming_adverb)
536 {
537 conditions.push_back("noun_id IN (SELECT a.noun_id FROM nouns AS a INNER JOIN noun_pronunciations AS curp ON curp.noun_id = a.noun_id INNER JOIN adverb_pronunciations AS rhmp ON rhmp.prerhyme != curp.prerhyme AND rhmp.rhyme = curp.rhyme)");
538 }
539
540 if (_has_rhyming_verb)
541 {
542 conditions.push_back("noun_id IN (SELECT a.noun_id FROM nouns AS a INNER JOIN noun_pronunciations AS curp ON curp.noun_id = a.noun_id INNER JOIN verb_pronunciations AS rhmp ON rhmp.prerhyme != curp.prerhyme AND rhmp.rhyme = curp.rhyme)");
543 }
544
496 for (auto except : _except) 545 for (auto except : _except)
497 { 546 {
498 conditions.push_back("noun_id != ?"); 547 conditions.push_back("noun_id != ?");
@@ -1768,7 +1817,7 @@ namespace verbly {
1768 { 1817 {
1769 throw std::runtime_error(sqlite3_errmsg(_data.ppdb)); 1818 throw std::runtime_error(sqlite3_errmsg(_data.ppdb));
1770 } 1819 }
1771 1820
1772 int i = 1; 1821 int i = 1;
1773 for (auto& binding : bindings) 1822 for (auto& binding : bindings)
1774 { 1823 {
@@ -1783,7 +1832,7 @@ namespace verbly {
1783 1832
1784 case binding::type::string: 1833 case binding::type::string:
1785 { 1834 {
1786 sqlite3_bind_text(ppstmt, i, binding.get_string().c_str(), binding.get_string().length(), SQLITE_STATIC); 1835 sqlite3_bind_text(ppstmt, i, binding.get_string().c_str(), binding.get_string().length(), SQLITE_TRANSIENT);
1787 1836
1788 break; 1837 break;
1789 } 1838 }
@@ -1791,7 +1840,7 @@ namespace verbly {
1791 1840
1792 i++; 1841 i++;
1793 } 1842 }
1794 1843
1795 /* 1844 /*
1796 for (auto adj : _derived_from_adjective) 1845 for (auto adj : _derived_from_adjective)
1797 { 1846 {
@@ -1843,7 +1892,7 @@ namespace verbly {
1843 1892
1844 for (auto& noun : output) 1893 for (auto& noun : output)
1845 { 1894 {
1846 query = "SELECT pronunciation FROM noun_pronunciations WHERE noun_id = ?"; 1895 query = "SELECT pronunciation, prerhyme, rhyme FROM noun_pronunciations WHERE noun_id = ?";
1847 if (sqlite3_prepare_v2(_data.ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK) 1896 if (sqlite3_prepare_v2(_data.ppdb, query.c_str(), query.length(), &ppstmt, NULL) != SQLITE_OK)
1848 { 1897 {
1849 throw std::runtime_error(sqlite3_errmsg(_data.ppdb)); 1898 throw std::runtime_error(sqlite3_errmsg(_data.ppdb));
@@ -1857,6 +1906,14 @@ namespace verbly {
1857 auto phonemes = verbly::split<std::list<std::string>>(pronunciation, " "); 1906 auto phonemes = verbly::split<std::list<std::string>>(pronunciation, " ");
1858 1907
1859 noun.pronunciations.push_back(phonemes); 1908 noun.pronunciations.push_back(phonemes);
1909
1910 if ((sqlite3_column_type(ppstmt, 1) != SQLITE_NULL) && (sqlite3_column_type(ppstmt, 2) != SQLITE_NULL))
1911 {
1912 std::string prerhyme(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 1)));
1913 std::string rhyming(reinterpret_cast<const char*>(sqlite3_column_text(ppstmt, 2)));
1914
1915 noun.rhymes.emplace_back(prerhyme, rhyming);
1916 }
1860 } 1917 }
1861 1918
1862 sqlite3_finalize(ppstmt); 1919 sqlite3_finalize(ppstmt);