public function createSorter(array $conditions)
{
$columns = [];
foreach ($conditions as $pair) {
list($column, , $sourceEntity) = ConditionParserHelper::parseCondition($pair[0]);
$sourceEntityMeta = $this->metadataStorage->get($sourceEntity ?: $this->mapper->getRepository()->getEntityClassNames()[0]);
$columns[] = [$column, $pair[1], $sourceEntityMeta];
}
return function ($a, $b) use($columns) {
foreach ($columns as $pair) {
$_a = $this->getter($a, $pair[0], $pair[2]);
$_b = $this->getter($b, $pair[0], $pair[2]);
$direction = $pair[1] === ICollection::ASC ? 1 : -1;
if (is_int($_a) || is_float($_a)) {
if ($_a < $_b) {
return $direction * -1;
} elseif ($_a > $_b) {
return $direction;
}
} elseif ($_a instanceof \Datetime) {
if ($_a < $_b) {
return $direction * -1;
} elseif ($_b > $_a) {
return $direction;
}
} else {
$res = strcmp((string) $_a, (string) $_b);
if ($res < 0) {
return $direction * -1;
} elseif ($res > 0) {
return $direction;
}
}
}
return 0;
};
}