/** * Find row number of a record in the result set of a selection. The selection * must be ordered. * @param ReadSelectionBuilder $selection A read selection. * @param Record $record A record. * @throws InvalidSelectionException If the selection is not ordered. * @return int Row number. */ public function rowNumberSelection(ReadSelectionBuilder $selection, Record $record) { if (empty($selection->orderBy)) { throw new InvalidSelectionException(tr('Can\'t find row number in selection without ordering')); } $condition = new ConditionBuilder(); foreach ($selection->orderBy as $orderBy) { $column = $orderBy['column']; $type = $this->getType($column)->placeholder; if ($orderBy['descending']) { $condition->and($column . ' > ' . $type, $record->{$column}); } else { $condition->and($column . ' < ' . $type, $record->{$column}); } } return $selection->and($condition)->count() + 1; }