Contents:
Search: |
SheafOverviewThe sheaf is the datastructure returned by the "SELECT (ALL|FOCUS) OBJECTS" query. See the MQL User's Guide Chapter 4 for a description of the sheaf. Briefly, a sheaf is a list of straws. A straw is a list of matched_objects. A matched_object may have an inner sheaf, which makes the datastructure recursive. A matched_object corresponds to an object_block(_first) or (opt_)gap_block in a topographic MQL query. A straw corresponds to a block_string. A sheaf corresponds to a blocks. A matched_object may be one of two kinds:
Use the getKind() method to find out which it is, if you don't already know from the query. A matched_object contains the following information:
Java-style iterators are provided. C++ interface#include <mql_sheaf.h> typedef enum { kMOKNIL_mo, // Used only while building sheaf, never in finished sheaf kMOKEMPTY_mo, // Used only while building sheaf, never in finished sheaf kMOKID_D, // Match of object_block(_first) kMOKID_M // Match of (opt_)gap_block } eMOKind; class MatchedObject { public: MatchedObject(const MatchedObject& other); ~MatchedObject(); const SetOfMonads& getMonads(void) const; id_d_t getID_D(void) const; const Sheaf* getSheaf(void) const; bool sheafIsEmpty(void) const; eMOKind getKind(void) const; /** Return true if this is an ID_M. * * @return \p true if this is an ID_M matched object, * \p false if it is an ID_D matched object. */ bool isID_M(void) const; /** Return true if this is an ID_D. * * @return \p true if this is an ID_D matched object, * \p false if it is an ID_M matched object. */ bool isID_D(void) const; /** Return true if the block from which this came had the FOCUS keyword. * * @return \p true if this matched object is in FOCUS, * \p false otherwise. */ bool getFocus(void) const; /* Return the mark string (given in the query with a backping * ("`"), right after the object type in an object_block, or * right after "[gap?" or "[gap". * * Can be called for all types of MatchedObjects, but will return "" (the * empty string) if either there is no mark, or it is an EMPTY_MO. * * @return the mark string, including the backping. */ std::string getMarkString() const; MatchedObject& operator=(const MatchedObject& other); // Not SWIG-wrapped short int getObjectTypeIndex(void) const; // A convenience function for getEMdFValue. // // Returns a string representation of the given EMdFValue. // Integers and ID_Ds are returned as their base-10 representation. // Strings are returned as-is. // Enums are returned as their string name, not their integer value. // Lists of integers are returned as a comma-separated list of // the base-10 representation of the integers involved, surrounded by // parentheses. // Lists of id_ds are returned like lists of integers. // // Always returns a string, so long as the index parameter is in range. // // Throws an EmdrosException if index out of range. std::string getFeatureAsString(int index) const; // A convenience function for getEMdFValue. // // Returns the "long" value of the given EMdFValue, if possible. // // Only features that are integers, id_ds, or enums return a value. // All others will throw an EmdrosException. // // Integers and id_ds are returned as is. // Enums are returned by their integer value, not their string name. // // Throws an EmdrosException if index out of range. long getFeatureAsLong(int index) const; // Get enum label from an index into the EMdFValue vector std::string getEnumLabel(int index) const; // Returns 0 on index out of range. // Is the fastest const EMdFValue *getEMdFValue(int index) const; // Returns 0 on index out of range. // Is slow. const EMdFValue *getEMdFValue(const std::string& feature_name) const; // Get the index of a feature name to be used for // getEMdFValue(short int index). // Returns -1 on not found int getEMdFValueIndex(const std::string& feature_name) const; // Get list of feature-names in the order in which they appear in // the value vector. Thus this list can be used as a basis for // getting the indexes of the EMdFValues to be used with // MatchedObject::getEMdFValue(). StringList getFeatureList(void) const; // Get number of values in list of EMdFValue's. unsigned int getNoOfEMdFValues(void) const; // Get name of object type for this MatchedObject (may be pow_m). std::string getObjectTypeName() const; void printConsole(EMdFOutput *pOut) const; void printXML(EMdFOutput* pOut) const; // See Sheaf::getSOM() for an explanation void getSOM(SetOfMonads& som, bool bUseOnlyFocusObjects) const; // See Sheaf::countObjects() for an explanation. long countObjects(bool bUseOnlyFocusObjects) const; // See Sheaf::countObjectsFromObjectType() for an explanation. long countObjectsFromObjectType(const std::string& object_type_name, bool bUseOnlyFocusObjects) const; // See Sheaf::countStraws() for an explanation. long countStraws() const; }; class StrawConstIterator { public: StrawConstIterator(const Straw *pMotherStraw); StrawConstIterator(); StrawConstIterator(const StrawConstIterator& other); ~StrawConstIterator(); bool hasNext() const; // Is the iterator == end iterator? Doesn't alter iterator const MatchedObject* next(); // Gets current and advances iterator afterwards const MatchedObject* previous(); // Regresses iterator and then gets current const MatchedObject* current(); // Gets current without altering iterator }; class Straw { private: friend class StrawConstIterator; monad_m m_last; MOList m_list; public: ~Straw(); Straw(const Straw& other); StrawConstIterator const_iterator() const; Straw& operator=(const Straw& other); // Not SWIG-wrapped monad_m getLast(void) const { return m_last; }; void printConsole(EMdFOutput *pOut) const; void printXML(EMdFOutput* pOut) const; // See Sheaf::countObjects() for an explanation. long countObjects(bool bUseOnlyFocusObjects) const; // See Sheaf::countObjectsFromObjectType() for an explanation. long countObjectsFromObjectType(const std::string& object_type_name, bool bUseOnlyFocusObjects) const; // See Sheaf::countStraws() for an explanation. long countStraws() const; // See Sheaf::getSOM() for an explanation void getSOM(SetOfMonads& som, bool bUseOnlyFocusObjects) const; }; class SheafIterator { public: SheafIterator(ListOfStraws *pMotherList); SheafIterator(); SheafIterator(const SheafIterator& other); ~SheafIterator(); bool hasNext() const; // Is the iterator == end iterator? Doesn't alter iterator Straw* next(); // Gets current and advances iterator afterwards Straw* previous(); // Regresses iterator and then gets current Straw* current(); // Gets current without altering iterator }; class SheafConstIterator { public: SheafConstIterator(const ListOfStraws *pMotherList); SheafConstIterator(); SheafConstIterator(const SheafConstIterator& other); ~SheafConstIterator(); bool hasNext() const; // Is the iterator == end iterator? Doesn't alter iterator const Straw* next(); // Gets current and advances iterator afterwards const Straw* previous(); // Regresses iterator and then gets current const Straw* current(); // Gets current without altering iterator }; class ListOfStraws { public: ~ListOfStraws(); ListOfStraws(const ListOfStraws& other); SheafIterator iterator(); SheafConstIterator const_iterator() const; bool isEmpty() const; void printConsole(EMdFOutput *pOut) const; void printXML(EMdFOutput* pOut) const; }; class Sheaf { public: Sheaf(const Sheaf& other); ~Sheaf(); bool isFail(void) const; SheafIterator iterator(); SheafConstIterator const_iterator() const; const ListOfStraws* get_plist(void) const { return m_plist; }; Sheaf& operator=(const Sheaf& other); // Not SWIG-wrapped void printConsole(EMdFOutput *pOut) const; void printXML(EMdFOutput* pOut) const; // out sheaf's contribution to DTD static void printDTD(EMdFOutput* pOut); // Count the objects inside the sheaf. If bUseOnlyFocusObjects is true, // only those MatchedObjects whose FOCUS boolean is true are added to the // count. // // The algorithm counts recursively throughout the sheaf, into the innermost // sheaves. long countObjects(bool bUseOnlyFocusObjects) const; // Count the objects inside the sheaf with a given object type name. // // If object_type_name is empty, all object types are counted. // // If object_type_name is "pow_m", only gap_blocks and opt_gap_blocks are // counted. // // If object_type_name is neither empty nor "pow_m", only objects of the // given object type are counted. // // The object_type_name parameter should be passed through the // std::string normalizeOTName(const std::string& object_type_name) // function before passing it as a parameter. // // If bUseOnlyFocusObjects is true, only those MatchedObjects whose // FOCUS boolean is true are added to the count. // // The algorithm counts recursively throughout the sheaf, into the innermost // sheaves. long countObjectsFromObjectType(const std::string& object_type_name, bool bUseOnlyFocusObjects) const; // See Sheaf::countStraws() for an explanation. long countStraws() const; // Gets big-union of sets of monads in sheaf's matched_objects. // This is done recursively through all straws and inner sheafs. // // If bUseOnlyFocusObjects is true, only matched_objects with their // focus boolean set to true will be included. Otherwise, all matched_objects // are considered. // The method makes no distinction between matched_objects arising from // (opt-)gap-blocks and object blocks. // // You should probably start with an empty set of monads unless you // want to include monads that are not in the sheaf. virtual void getSOM(SetOfMonads& som, bool bUseOnlyFocusObjects) const; // Here is a version which starts with an empty set and returns the result // rather than passing it as a parameter. virtual SetOfMonads getSOM(bool bUseOnlyFocusObjects) const; }; //////////////////////////////////////////////////////////////// // // Flat sheaf // //////////////////////////////////////////////////////////////// class FlatStraw { public: FlatStraw(const std::string& object_type_name); ~FlatStraw(); FlatStrawConstIterator const_iterator(void) const; void addMO(const MatchedObject *pMO); void printConsole(EMdFOutput *pOut) const; void printXML(EMdFOutput* pOut) const; std::string getObjectTypeName(void) const; }; class FlatStrawConstIterator { public: FlatStrawConstIterator(); FlatStrawConstIterator(const FlatStrawConstIterator& other); ~FlatStrawConstIterator() {}; bool hasNext() const; // Is the iterator == end iterator? Doesn't alter iterator MatchedObject *next(); // Gets current and advances iterator afterwards MatchedObject *current(); // Gets current without altering iterator }; class FlatSheafConstIterator { public: FlatSheafConstIterator(); FlatSheafConstIterator(const FlatSheafConstIterator& other); ~FlatSheafConstIterator(); bool hasNext() const; // Is the iterator == end iterator? Doesn't alter iterator FlatStraw* next(); // Gets current and advances iterator afterwards FlatStraw* current(); // Gets current without altering iterator }; class FlatSheaf { public: FlatSheaf(); // For "all" object types // For only a select few -- isn't SWIG-wrapped FlatSheaf(const std::list<std::pair<id_d_t, std::string> >& object_types); ~FlatSheaf(); bool isFail(void) const { return m_bIsFail; }; void printConsole(EMdFOutput *pOut) const; void printXML(EMdFOutput* pOut) const; static void printDTD(EMdFOutput *pOut); FlatSheafConstIterator const_iterator(void) const; }; // For all object types in the sheaf. // Is not SWIG-wrapped. Use the interface in // MQLResult instead. extern FlatSheaf *mql_flatten_sheaf(const Sheaf *pSheaf); // Only for certain object types // Is not SWIG-wrapped. Use the interface in // MQLResult instead. extern FlatSheaf *mql_flatten_sheaf(StringList *pObjectTypeNames, EMdFDB *pDB, const Sheaf *pSheaf); // Only for certain object types // Is not SWIG-wrapped. Use the interface in // MQLResult instead. extern FlatSheaf *mql_flatten_sheaf(StringList *pObjectTypeNames, EmdrosEnv *pEnv, const Sheaf *pSheaf); ExampleThe iterators are used like this: Sheaf *pSheaf; // Assumed to be initialized from somewhere SheafConstIterator sci = pSheaf->const_iterator(); while (sci.hasNext()) { const Straw *pStraw = sci.current(); // Process pStraw ... sci.next(); } // Or like this: SheafIterator si = pSheaf->iterator(); while (si.hasNext()) { Straw *pStraw = si.next(); // Process pStraw ... // Note how there is no si.next() again, since next() // first gets current element and then advances iterator. // NOTE: This is also possible with the const iterators. } |