|
|
@@ -16105,6 +16105,8 @@ void CSphIndex_VLN::Dealloc ()
|
|
|
m_tSettings.m_eDocinfo = SPH_DOCINFO_NONE;
|
|
|
|
|
|
m_bPreallocated = false;
|
|
|
+ SafeDelete ( m_pFieldFilter );
|
|
|
+ SafeDelete ( m_pQueryTokenizer );
|
|
|
SafeDelete ( m_pTokenizer );
|
|
|
SafeDelete ( m_pDict );
|
|
|
|
|
|
@@ -25911,25 +25913,25 @@ void CSphSource_Document::BuildSubstringHits ( SphDocID_t uDocid, bool bPayload,
|
|
|
// and compute fields lengths
|
|
|
if ( !bSkipEndMarker && !m_tState.m_bProcessingHits && m_tHits.Length() )
|
|
|
{
|
|
|
- CSphWordHit * pHit = const_cast < CSphWordHit * > ( m_tHits.Last() );
|
|
|
- Hitpos_t uRefPos = pHit->m_uWordPos;
|
|
|
+ CSphWordHit * pTail = const_cast < CSphWordHit * > ( m_tHits.Last() );
|
|
|
|
|
|
if ( m_pFieldLengthAttrs )
|
|
|
- m_pFieldLengthAttrs [ HITMAN::GetField ( pHit->m_uWordPos ) ] = HITMAN::GetPos ( pHit->m_uWordPos );
|
|
|
-
|
|
|
- for ( ; pHit>=m_tHits.First() && pHit->m_uWordPos==uRefPos; pHit-- )
|
|
|
- HITMAN::SetEndMarker ( &pHit->m_uWordPos );
|
|
|
+ m_pFieldLengthAttrs [ HITMAN::GetField ( pTail->m_uWordPos ) ] = HITMAN::GetPos ( pTail->m_uWordPos );
|
|
|
|
|
|
- // mark blended HEAD as trailing too
|
|
|
+ Hitpos_t uEndPos = pTail->m_uWordPos;
|
|
|
if ( iBlendedHitsStart>=0 )
|
|
|
{
|
|
|
assert ( iBlendedHitsStart>=0 && iBlendedHitsStart<m_tHits.Length() );
|
|
|
- pHit = const_cast < CSphWordHit * > ( m_tHits.First()+iBlendedHitsStart );
|
|
|
- uRefPos = pHit->m_uWordPos;
|
|
|
+ Hitpos_t uBlendedPos = ( m_tHits.First() + iBlendedHitsStart )->m_uWordPos;
|
|
|
+ uEndPos = Min ( uEndPos, uBlendedPos );
|
|
|
+ }
|
|
|
|
|
|
- const CSphWordHit * pEnd = m_tHits.First()+m_tHits.Length();
|
|
|
- for ( ; pHit<pEnd && pHit->m_uWordPos==uRefPos; pHit++ )
|
|
|
- HITMAN::SetEndMarker ( &pHit->m_uWordPos );
|
|
|
+ // set end marker for all tail hits
|
|
|
+ const CSphWordHit * pStart = m_tHits.First();
|
|
|
+ while ( pStart<=pTail && uEndPos<=pTail->m_uWordPos )
|
|
|
+ {
|
|
|
+ HITMAN::SetEndMarker ( &pTail->m_uWordPos );
|
|
|
+ pTail--;
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -25950,7 +25952,6 @@ void CSphSource_Document::BuildRegularHits ( SphDocID_t uDocid, bool bPayload, b
|
|
|
|
|
|
// FIELDEND_MASK at last token stream should be set for HEAD token too
|
|
|
int iBlendedHitsStart = -1;
|
|
|
- int iLastTokenStart = -1;
|
|
|
|
|
|
// index words only
|
|
|
while ( ( m_iMaxHits==0 || m_tHits.m_dData.GetLength()+BUILD_REGULAR_HITS_COUNT<m_iMaxHits )
|
|
|
@@ -25967,9 +25968,6 @@ void CSphSource_Document::BuildRegularHits ( SphDocID_t uDocid, bool bPayload, b
|
|
|
HITMAN::AddPos ( &m_tState.m_iHitPos, m_iBoundaryStep );
|
|
|
}
|
|
|
|
|
|
- if ( m_tState.m_iBuildLastStep )
|
|
|
- iLastTokenStart = m_tHits.Length();
|
|
|
-
|
|
|
if ( BuildZoneHits ( uDocid, sWord ) )
|
|
|
continue;
|
|
|
|
|
|
@@ -26029,27 +26027,25 @@ void CSphSource_Document::BuildRegularHits ( SphDocID_t uDocid, bool bPayload, b
|
|
|
// and compute field lengths
|
|
|
if ( !bSkipEndMarker && !m_tState.m_bProcessingHits && m_tHits.Length() )
|
|
|
{
|
|
|
- CSphWordHit * pHit = const_cast < CSphWordHit * > ( m_tHits.Last() );
|
|
|
- HITMAN::SetEndMarker ( &pHit->m_uWordPos );
|
|
|
+ CSphWordHit * pTail = const_cast < CSphWordHit * > ( m_tHits.Last() );
|
|
|
|
|
|
if ( m_pFieldLengthAttrs )
|
|
|
- m_pFieldLengthAttrs [ HITMAN::GetField ( pHit->m_uWordPos ) ] = HITMAN::GetPos ( pHit->m_uWordPos );
|
|
|
+ m_pFieldLengthAttrs [ HITMAN::GetField ( pTail->m_uWordPos ) ] = HITMAN::GetPos ( pTail->m_uWordPos );
|
|
|
|
|
|
- // mark blended HEAD as trailing too
|
|
|
+ Hitpos_t uEndPos = pTail->m_uWordPos;
|
|
|
if ( iBlendedHitsStart>=0 )
|
|
|
{
|
|
|
assert ( iBlendedHitsStart>=0 && iBlendedHitsStart<m_tHits.Length() );
|
|
|
- CSphWordHit * pBlendedHit = const_cast < CSphWordHit * > ( m_tHits.First() + iBlendedHitsStart );
|
|
|
- HITMAN::SetEndMarker ( &pBlendedHit->m_uWordPos );
|
|
|
- } else if ( iLastTokenStart>=0 && iLastTokenStart+1<m_tHits.Length() )
|
|
|
+ Hitpos_t uBlendedPos = ( m_tHits.First() + iBlendedHitsStart )->m_uWordPos;
|
|
|
+ uEndPos = Min ( uEndPos, uBlendedPos );
|
|
|
+ }
|
|
|
+
|
|
|
+ // set end marker for all tail hits
|
|
|
+ const CSphWordHit * pStart = m_tHits.First();
|
|
|
+ while ( pStart<=pTail && uEndPos<=pTail->m_uWordPos )
|
|
|
{
|
|
|
- CSphWordHit * pHit = const_cast < CSphWordHit * > ( m_tHits.First() + iLastTokenStart );
|
|
|
- const CSphWordHit * pEnd = m_tHits.First() + m_tHits.Length() - 1;
|
|
|
- while ( pHit<pEnd )
|
|
|
- {
|
|
|
- HITMAN::SetEndMarker ( &pHit->m_uWordPos );
|
|
|
- pHit++;
|
|
|
- }
|
|
|
+ HITMAN::SetEndMarker ( &pTail->m_uWordPos );
|
|
|
+ pTail--;
|
|
|
}
|
|
|
}
|
|
|
}
|