protected function execute() { if ($this->rows !== NULL) { return; } $referencing = & $this->refTable->referencing[$this->getSql()]; if ($referencing === NULL) { $limit = $this->limit; $rows = count($this->refTable->rows); if ($this->limit && $rows > 1) { $this->limit = NULL; } parent::execute(); $this->limit = $limit; $referencing = array(); $offset = array(); foreach ($this->rows as $key => $row) { $ref = & $referencing[$row[$this->column]]; $skip = & $offset[$row[$this->column]]; if ($limit === NULL || $rows <= 1 || (count($ref) < $limit && $skip >= $this->offset)) { $ref[$key] = $row; } else { unset($this->rows[$key]); } $skip++; unset($ref, $skip); } } $this->data = & $referencing[$this->active]; if ($this->data === NULL) { $this->data = array(); } }
protected function execute() { if ($this->rows !== NULL) { $this->observeCache = $this; return; } $hash = md5($this->getSql() . json_encode($this->sqlBuilder->getParameters())); $accessedColumns = $this->accessedColumns; $referencingBase = & $this->getRefTable($refPath)->referencing[$this->getCacheKey()]; $referencing = & $referencingBase[$refPath . $hash]; $this->rows = & $referencing['rows']; $this->referenced = & $referencing['refs']; $this->accessedColumns = & $referencing['accessed']; $this->observeCache = & $referencingBase['observeCache']; $refData = & $referencing['data']; if ($refData === NULL) { // we have not fetched any data => init accessedColumns by cached accessedColumns $this->accessedColumns = $accessedColumns; $limit = $this->sqlBuilder->getLimit(); $rows = count($this->refTable->rows); if ($limit && $rows > 1) { $this->sqlBuilder->setLimit(NULL, NULL); } parent::execute(); $this->sqlBuilder->setLimit($limit, NULL); $refData = array(); $offset = array(); $this->accessColumn($this->column); foreach ((array) $this->rows as $key => $row) { $ref = & $refData[$row[$this->column]]; $skip = & $offset[$row[$this->column]]; if ($limit === NULL || $rows <= 1 || (count($ref) < $limit && $skip >= $this->sqlBuilder->getOffset())) { $ref[$key] = $row; } else { unset($this->rows[$key]); } $skip++; unset($ref, $skip); } } $this->observeCache = $this; $this->data = & $refData[$this->active]; if ($this->data === NULL) { $this->data = array(); } else { foreach ($this->data as $row) { $row->setTable($this); // injects correct parent GroupedSelection } reset($this->data); $this->checkReferenced = TRUE; } }