From d70b72b0c1a0696c3d0be042389d24b3d099f75a Mon Sep 17 00:00:00 2001 From: Simon Rozman Date: Thu, 26 May 2016 08:53:38 +0200 Subject: [PATCH] Inactive related characters removed --- ZRColaCompile/dbsource.cpp | 43 +++++++++++------- ZRColaCompile/dbsource.h | 51 ++++++++++++++++++--- ZRColaCompile/main.cpp | 89 +++++++++++++++++++++++-------------- ZRColaCompile/stdafx.h | 2 + output/data/ZRCola.zrcdb | Bin 1881620 -> 1881582 bytes 5 files changed, 129 insertions(+), 56 deletions(-) diff --git a/ZRColaCompile/dbsource.cpp b/ZRColaCompile/dbsource.cpp index e47244e..339c63c 100644 --- a/ZRColaCompile/dbsource.cpp +++ b/ZRColaCompile/dbsource.cpp @@ -22,7 +22,7 @@ using namespace std; -bool ZRCola::DBSource::character_desc_idx::add_keywords(const wchar_t *str, wchar_t chr, size_t sub) +void ZRCola::DBSource::character_desc_idx::parse_keywords(const wchar_t *str, list &terms) { wxASSERT_MSG(str, wxT("string is NULL")); @@ -30,7 +30,7 @@ bool ZRCola::DBSource::character_desc_idx::add_keywords(const wchar_t *str, wcha // Skip white space. for (;;) { if (*str == 0) - return true; + return; else if (!iswspace(*str)) break; else @@ -62,23 +62,29 @@ bool ZRCola::DBSource::character_desc_idx::add_keywords(const wchar_t *str, wcha if (!term.empty()) { transform(term.begin(), term.end(), term.begin(), towlower); - if (sub) { - wstring::size_type j_end = term.size(); - if (j_end >= sub) { - // Insert all keyword substrings "sub" or more characters long. - for (wstring::size_type i = 0, i_end = j_end - sub; i <= i_end; ++i) { - for (wstring::size_type j = i + sub; j <= j_end; ++j) - add_keyword(term.substr(i, j - i), chr); - } - } - } else { - // Insert exact keyword only. - add_keyword(term, chr); - } + terms.push_back(term); } } +} - return true; + +void ZRCola::DBSource::character_desc_idx::add_keywords(const std::list &terms, wchar_t chr, size_t sub) +{ + for (list::const_iterator term = terms.cbegin(), term_end = terms.cend(); term != term_end; ++term) { + if (sub) { + wstring::size_type j_end = term->size(); + if (j_end >= sub) { + // Insert all keyword substrings "sub" or more characters long. + for (wstring::size_type i = 0, i_end = j_end - sub; i <= i_end; ++i) { + for (wstring::size_type j = i + sub; j <= j_end; ++j) + add_keyword(term->substr(i, j - i), chr); + } + } + } else { + // Insert exact keyword only. + add_keyword(*term, chr); + } + } } @@ -772,12 +778,15 @@ bool ZRCola::DBSource::GetCharacter(const ATL::CComPtr& rs, charac wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"opis_en"), &f))); wxCHECK(GetValue(f, chr.desc), false); } + ZRCola::DBSource::character_desc_idx::parse_keywords(chr.desc.c_str(), chr.terms); + wstring keywords; { ATL::CComPtr f; wxVERIFY(SUCCEEDED(flds->get_Item(ATL::CComVariant(L"klj_bes_en"), &f))); - wxCHECK(GetValue(f, chr.keywords), false); + wxCHECK(GetValue(f, keywords), false); } + ZRCola::DBSource::character_desc_idx::parse_keywords(keywords.c_str(), chr.terms); { ATL::CComPtr f; diff --git a/ZRColaCompile/dbsource.h b/ZRColaCompile/dbsource.h index 8771837..bb66b0f 100644 --- a/ZRColaCompile/dbsource.h +++ b/ZRColaCompile/dbsource.h @@ -24,6 +24,7 @@ #include #include +#include #include #include #include @@ -119,11 +120,42 @@ namespace ZRCola { /// class character { public: - wchar_t chr; ///< Character - ZRCola::chrcatid_t cat; ///> Category ID - std::wstring desc; ///< Character description - std::wstring keywords; ///< Additional keywords - std::wstring rel; ///< Related characters + inline character() + { + chr = 0; + cat.data[0] = 0; + cat.data[1] = 0; + } + + inline character(_In_ const character &othr) : + chr (othr.chr), + cat (othr.cat), + desc (othr.desc), + terms(othr.terms), + rel (othr.rel) + { + } + + inline bool operator==(_In_ const character &othr) const + { + return + chr == othr.chr && + cat == othr.cat && + desc == othr.desc && + terms == othr.terms && + rel == othr.rel; + } + + inline bool operator!=(_In_ const character &othr) const + { + return !operator==(othr); + } + + wchar_t chr; ///< Character + ZRCola::chrcatid_t cat; ///< Category ID + std::wstring desc; ///< Character description + std::list terms; ///< Search terms + std::wstring rel; ///< Related characters }; @@ -153,7 +185,14 @@ namespace ZRCola { class character_desc_idx : public std::map, character_desc_idx_less> { public: - bool add_keywords(const wchar_t *str, wchar_t chr, size_t sub = 0); + static void parse_keywords(const wchar_t *str, std::list &terms); + void add_keywords(const std::list &terms, wchar_t chr, size_t sub = 0); + inline void add_keywords(const wchar_t *str, wchar_t chr, size_t sub = 0) + { + std::list terms; + parse_keywords(str, terms); + add_keywords(terms, chr, sub); + } void save(ZRCola::textindex &idx) const; diff --git a/ZRColaCompile/main.cpp b/ZRColaCompile/main.cpp index c0a3387..4ae53d8 100644 --- a/ZRColaCompile/main.cpp +++ b/ZRColaCompile/main.cpp @@ -393,47 +393,70 @@ int _tmain(int argc, _TCHAR *argv[]) if (src.SelectCharacters(rs)) { size_t count = src.GetRecordsetCount(rs); if (count < 0xffffffff) { // 4G check (-1 is reserved for error condition) - ZRCola::DBSource::character chr; - ZRCola::character_db db; ZRCola::DBSource::character_desc_idx idxChrDsc, idxChrDscSub; + vector > chrs; + chrs.resize(0x10000); + + // Phase 1: Parse characters and build indexes. + while (!ZRCola::DBSource::IsEOF(rs)) { + // Read character from the database. + unique_ptr c(new ZRCola::DBSource::character); + if (src.GetCharacter(rs, *c)) { + const ZRCola::DBSource::character &chr = *c.get(); + chrs[chr.chr].swap(c); + + // Add description (and keywords) to index. + idxChrDsc .add_keywords(chr.terms, chr.chr, 0); + idxChrDscSub.add_keywords(chr.terms, chr.chr, 3); + } else + has_errors = true; + + wxVERIFY(SUCCEEDED(rs->MoveNext())); + } + + // Phase 2: Build related character lists. + for (size_t i = 0, i_end = chrs.size(); i < i_end; i++) { + ZRCola::DBSource::character &chr = *(chrs[i].get()); + if (&chr == NULL) continue; + + // Remove all unexisting or inactive related characters. + for (wstring::size_type i = chr.rel.length(); i--;) { + if (!chrs[chr.rel[i]]) + chr.rel.erase(i, 1); + } + } + + ZRCola::character_db db; + // Preallocate memory. db.idxChr.reserve(count); db.data .reserve(count*4); - // Parse characters and build index and data. - while (!ZRCola::DBSource::IsEOF(rs)) { - // Read character from the database. - if (src.GetCharacter(rs, chr)) { - // Add character to index and data. - unsigned __int32 idx = db.data.size(); - db.data.push_back((unsigned __int16)chr.chr); - for (wstring::size_type i = 0; i < sizeof(ZRCola::chrcatid_t)/sizeof(unsigned __int16); i++) - db.data.push_back(((const unsigned __int16*)chr.cat.data)[i]); - wstring::size_type n_desc = chr.desc.length(); - wxASSERT_MSG(n_desc <= 0xffff, wxT("character description too long")); - db.data.push_back((unsigned __int16)n_desc); - wstring::size_type n_rel = chr.rel.length(); - wxASSERT_MSG(n_rel <= 0xffff, wxT("too many related characters")); - db.data.push_back((unsigned __int16)n_rel); - for (wstring::size_type i = 0; i < n_desc; i++) - db.data.push_back(chr.desc[i]); - for (wstring::size_type i = 0; i < n_rel; i++) - db.data.push_back(chr.rel[i]); - db.idxChr.push_back(idx); + // Phase 3: Parse characters and build index and data. + for (size_t i = 0, i_end = chrs.size(); i < i_end; i++) { + const ZRCola::DBSource::character &chr = *(chrs[i].get()); + if (&chr == NULL) continue; - // Add description (and keywords) to index. - idxChrDsc .add_keywords(chr.desc .c_str(), chr.chr, 0); - idxChrDsc .add_keywords(chr.keywords.c_str(), chr.chr, 0); - idxChrDscSub.add_keywords(chr.desc .c_str(), chr.chr, 3); - idxChrDscSub.add_keywords(chr.keywords.c_str(), chr.chr, 3); + // Add character to index and data. + unsigned __int32 idx = db.data.size(); + db.data.push_back((unsigned __int16)chr.chr); + for (wstring::size_type i = 0; i < sizeof(ZRCola::chrcatid_t)/sizeof(unsigned __int16); i++) + db.data.push_back(((const unsigned __int16*)chr.cat.data)[i]); + wstring::size_type n_desc = chr.desc.length(); + wxASSERT_MSG(n_desc <= 0xffff, wxT("character description too long")); + db.data.push_back((unsigned __int16)n_desc); + wstring::size_type n_rel = chr.rel.length(); + wxASSERT_MSG(n_rel <= 0xffff, wxT("too many related characters")); + db.data.push_back((unsigned __int16)n_rel); + for (wstring::size_type i = 0; i < n_desc; i++) + db.data.push_back(chr.desc[i]); + for (wstring::size_type i = 0; i < n_rel; i++) + db.data.push_back(chr.rel[i]); + db.idxChr.push_back(idx); - // Mark category used. - categories_used.insert(chr.cat); - } else - has_errors = true; - - wxVERIFY(SUCCEEDED(rs->MoveNext())); + // Mark category used. + categories_used.insert(chr.cat); } // Sort indices. diff --git a/ZRColaCompile/stdafx.h b/ZRColaCompile/stdafx.h index 9d54a3a..58d3486 100644 --- a/ZRColaCompile/stdafx.h +++ b/ZRColaCompile/stdafx.h @@ -52,4 +52,6 @@ #include #include #include +#include #include +#include diff --git a/output/data/ZRCola.zrcdb b/output/data/ZRCola.zrcdb index 538d2a75f8a9e255531c9a7ed1454278bbb37af8..477e5d3133dc20d8bedc4b5acac407e64a34bbb9 100644 GIT binary patch delta 28034 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 UdNPoaOk^g@qATOFzLxI)013+z9{>OV delta 28084 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