Skip to content

Commit bd6aed9

Browse files
committed
Support whereIn and whereBetween
close #4, #5
1 parent dc42047 commit bd6aed9

File tree

3 files changed

+94
-13
lines changed

3 files changed

+94
-13
lines changed

src/Kitar/Dynamodb/Query/Builder.php

Lines changed: 35 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,6 @@ class Builder extends BaseBuilder
4545
*/
4646
public $dry_run = false;
4747

48-
/**
49-
* The attribute name to place compiled wheres.
50-
* @var string
51-
*/
52-
public $where_as;
53-
5448
/**
5549
* The ExpressionAttributes object.
5650
* @var Kitar\Dynamodb\Query\ExpressionAttributes
@@ -63,6 +57,12 @@ class Builder extends BaseBuilder
6357
*/
6458
public $available_wheres;
6559

60+
/**
61+
* The attribute name to place compiled wheres.
62+
* @var string
63+
*/
64+
public $where_as;
65+
6666
/**
6767
* Dedicated query for building FilterExpression.
6868
* @var Kitar\Dynamodb\Query\Builder
@@ -228,7 +228,7 @@ public function initializeDedicatedQueries()
228228
// Array of: 'incomingMethodName' => [ 'target_builder_instance_name', 'targetMethodName' ]
229229
foreach (['filter', 'condition', 'key_condition'] as $query_type) {
230230
foreach (['', 'or'] as $boolean) {
231-
foreach ([''] as $where_type) {
231+
foreach (['', 'in', 'between'] as $where_type) {
232232
$target_query = $query_type . '_query';
233233
$source_method = Str::camel(implode('_', [$boolean, $query_type, $where_type]));
234234
$target_method = Str::camel(implode('_', [$boolean, 'where', $where_type]));
@@ -306,6 +306,34 @@ public function where($column, $operator = null, $value = null, $boolean = 'and'
306306
return $this;
307307
}
308308

309+
/**
310+
* @inheritdoc
311+
*/
312+
public function whereIn($column, $values, $boolean = 'and', $not = false)
313+
{
314+
$column = $this->expression_attributes->addName($column);
315+
316+
foreach ($values as &$value) {
317+
$value = $this->expression_attributes->addValue($value);
318+
}
319+
320+
return parent::whereIn($column, $values, $boolean, $not);
321+
}
322+
323+
/**
324+
* @inheritdoc
325+
*/
326+
public function whereBetween($column, array $values, $boolean = 'and', $not = false)
327+
{
328+
$column = $this->expression_attributes->addName($column);
329+
330+
foreach ($values as &$value) {
331+
$value = $this->expression_attributes->addValue($value);
332+
}
333+
334+
return parent::whereBetween($column, $values, $boolean, $not);
335+
}
336+
309337
/**
310338
* @inheritdoc
311339
*/

src/Kitar/Dynamodb/Query/Grammar.php

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -259,13 +259,11 @@ protected function compileSizeCondition($where)
259259
*/
260260
protected function whereBetween($query, $where)
261261
{
262-
$column = $query->expression_attributes->addName($where['column']);
262+
$min = reset($where['values']);
263263

264-
$min = $query->expression_attributes->addValue(reset($where['values']));
264+
$max = end($where['values']);
265265

266-
$max = $query->expression_attributes->addValue(end($where['values']));
267-
268-
return "({$column} between {$min} and {$max})";
266+
return "({$where['column']} between {$min} and {$max})";
269267
}
270268

271269
/**
@@ -275,7 +273,7 @@ protected function whereIn($query, $where)
275273
{
276274
$values = implode(', ', $where['values']);
277275

278-
return "in({$values})";
276+
return "({$where['column']} in ({$values}))";
279277
}
280278

281279
/**

tests/Query/BuilderTest.php

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -215,6 +215,61 @@ public function it_can_process_or_condition()
215215
$this->assertEquals($params, $query['params']);
216216
}
217217

218+
/** @test */
219+
public function it_can_process_filter_in()
220+
{
221+
$params = [
222+
'TableName' => 'test',
223+
'FilterExpression' => '(#1 in (:1, :2, :3))',
224+
'ExpressionAttributeNames' => [
225+
'#1' => 'Id'
226+
],
227+
'ExpressionAttributeValues' => [
228+
':1' => [
229+
'N' => '101'
230+
],
231+
':2' => [
232+
'N' => '102'
233+
],
234+
':3' => [
235+
'N' => '201'
236+
]
237+
]
238+
];
239+
240+
$query = $this->builder
241+
->filterIn('Id', [101, 102, 201])
242+
->scan();
243+
244+
$this->assertEquals($params, $query['params']);
245+
}
246+
247+
/** @test */
248+
public function it_can_process_filter_between()
249+
{
250+
$params = [
251+
'TableName' => 'test',
252+
'FilterExpression' => '(#1 between :1 and :2)',
253+
'ExpressionAttributeNames' => [
254+
'#1' => 'Id'
255+
],
256+
'ExpressionAttributeValues' => [
257+
':1' => [
258+
'N' => '101'
259+
],
260+
':2' => [
261+
'N' => '103'
262+
]
263+
]
264+
];
265+
266+
$query = $this->builder
267+
->filterBetween('Id', [101, 103])
268+
->scan();
269+
270+
$this->assertEquals($params, $query['params']);
271+
}
272+
218273
/** @test */
219274
public function it_can_process_get_item()
220275
{

0 commit comments

Comments
 (0)