diff --git a/src/Builder/Builder.php b/src/Builder/Builder.php index 10b25c1..4ebab7e 100644 --- a/src/Builder/Builder.php +++ b/src/Builder/Builder.php @@ -5,12 +5,14 @@ use Closure; use Illuminate\Support\Arr; use Illuminate\Support\Str; +use Illuminate\Support\Traits\Macroable; use NorbyBaru\AwsTimestream\Concerns\BuildersConcern; use NorbyBaru\AwsTimestream\Contract\QueryBuilderContract; abstract class Builder implements QueryBuilderContract { - use BuildersConcern; + use BuildersConcern; + Use Macroable; protected string $database = ''; protected string $table = ''; diff --git a/tests/Unit/QueryBuilderUnitTest.php b/tests/Unit/QueryBuilderUnitTest.php index f0588e3..2562148 100644 --- a/tests/Unit/QueryBuilderUnitTest.php +++ b/tests/Unit/QueryBuilderUnitTest.php @@ -2,6 +2,7 @@ namespace NorbyBaru\AwsTimestream\Tests\Unit; +use Illuminate\Support\Carbon; use NorbyBaru\AwsTimestream\Builder\Builder; use NorbyBaru\AwsTimestream\Builder\TimestreamQueryBuilder; use NorbyBaru\AwsTimestream\Tests\TestCase; @@ -9,6 +10,21 @@ class QueryBuilderUnitTest extends TestCase { + protected function setUp(): void + { + TimestreamQueryBuilder::macro( + "whereDateBetween", + fn ($from, $to) => $this->whereBetween('date', [$from, $to]) + ); + + TimestreamQueryBuilder::macro( + "whereHoursAgo", + fn (string $column, int $hours, string $operator = '=') => $this->whereAgo($column, "{$hours}h", $operator) + ); + + parent::setUp(); + } + public function test_it_can_return_query_builder() { $this->assertInstanceOf(Builder::class, TimestreamBuilder::query()); @@ -74,6 +90,21 @@ public function test_it_can_build_where_in_query() $this->validateSql("WHERE state IN ('open','draft','published')", $query); } + public function test_it_should_build_query_from_marco() + { + $dateFrom = Carbon::now()->yesterday()->toDateString(); + $dateTo = Carbon::now()->toDateString(); + $query = TimestreamBuilder::query() + ->whereIn('state', ['open', 'draft', 'published']) + ->whereDateBetween($dateFrom, $dateTo) + ->whereHoursAgo('time', 72); + + $this->validateSql( + "WHERE state IN ('open','draft','published') AND date BETWEEN {$dateFrom} and {$dateTo} AND time = ago(72h)", + $query + ); + } + private function validateSql(string $expected, TimestreamQueryBuilder $builder) { $this->assertEquals($expected, trim($builder->getSql()));