From 2e9663da330866e655ba414bed0dfcd0de486864 Mon Sep 17 00:00:00 2001 From: Peng Wu Date: Thu, 26 Aug 2010 15:41:42 +0800 Subject: add search to phrase large table. --- src/storage/phrase_large_table.cpp | 40 +++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) (limited to 'src/storage/phrase_large_table.cpp') diff --git a/src/storage/phrase_large_table.cpp b/src/storage/phrase_large_table.cpp index a033cee..38d6d5e 100644 --- a/src/storage/phrase_large_table.cpp +++ b/src/storage/phrase_large_table.cpp @@ -23,6 +23,32 @@ #include #include "phrase_large_table.h" +template +struct PhraseIndexItem{ + phrase_token_t m_token; + utf16_t m_phrase[phrase_length]; +public: + PhraseIndexItem(utf16_t phrase[], phrase_token_t token){ + memmove(m_phrase, phrase, sizeof(utf16_t) * phrase_length); + m_token = token; + } +}; + +template +static int phrase_compare(const PhraseIndexItem &lhs, + const PhraseIndexItem &rhs){ + utf16_t * phrase_lhs = (utf16_t *) lhs.m_phrase; + utf16_t * phrase_rhs = (utf16_t *) rhs.m_phrase; + + return memcmp(phrase_lhs, phrase_rhs, sizeof(utf16_t) * phrase_length); +} + +template +static bool phrase_less_than(const PhraseIndexItem & lhs, + const PhraseIndexItem & rhs){ + return 0 > phrase_compare(lhs, rhs); +} + PhraseBitmapIndexLevel::PhraseBitmapIndexLevel(){ memset(m_phrase_length_indexes, 0, sizeof(m_phrase_length_indexes)); } @@ -132,5 +158,17 @@ int PhraseLengthIndexLevel::search(int phrase_length, template int PhraseArrayIndexLevel::search(/* in */ utf16_t phrase[], /* out */ phrase_token_t & token){ - + PhraseIndexItem * chunk_begin, * chunk_end; + chunk_begin = (PhraseIndexItem *)m_chunk.begin(); + chunk_end = (PhraseIndexItem *)m_chunk.end(); + PhraseIndexItem search_elem(phrase, -1); + + //do the search + std_lite::pair *, PhraseIndexItem *> range; + range = std_lite::equal_range(chunk_begin, chunk_end, search_elem, phrase_less_than); + + if ( range.first == range.second ) + return SEARCH_NONE; + assert(range.second - range.first == 1); + return SEARCH_OK; } -- cgit