Skip to content

Commit 0087474

Browse files
committed
Implemented correct COUNT DISTINCT over several local indexes
1 parent 406f96d commit 0087474

20 files changed

+519
-385
lines changed

src/chunksearchctx.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void DiskChunkSearcherCtx_t::MergeChild ( DiskChunkSearcherCtx_t tChild ) const
2727
// sorting results
2828
ARRAY_CONSTFOREACH ( i, m_dSorters )
2929
if ( tChild.m_dSorters[i] )
30-
tChild.m_dSorters[i]->MoveTo ( m_dSorters[i] );
30+
tChild.m_dSorters[i]->MoveTo ( m_dSorters[i], false );
3131

3232
auto & tChildRes = tChild.m_tMeta;
3333

src/columnarsort.cpp

+10-10
Original file line numberDiff line numberDiff line change
@@ -281,11 +281,11 @@ class ColumnarProxySorter_T : public ISphMatchSorter
281281
void Push ( const VecTraits_T<const CSphMatch> & dMatches ) override { assert ( 0 && "No batch push to proxy sorter" ); }
282282

283283
bool IsGroupby() const override { return m_pSorter->IsGroupby(); }
284-
bool PushGrouped ( const CSphMatch & tEntry, bool bNewSet ) override { return m_pSorter->PushGrouped ( tEntry, bNewSet ); }
284+
bool PushGrouped ( const CSphMatch & tEntry, bool bNewSet, bool bUpdateDistinct ) override { return m_pSorter->PushGrouped ( tEntry, bNewSet, bUpdateDistinct ); }
285285
int GetLength () override;
286-
void Finalize ( MatchProcessor_i & tProcessor, bool bCallProcessInResultSetOrder ) override;
286+
void Finalize ( MatchProcessor_i & tProcessor, bool bCallProcessInResultSetOrder, bool bFinalizeMatches ) override;
287287
int Flatten ( CSphMatch * pTo ) override;
288-
void MoveTo ( ISphMatchSorter * pRhs ) override;
288+
void MoveTo ( ISphMatchSorter * pRhs, bool bCopyMeta ) override;
289289

290290
ISphMatchSorter * Clone() const override { return new ColumnarProxySorter_T<GENERIC,COMP,SINGLE> ( m_pSorter->Clone(), m_iSize, m_iFastPathAttrs ); }
291291
void CloneTo ( ISphMatchSorter * pTrg ) const override;
@@ -300,7 +300,7 @@ class ColumnarProxySorter_T : public ISphMatchSorter
300300
int64_t GetTotalCount() const override { return m_pSorter->GetTotalCount(); }
301301

302302
void SetFilteredAttrs ( const sph::StringSet & hAttrs, bool bAddDocid ) override { m_pSorter->SetFilteredAttrs ( hAttrs, bAddDocid ); }
303-
void TransformPooled2StandalonePtrs ( GetBlobPoolFromMatch_fn fnBlobPoolFromMatch, GetColumnarFromMatch_fn fnGetColumnarFromMatch ) override;
303+
void TransformPooled2StandalonePtrs ( GetBlobPoolFromMatch_fn fnBlobPoolFromMatch, GetColumnarFromMatch_fn fnGetColumnarFromMatch, bool bFinalizeSorters ) override;
304304

305305
bool IsRandom() const override { return m_pSorter->IsRandom(); }
306306
void SetRandom ( bool bRandom ) override { m_pSorter->SetRandom(bRandom); }
@@ -477,11 +477,11 @@ void ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::SetColumnar ( columnar::Columna
477477
}
478478

