Passed
Pull Request — master (#142)
by Bao
07:46
created

QueryBuilder::prepare()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 4

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 4
rs 10
c 0
b 0
f 0
cc 2
nc 1
nop 1
1
<?php
2
3
namespace BaoPham\DynamoDb\DynamoDb;
4
5
use Aws\DynamoDb\DynamoDbClient;
6
use BadMethodCallException;
7
use BaoPham\DynamoDb\DynamoDbClientInterface;
8
use BaoPham\DynamoDb\RawDynamoDbQuery;
9
10
/**
11
 * Class QueryBuilder
12
 *
13
 * @package BaoPham\DynamoDb\DynamoDb
14
 *
15
 * Methods are in the form of `set<key_name>`, where `<key_name>`
16
 * is the key name of the query body to be sent.
17
 *
18
 * For example, to build a query:
19
 * [
20
 *     'AttributeDefinitions' => ...,
21
 *     'GlobalSecondaryIndexUpdates' => ...
22
 *     'TableName' => ...
23
 * ]
24
 *
25
 * Do:
26
 *
27
 * $query = $query->setAttributeDefinitions(...)->setGlobalSecondaryIndexUpdates(...)->setTableName(...);
28
 *
29
 * When ready:
30
 *
31
 * $query->prepare()->updateTable();
32
 *
33
 * Common methods:
34
 *
35
 * @method QueryBuilder setExpressionAttributeNames(array $mapping)
36
 * @method QueryBuilder setExpressionAttributeValues(array $mapping)
37
 * @method QueryBuilder setFilterExpression(string $expression)
38
 * @method QueryBuilder setKeyConditionExpression(string $expression)
39
 * @method QueryBuilder setProjectionExpression(string $expression)
40
 * @method QueryBuilder setUpdateExpression(string $expression)
41
 * @method QueryBuilder setAttributeUpdates(array $updates)
42
 * @method QueryBuilder setScanIndexForward(bool $forward)
43
 * @method QueryBuilder setExclusiveStartKey(mixed $key)
44
 * @method QueryBuilder setReturnValues(string $type)
45
 * @method QueryBuilder setRequestItems(array $items)
46
 * @method QueryBuilder setTableName(string $table)
47
 * @method QueryBuilder setIndexName(string $index)
48
 * @method QueryBuilder setSelect(string $select)
49
 * @method QueryBuilder setItem(array $item)
50
 * @method QueryBuilder setKeys(array $keys)
51
 * @method QueryBuilder setLimit(int $limit)
52
 * @method QueryBuilder setKey(array $key)
53
 */
54
class QueryBuilder
55
{
56
    /**
57
     * @var DynamoDbClientInterface
58
     */
59
    private $service;
60
61
    /**
62
     * Query body to be sent to AWS
63
     *
64
     * @var array
65
     */
66
    public $query = [];
67
68
    public function __construct(DynamoDbClientInterface $service)
69
    {
70
        $this->service = $service;
71
    }
72
73
    public function hydrate(array $query)
74
    {
75
        $this->query = $query;
76
77
        return $this;
78
    }
79
80
    public function setExpressionAttributeName($placeholder, $name)
81
    {
82
        $this->query['ExpressionAttributeNames'][$placeholder] = $name;
83
84
        return $this;
85
    }
86
87
    public function setExpressionAttributeValue($placeholder, $value)
88
    {
89
        $this->query['ExpressionAttributeValues'][$placeholder] = $value;
90
91
        return $this;
92
    }
93
94
    /**
95
     * @param DynamoDbClient|null $client
96
     * @return ExecutableQuery
97
     */
98
    public function prepare(DynamoDbClient $client = null)
99
    {
100
        $raw = new RawDynamoDbQuery(null, $this->query);
101
        return new ExecutableQuery($client ?: $this->service->getClient(), $raw->finalize()->query);
102
    }
103
104
    /**
105
     * @param  string $method
106
     * @param  array  $parameters
107
     * @return mixed
108
     */
109
    public function __call($method, $parameters)
110
    {
111
        if (starts_with($method, 'set')) {
112
            $this->query[str_after($method, 'set')] = current($parameters);
113
114
            return $this;
115
        }
116
117
        throw new BadMethodCallException(sprintf(
118
            'Method %s::%s does not exist.',
119
            static::class,
120
            $method
121
        ));
122
    }
123
}
124