/** * @brief Executes an MDX Query via SOAP XMLA * * @param string $mdx - The MDX Query String to execute * * @return XMLACellSet An XMLA Cell Set, which implements ICellSet */ public function executeOlapQuery($mdx) { $logPerformance = $this->logPerformance; if ($this->logger) { if ($logPerformance) { $startTime = XMLAUtil::microtimeFloat(); } $this->logger->debug(__CLASS__, '[MDX QUERY]' . PHP_EOL . $mdx); } $this->statement = $mdx; $catalog = $this->con->getCatalog(); $dataSourceInfo = $this->con->getDataSourceInfo(); $queryXML = "\n <Execute xmlns=\"urn:schemas-microsoft-com:xml-analysis\">\n <Command>\n <Statement>\n <![CDATA[\n {$mdx}\n ]]>\n </Statement>\n </Command>\n <Properties>\n <PropertyList>\n <Catalog>{$catalog}</Catalog>\n <DataSourceInfo>{$dataSourceInfo}</DataSourceInfo>\n <Format>Multidimensional</Format>\n <AxisFormat>TupleFormat</AxisFormat>\n </PropertyList>\n </Properties>\n </Execute>\n "; // submit the MDX query if ($logPerformance) { $submitStartTime = XMLAUtil::microtimeFloat(); } $dom = $this->con->submit($queryXML); if ($logPerformance) { $submitEndTime = XMLAUtil::microtimeFloat() - $submitStartTime; } // populate the MDX query results into a cellset if ($logPerformance) { $populateStartTime = XMLAUtil::microtimeFloat(); } if (empty($this->cellSet)) { $this->cellSet = new XMLACellSet($this); } $this->cellSet->populate($dom); if ($logPerformance) { $populateEndTime = XMLAUtil::microtimeFloat() - $populateStartTime; } // log timing of method calls for performance tuning if ($logPerformance && $this->logger) { $this->logger->debug(__CLASS__, "[MDX SUBMIT TIME] " . $submitEndTime); $this->logger->debug(__CLASS__, "[MDX POPULATE TIME] " . $populateEndTime); $this->logger->debug(__CLASS__, "[MDX TOTAL TIME] " . (DateTime::microtimeFloat() - $startTime)); } return $this->cellSet; }