AENode Class Reference

An abstract base class that defines the basic behaviors that any Algebraic Expression (AE) node exhibits. More...

Inherited by AEBinaryExprT< AENode, AEColumn, AEValueExpr, SharedPtr< AEColumn >, SharedPtr< AEValueExpr > >, AENodeListT< AENode, AESetClause >, AENodeListT< AENode, AEValueExpr >, AEBooleanExpr, AEQueryOperation, AEStatement, and AEValueExpr.

List of all members.

Public Member Functions

virtual void AcceptVisitor (AENodeVisitor &in_visitor)=0
 Calls the correct method on the visitor.
virtual AENodeClone () const =0
 Creates a clone of this node object.
virtual const AEBooleanExprGetAsBooleanExpr () const
 Get the object as an AEBooleanExpr object.
virtual AEBooleanExprGetAsBooleanExpr ()
 Get the object as an AEBooleanExpr object.
virtual const AEQueryOperationGetAsQueryOperation () const
 Retrieves the object as an AEQueryOperation object.
virtual AEQueryOperationGetAsQueryOperation ()
 Retrieves the object as an AEQueryOperation object.
virtual const AERelationalExprGetAsRelationalExpr () const
 Retrieves the object as an AERelationalExpr object.
virtual AERelationalExprGetAsRelationalExpr ()
 Retrieves the object as an AERelationalExpr object.
virtual const AESetClauseGetAsSetClause () const
 Retrieves the object as an AESetClause object.
virtual AESetClauseGetAsSetClause ()
 Retrieves the object as an AESetClause object.
virtual const AESetClauseListGetAsSetClauseList () const
 Retrieves the object as an AESetClauseList object.
virtual AESetClauseListGetAsSetClauseList ()
 Retrieves the object as an AESetClauseList object.
virtual const AEStatementGetAsStatement () const
 Retrieves the object as an AEStatement object.
virtual AEStatementGetAsStatement ()
 Retrieves the object as an AEStatement object.
virtual const AEValueExprGetAsValueExpr () const
 Retrieves the object as an AEValueExpr object.
virtual AEValueExprGetAsValueExpr ()
 Retrieves the object as an AEValueExpr object.
virtual const AEValueListGetAsValueList () const
 Retrieves the object as an AEValueList object.
virtual AEValueListGetAsValueList ()
 Retrieves the object as an AEValueList object.
virtual const AENodeGetChild (simba_size_t in_index) const =0
 Gets a pointer reference to the specified child node.
virtual AENodeGetChild (simba_size_t in_index)=0
 Gets a pointer reference to the specified child node.
virtual simba_size_t GetChildCount () const =0
 Gets the number of child nodes that this node has.
AENodeIterator GetChildren ()
 Returns an iterator that iterates through all the child nodes.
virtual simba_wstring GetLogString () const =0
 Returns a string name for this node for the purpose of logging.
virtual AENodeType GetNodeType () const =0
 Returns an integer that uniquely identifies the node class.
AENodeGetParent () const
 Gets a pointer referent to the parent node.
AENodeGetRoot ()
 Get the root of the tree containing this node.
virtual bool IsBooleanExpr () const
 Tells whether this is an AEBooleanExpr node.
virtual bool IsEquivalent (const AENode *in_another) const
 Tests whether two trees are equivalent.
virtual bool IsQueryOperation () const
 Tells whether this is an AEQueryOperation node.
virtual bool IsRelationalExpr () const
 Tells whether this is an AERelationalExpr object.
virtual bool IsStatement () const
 Tells whether this is an AEStatement node.
virtual bool IsValueExpr () const
 Tells whether this is an AEValueExpr node.
void SetParent (AENode *in_node)
 Sets the parent node.
virtual void Validate ()
 Validates the node.
virtual ~AENode ()
 Destructor.

Protected Member Functions

 AENode (const AENode &in_other)
 Copy constructor.
 AENode ()
 Default constructor.
virtual bool IsEqual (const AENode *in_another) const
 Tests whether two nodes are "equal".

Detailed Description

An abstract base class that defines the basic behaviors that any Algebraic Expression (AE) node exhibits.


Constructor & Destructor Documentation

virtual ~AENode (  )  [virtual]

Destructor.

AENode (  )  [protected]

Default constructor.

AENode ( const AENode in_other  )  [protected]

Copy constructor.

To support "cloning". See Clone() method.

Parameters:
in_other The other node to create copy from.

