/** * Caches the parents (if not cached already) * of the given node by fecthing them from the database * if neccessary, and then inserting them in <code>_tree</code> and updating * <code>_cache</code>. * @access public * @param object node The node object whose parents we must cache. * @return ref array An array of the parent nodes of the given node. **/ function getParents(Node $node) { // Use Harmoni_Db method for greater performance if it is configured if (isset($this->harmoni_db)) { return $this->getParents_Harmoni_Db($node); } // Otherwise use original method $idValue = $node->_id->getIdString(); // if the children have not been already cached, do it if (!$this->_isCachedUp($idValue, 1)) { // include the given node in the cache of nodes if necessary if (!$this->_isCached($idValue)) { $nullValue = NULL; // getting rid of PHP warnings by specifying // this second argument $this->_tree->addNode(new TreeNode($idValue), $nullValue); $this->_cache[$idValue][0] = $node; } // now fetch <code>$node</code>'s parents from the database // with the exception of those parents that have been already fetched $treeNode = $this->_tree->getNode($idValue); $nodesToExclude = isset($treeNode) ? $treeNode->getParents() : array(); $dbHandler = Services::getService("DatabaseManager"); $idManager = Services::getService("Id"); $query = new SelectQuery(); // set the columns to select $query->addColumn("id", "id", "parents"); $query->addColumn("display_name", "display_name", "parents"); $query->addColumn("description", "description", "parents"); $query->addColumn("domain", "domain", "az2_node_type"); $query->addColumn("authority", "authority", "az2_node_type"); $query->addColumn("keyword", "keyword", "az2_node_type"); $query->addColumn("description", "type_description", "az2_node_type"); // set the tables $query->addTable("az2_j_node_node", NO_JOIN, "", "child"); $joinc = "child.fk_parent = " . "parents.id"; $query->addTable("az2_node", INNER_JOIN, $joinc, "parents"); $joinc = "parents.fk_type = " . "az2_node_type.id"; $query->addTable("az2_node_type", INNER_JOIN, $joinc); $query->addWhereEqual("child.fk_hierarchy", $this->_hierarchyId); $query->addWhereEqual("child.fk_child", $idValue); $query->addOrderBy("parents.id"); if (count($nodesToExclude) > 0) { $query->addWhereNotIn("parents.id", array_keys($nodesToExclude)); } // echo "<pre>\n"; // echo MySQL_SQLGenerator::generateSQLQuery($query); // echo "</pre>\n"; $queryResult = $dbHandler->query($query, $this->_dbIndex); // for all rows returned by the query while ($queryResult->hasMoreRows()) { $row = $queryResult->getCurrentRow(); // see if node in current row is in the cache $parentIdValue = $row['id']; // if not create it and cache it if (!$this->_isCached($parentIdValue)) { $parentId = $idManager->getId($parentIdValue); $parentType = new HarmoniType($row['domain'], $row['authority'], $row['keyword'], $row['type_description']); $parent = new AuthZ2_Node($parentId, $parentType, $row['display_name'], $row['description'], $this); $parentTreeNode = new TreeNode($parentIdValue); $nullValue = NULL; // getting rid of PHP warnings by specifying // this second argument $this->_tree->addNode($parentTreeNode, $nullValue); $this->_tree->addNode($treeNode, $parentTreeNode); $this->_cache[$parentIdValue][0] = $parent; $this->_cache[$parentIdValue][1] = 0; $this->_cache[$parentIdValue][2] = 0; } else { $this->_tree->addNode($treeNode, $this->_tree->getNode($parentIdValue)); } $queryResult->advanceRow(); } // finish caching $this->_cache[$idValue][2] = 1; // parents have been cached $queryResult->free(); } // now that all nodes are cached, just return all children $treeNode = $this->_tree->getNode($idValue); $result = array(); $parentsIds = $treeNode->getParents(); foreach (array_keys($parentsIds) as $i => $key) { $result[] = $this->_cache[$key][0]; } return $result; }