diff --git a/core/oqlclassnode.class.inc.php b/core/oqlclassnode.class.inc.php index cc21fb7290..da157f588e 100644 --- a/core/oqlclassnode.class.inc.php +++ b/core/oqlclassnode.class.inc.php @@ -128,6 +128,19 @@ class OQLClassNode return $sOQL; } + public function Browse(Closure $callback) + { + $callback($this); + foreach ($this->GetJoins() as $aJoins) + { + /** @var \OQLJoin $oJoin */ + foreach ($aJoins as $oJoin) + { + $oJoin->GetOOQLClassNode()->Browse($callback); + } + } + } + public function GetExternalKeys() { return $this->aExtKeys; @@ -318,4 +331,4 @@ class OQLJoin return $this->sRightField; } -} \ No newline at end of file +} diff --git a/core/oqlclasstreebuilder.class.inc.php b/core/oqlclasstreebuilder.class.inc.php index bd477930dd..a397ab3dbc 100644 --- a/core/oqlclasstreebuilder.class.inc.php +++ b/core/oqlclasstreebuilder.class.inc.php @@ -23,7 +23,7 @@ class OQLClassTreeBuilder * @param \DBObjectSearch $oDBObjetSearch * @param \QueryBuilderContext $oBuild */ - public function __construct($oDBObjetSearch, $oBuild) + protected function __construct($oDBObjetSearch, $oBuild) { $this->oBuild = $oBuild; $this->oDBObjectSearch = $oDBObjetSearch; @@ -36,6 +36,25 @@ class OQLClassTreeBuilder $this->oOQLClassNode = new OQLClassNode($oBuild, $this->sClass, $this->sClassAlias); } + /** + * @param \DBObjectSearch $oDBObjetSearch + * @param \QueryBuilderContext $oBuild + * + * @return \OQLClassNode + * @throws \CoreException + */ + public static function GetOQLClassTree($oDBObjetSearch, $oBuild) + { + $oOQLClassTreeBuilder = new OQLClassTreeBuilder($oDBObjetSearch, $oBuild); + $oOQLClassNode = $oOQLClassTreeBuilder->DevelopOQLClassNode(); + $oOQLClassTreeOptimizer = new OQLClassTreeOptimizer($oOQLClassNode, $oBuild); + $oOQLClassTreeOptimizer->OptimizeClassTree(); + $oOQLActualClassTreeResolver = new OQLActualClassTreeResolver($oOQLClassNode, $oBuild); + $oOQLClassNode = $oOQLActualClassTreeResolver->Resolve(); + + return $oOQLClassNode; + } + /** * Develop OQL. * Add joins from OQL (outgoing and incoming)