//+--------------------------------------------------------------------------- // // 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 // ..\Inc includes: #include 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 _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 */