+ // optional infos columns
+ $optional_fields = '';
+ if (count($this->ofields)) {
+ $order = array();
+ foreach ($this->vars as $i => $aliasname) {
+ $order[sprintf('%f',count($order))] = $i;
+ }
+ // delta for indexing optional columns between existing ones
+ $changeorder = 0.5;
+ foreach ($this->ofields as $sqlname => $ofieldvalues) {
+ list($aliasname, $desc, $type, $nextvar) = $ofieldvalues;
+ $optional_fields .= ', '.$sqlname.' AS '.$aliasname;
+ $this->describe($aliasname, $desc, true);
+ $this->vars[$aliasname]['optional'] = true;
+ if (isset($type)) {
+ $this->vars[$aliasname]['Type'] = $type;
+ }
+ if (isset($nextvar) && isset($this->vars[$nextvar]) && $nextvar != $aliasname) {
+ $nextkey = array_search($nextvar, $order);
+ $order[sprintf('%f',$nextkey - $changeorder)] = $aliasname;
+ $changeorder = $changeorder / 2;
+ } else {
+ $order[sprintf('%f',count($order))] = $aliasname;
+ }
+ $this->vars[$aliasname]['Field'] = $aliasname;
+ }
+ if ($changeorder != 0.5) {
+ ksort($order);
+ $orderedvars = array();
+ foreach ($order as $aliasname) {
+ $orderedvars[$aliasname] = $this->vars[$aliasname];
+ }
+ $this->vars = $orderedvars;
+ }
+ }
+ $optional_joints = '';
+ foreach ($this->otables as $tablename => $jointclause) {
+ $optional_joints .= ' LEFT JOIN '.$tablename.' ON ('.$jointclause.')';
+ }
+ $it = XDB::iterator("SELECT t.* {$optional_fields} FROM {$this->table} AS t {$optional_joints} WHERE {$this->whereclause} $sort");