-
Notifications
You must be signed in to change notification settings - Fork 460
Expand file tree
/
Copy pathAggregateQuerySnapshot.php
More file actions
135 lines (124 loc) · 3.8 KB
/
AggregateQuerySnapshot.php
File metadata and controls
135 lines (124 loc) · 3.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
<?php
/**
* Copyright 2023 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
namespace Google\Cloud\Firestore;
use Google\Cloud\Core\Timestamp;
use Google\Cloud\Core\TimeTrait;
use Google\Cloud\Firestore\V1\ExplainMetrics;
/**
* Represents the result set of an AggregateQuery.
*
* Example:
* ```
* use Google\Cloud\Firestore\FirestoreClient;
*
* $firestore = new FirestoreClient();
* $collection = $firestore->collection('users');
* $query = $collection->where('age', '>', 18);
*
* $snapshot = $query->count();
* ```
*/
class AggregateQuerySnapshot
{
use TimeTrait;
private Timestamp $readTime;
private array $aggregateFields = [];
private string $transaction;
private null|ExplainMetrics $explainMetrics;
/**
* An immutable snapshot of aggregate query results.
*
* @param array $snapshot Result of an AggregateQuery.
*/
public function __construct($snapshot = [])
{
if (isset($snapshot['transaction'])) {
$this->transaction = $snapshot['transaction'];
}
if (isset($snapshot['readTime'])) {
$time = $this->parseTimeString($snapshot['readTime']);
$this->readTime = new Timestamp($time[0], $time[1]);
}
if (isset($snapshot['result']['aggregateFields'])) {
$this->aggregateFields = $snapshot['result']['aggregateFields'];
}
if (isset($snapshot['explainMetrics'])) {
$this->explainMetrics = $this->parseMetrics($snapshot['explainMetrics']);
}
}
/**
* Get the transaction id.
*
* @return string
*/
public function getTransaction()
{
return $this->transaction;
}
/**
* Get the Aggregation read time.
*
* @return Timestamp
*/
public function getReadTime()
{
return $this->readTime;
}
/**
* Gets `ExplainMetrics` when the `explainOptions` option is supplied.
* If `ExplainOptions::setAnalyze` is set to `false`, the query is
* planned and not executed, returning only the {@see V1\PlanSummary}
* instead of the {@see V1\ExecutionStats} and result.
*
* @return null|ExplainMetrics
*/
public function getExplainMetrics()
{
return $this->explainMetrics;
}
/**
* Get the Query Aggregation value.
*
* @param string $alias The aggregation alias.
* @return mixed
* @throws \InvalidArgumentException If provided alias does not exist in result.
*/
public function get($alias)
{
if (!isset($this->aggregateFields[$alias])) {
throw new \InvalidArgumentException('alias does not exist');
}
$result = $this->aggregateFields[$alias];
if (is_array($result)) {
$key = array_key_first($result);
if ($key == 'nullValue') {
return null;
}
// `$result` would contain only one of
// (@see https://cloud.google.com/firestore/docs/reference/rest/v1/Value)
return $result[$key];
}
return $result;
}
private function parseMetrics(array $metrics): ExplainMetrics
{
$explainMetrics = new ExplainMetrics();
$json = json_encode($metrics, true);
$explainMetrics->mergeFromJsonString($json);
return $explainMetrics;
}
}