write FacadePhraseIndex::merge_with_mask
authorPeng Wu <alexepico@gmail.com>
Fri, 26 Oct 2012 06:15:23 +0000 (14:15 +0800)
committerPeng Wu <alexepico@gmail.com>
Fri, 26 Oct 2012 06:15:23 +0000 (14:15 +0800)
src/storage/phrase_index.cpp
src/storage/phrase_index.h

index 6864387..be78dfa 100644 (file)
@@ -251,6 +251,40 @@ bool FacadePhraseIndex::merge(guint8 phrase_index, MemoryChunk * log){
     return retval;
 }
 
+bool FacadePhraseIndex::merge_with_mask(guint8 phrase_index,
+                                        MemoryChunk * log,
+                                        phrase_token_t mask,
+                                        phrase_token_t value){
+    SubPhraseIndex * & sub_phrases = m_sub_phrase_indices[phrase_index];
+    if ( !sub_phrases )
+        return false;
+
+    /* check mask and value. */
+    phrase_token_t index_mask = PHRASE_INDEX_LIBRARY_INDEX(mask);
+    phrase_token_t index_value = PHRASE_INDEX_LIBRARY_INDEX(value);
+    if (!((index_mask & phrase_index) == index_value))
+        return false;
+
+    /* unload old sub phrase index */
+    m_total_freq -= sub_phrases->get_phrase_index_total_freq();
+
+    /* calculate the sub phrase index mask and value. */
+    mask &= PHRASE_MASK; value &= PHRASE_MASK;
+
+    /* prepare the new logger. */
+    PhraseIndexLogger oldlogger;
+    oldlogger.load(log);
+    PhraseIndexLogger * newlogger = mask_out_phrase_index_logger
+        (&oldlogger, mask, value);
+
+    bool retval = sub_phrases->merge(newlogger);
+    m_total_freq += sub_phrases->get_phrase_index_total_freq();
+    delete newlogger;
+
+    return retval;
+}
+
+
 bool SubPhraseIndex::load(MemoryChunk * chunk, 
                          table_offset_t offset, table_offset_t end){
     //save the memory chunk
index e9f4764..7eb79fc 100644 (file)
@@ -533,6 +533,22 @@ public:
     bool merge(guint8 phrase_index, MemoryChunk * log);
 
     /**
+     * FacadePhraseIndex::merge_with_mask:
+     * @phrase_index: the index of sub phrase index to be merged.
+     * @log: the logger of difference in user home directory.
+     * @mask: the mask.
+     * @value: the value.
+     * @returns: whether the merge operation is successful.
+     *
+     * Merge the user logger of difference with mask operation.
+     *
+     * Note: the ownership of log is transfered here.
+     *
+     */
+    bool merge_with_mask(guint8 phrase_index, MemoryChunk * log,
+                         phrase_token_t mask, phrase_token_t value);
+
+    /**
      * FacadePhraseIndex::compact:
      * @returns: whether the compact operation is successful.
      *
@@ -806,8 +822,7 @@ typedef struct {
 extern const pinyin_table_info_t pinyin_phrase_files[PHRASE_INDEX_LIBRARY_COUNT];
 
 PhraseIndexLogger * mask_out_phrase_index_logger
-(const PhraseIndexLogger * oldlogger, phrase_token_t mask,
- phrase_token_t value);
+(PhraseIndexLogger * oldlogger, phrase_token_t mask, phrase_token_t value);
  
 };