/** * Find subproperties or subcategories. This may require iterative computation, * and temporary tables are used in many cases. * * @param QuerySegment $query */ private function resolveHierarchyForSegment(QuerySegment &$query) { switch ($query->type) { case QuerySegment::Q_PROP_HIERARCHY: $type = 'property'; break; case QuerySegment::Q_CLASS_HIERARCHY: $type = 'class'; break; } list($smwtable, $depth) = $this->hierarchyTempTableBuilder->getHierarchyTableDefinitionForType($type); if ($depth <= 0) { // treat as value, no recursion $query->type = QuerySegment::Q_VALUE; return; } $values = ''; $valuecond = ''; $db = $this->connection; foreach ($query->joinfield as $value) { $values .= ($values ? ',' : '') . '(' . $db->addQuotes($value) . ')'; $valuecond .= ($valuecond ? ' OR ' : '') . 'o_id=' . $db->addQuotes($value); } // Try to safe time (SELECT is cheaper than creating/dropping 3 temp tables): $res = $db->select($smwtable, 's_id', $valuecond, __METHOD__, array('LIMIT' => 1)); if (!$db->fetchObject($res)) { // no subobjects, we are done! $db->freeResult($res); $query->type = QuerySegment::Q_VALUE; return; } $db->freeResult($res); $tablename = $db->tableName($query->alias); $this->executedQueries[$query->alias] = array("Recursively computed hierarchy for element(s) {$values}."); $query->joinTable = $query->alias; $query->joinfield = "{$query->alias}.id"; $db->query($this->getCreateTempIDTableSQL($tablename), __METHOD__); $this->hierarchyTempTableBuilder->createHierarchyTempTableFor($type, $tablename, $values); }
public function testTryToGetHierarchyTableDefinitionForUnregisteredTypeThrowsException() { $instance = new HierarchyTempTableBuilder($this->connection, $this->temporaryIdTableCreator); $this->setExpectedException('RuntimeException'); $instance->getHierarchyTableDefinitionForType('foo'); }