479479
template <typename GENERIC, typename COMP, typename SINGLE>
480-
void ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::TransformPooled2StandalonePtrs ( GetBlobPoolFromMatch_fn fnBlobPoolFromMatch, GetColumnarFromMatch_fn fnGetColumnarFromMatch )
480+
void ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::TransformPooled2StandalonePtrs ( GetBlobPoolFromMatch_fn fnBlobPoolFromMatch, GetColumnarFromMatch_fn fnGetColumnarFromMatch, bool bFinalizeSorters )
481481
{
482482
assert(m_pSorter);
483483
PushCollectedToSorter();
484-
m_pSorter->TransformPooled2StandalonePtrs ( fnBlobPoolFromMatch, fnGetColumnarFromMatch );
484+
m_pSorter->TransformPooled2StandalonePtrs ( fnBlobPoolFromMatch, fnGetColumnarFromMatch, bFinalizeSorters );
485485
m_pSchema = m_pSorter->GetSchema();
486486
}
487487

@@ -505,11 +505,11 @@ bool ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::PushMatch ( const CSphMatch & t
505505
}
506506

507507
template <typename GENERIC, typename COMP, typename SINGLE>
508-
void ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::Finalize ( MatchProcessor_i & tProcessor, bool bCallProcessInResultSetOrder )
508+
void ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::Finalize ( MatchProcessor_i & tProcessor, bool bCallProcessInResultSetOrder, bool bFinalizeMatches )
509509
{
510510
assert(m_pSorter);
511511
PushCollectedToSorter();
512-
m_pSorter->Finalize ( tProcessor, bCallProcessInResultSetOrder );
512+
m_pSorter->Finalize ( tProcessor, bCallProcessInResultSetOrder, bFinalizeMatches );
513513
}
514514

515515
template <typename GENERIC, typename COMP, typename SINGLE>
@@ -521,15 +521,15 @@ int ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::Flatten ( CSphMatch * pTo )
521521
}
522522

523523
template <typename GENERIC, typename COMP, typename SINGLE>
524-
void ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::MoveTo ( ISphMatchSorter * pRhs )
524+
void ColumnarProxySorter_T<GENERIC,COMP,SINGLE>::MoveTo ( ISphMatchSorter * pRhs, bool bCopyMeta )
525525
{
526526
// we assume that the rhs sorter is of the same type, i.e. proxy
527527
auto pRhsProxy = (ColumnarProxySorter_T<GENERIC,COMP,SINGLE>*)pRhs;
528528

529529
PushCollectedToSorter();
530530
pRhsProxy->PushCollectedToSorter();
531531

532-
m_pSorter->MoveTo ( pRhsProxy->m_pSorter.Ptr() );
532+
m_pSorter->MoveTo ( pRhsProxy->m_pSorter.Ptr(), bCopyMeta );
533533
}
534534

535535
template <typename GENERIC, typename COMP, typename SINGLE>

src/dynamic_idx.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -569,8 +569,8 @@ class DynMatchProcessor_c : public MatchProcessor_i, ISphNoncopyable
569569
}
570570
};
571571

572-
bool GenericTableIndex_c::MultiScan ( CSphQueryResult & tResult, const CSphQuery & tQuery,
573-
const VecTraits_T<ISphMatchSorter *> & dSorters, const CSphMultiQueryArgs &tArgs ) const
572+
573+
bool GenericTableIndex_c::MultiScan ( CSphQueryResult & tResult, const CSphQuery & tQuery, const VecTraits_T<ISphMatchSorter *> & dSorters, const CSphMultiQueryArgs & tArgs ) const
574574
{
575575
assert ( tArgs.m_iTag>=0 );
576576
auto & tMeta = *tResult.m_pMeta;
@@ -679,7 +679,7 @@ bool GenericTableIndex_c::MultiScan ( CSphQueryResult & tResult, const CSphQuery
679679
if ( tCtx.m_dCalcFinal.GetLength () )
680680
{
681681
DynMatchProcessor_c tFinal ( tArgs.m_iTag, tCtx );
682-
dSorters.Apply ( [&tFinal] ( ISphMatchSorter * p ) { p->Finalize ( tFinal, false ); } );
682+
dSorters.Apply ( [&] ( ISphMatchSorter * p ) { p->Finalize ( tFinal, false, tArgs.m_bFinalizeSorters ); } );
683683
}
684684

685685
tMeta.m_iQueryTime += ( int ) ( ( sphMicroTimer () - tmQueryStart ) / 1000 );

0 commit comments

Comments
 (0)