741 lines
16 KiB
C++
741 lines
16 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1991 - 2000.
|
|
//
|
|
// File: IRest.hxx
|
|
//
|
|
// Contents: Internal query restrictions
|
|
//
|
|
// Classes: CInternalPropertyRestriction
|
|
// COccRestriction
|
|
// CWordRestriction
|
|
// CSynRestriction
|
|
// CRangeRestriction
|
|
// CUnfilteredRestriction
|
|
// CScopeRestriction
|
|
// CPhraseRestriction
|
|
//
|
|
// History: 19-Sep-91 BartoszM Implemented.
|
|
// 30-Nov-92 KyleP Removed CPhraseXpr
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
|
|
DECLARE_SMARTP( Restriction )
|
|
DECLARE_SMARTP( NodeRestriction )
|
|
DECLARE_SMARTP( NotRestriction )
|
|
|
|
#define INIT_PHRASE_WORDS 4
|
|
|
|
#if CIDBG == 1
|
|
void Display( CRestriction * pxp, int indent, ULONG infolevel );
|
|
#endif // DBG == 1
|
|
|
|
//
|
|
// Internal node types
|
|
//
|
|
|
|
int const RTWord = 0xffffffff;
|
|
int const RTSynonym = 0xfffffffe;
|
|
int const RTPhrase = 0xfffffffd;
|
|
int const RTRange = 0xfffffffc;
|
|
int const RTIndexedProp = 0xfffffffb;
|
|
int const RTInternalProp = 0xfffffffa;
|
|
|
|
const ULONG RTScope = 9; // moved from querys.idl
|
|
|
|
|
|
// This is a helper function for unmarshalling a wide string from a stream.
|
|
// This can't be in memdeser since it calls CoTaskMemAlloc, which isn't
|
|
// available in ntdll.dll
|
|
|
|
WCHAR * UnMarshallWideString( PDeSerStream & stm );
|
|
WCHAR * UnMarshallWideStringNew( PDeSerStream & stm );
|
|
|
|
BOOL ValidateScopeRestriction( CRestriction * prestScope );
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CInternalPropertyRestriction
|
|
//
|
|
// Purpose: Property <relop> constant restriction
|
|
//
|
|
// History: 21-Jan-92 KyleP Created
|
|
//
|
|
// Notes: Identical to CPropertyRestriction except the Property
|
|
// name string is replaced with a pid.
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CInternalPropertyRestriction : public CRestriction
|
|
{
|
|
public:
|
|
|
|
//
|
|
// Constructors
|
|
//
|
|
|
|
inline CInternalPropertyRestriction();
|
|
|
|
CInternalPropertyRestriction( ULONG relop,
|
|
PROPID pid,
|
|
CStorageVariant const & prval,
|
|
CRestriction * pcrstHelper = 0 );
|
|
CInternalPropertyRestriction( CInternalPropertyRestriction const & intPropRst );
|
|
CInternalPropertyRestriction *Clone() const;
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
|
|
~CInternalPropertyRestriction();
|
|
|
|
//
|
|
// Validity check
|
|
//
|
|
|
|
inline BOOL IsValid() const;
|
|
|
|
//
|
|
// Serialization
|
|
//
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
CInternalPropertyRestriction( ULONG ulWeight, PDeSerStream & stm );
|
|
|
|
//
|
|
// Member variable access
|
|
//
|
|
|
|
inline void SetRelation( ULONG relop );
|
|
inline ULONG Relation() const;
|
|
|
|
inline void SetPid( PROPID pid );
|
|
inline PROPID Pid() const;
|
|
|
|
inline void SetValue( double dValue );
|
|
inline void SetValue( ULONG ulValue );
|
|
inline void SetValue( LONG lValue );
|
|
inline void SetValue( BOOL fValue );
|
|
|
|
inline void SetValue( FILETIME ftValue );
|
|
|
|
void SetValue( BLOB & bValue );
|
|
void SetValue( GUID & guidValue );
|
|
void SetValue( WCHAR * pwcsValue );
|
|
|
|
inline CStorageVariant const & Value() const;
|
|
|
|
//
|
|
// A content helper is a content index restriction that
|
|
// may help to resolve the property restriction.
|
|
//
|
|
|
|
inline CRestriction * GetContentHelper() const;
|
|
inline CRestriction * AcquireContentHelper();
|
|
inline void SetContentHelper( CRestriction * pcrst );
|
|
|
|
private:
|
|
|
|
ULONG _relop; // Relation
|
|
PROPID _pid; // Property
|
|
CStorageVariant _prval; // Constant value
|
|
CRestriction * _pcrst; // Expanded content restriction (for strings)
|
|
};
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: COccRestriction
|
|
//
|
|
// Purpose: Occurrence restriction
|
|
//
|
|
// History: 29-Nov-94 SitaramR Created
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class COccRestriction : public CRestriction
|
|
{
|
|
public:
|
|
COccRestriction( ULONG ulType, ULONG ulWeight, OCCURRENCE occ,
|
|
ULONG cPrevNoiseWords, ULONG cPostNoiseWords );
|
|
~COccRestriction();
|
|
|
|
//
|
|
// Validity check
|
|
//
|
|
|
|
BOOL IsValid() const;
|
|
|
|
//
|
|
// serialization
|
|
//
|
|
|
|
void Marshall( PSerStream& stm) const;
|
|
COccRestriction( ULONG ulType, ULONG ulWeight, PDeSerStream& stm);
|
|
|
|
COccRestriction *Clone() const;
|
|
|
|
OCCURRENCE Occurrence() const { return _occ; }
|
|
void SetOccurrence( OCCURRENCE occ) { _occ = occ; }
|
|
|
|
ULONG CountPrevNoiseWords() const { return _cPrevNoiseWords; }
|
|
ULONG CountPostNoiseWords() const { return _cPostNoiseWords; }
|
|
void AddCountPostNoiseWords( ULONG cWords ) { _cPostNoiseWords += cWords; }
|
|
|
|
protected:
|
|
OCCURRENCE _occ;
|
|
ULONG _cPrevNoiseWords;
|
|
ULONG _cPostNoiseWords;
|
|
};
|
|
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CWordRestriction
|
|
//
|
|
// Purpose: Word expression
|
|
//
|
|
// Interface:
|
|
//
|
|
// History: 19-Sep-91 BartoszM Created
|
|
// 05-Sep-92 MikeHew Added Serialization
|
|
// 14-Jan-93 KyleP Converted to restriction
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CWordRestriction : public COccRestriction
|
|
{
|
|
public:
|
|
|
|
//
|
|
// Constructors
|
|
//
|
|
|
|
CWordRestriction ( const CKeyBuf& keybuf,
|
|
OCCURRENCE occ,
|
|
ULONG cPrevNoiseWords,
|
|
ULONG cPostNoiseWords,
|
|
BOOL isRange );
|
|
CWordRestriction ( const CWordRestriction& wordRst );
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
|
|
~CWordRestriction();
|
|
|
|
//
|
|
// Validity check
|
|
//
|
|
|
|
inline BOOL IsValid() const;
|
|
|
|
//
|
|
// Serialization
|
|
//
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
CWordRestriction( ULONG ulWeight, PDeSerStream & stm );
|
|
|
|
CWordRestriction *Clone() const;
|
|
|
|
//
|
|
// Member variable access
|
|
//
|
|
|
|
BOOL IsRange() const { return _isRange; }
|
|
const CKey* GetKey() const { return &_key; }
|
|
PROPID Pid() const { return _key.Pid(); }
|
|
void SetPid( PROPID pid ) { _key.SetPid( pid ); }
|
|
|
|
private:
|
|
CKey _key;
|
|
BOOL _isRange;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CSynRestriction
|
|
//
|
|
// Purpose: Synonym expression
|
|
//
|
|
// History: 07-Feb-92 BartoszM Created
|
|
// 05-Sep-92 MikeHew Added Serialization
|
|
// 14-Jan-93 KyleP Converted to restriction
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CSynRestriction : public COccRestriction
|
|
{
|
|
public:
|
|
//
|
|
// Constructors
|
|
//
|
|
|
|
CSynRestriction ( const CKey& key, OCCURRENCE occ,
|
|
ULONG cPrevNoiseWords, ULONG cPostNoiseWords, BOOL isRange );
|
|
CSynRestriction( CSynRestriction& synRst );
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
|
|
~CSynRestriction();
|
|
|
|
//
|
|
// Validity check
|
|
//
|
|
|
|
inline BOOL IsValid() const;
|
|
|
|
//
|
|
// Serialization
|
|
//
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
CSynRestriction( ULONG ulWeight, PDeSerStream & stm );
|
|
|
|
CSynRestriction *Clone() const;
|
|
|
|
//
|
|
// Member variable access
|
|
//
|
|
|
|
void AddKey ( const CKeyBuf& Key );
|
|
CKeyArray& GetKeys() { return _keyArray; }
|
|
|
|
BOOL IsRange() { return _isRange; }
|
|
|
|
private:
|
|
CKeyArray _keyArray;
|
|
BOOL _isRange;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CRangeRestriction
|
|
//
|
|
// Purpose: Range expression
|
|
//
|
|
// History: 24-Sep-91 BartoszM Created
|
|
// 14-Jan-93 KyleP Converted to restriction
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CRangeRestriction : public CRestriction
|
|
{
|
|
public:
|
|
//
|
|
// Constructors
|
|
//
|
|
|
|
CRangeRestriction ();
|
|
CRangeRestriction( const CRangeRestriction& rangeRst );
|
|
CRangeRestriction *Clone() const;
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
|
|
~CRangeRestriction();
|
|
|
|
//
|
|
// Validity check
|
|
//
|
|
|
|
inline BOOL IsValid() const;
|
|
|
|
//
|
|
// Serialization
|
|
//
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
CRangeRestriction( ULONG ulWeight, PDeSerStream & stm );
|
|
|
|
//
|
|
// Member variable access
|
|
//
|
|
|
|
void SetStartKey ( const CKeyBuf& keyStart );
|
|
void SetEndKey ( const CKeyBuf& keyEnd );
|
|
|
|
PROPID Pid() const
|
|
{
|
|
Win4Assert(_keyStart.Pid() == _keyEnd.Pid() );
|
|
return _keyStart.Pid();
|
|
}
|
|
|
|
const CKey* GetStartKey() const { return &_keyStart; }
|
|
const CKey* GetEndKey() const { return &_keyEnd; }
|
|
|
|
private:
|
|
CKey _keyStart;
|
|
CKey _keyEnd;
|
|
};
|
|
|
|
class CUnfilteredRestriction : public CRangeRestriction
|
|
{
|
|
public:
|
|
|
|
CUnfilteredRestriction();
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CScopeRestriction
|
|
//
|
|
// Purpose: Scope restriction
|
|
//
|
|
// History: 07-Jan-93 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CScopeRestriction : public CRestriction
|
|
{
|
|
public:
|
|
|
|
//
|
|
// Constructors
|
|
//
|
|
|
|
inline CScopeRestriction();
|
|
CScopeRestriction( WCHAR const * pwcsPath, BOOL fRecursive, BOOL fVirtual );
|
|
|
|
//
|
|
// Copy constructors/assignment/clone
|
|
//
|
|
|
|
CScopeRestriction & operator =( CScopeRestriction const & source );
|
|
CScopeRestriction * Clone() const;
|
|
|
|
//
|
|
// Destructor
|
|
//
|
|
|
|
~CScopeRestriction();
|
|
|
|
//
|
|
// Validity check
|
|
//
|
|
|
|
inline BOOL IsValid() const;
|
|
|
|
//
|
|
// Serialization
|
|
//
|
|
|
|
void Marshall( PSerStream & stm ) const;
|
|
CScopeRestriction( ULONG ulWeight, PDeSerStream & stm );
|
|
|
|
//
|
|
// Member variable access
|
|
//
|
|
|
|
void SetPath( WCHAR const * pwcsPath );
|
|
inline WCHAR const * GetPath() const;
|
|
inline ULONG PathLength() const;
|
|
inline const CLowerFunnyPath & GetFunnyPath() const;
|
|
|
|
//
|
|
// Query depth
|
|
//
|
|
|
|
inline void MakeDeep();
|
|
inline void MakeShallow();
|
|
|
|
inline BOOL IsDeep() const;
|
|
inline BOOL IsShallow() const;
|
|
|
|
//
|
|
// Virtual/Physical scoping.
|
|
//
|
|
|
|
inline void MakePhysical();
|
|
inline void MakeVirtual();
|
|
|
|
inline BOOL IsPhysical() const;
|
|
inline BOOL IsVirtual() const;
|
|
|
|
# ifdef CIEXTMODE
|
|
void CiExtDump(void *ciExtSelf);
|
|
# endif
|
|
|
|
private:
|
|
BOOL _fValid;
|
|
CLowerFunnyPath _lowerFunnyPath;
|
|
ULONG _fRecursive; // Should be BOOL, but MIDL dislikes
|
|
ULONG _fVirtual; // Should be BOOL, but MIDL dislikes
|
|
};
|
|
|
|
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CPhraseRestriction
|
|
//
|
|
// Purpose: Phrase restriction whose children are occurrence restrictions
|
|
//
|
|
// History: 29-Nov-94 SitaramR Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CPhraseRestriction : public CNodeRestriction
|
|
{
|
|
public:
|
|
|
|
CPhraseRestriction( unsigned cInitAllocated = 2 )
|
|
: CNodeRestriction( RTPhrase, cInitAllocated ) { }
|
|
~CPhraseRestriction();
|
|
|
|
//
|
|
// De-serialization (serialization is done by CNodeRestriction only, because
|
|
// there are no data members in CPhraseRestriction)
|
|
//
|
|
CPhraseRestriction( ULONG ulWeight, PDeSerStream & stm );
|
|
|
|
//
|
|
// Node manipulation
|
|
//
|
|
void AddChild( CRestriction * presChild, unsigned & pos )
|
|
{
|
|
Win4Assert( presChild->Type() == RTWord || presChild->Type() == RTSynonym );
|
|
CNodeRestriction::AddChild( presChild, pos );
|
|
}
|
|
|
|
void AddChild( CRestriction * presChild )
|
|
{
|
|
Win4Assert( presChild->Type() == RTWord || presChild->Type() == RTSynonym );
|
|
CNodeRestriction::AddChild( presChild );
|
|
}
|
|
|
|
COccRestriction * RemoveChild( unsigned pos )
|
|
{
|
|
CRestriction *pRst = CNodeRestriction::RemoveChild( pos );
|
|
|
|
#if CIDBG == 1
|
|
if ( pRst )
|
|
Win4Assert( pRst->Type() == RTWord || pRst->Type() == RTSynonym );
|
|
#endif
|
|
|
|
return (COccRestriction *)pRst;
|
|
}
|
|
|
|
|
|
//
|
|
// Member variable access
|
|
//
|
|
void SetChild( CRestriction * presChild, unsigned pos )
|
|
{
|
|
Win4Assert( presChild->Type() == RTWord || presChild->Type() == RTSynonym );
|
|
CNodeRestriction::SetChild( presChild, pos );
|
|
}
|
|
|
|
COccRestriction * GetChild( unsigned pos ) const
|
|
{
|
|
CRestriction *pRst = CNodeRestriction::GetChild( pos );
|
|
|
|
#if CIDBG == 1
|
|
if ( pRst )
|
|
Win4Assert( pRst->Type() == RTWord || pRst->Type() == RTSynonym );
|
|
#endif
|
|
|
|
return (COccRestriction *)pRst;
|
|
}
|
|
};
|
|
|
|
|
|
DECLARE_SMARTP( ScopeRestriction )
|
|
|
|
inline CInternalPropertyRestriction::CInternalPropertyRestriction()
|
|
: CRestriction( RTInternalProp, MAX_QUERY_RANK )
|
|
{
|
|
}
|
|
|
|
inline BOOL CInternalPropertyRestriction::IsValid() const
|
|
{
|
|
return ( _pid != pidInvalid &&
|
|
_prval.IsValid() &&
|
|
( 0 == _pcrst || _pcrst->IsValid() ) );
|
|
}
|
|
|
|
inline void CInternalPropertyRestriction::SetRelation( ULONG relop )
|
|
{
|
|
_relop = relop;
|
|
}
|
|
|
|
inline ULONG CInternalPropertyRestriction::Relation() const
|
|
{
|
|
return _relop;
|
|
}
|
|
|
|
inline void CInternalPropertyRestriction::SetPid( PROPID pid )
|
|
{
|
|
_pid = pid;
|
|
}
|
|
|
|
inline PROPID CInternalPropertyRestriction::Pid() const
|
|
{
|
|
return _pid;
|
|
}
|
|
|
|
inline void CInternalPropertyRestriction::SetValue( double dValue )
|
|
{
|
|
_prval = dValue;
|
|
}
|
|
|
|
inline void CInternalPropertyRestriction::SetValue( ULONG ulValue )
|
|
{
|
|
_prval.SetUI4( ulValue );
|
|
}
|
|
|
|
inline void CInternalPropertyRestriction::SetValue( LONG lValue )
|
|
{
|
|
_prval = lValue;
|
|
}
|
|
|
|
inline void CInternalPropertyRestriction::SetValue( BOOL fValue )
|
|
{
|
|
_prval.SetBOOL( fValue ? VARIANT_TRUE : VARIANT_FALSE );
|
|
}
|
|
|
|
inline void CInternalPropertyRestriction::SetValue( FILETIME ftValue )
|
|
{
|
|
_prval = ftValue;
|
|
}
|
|
|
|
inline CStorageVariant const & CInternalPropertyRestriction::Value() const
|
|
{
|
|
return( _prval );
|
|
}
|
|
|
|
inline CRestriction * CInternalPropertyRestriction::GetContentHelper() const
|
|
{
|
|
return( _pcrst );
|
|
}
|
|
|
|
inline CRestriction * CInternalPropertyRestriction::AcquireContentHelper()
|
|
{
|
|
CRestriction * pTemp = _pcrst;
|
|
_pcrst = 0;
|
|
return( pTemp );
|
|
}
|
|
|
|
inline void CInternalPropertyRestriction::SetContentHelper( CRestriction * pcrst )
|
|
{
|
|
Win4Assert( _pcrst == 0 );
|
|
_pcrst = pcrst;
|
|
}
|
|
|
|
//
|
|
// CWordRestriction inline
|
|
//
|
|
|
|
inline BOOL CWordRestriction::IsValid() const
|
|
{
|
|
return ( 0 != _key.GetBuf() );
|
|
}
|
|
|
|
//
|
|
// CSynRestriction inline
|
|
//
|
|
|
|
inline BOOL CSynRestriction::IsValid() const
|
|
{
|
|
for ( int i = 0; i < _keyArray.Count(); i++ )
|
|
{
|
|
if ( 0 == _keyArray.Get(i).GetBuf() )
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// CRangeRestriction inline
|
|
//
|
|
|
|
inline BOOL CRangeRestriction::IsValid() const
|
|
{
|
|
return ( 0 != _keyStart.GetBuf() && 0 != _keyEnd.GetBuf() );
|
|
}
|
|
|
|
//
|
|
// CScopeRestriction inline
|
|
//
|
|
|
|
inline CScopeRestriction::CScopeRestriction()
|
|
: CRestriction( RTScope, MAX_QUERY_RANK ),
|
|
_fValid(FALSE)
|
|
{
|
|
}
|
|
|
|
inline BOOL CScopeRestriction::IsValid() const
|
|
{
|
|
return ( _fValid );
|
|
}
|
|
|
|
// returns the Actual Path
|
|
inline WCHAR const * CScopeRestriction::GetPath() const
|
|
{
|
|
return _fValid ? _lowerFunnyPath.GetActualPath() : NULL;
|
|
}
|
|
|
|
// returns the actual path length
|
|
inline ULONG CScopeRestriction::PathLength() const
|
|
{
|
|
return _lowerFunnyPath.GetActualLength();
|
|
}
|
|
|
|
// Returns funny path
|
|
inline const CLowerFunnyPath & CScopeRestriction::GetFunnyPath() const
|
|
{
|
|
return _lowerFunnyPath;
|
|
}
|
|
|
|
inline void CScopeRestriction::MakeDeep()
|
|
{
|
|
_fRecursive = TRUE;
|
|
}
|
|
|
|
inline void CScopeRestriction::MakeShallow()
|
|
{
|
|
_fRecursive = FALSE;
|
|
}
|
|
|
|
inline BOOL CScopeRestriction::IsDeep() const
|
|
{
|
|
return ( _fRecursive == TRUE );
|
|
}
|
|
|
|
inline BOOL CScopeRestriction::IsShallow() const
|
|
{
|
|
return ( _fRecursive == FALSE );
|
|
}
|
|
|
|
inline void CScopeRestriction::MakePhysical()
|
|
{
|
|
_fVirtual = FALSE;
|
|
}
|
|
|
|
inline void CScopeRestriction::MakeVirtual()
|
|
{
|
|
_fVirtual = TRUE;
|
|
}
|
|
|
|
inline BOOL CScopeRestriction::IsPhysical() const
|
|
{
|
|
return ( _fVirtual == FALSE );
|
|
}
|
|
|
|
inline BOOL CScopeRestriction::IsVirtual() const
|
|
{
|
|
return ( _fVirtual == TRUE );
|
|
}
|
|
|