Beispiel #1
0
 protected function helper_main(Collection $metas, array $cols, array $joins)
 {
     $table = $this->schema->table();
     $as = $this->schema->tableAs();
     $id = $this->schema->id();
     $sql_fields = self::arrayToSqlCols($cols);
     $sql_joins = PlSqlJoin::formatJoins($joins, array());
     $collections = array();
     foreach ($cols as $fields) {
         foreach ($fields as $field) {
             if ($this->schema->isCollection($field)) {
                 // TODO: is this code used ?
                 //$collections[$field] = new Collection($this->schema->collectionType($field));
                 throw new Exception("Oops, there is a main handler for collections now ?");
             } elseif (!empty($this->subs) && array_key_exists($field, $this->subs)) {
                 $collections[$field] = new Collection($this->schema->objectType($field));
             }
         }
     }
     $iter = XDB::iterator("SELECT  {$as}.{$id} AS id, {$sql_fields}\n                                 FROM  {$table} AS {$as}\n                                       {$sql_joins}\n                                WHERE  {$as}.{$id} IN {?}", $metas->ids());
     while ($datas = $iter->next()) {
         foreach ($datas as $key => $value) {
             if ($this->schema->isObject($key)) {
                 $class = $this->schema->objectType($key);
                 $datas[$key] = new $class($value);
             }
             if (array_key_exists($key, $collections) && $value !== null) {
                 $datas[$key] = $collections[$key]->addget($value);
             }
             if ($value === null) {
                 /*
                  * /!\ Null in the DB means false in here.
                  * Therefore Boolean fields must *not* be nullable !
                  */
                 $datas[$key] = false;
             }
         }
         $metas->get($datas['id'])->fillFromArray($datas);
     }
     foreach ($collections as $field => $collection) {
         $collection->select($this->subs[$field]);
     }
 }
Beispiel #2
0
 public static function batchSelect(array $wikis, $options = null)
 {
     if (empty($wikis)) {
         return;
     }
     $bits = self::optionsToBits($options);
     $wikis = array_combine(self::toIds($wikis), $wikis);
     $joins = array();
     $cols = array();
     if ($bits & self::SELECT_BASE) {
         $cols['w'] = array('name', 'comments');
     }
     if ($bits & self::SELECT_COUNT || $bits & self::SELECT_VERSION) {
         $cols[-1] = array('COUNT(wv.version) AS count');
         $joins['wv'] = PlSqlJoin::left('wiki_version', '$ME.wid = w.wid');
     }
     if (!empty($cols)) {
         $iter = XDB::iterator('SELECT  w.wid AS id, ' . self::arrayToSqlCols($cols) . '
                                  FROM  wiki AS w
                                        ' . PlSqlJoin::formatJoins($joins, array()) . '
                                 WHERE  w.wid IN {?}
                              GROUP BY  w.wid', array_keys($wikis));
         while ($datas = $iter->next()) {
             $wikis[$datas['id']]->fillFromArray($datas);
         }
     }
     // Load last version
     if ($bits & self::SELECT_VERSION) {
         if (!isset($options[self::SELECT_VERSION])) {
             $opts = array('versions' => array('last'));
         } else {
             $opts = $options[self::SELECT_VERSION];
         }
         $conds = array();
         foreach ($wikis as $w) {
             if ($w->versions == null) {
                 $w->versions = array();
             }
             $versions = array();
             if (in_array('last', $opts['versions'])) {
                 $versions[] = $w->count();
             }
             foreach ($opts['versions'] as $version) {
                 if ($version != 'last') {
                     $versions[] = $version;
                 }
             }
             if (!empty($versions)) {
                 $conds[] = XDB::format('( wid = {?} AND version IN {?} )', $w->id(), $versions);
             }
         }
         $iter = XDB::iterator('SELECT  wid AS id, version, wrote, writer, content
                                  FROM  wiki_version
                                 WHERE  ' . implode(' OR ', $conds));
         $writers = new Collection('User');
         while ($datas = $iter->next()) {
             $writer = $writers->addget($datas['writer']);
             $wikis[$datas['id']]->versions[$datas['version']] = array('wrote' => $datas['wrote'], 'writer' => $writer, 'content' => $datas['content']);
         }
         if (isset($opts['options'])) {
             $writers->select($opts['options']);
         }
     }
 }