Member Function Documentation

virtual void AcceptVisitor ( AENodeVisitor in_visitor  )  [pure virtual]
virtual AENode* Clone (  )  const [pure virtual]
virtual const AEBooleanExpr* GetAsBooleanExpr (  )  const [virtual]

Get the object as an AEBooleanExpr object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEBooleanExpr object. (NOT OWN)

Reimplemented in AEBooleanExpr.

virtual AEBooleanExpr* GetAsBooleanExpr (  )  [virtual]

Get the object as an AEBooleanExpr object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEBooleanExpr object. (NOT OWN)

Reimplemented in AEBooleanExpr.

virtual const AEQueryOperation* GetAsQueryOperation (  )  const [virtual]

Retrieves the object as an AEQueryOperation object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEQueryOperation object. (NOT OWN)

Reimplemented in AEQueryOperation.

virtual AEQueryOperation* GetAsQueryOperation (  )  [virtual]

Retrieves the object as an AEQueryOperation object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEQueryOperation object. (NOT OWN)

Reimplemented in AEQueryOperation.

virtual const AERelationalExpr* GetAsRelationalExpr (  )  const [virtual]

Retrieves the object as an AERelationalExpr object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

NOTE: Although this method could be defined on AEQueryOperation only. For convenience, it is defined here since most AEQueryOperation's are AERelationalExpr's.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AERelationalExpr object. (NOT OWN)

Reimplemented in AERelationalExpr.

virtual AERelationalExpr* GetAsRelationalExpr (  )  [virtual]

Retrieves the object as an AERelationalExpr object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

NOTE: Although this method could be defined on AEQueryOperation only. For convenience, it is defined here since most AEQueryOperation's are AERelationalExpr's.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AERelationalExpr object. (NOT OWN)

Reimplemented in AERelationalExpr.

virtual const AESetClause* GetAsSetClause (  )  const [virtual]

Retrieves the object as an AESetClause object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AESetClause object. (NOT OWN)

Reimplemented in AESetClause.

virtual AESetClause* GetAsSetClause (  )  [virtual]

Retrieves the object as an AESetClause object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AESetClause object. (NOT OWN)

Reimplemented in AESetClause.

virtual const AESetClauseList* GetAsSetClauseList (  )  const [virtual]

Retrieves the object as an AESetClauseList object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AESetClauseList object. (NOT OWN)

Reimplemented in AESetClauseList.

virtual AESetClauseList* GetAsSetClauseList (  )  [virtual]

Retrieves the object as an AESetClauseList object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AESetClauseList object. (NOT OWN)

Reimplemented in AESetClauseList.

virtual const AEStatement* GetAsStatement (  )  const [virtual]

Retrieves the object as an AEStatement object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEStatement object. (NOT OWN)

Reimplemented in AEStatement.

virtual AEStatement* GetAsStatement (  )  [virtual]

Retrieves the object as an AEStatement object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEStatement object. (NOT OWN)

Reimplemented in AEStatement.

virtual const AEValueExpr* GetAsValueExpr (  )  const [virtual]

Retrieves the object as an AEValueExpr object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEValueExpr object. (NOT OWN)

Reimplemented in AEValueExpr.

virtual AEValueExpr* GetAsValueExpr (  )  [virtual]

Retrieves the object as an AEValueExpr object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEValueExpr object. (NOT OWN)

Reimplemented in AEValueExpr.

virtual const AEValueList* GetAsValueList (  )  const [virtual]

Retrieves the object as an AEValueList object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEValueList object. (NOT OWN)

Reimplemented in AEValueList.

virtual AEValueList* GetAsValueList (  )  [virtual]

Retrieves the object as an AEValueList object.

This default implementation always throw an exception. The appropriate sub-class must override this method.

Exceptions:
SEInvalidOperationException if this object is not of expected type.
Returns:
This object as an AEValueList object. (NOT OWN)

Reimplemented in AEValueList.

virtual const AENode* GetChild ( simba_size_t  in_index  )  const [pure virtual]

Gets a pointer reference to the specified child node.

IMPLEMENTATION NOTE: This method should be overridden when GetChildCount() is overridden in a child class of this class. Otherwise, there is almost always a consistency issue.

Parameters:
in_index The zero-based index for the child.
Exceptions:
SEInvalidArgumentException when in_index is invalid
SEInvalidOperationException when this is a leaf node
Returns:
A pointer reference to the requested child node. (NOT OWN)

