Windows2003-3790/inetsrv/query/h/keycur.hxx

129 lines
3.4 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1991 - 1998.
//
// File: keycur.hxx
//
// Contents: Key cursor classes
//
// Classes: CKeyCursor - 'The mother of all key cursors'
//
// History: 15-Apr-91 KyleP Created.
// 26-Sep-91 BartoszM Made it a subclass
// 18-Feb-92 AmyA Changed from CIndexCursor to
// CKeyCursor.
//
//----------------------------------------------------------------------------
#pragma once
#include <misc.hxx>
#include <ocursor.hxx>
class CKeyBuf;
//+---------------------------------------------------------------------------
//
// Class: CKeyCursor
//
// Purpose: The root class for all key cursors
//
// Interface:
//
// History: 15-Apr-91 KyleP Created.
// 22-Jul-92 BartoszM added weight, rank, and max wid
// 23-Jun-94 SitaramR removed _widMax.
//
//----------------------------------------------------------------------------
class CKeyCursor : public COccCursor
{
public:
CKeyCursor ( INDEXID iid, WORKID widMax )
: COccCursor(iid, widMax),
_lStatWeight( 0xffffffff ) {}
CKeyCursor () {}
virtual const CKeyBuf * GetKey() = 0;
// GetNextKey should always update _pid!
// and _lStatWeight
virtual const CKeyBuf * GetNextKey() = 0;
virtual ULONG OccurrenceCount() { return(0); }
virtual WORKID MaxWorkId() { return(_widMax); }
virtual LONG Rank()
{
LONG rank;
//
// Only string keys really have a rank with any meaning.
//
if ( GetKey()->IsValue() )
{
rank = MAX_QUERY_RANK;
}
else
{
OCCURRENCE maxOcc = MaxOccurrence();
Win4Assert( maxOcc > 0 );
Win4Assert( 0xffffffff != _lStatWeight );
rank = RANK_MULTIPLIER * HitCount() * _lStatWeight / maxOcc;
ciDebugOut(( DEB_TRACE, "wid %d, rank %d, maxOcc %d, _lStatWeight %d, HitCount %d\n",
WorkId(), rank, maxOcc, _lStatWeight, HitCount() ));
#if CIDBG == 1
if ( rank < 0 )
ciDebugOut(( DEB_WARN,
"keycur rank 0x%x, maxOcc 0x%x, _lStatWeight 0x%x, HitCount 0x%x\n",
rank, maxOcc, _lStatWeight, HitCount() ));
#endif
if (rank > MAX_QUERY_RANK)
rank = MAX_QUERY_RANK;
}
return rank;
}
virtual void FreeStream() {}
virtual void RefillStream() {}
void RatioFinished ( ULONG& denom, ULONG& num )
{
Win4Assert ( !"RatioFinished called for random CKeyCursor" );
}
#ifdef CIEXTMODE
void CiExtDump(void *ciExtSelf);
#endif
protected:
void UpdateWeight()
{
ULONG widCount = WorkIdCount();
if ( widCount == 0 )
_lStatWeight = 0;
else
_lStatWeight = Log2(_widMax / widCount);
ciDebugOut(( DEB_TRACE, "updateweight wid %d, _widMax %d, widCount %d, _lStatWeight %d\n",
WorkId(), _widMax, widCount, _lStatWeight ));
}
LONG _lStatWeight; // statistical weight for current key
};