Skip to content

Commit

Permalink
WIP range support
Browse files Browse the repository at this point in the history
  • Loading branch information
Dalibor Karlović committed Oct 23, 2017
1 parent c0b53c2 commit 1698882
Show file tree
Hide file tree
Showing 3 changed files with 51 additions and 15 deletions.
24 changes: 18 additions & 6 deletions src/Extension/Conversion/DateConversion.php
Original file line number Diff line number Diff line change
Expand Up @@ -50,16 +50,28 @@ public function convertValue($value): string
*/
public function convertQuery(string $propertyName, $value, QueryConversionHints $hints): ?array
{
if (!is_array($value)) {
if (!is_array($value) && !$value instanceof Range) {
return $this->generateDateRange($propertyName, new Range($value, $value));
}

$range = [];

/** @var array $value */
foreach ($value as $singleValue) {
$dateRange = $this->generateDateRange($propertyName, new Range($singleValue, $singleValue));
$range[Generator::QUERY_BOOL][Generator::CONDITION_OR][] = $dateRange;
switch ($hints->context) {
case QueryConversionHints::CONTEXT_RANGE_VALUES:
case QueryConversionHints::CONTEXT_EXCLUDED_RANGE_VALUES:
// already a Range
/** @var Range $value */
$range = [Generator::QUERY_RANGE => [$propertyName => Generator::generateRangeParams($value)]];
break;
default:
case QueryConversionHints::CONTEXT_SIMPLE_VALUES:
case QueryConversionHints::CONTEXT_EXCLUDED_SIMPLE_VALUES:
// dates as single values, need to convert them to a date range
/** @var array $value */
foreach ($value as $singleValue) {
$dateRange = $this->generateDateRange($propertyName, new Range($singleValue, $singleValue));
$range[Generator::QUERY_BOOL][Generator::CONDITION_OR][] = $dateRange;
}
break;
}

return $range;
Expand Down
40 changes: 31 additions & 9 deletions src/QueryConditionGenerator.php
Original file line number Diff line number Diff line change
Expand Up @@ -158,16 +158,22 @@ private function processGroup(ValuesGroup $group): array
}

if (!$hints->identifier) {
/** @var Range $range */
foreach ($valuesBag->get(Range::class) as $range) {
$range = $this->convertRangeValues($range, $converter);
$bool[$includingType][][self::QUERY_RANGE][$propertyName] = static::generateRangeParams($range);
if ($valuesBag->has(Range::class)) {
/** @var Range $range */
foreach ($valuesBag->get(Range::class) as $range) {
$range = $this->convertRangeValues($range, $converter);
$hints->context = QueryConversionHints::CONTEXT_RANGE_VALUES;
$bool[$includingType][] = $this->prepareQuery($propertyName, $range, $hints, $converter);
}
}

/** @var Range $range */
foreach ($valuesBag->get(ExcludedRange::class) as $range) {
$range = $this->convertRangeValues($range, $converter);
$bool[self::CONDITION_NOT][][self::QUERY_RANGE][$propertyName] = static::generateRangeParams($range);
if ($valuesBag->has(ExcludedRange::class)) {
/** @var Range $range */
foreach ($valuesBag->get(ExcludedRange::class) as $range) {
$range = $this->convertRangeValues($range, $converter);
$hints->context = QueryConversionHints::CONTEXT_EXCLUDED_RANGE_VALUES;
$bool[self::CONDITION_NOT][] = $this->prepareQuery($propertyName, $range, $hints, $converter);
}
}
} else {
// IDs cannot be queries by range in Elasticsearch, use ids query
Expand Down Expand Up @@ -309,7 +315,23 @@ private function prepareQuery(string $propertyName, $value, QueryConversionHints
if (null === $converter
|| !$converter instanceof QueryConversion
|| null === ($query = $converter->convertQuery($propertyName, $value, $hints))) {
return [self::QUERY_TERMS => [$propertyName => $value]];
if ($hints->identifier) {
$query = [self::QUERY_IDS => [self::QUERY_VALUES => $value]];
} else {
switch ($hints->context) {
case QueryConversionHints::CONTEXT_RANGE_VALUES:
case QueryConversionHints::CONTEXT_EXCLUDED_RANGE_VALUES:
// ranges
$query = [self::QUERY_RANGE => [$propertyName => static::generateRangeParams($value)]];
break;
default:
case QueryConversionHints::CONTEXT_SIMPLE_VALUES:
case QueryConversionHints::CONTEXT_EXCLUDED_SIMPLE_VALUES:
// simple values
$query = [self::QUERY_TERMS => [$propertyName => $value]];
break;
}
}
}

return $query;
Expand Down
2 changes: 2 additions & 0 deletions src/QueryConversionHints.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ class QueryConversionHints
{
public const CONTEXT_SIMPLE_VALUES = 'SIMPLE_VALUES';
public const CONTEXT_EXCLUDED_SIMPLE_VALUES = 'EXCLUDED_SIMPLE_VALUES';
public const CONTEXT_RANGE_VALUES = 'RANGE_VALUES';
public const CONTEXT_EXCLUDED_RANGE_VALUES = 'EXCLUDED_RANGE_VALUES';

/** @var bool */
public $identifier = false;
Expand Down

0 comments on commit 1698882

Please sign in to comment.