Implemented in AEAggregate, AECustomScalarFn, AEInsert, AEInsertionTable, AEJoin, AEMerge, AENativeSyntax, AEProcedure, AEProject, AEScalarFn, AESearchedCase, AESelect, AESimpleCase, AETopNSort, AEBinaryExprT< AEValueExpr, AEBooleanExpr, AEValueExpr, AutoPtr< AEBooleanExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEBooleanExpr, AEValueList, AENode >, AEBinaryExprT< AEValueExpr, AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEBooleanExpr, AEValueList, AERelationalExpr >, AEBinaryExprT< AERelationalExpr, AERelationalExpr >, AEBinaryExprT< AEBooleanExpr, AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEStatement, AEValueList, AERowCountStatement >, AEBinaryExprT< AENode, AEColumn, AEValueExpr, SharedPtr< AEColumn >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AERowCountStatement, AETable, AEBooleanExpr >, AEBinaryExprT< AERowCountStatement, AETable, AERelationalExpr >, AEBinaryExprT< AEBooleanExpr, AEBooleanExpr >, AEBinaryExprT< AEBooleanExpr, AEValueList >, AENodeListT< AENode, AEValueExpr >, AENodeListT< AENode, AESetClause >, AEQuinaryExprT< AERowCountStatement, AETable, AERelationalExpr, AEBooleanExpr, AESetClauseList, AEValueList >, AETerminalExprT< AEValueExpr >, AETerminalExprT< AENamedRelationalExpr >, AETerminalExprT< AERowCountStatement >, AETerminalExprT< AEBooleanExpr >, AETernaryExprT< AERowCountStatement, AETable, AESetClauseList, AEBooleanExpr >, AEUnaryExprT< AERowCountStatement, AETable >, AEUnaryExprT< AEValueExpr, AERelationalExpr >, AEUnaryExprT< AERelationalExpr, AERelationalExpr >, AEUnaryExprT< AEBooleanExpr, AERelationalExpr >, AEUnaryExprT< AEStatement, AEProcedure >, AEUnaryExprT< AENamedRelationalExpr, AERelationalExpr >, AEUnaryExprT< AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr > >, AEUnaryExprT< AERowCountStatement, AERelationalExpr >, AEUnaryExprT< AEStatement, AEQueryOperation >, AEUnaryExprT< AERelationalExpr, AEValueList >, AEUnaryExprT< AEBooleanExpr, AEBooleanExpr >, and AEUnaryExprT< AEBooleanExpr, AEValueList >.

virtual AENode* GetChild ( simba_size_t  in_index  )  [pure virtual]

Gets a pointer reference to the specified child node.

IMPLEMENTATION NOTE: This method should be overridden when GetChildCount() is overridden in a child class of this class. Otherwise, there is almost always a consistency issue.

Parameters:
in_index The zero-based index for the child.
Exceptions:
SEInvalidArgumentException when in_index is invalid
SEInvalidOperationException when this is a leaf node
Returns:
A pointer reference to the requested child node. (NOT OWN)

Implemented in AEAggregate, AECustomScalarFn, AEInsert, AEInsertionTable, AEJoin, AEMerge, AENativeSyntax, AEProcedure, AEProject, AEScalarFn, AESearchedCase, AESelect, AESimpleCase, AETopNSort, AEBinaryExprT< AEValueExpr, AEBooleanExpr, AEValueExpr, AutoPtr< AEBooleanExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEBooleanExpr, AEValueList, AENode >, AEBinaryExprT< AEValueExpr, AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEBooleanExpr, AEValueList, AERelationalExpr >, AEBinaryExprT< AERelationalExpr, AERelationalExpr >, AEBinaryExprT< AEBooleanExpr, AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEStatement, AEValueList, AERowCountStatement >, AEBinaryExprT< AENode, AEColumn, AEValueExpr, SharedPtr< AEColumn >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AERowCountStatement, AETable, AEBooleanExpr >, AEBinaryExprT< AERowCountStatement, AETable, AERelationalExpr >, AEBinaryExprT< AEBooleanExpr, AEBooleanExpr >, AEBinaryExprT< AEBooleanExpr, AEValueList >, AENodeListT< AENode, AEValueExpr >, AENodeListT< AENode, AESetClause >, AEQuinaryExprT< AERowCountStatement, AETable, AERelationalExpr, AEBooleanExpr, AESetClauseList, AEValueList >, AETerminalExprT< AEValueExpr >, AETerminalExprT< AENamedRelationalExpr >, AETerminalExprT< AERowCountStatement >, AETerminalExprT< AEBooleanExpr >, AETernaryExprT< AERowCountStatement, AETable, AESetClauseList, AEBooleanExpr >, AEUnaryExprT< AERowCountStatement, AETable >, AEUnaryExprT< AEValueExpr, AERelationalExpr >, AEUnaryExprT< AERelationalExpr, AERelationalExpr >, AEUnaryExprT< AEBooleanExpr, AERelationalExpr >, AEUnaryExprT< AEStatement, AEProcedure >, AEUnaryExprT< AENamedRelationalExpr, AERelationalExpr >, AEUnaryExprT< AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr > >, AEUnaryExprT< AERowCountStatement, AERelationalExpr >, AEUnaryExprT< AEStatement, AEQueryOperation >, AEUnaryExprT< AERelationalExpr, AEValueList >, AEUnaryExprT< AEBooleanExpr, AEBooleanExpr >, and AEUnaryExprT< AEBooleanExpr, AEValueList >.

