const RowMatchNode* TermMatchTreeConverter::BuildMatchTree(const TermMatchNode::Phrase& node) { RowMatchNode::Builder builder(RowMatchNode::AndMatch, m_allocator); RingBuffer<Term, Term::c_log2MaxGramSize + 1> termBuffer; StringVector const & stringVector = node.GetGrams(); for (unsigned i = 0; i < stringVector.GetSize(); ++i) { *termBuffer.PushBack() = GetUnigramTerm(stringVector[i], node.GetStreamId()); if (termBuffer.GetCount() == Term::c_maxGramSize) { ProcessNGramBuffer(builder, termBuffer); } } while (!termBuffer.IsEmpty()) { ProcessNGramBuffer(builder, termBuffer); } return builder.Complete(); }