415 lines
10 KiB
C++
415 lines
10 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1991 - 2000.
|
|
//
|
|
// File: Xpr.hxx
|
|
//
|
|
// Contents: Internal expression classes
|
|
//
|
|
// Classes: CNodeXpr
|
|
// CXprPropertyValue
|
|
// CXprPropertyRelation
|
|
//
|
|
// History: 10-Sep-91 KyleP Created
|
|
//
|
|
// Notes: Implementation for classes defined in this file will be
|
|
// found with either the content index or the query engine.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#pragma once
|
|
|
|
#include <strategy.hxx>
|
|
|
|
// ..\Inc includes:
|
|
#include <pvalxpr.hxx>
|
|
|
|
class CNodeXpr;
|
|
class CCI;
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CXpr (xp)
|
|
//
|
|
// Purpose: Base (internal) expression class.
|
|
//
|
|
// Interface:
|
|
//
|
|
// History: 11-Sep-91 KyleP Created.
|
|
// 23-Jun-92 MikeHew Added Weighting
|
|
// 05-Sep-92 MikeHew Added Serialization
|
|
//
|
|
// Notes: Restrictions are converted to expressions during
|
|
// normalization. Expressions are aware of issues such as
|
|
// what indexes can optimize their evaluation and can
|
|
// be evaluated with respect to a particular object.
|
|
//
|
|
// In contrast, restrictions are just a description of an
|
|
// expression.
|
|
//
|
|
// This class is shared with the content index. Some methods
|
|
// only make sense for expressions which are capable of being
|
|
// evaluated by the content index. Other methods only apply
|
|
// to evaluation in the Query engine.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CXpr : public CValueXpr
|
|
{
|
|
public:
|
|
|
|
enum NodeType
|
|
{
|
|
NTAnd,
|
|
NTOr,
|
|
NTNot,
|
|
NTAndNot,
|
|
NTVector,
|
|
|
|
NTScope,
|
|
|
|
NTProperty,
|
|
NTRegex,
|
|
NTPropertyValue,
|
|
|
|
NTNull
|
|
};
|
|
|
|
//
|
|
// Construction-related methods
|
|
//
|
|
|
|
inline CXpr( NodeType type, ULONG ulWeight = MAX_QUERY_RANK );
|
|
|
|
virtual ~CXpr();
|
|
|
|
virtual CXpr * Clone();
|
|
|
|
//
|
|
// Index-related methods
|
|
//
|
|
|
|
virtual void SelectIndexing( CIndexStrategy & strategy );
|
|
|
|
virtual BOOL IsMatch( CRetriever & obj );
|
|
|
|
//
|
|
// Match quality methods
|
|
//
|
|
|
|
virtual ULONG HitCount( CRetriever & );
|
|
|
|
virtual LONG Rank( CRetriever & );
|
|
|
|
//
|
|
// Value-related methods
|
|
//
|
|
|
|
virtual GetValueResult GetValue( CRetriever & obj,
|
|
PROPVARIANT * p,
|
|
ULONG * pcb );
|
|
|
|
virtual ULONG ValueType() const;
|
|
|
|
//
|
|
// Node-related methods
|
|
//
|
|
|
|
NodeType NType() const;
|
|
|
|
virtual BOOL IsLeaf() const;
|
|
|
|
inline CNodeXpr* CastToNode();
|
|
|
|
ULONG GetWeight() { return _weight; }
|
|
|
|
void SetWeight(ULONG wt) { _weight = wt; }
|
|
|
|
protected:
|
|
|
|
NodeType _type;
|
|
|
|
ULONG _weight;
|
|
|
|
};
|
|
|
|
DECLARE_SMARTP( Xpr );
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CXpr::NType, public
|
|
//
|
|
// Returns: Type of expression node
|
|
//
|
|
// History: 27-Sep-91 BartoszM Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline CXpr::NodeType CXpr::NType() const
|
|
{
|
|
return _type;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CXpr::CastToNode, public
|
|
//
|
|
// Synopsis: "Safe" cast down to CNodeXpr
|
|
//
|
|
// Requires: Type to be one of CNodeXpr types
|
|
//
|
|
// History: 27-Sep-91 BartoszM Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline CNodeXpr* CXpr::CastToNode()
|
|
{
|
|
Assert ( _type == NTAnd ||
|
|
_type == NTOr ||
|
|
_type == NTAndNot ||
|
|
_type == NTVector );
|
|
|
|
return (CNodeXpr*) this;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CXpr::~CXpr, public
|
|
//
|
|
// Synopsis: Destroys an expression.
|
|
//
|
|
// History: 23-Sep-91 KyleP Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline CXpr::~CXpr()
|
|
{}
|
|
|
|
inline void CXpr::SelectIndexing( CIndexStrategy & strategy )
|
|
{
|
|
strategy.SetUnknownBounds();
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CNodeXpr
|
|
//
|
|
// Purpose: Node with child expressions (Boolean, Phrase, etc...)
|
|
//
|
|
// Interface:
|
|
//
|
|
// History: 11-Sep-91 BartoszM Created.
|
|
// 05-Sep-92 MikeHew Added Serialization
|
|
//
|
|
// Notes: CNodeXpr does not guarantee the position of nodes across
|
|
// calls to RemoveChild.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CNodeXpr : public CXpr
|
|
{
|
|
public:
|
|
|
|
CNodeXpr( CXpr::NodeType type, unsigned cInit = 2 );
|
|
|
|
CNodeXpr( CNodeXpr & nxpr );
|
|
|
|
virtual ~CNodeXpr();
|
|
|
|
virtual CXpr * Clone();
|
|
|
|
//
|
|
// Index-related methods
|
|
//
|
|
|
|
virtual void SelectIndexing( CIndexStrategy & strategy );
|
|
|
|
virtual BOOL IsMatch( CRetriever & obj );
|
|
|
|
//
|
|
// Match quality methods
|
|
//
|
|
|
|
virtual ULONG HitCount( CRetriever & );
|
|
|
|
virtual LONG Rank( CRetriever & );
|
|
|
|
//
|
|
// Node-specific methods
|
|
//
|
|
|
|
BOOL IsLeaf() const;
|
|
|
|
void AddChild ( CXpr* child );
|
|
|
|
inline void SetChild ( CXpr* child, unsigned iPos );
|
|
|
|
inline CXpr* GetChild ( unsigned iPos );
|
|
|
|
CXpr* RemoveChild ( unsigned iPos );
|
|
|
|
unsigned Count() { return _cXpr; }
|
|
|
|
private:
|
|
|
|
unsigned _size;
|
|
unsigned _cXpr;
|
|
CXpr * * _aXpr;
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Class: CVectorXpr
|
|
//
|
|
// Purpose: Extended from node expression to support weighted vectors.
|
|
//
|
|
// History: 24-Jul-92 KyleP Created.
|
|
// 05-Sep-92 MikeHew Added Serialization
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
class CVectorXpr : public CNodeXpr
|
|
{
|
|
public:
|
|
|
|
CVectorXpr( unsigned cInit, ULONG RankMethod );
|
|
|
|
inline ULONG GetRankMethod() { return( _ulRankMethod ); }
|
|
|
|
private:
|
|
|
|
ULONG _ulRankMethod;
|
|
};
|
|
|
|
//+-------------------------------------------------------------------------
|
|
//
|
|
// Class: CXprPropertyRelation (pv)
|
|
//
|
|
// Purpose: Performs relational operations on properties
|
|
//
|
|
// Interface:
|
|
//
|
|
// History: 11-Oct-91 KyleP Created
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
class CXprPropertyRelation : public CXpr
|
|
{
|
|
public:
|
|
|
|
CXprPropertyRelation( PROPID pid,
|
|
ULONG relop,
|
|
CStorageVariant const & prval,
|
|
CRestriction * prstContentHelper );
|
|
|
|
CXprPropertyRelation( CXprPropertyRelation & propxpr );
|
|
|
|
virtual ~CXprPropertyRelation();
|
|
|
|
virtual CXpr * Clone();
|
|
|
|
virtual void SelectIndexing( CIndexStrategy & strategy );
|
|
|
|
virtual BOOL IsMatch( CRetriever & obj );
|
|
|
|
private:
|
|
|
|
CXprPropertyValue _xpval; // Gets value from filesystem
|
|
BOOL (* _relop) (PROPVARIANT const &,
|
|
PROPVARIANT const &); // Relational operator
|
|
CStorageVariant _cval; // Constant value
|
|
ULONG _rel; // Relation (used if type
|
|
// mismatch)
|
|
XPtr<CRestriction> _xrstContentHelper; // Content helper.
|
|
};
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CXpr::CXpr, public
|
|
//
|
|
// Synopsis:
|
|
//
|
|
// Arguments: [type] -- type of expression
|
|
//
|
|
// History: 27-Sep-91 BartoszM Created.
|
|
// 23-Jun-92 MikeHew Added Weighting.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
CXpr::CXpr(NodeType type, ULONG ulWeight ) :
|
|
_type(type), _weight(ulWeight)
|
|
{
|
|
END_CONSTRUCTION( CXpr );
|
|
}
|
|
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CNodeXpr::SetChild, public
|
|
//
|
|
// Synopsis: Set the child expression at a specific position.
|
|
//
|
|
// Arguments: [child] -- New child node.
|
|
// [iPos] -- Position of node.
|
|
//
|
|
// Requires: [iPos] is a valid index.
|
|
//
|
|
// History: 12-Dec-91 KyleP Created.
|
|
//
|
|
// Notes: The position of an expression within the node is not
|
|
// guaranteed to be constant over all operations on the node.
|
|
// The only safe way to use this function is after a call to
|
|
// GetChild.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline void CNodeXpr::SetChild ( CXpr* child, unsigned iPos )
|
|
{
|
|
Win4Assert ( iPos <= _cXpr );
|
|
_aXpr[iPos] = child;
|
|
}
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CNodeXpr::GetChild, public
|
|
//
|
|
// Synopsis: Retrieves a child expression without removing it from the node.
|
|
//
|
|
// Arguments: [iPos] -- Position of expression to retrieve.
|
|
//
|
|
// Requires: [iPos] is a valid index.
|
|
//
|
|
// Returns: A pointer the the expression at [iPos].
|
|
//
|
|
// History: 12-Dec-91 KyleP Created.
|
|
//
|
|
// Notes: You are just 'borrowing' a node when retrieving it with
|
|
// this method. Do not delete the borrowed node!
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
inline CXpr* CNodeXpr::GetChild ( unsigned iPos )
|
|
{
|
|
Win4Assert ( iPos <= _cXpr );
|
|
return _aXpr[iPos];
|
|
}
|
|
|
|
#ifdef DOCGEN
|
|
|
|
//+---------------------------------------------------------------------------
|
|
//
|
|
// Member: CXpr::NType, public
|
|
//
|
|
// Returns: Type type of this particular node (AND, CONTENT, etc.)
|
|
//
|
|
// History: 23-Sep-91 KyleP Created.
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
NodeType CXpr::NType() const
|
|
{}
|
|
|
|
#endif /* DOCGEN */
|
|
|