55use Utopia \Database \Database as UtopiaDatabase ;
66use Utopia \Database \Document ;
77use Utopia \Database \Exception \Duplicate as DuplicateException ;
8- use Utopia \Database \Query ;
8+ use Utopia \Database \Query as DatabaseQuery ;
99use Utopia \Exception ;
1010use Utopia \Usage \Metric ;
11+ use Utopia \Usage \Query ;
1112use Utopia \Usage \Usage ;
1213
1314class Database extends SQL
@@ -138,17 +139,92 @@ public function logBatch(array $metrics): bool
138139 return true ;
139140 }
140141
142+ /**
143+ * Convert Utopia\Usage\Query to Utopia\Database\Query for use with the Database class.
144+ *
145+ * @param array<Query> $queries
146+ * @return array<DatabaseQuery>
147+ */
148+ private function convertQueriesToDatabase (array $ queries ): array
149+ {
150+ $ dbQueries = [];
151+ foreach ($ queries as $ query ) {
152+ $ method = $ query ->getMethod ();
153+ $ attribute = $ query ->getAttribute ();
154+ $ values = $ query ->getValues ();
155+
156+ switch ($ method ) {
157+ case Query::TYPE_EQUAL :
158+ /** @var array<array<int|string, mixed>|bool|float|int|string> $values */
159+ $ dbQueries [] = DatabaseQuery::equal ($ attribute , $ values );
160+ break ;
161+ case Query::TYPE_GREATER :
162+ if (!empty ($ values )) {
163+ /** @var bool|float|int|string $value */
164+ $ value = $ values [0 ];
165+ $ dbQueries [] = DatabaseQuery::greaterThan ($ attribute , $ value );
166+ }
167+ break ;
168+ case Query::TYPE_LESSER :
169+ if (!empty ($ values )) {
170+ /** @var bool|float|int|string $value */
171+ $ value = $ values [0 ];
172+ $ dbQueries [] = DatabaseQuery::lessThan ($ attribute , $ value );
173+ }
174+ break ;
175+ case Query::TYPE_BETWEEN :
176+ if (count ($ values ) >= 2 ) {
177+ /** @var bool|float|int|string $start */
178+ $ start = $ values [0 ];
179+ /** @var bool|float|int|string $end */
180+ $ end = $ values [1 ];
181+ $ dbQueries [] = DatabaseQuery::between ($ attribute , $ start , $ end );
182+ }
183+ break ;
184+ case Query::TYPE_IN :
185+ // For IN queries, the values are the items to match
186+ // Create using equal with array values for compatibility
187+ /** @var array<array<int|string, mixed>|bool|float|int|string> $values */
188+ $ dbQueries [] = DatabaseQuery::contains ($ attribute , $ values );
189+ break ;
190+ case Query::TYPE_ORDER_DESC :
191+ $ dbQueries [] = DatabaseQuery::orderDesc ($ attribute );
192+ break ;
193+ case Query::TYPE_ORDER_ASC :
194+ $ dbQueries [] = DatabaseQuery::orderAsc ($ attribute );
195+ break ;
196+ case Query::TYPE_LIMIT :
197+ if (!empty ($ values )) {
198+ /** @var int|string $val */
199+ $ val = $ values [0 ] ?? 0 ;
200+ $ dbQueries [] = DatabaseQuery::limit ((int ) $ val );
201+ }
202+ break ;
203+ case Query::TYPE_OFFSET :
204+ if (!empty ($ values )) {
205+ /** @var int|string $val */
206+ $ val = $ values [0 ] ?? 0 ;
207+ $ dbQueries [] = DatabaseQuery::offset ((int ) $ val );
208+ }
209+ break ;
210+ }
211+ }
212+
213+ return $ dbQueries ;
214+ }
215+
141216 public function getByPeriod (string $ metric , string $ period , array $ queries = []): array
142217 {
143218 /** @var array<Document> $result */
144219 $ result = $ this ->db ->getAuthorization ()->skip (function () use ($ queries , $ metric , $ period ) {
145- $ queries [] = Query::equal ('metric ' , [$ metric ]);
146- $ queries [] = Query::equal ('period ' , [$ period ]);
147- $ queries [] = Query::orderDesc ();
220+ $ dbQueries = $ this ->convertQueriesToDatabase ($ queries );
221+ $ dbQueries [] = DatabaseQuery::equal ('metric ' , [$ metric ]);
222+ $ dbQueries [] = DatabaseQuery::equal ('period ' , [$ period ]);
223+ $ dbQueries [] = DatabaseQuery::orderDesc ();
148224
149225 return $ this ->db ->find (
150226 collection: $ this ->collection ,
151- queries: $ queries ,
227+ queries: $ dbQueries ,
152228 );
153229 });
154230
@@ -159,14 +235,15 @@ public function getBetweenDates(string $metric, string $startDate, string $endDa
159235 {
160236 /** @var array<Document> $result */
161237 $ result = $ this ->db ->getAuthorization ()->skip (function () use ($ queries , $ metric , $ startDate , $ endDate ) {
162- $ queries [] = Query::equal ('metric ' , [$ metric ]);
163- $ queries [] = Query::greaterThanEqual ('time ' , $ startDate );
164- $ queries [] = Query::lessThanEqual ('time ' , $ endDate );
165- $ queries [] = Query::orderDesc ();
238+ $ dbQueries = $ this ->convertQueriesToDatabase ($ queries );
239+ $ dbQueries [] = DatabaseQuery::equal ('metric ' , [$ metric ]);
240+ $ dbQueries [] = DatabaseQuery::greaterThanEqual ('time ' , $ startDate );
241+ $ dbQueries [] = DatabaseQuery::lessThanEqual ('time ' , $ endDate );
242+ $ dbQueries [] = DatabaseQuery::orderDesc ();
166243
167244 return $ this ->db ->find (
168245 collection: $ this ->collection ,
169- queries: $ queries ,
246+ queries: $ dbQueries ,
170247 );
171248 });
172249
@@ -177,13 +254,13 @@ public function countByPeriod(string $metric, string $period, array $queries = [
177254 {
178255 /** @var int $count */
179256 $ count = $ this ->db ->getAuthorization ()->skip (function () use ($ queries , $ metric , $ period ) {
257+ $ dbQueries = $ this ->convertQueriesToDatabase ($ queries );
258+ $ dbQueries [] = DatabaseQuery::equal ('metric ' , [$ metric ]);
259+ $ dbQueries [] = DatabaseQuery::equal ('period ' , [$ period ]);
260+
180261 return $ this ->db ->count (
181262 collection: $ this ->collection ,
182- queries: [
183- Query::equal ('metric ' , [$ metric ]),
184- Query::equal ('period ' , [$ period ]),
185- ...$ queries ,
186- ]
263+ queries: $ dbQueries
187264 );
188265 });
189266
@@ -210,8 +287,8 @@ public function purge(string $datetime): bool
210287 $ documents = $ this ->db ->find (
211288 collection: $ this ->collection ,
212289 queries: [
213- Query ::lessThan ('time ' , $ datetime ),
214- Query ::limit (100 ),
290+ DatabaseQuery ::lessThan ('time ' , $ datetime ),
291+ DatabaseQuery ::limit (100 ),
215292 ]
216293 );
217294
@@ -234,9 +311,10 @@ public function find(array $queries = []): array
234311 {
235312 /** @var array<Document> $result */
236313 $ result = $ this ->db ->getAuthorization ()->skip (function () use ($ queries ) {
314+ $ dbQueries = $ this ->convertQueriesToDatabase ($ queries );
237315 return $ this ->db ->find (
238316 collection: $ this ->collection ,
239- queries: $ queries ,
317+ queries: $ dbQueries ,
240318 );
241319 });
242320
@@ -253,9 +331,10 @@ public function count(array $queries = []): int
253331 {
254332 /** @var int $count */
255333 $ count = $ this ->db ->getAuthorization ()->skip (function () use ($ queries ) {
334+ $ dbQueries = $ this ->convertQueriesToDatabase ($ queries );
256335 return $ this ->db ->count (
257336 collection: $ this ->collection ,
258- queries: $ queries
337+ queries: $ dbQueries
259338 );
260339 });
261340
0 commit comments