virtual simba_size_t GetChildCount (  )  const [pure virtual]

Gets the number of child nodes that this node has.

IMPLEMENTATION NOTE: This method should be overridden when GetChild() is overridden in a child class of this class. Otherwise, there is almost always a consistency issue.

Returns:
The number of child nodes.

Implemented in AEAggregate, AECustomScalarFn, AEInsert, AEInsertionTable, AEJoin, AEMerge, AENativeSyntax, AEProcedure, AEProject, AEScalarFn, AESearchedCase, AESelect, AESimpleCase, AETopNSort, AEBinaryExprT< AEValueExpr, AEBooleanExpr, AEValueExpr, AutoPtr< AEBooleanExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEBooleanExpr, AEValueList, AENode >, AEBinaryExprT< AEValueExpr, AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEBooleanExpr, AEValueList, AERelationalExpr >, AEBinaryExprT< AERelationalExpr, AERelationalExpr >, AEBinaryExprT< AEBooleanExpr, AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AEStatement, AEValueList, AERowCountStatement >, AEBinaryExprT< AENode, AEColumn, AEValueExpr, SharedPtr< AEColumn >, SharedPtr< AEValueExpr > >, AEBinaryExprT< AERowCountStatement, AETable, AEBooleanExpr >, AEBinaryExprT< AERowCountStatement, AETable, AERelationalExpr >, AEBinaryExprT< AEBooleanExpr, AEBooleanExpr >, AEBinaryExprT< AEBooleanExpr, AEValueList >, AENodeListT< AENode, AEValueExpr >, AENodeListT< AENode, AESetClause >, AEQuinaryExprT< AERowCountStatement, AETable, AERelationalExpr, AEBooleanExpr, AESetClauseList, AEValueList >, AETerminalExprT< AEValueExpr >, AETerminalExprT< AENamedRelationalExpr >, AETerminalExprT< AERowCountStatement >, AETerminalExprT< AEBooleanExpr >, AETernaryExprT< AERowCountStatement, AETable, AESetClauseList, AEBooleanExpr >, AEUnaryExprT< AERowCountStatement, AETable >, AEUnaryExprT< AEValueExpr, AERelationalExpr >, AEUnaryExprT< AERelationalExpr, AERelationalExpr >, AEUnaryExprT< AEBooleanExpr, AERelationalExpr >, AEUnaryExprT< AEStatement, AEProcedure >, AEUnaryExprT< AENamedRelationalExpr, AERelationalExpr >, AEUnaryExprT< AEValueExpr, AEValueExpr, SharedPtr< AEValueExpr > >, AEUnaryExprT< AERowCountStatement, AERelationalExpr >, AEUnaryExprT< AEStatement, AEQueryOperation >, AEUnaryExprT< AERelationalExpr, AEValueList >, AEUnaryExprT< AEBooleanExpr, AEBooleanExpr >, and AEUnaryExprT< AEBooleanExpr, AEValueList >.

AENodeIterator GetChildren (  ) 

Returns an iterator that iterates through all the child nodes.

Returns:
An iterator that iterates through all the child nodes.
virtual simba_wstring GetLogString (  )  const [pure virtual]
virtual AENodeType GetNodeType (  )  const [pure virtual]
AENode* GetParent (  )  const

