OP_STATUS IntersectionIndexGroup::AddIndex(index_gid_t index_id) { if (m_indexes.Contains(index_id)) return OpStatus::OK; Index* index = m_indexer->GetIndexById(index_id); if (index) { RETURN_IF_ERROR(index->PreFetch()); OpINT32Vector all_messages; RETURN_IF_ERROR(m_index->GetAllMessages(all_messages)); for (UINT32 i = 0; i < all_messages.GetCount(); i++) { if (!index->Contains(all_messages.Get(i))) { RETURN_IF_ERROR(m_index->RemoveMessage(all_messages.Get(i))); } } RETURN_IF_ERROR(m_indexes.Insert(index_id)); RETURN_IF_ERROR(index->AddObserver(this)); } return OpStatus::OK; }
OP_STATUS UnionIndexGroup::MessageRemoved(Index* index, message_gid_t message, BOOL setting_keyword) { for (unsigned i = 0; i < m_indexes.GetCount(); i++) { Index* index = m_indexer->GetIndexById(m_indexes.GetByIndex(i)); if (index && index->Contains(message)) { return OpStatus::OK; } } return m_index->RemoveMessage(message); }
OP_STATUS IntersectionIndexGroup::MessageAdded(Index* index, message_gid_t message, BOOL setting_keyword) { if (index == m_base || m_indexes.Contains(index->GetId())) { if (m_base->Contains(message)) { for (unsigned i = 0; i < m_indexes.GetCount(); i++) { Index * index = m_indexer->GetIndexById(m_indexes.GetByIndex(i)); if (index && !index->Contains(message)) return OpStatus::OK; } return m_index->NewMessage(message); } } return OpStatus::OK; }
OP_STATUS ComplementIndexGroup::MessageRemoved(Index* index, message_gid_t message, BOOL setting_keyword) { if (index == m_base) { return m_index->RemoveMessage(message); } else if (m_base && m_base->Contains(message)) { for (unsigned i = 0; i < m_indexes.GetCount(); i++) { Index * index = m_indexer->GetIndexById(m_indexes.GetByIndex(i)); if (index && index->Contains(message)) return m_index->RemoveMessage(message); } return m_index->NewMessage(message); } return OpStatus::OK; }