/** * @since 2.2 * * @return QueryEngine */ public function newMasterQueryEngine() { $resolverOptions = new ResolverOptions(); $resolverOptions->set('hierarchytables', array('_SUBP' => $this->store->findPropertyTableID(new DIProperty('_SUBP')), '_SUBC' => $this->store->findPropertyTableID(new DIProperty('_SUBC')))); $querySegmentListResolver = new QuerySegmentListResolver($this->store->getConnection('mw.db'), $this->newTemporaryIdTableCreator(), $resolverOptions); return new QueryEngine($this->store, new QueryBuilder($this->store), $querySegmentListResolver, new EngineOptions()); }
/** * 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) { $db = $this->connection; $hierarchytables = $this->resolverOptions->get('hierarchytables'); if ($query->type === QuerySegment::Q_PROP_HIERARCHY) { $depth = $this->resolverOptions->get('smwgQSubpropertyDepth'); $smwtable = $db->tableName($hierarchytables['_SUBP']); } else { $depth = $this->resolverOptions->get('smwgQSubcategoryDepth'); $smwtable = $db->tableName($hierarchytables['_SUBC']); } if ($depth <= 0) { // treat as value, no recursion $query->type = QuerySegment::Q_VALUE; return; } $values = ''; $valuecond = ''; 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"; if ($this->queryMode == Query::MODE_DEBUG) { return; // No real queries in debug mode. } $db->query($this->getCreateTempIDTableSQL($tablename), __METHOD__); if (array_key_exists($values, $this->hierarchyCache)) { // Just copy known result. $db->query("INSERT INTO {$tablename} (id) SELECT id" . ' FROM ' . $this->hierarchyCache[$values], __METHOD__); return; } $this->fillHierarchyCacheForTableId($tablename, $values, $smwtable, $depth); }
public function testUnregisteredKeyThrowsException() { $instance = new ResolverOptions(); $this->setExpectedException('InvalidArgumentException'); $instance->get('Foo'); }