Something went wrong. Try again.
@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
Something went wrong. Try again.
3.5 kB · 143 lines
PHP
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144<?php
/** * Structural class representing a column ordering for a query. * * Queries often order results on multiple columns. For example, projects might * be ordered by "name, id". This class wraps a list of column orderings and * makes them easier to manage. * * To construct an order vector, use @{method:newFromVector}: * * $vector = PhabricatorQueryOrderVector::newFromVector(array('name', 'id')); * * You can iterate over an order vector normally: * * foreach ($vector as $item) { * // ... * } * * The items are objects of class @{class:PhabricatorQueryOrderItem}. * * This class is primarily internal to the query infrastructure, and most * application code should not need to interact with it directly. */final class PhabricatorQueryOrderVector extends Phobject implements Iterator {
private $items; private $keys; private $cursor;
private function __construct() { // <private> }
public static function newFromVector($vector) { if ($vector instanceof PhabricatorQueryOrderVector) { return (clone $vector); }
if (!is_array($vector)) { throw new Exception( pht( 'An order vector can only be constructed from a list of strings or '. 'another order vector.')); }
if (!$vector) { throw new Exception( pht( 'An order vector must not be empty.')); }
$items = array(); foreach ($vector as $key => $scalar) { if (!is_string($scalar)) { throw new Exception( pht( 'Value with key "%s" in order vector is not a string (it has '. 'type "%s"). An order vector must contain only strings.', $key, gettype($scalar))); }
$item = PhabricatorQueryOrderItem::newFromScalar($scalar);
// Orderings like "id, id, id" or "id, -id" are meaningless and invalid. if (isset($items[$item->getOrderKey()])) { throw new Exception( pht( 'Order vector "%s" specifies order "%s" twice. Each component '. 'of an ordering must be unique.', implode(', ', $vector), $item->getOrderKey())); }
$items[$item->getOrderKey()] = $item; }
$obj = new PhabricatorQueryOrderVector(); $obj->items = $items; $obj->keys = array_keys($items); return $obj; }
public function appendVector($vector) { $vector = self::newFromVector($vector);
// When combining vectors (like "group by" and "order by" vectors), there // may be redundant columns. We only want to append unique columns which // aren't already present in the vector. foreach ($vector->items as $key => $item) { if (empty($this->items[$key])) { $this->items[$key] = $item; $this->keys[] = $key; } }
return $this; }
public function getAsString() { $scalars = array(); foreach ($this->items as $item) { $scalars[] = $item->getAsScalar(); } return implode(', ', $scalars); }
public function containsKey($key) { return isset($this->items[$key]); }
/* -( Iterator Interface )------------------------------------------------- */
public function rewind() { $this->cursor = 0; }
public function current() { return $this->items[$this->key()]; }
public function key() { return $this->keys[$this->cursor]; }
public function next() { ++$this->cursor; }
public function valid() { return isset($this->keys[$this->cursor]); }
}