QueryBuilder   A
last analyzed

Complexity

Total Complexity 8

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Test Coverage

Coverage 70.83%

Importance

Changes 4
Bugs 0 Features 0
Metric Value
wmc 8
eloc 20
c 4
b 0
f 0
dl 0
loc 68
ccs 17
cts 24
cp 0.7083
rs 10

6 Methods

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