|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 2000.
//
// File: index.cxx
//
// Contents: Methods used by all indexes.
//
// Classes: CIndex
//
// History: 06-Mar-91 KyleP Created.
//
//----------------------------------------------------------------------------
#include <pch.cxx>
#pragma hdrstop
#include "index.hxx"
#include "stat.hxx"
#if DEVL == 1
#define INPTR pfOut
#define DEB_PRINTF( x ) fprintf x
#endif
//+---------------------------------------------------------------------------
//
// Member: CIndex::DebugDump, public
//
// Synopsis: Formatted dump of CWordList contents.
//
// Arguments: [pfOut] -- File to dump data to.
//
// Requires: The AddEntry method cannot be called after DebugDump.
//
// Derivation: From base class CIndex, Always override in subclasses.
//
// History: 07-Mar-91 KyleP Created.
// 27-Oct-93 DwightKr Increased size of PopularKeys so
// that prop filtering could be tested
//
// Notes: This interface should at some point be changed to accept
// a stream and write the contents of the CWordList to the
// stream. Since C7 does not yet provide a stream interface
// I'll just print to stdout (Ugh!);
//
//----------------------------------------------------------------------------
void CIndex::DebugDump(FILE *pfOut, ULONG fSummaryOnly ) { #if CIDBG == 1
const CKeyBuf * pkey;
CKeyCursor * pcur = QueryCursor();
TRY { CStat KeyDelta; CStat WidCount; CStat OccCount; CKeyBuf LastKey;
static ULONG aBucket[] = { 1, 2, 3, 4, 6, 8, 12, 16, 24, 32, 64, 96, 128, 192, 256, 284, 512, 768, 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576, 32768 };
CDistrib WidDistrib( sizeof(aBucket) / sizeof(ULONG), 1, aBucket );
CDistrib OccDistrib( sizeof(aBucket) / sizeof(ULONG), 1, aBucket );
LastKey.SetCount(0);
CPopularKeys PopularKeys(50); CPopularKeys BigOccKeys(50);
int const cWidsToTrack = 50; CPopularKeys widKeys[ cWidsToTrack + 1 ];
ciDebugOut(( DEB_ITRACE, "Scan on letter: " )); WCHAR FirstLetter = '@';
for (pkey = pcur->GetKey(); pkey != NULL; pkey = pcur->GetNextKey()) { //
// Calculate the common prefix from the previous key.
//
UINT cPrefix; UINT mincb = __min( LastKey.Count(), pkey->Count() );
for ( cPrefix = 0; (cPrefix < mincb) && ((LastKey.GetBuf())[cPrefix] == pkey->GetBuf()[cPrefix]); cPrefix++ ) continue; // NULL body
UINT cSuffix = pkey->Count() - cPrefix;
LastKey = *pkey;
if ( cPrefix > 15 || cSuffix > 15 ) cSuffix += 3; // 0 byte + prefix + suffix
else cSuffix += 1; // prefix/suffix byte
KeyDelta.Add( cSuffix ); WidCount.Add( pcur->WorkIdCount() ); WidDistrib.Add( pcur->WorkIdCount() );
PopularKeys.Add( *pkey, pcur->WorkIdCount() );
if ( *(pkey->GetStr()) != FirstLetter ) { FirstLetter = *(pkey->GetStr()); ciDebugOut (( DEB_NOCOMPNAME | DEB_ITRACE, "%c", FirstLetter )); }
if ( !fSummaryOnly ) { DEB_PRINTF((INPTR, "Key: "));
DEB_PRINTF((INPTR, "%.*ws -- ", pkey->StrLen(), pkey->GetStr()));
DEB_PRINTF((INPTR, " (PID = %lx)", pkey->Pid())); DEB_PRINTF((INPTR, " (CWID = %ld)\n", pcur->WorkIdCount())); }
for (WORKID wid = pcur->WorkId(); wid != widInvalid; wid = pcur->NextWorkId()) { OccCount.Add( pcur->OccurrenceCount() ); OccDistrib.Add( pcur->OccurrenceCount() ); BigOccKeys.Add( *pkey, pcur->OccurrenceCount() );
if ( wid <= cWidsToTrack ) widKeys[wid].Add( *pkey, pcur->Rank() );
if ( !fSummaryOnly ) { DEB_PRINTF((INPTR, " (WID = %lx) ", wid)); DEB_PRINTF((INPTR, "(COCC = %ld)\n\t", pcur->OccurrenceCount()));
int i = 1;
for (OCCURRENCE occ = pcur->Occurrence(); occ != OCC_INVALID; occ = pcur->NextOccurrence(), i++ ) { DEB_PRINTF((INPTR, " %6ld", occ)); if ( i % 10 == 0 ) { DEB_PRINTF((INPTR, "\n\t")); } }
DEB_PRINTF((INPTR, "\n")); } }
if ( !fSummaryOnly ) { DEB_PRINTF((INPTR, "\n")); }
}
//
// Print stats
//
KeyDelta.Print( pfOut, "Key size", 1, 1 ); WidCount.Print( pfOut, "Wid count", 0, 1 ); OccCount.Print( pfOut, "Occ count", 0, 1 );
DEB_PRINTF(( INPTR, "\nMost popular keys (high work id count):\n\n" )); PopularKeys.Print( pfOut );
DEB_PRINTF(( INPTR, "\nMost popular keys (high occurrence count):\n\n" )); BigOccKeys.Print( pfOut );
DEB_PRINTF(( INPTR, "\n\nWorkid count distribution:\n\n" )); WidDistrib.Print( pfOut ); DEB_PRINTF(( INPTR, "\n\nOccurrence count distribution:\n\n" )); OccDistrib.Print( pfOut );
ciDebugOut (( DEB_NOCOMPNAME | DEB_ITRACE, "\n" ));
for ( int i = 1; i <= cWidsToTrack; i++ ) { DEB_PRINTF(( INPTR, "\n\nWid %u:\n", i )); widKeys[i].Print( pfOut ); }
} CATCH(CException, e) { delete pcur; RETHROW(); } END_CATCH
delete pcur; #endif // CIDBG == 1
}
|