Gets a pointer referent to the parent node.

If this is the root node, the parent node is NULL.

Returns:
the parent node. (NOT OWN)
AENode* GetRoot (  ) 

Get the root of the tree containing this node.

virtual bool IsBooleanExpr (  )  const [virtual]

Tells whether this is an AEBooleanExpr node.

This default implementation always returns false. The appropriate sub-class must override this method along with GetAsBooleanExpr().

Returns:
True if this is an AEBooleanExpr node, false otherwise.

Reimplemented in AEBooleanExpr.

virtual bool IsEqual ( const AENode in_another  )  const [protected, virtual]

Tests whether two nodes are "equal".

For different node types, the meaning of "equal" is different. For most (if not all) of the non-leaf nodes, this normally means whether the node types are the same. For leaf node, the actual values are compared. Regardless of the node type, however, the meaning of "equal" should only involve the nodes themselves without considering the child nodes. In this regard, this method is different from the method IsEquivalent().

The default implementation of this method in this class compares only the node types. A sub-class should override this behavior if this does not apply.

Parameters:
in_another Another node to compare to. (NOT OWN)
Returns:
true if two nodes are equal, false otherwise.

Reimplemented in AEAggrFunction, AEColumn, AECustomAggregateFn, AECustomScalarFn, AEDummyTable, AEIntervalLiteral, AELiteral, AEParameter, AEProxyColumn, AEScalarFn, AETable, and AEValueList.

virtual bool IsEquivalent ( const AENode in_another  )  const [virtual]

Tests whether two trees are equivalent.

For different trees, the notion of "equivalence" might be slightly different. Generally speaking, two trees are equivalent if they have the same tree structure and every pair of the corresponding nodes are equal (see IsEqual() method). There are some exceptions to this general description. For example, (a + b) is equivalent to (b + a) even though they do not have exactly the same tree structure.

Parameters:
in_another The root of another tree. (NOT OWN)
Returns:
True if two trees are equivalent, false otherwise.

Reimplemented in AEComparison.

virtual bool IsQueryOperation (  )  const [virtual]

Tells whether this is an AEQueryOperation node.

This default implementation always returns false. The appropriate sub-class must override this method along with GetAsQueryOperation().

Returns:
True if this is an AEQueryOperation node, false otherwise.

Reimplemented in AEQueryOperation.

virtual bool IsRelationalExpr (  )  const [virtual]

Tells whether this is an AERelationalExpr object.

This default implementation always returns false. The appropriate sub-class must override this method along with GetAsRelationalExpr().

NOTE: Although this method could be defined on AEQueryOperation only. For convenience, it is defined here since most AEQueryOperation's are AERelationalExpr's.

Returns:
True if this is an AERelationalExpr object, false otherwise.

Reimplemented in AERelationalExpr.

virtual bool IsStatement (  )  const [virtual]

Tells whether this is an AEStatement node.

This default implementation always returns false. The appropriate sub-class must override this method along with GetAsStatement().

Returns:
True if this is an AEStatement node, false otherwise.

Reimplemented in AEStatement.

virtual bool IsValueExpr (  )  const [virtual]

Tells whether this is an AEValueExpr node.

This default implementation always returns false. The appropriate sub-class must override this method along with GetAsValueExpr().

Returns:
True if this is an AEValueExpr node, false otherwise.

Reimplemented in AEValueExpr.

void SetParent ( AENode in_node  ) 

Sets the parent node.

This object only holds a pointer reference to the parent node, it does not only the parent. As a matter of fact, in the AE tree design, a parent node alway owns its child nodes.

Parameters:
in_node The parent node, NULL if this is the root node.
virtual void Validate (  )  [virtual]

Validates the node.

This is a default base implementation does nothing and it cascades to any children.

Exceptions:
AEInvalidAetException if the node is not valid.

Reimplemented in AEAggrFunction, AEAlterTable, AECreateIndex, AECreateTable, AECreateTableAsSelect, AECreateView, AECrossJoin, AEDropIndex, AEDropTable, AEDropView, AEGrant, AEInsert, AEIntersect, AEJoin, AEMerge, AENativeSyntax, AEProcedure, AEQuery, AERevoke, AESetCatalog, AESetClauseList, AESetSchema, AESetStatement, and AETableConstructor.


The documentation for this class was generated from the following file:

Generated on Wed May 17 14:21:17 2017 for SimbaEngine 10.1.3.1011 by simba