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 IndexGroup::IndexAdded(Indexer *indexer, UINT32 index_id) { if (m_base_id == index_id) { m_base = m_indexer->GetIndexById(index_id); return m_base->AddObserver(this); } else if (m_indexes.Contains(index_id)) { Index* index = m_indexer->GetIndexById(index_id); return index->AddObserver(this); } return OpStatus::OK; }
OP_STATUS IndexGroup::AddIndexWithoutAddingMessages(index_gid_t index_id) { if (m_indexes.Contains(index_id)) return OpStatus::OK; RETURN_IF_ERROR(m_indexes.Insert(index_id)); Index* index = m_indexer->GetIndexById(index_id); if (index) { RETURN_IF_ERROR(index->AddObserver(this)); } return OpStatus::OK; }
OP_STATUS UnionIndexGroup::AddIndex(index_gid_t index_id) { if (m_indexes.Contains(index_id)) return OpStatus::OK; RETURN_IF_ERROR(m_indexes.Insert(index_id)); Index* index = m_indexer->GetIndexById(index_id); if (index) { index->PreFetch(); for (INT32SetIterator it(index->GetIterator()); it; it++) { RETURN_IF_ERROR(m_index->NewMessage(it.GetData())); } index->AddObserver(this); m_index->ResetUnreadCount(); } return OpStatus::OK; }