Skip to content

Commit f04d279

Browse files
committed
feat: Add support for FINAL in SELECT queries in ClickHouse adapter and update tests
1 parent c74eea7 commit f04d279

2 files changed

Lines changed: 18 additions & 4 deletions

File tree

src/Usage/Adapter/ClickHouse.php

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,9 @@ class ClickHouse extends SQL
5050

5151
private Client $client;
5252

53+
/** @var bool Whether to use FINAL in SELECT queries to force merge-on-read (tests) */
54+
private bool $useFinal = true;
55+
5356
protected ?int $tenant = null;
5457

5558
protected bool $sharedTables = false;
@@ -86,6 +89,15 @@ public function __construct(
8689
$this->client->setTimeout(30_000); // 30 seconds
8790
}
8891

92+
/**
93+
* Enable or disable using FINAL in SELECT queries.
94+
*/
95+
public function setUseFinal(bool $useFinal): self
96+
{
97+
$this->useFinal = $useFinal;
98+
return $this;
99+
}
100+
89101
/**
90102
* Get adapter name.
91103
*/
@@ -846,6 +858,7 @@ public function find(array $queries = []): array
846858
{
847859
$tableName = $this->getTableName();
848860
$escapedTable = $this->escapeIdentifier($this->database) . '.' . $this->escapeIdentifier($tableName);
861+
$fromTable = $escapedTable . ($this->useFinal ? ' FINAL' : '');
849862

850863
// Parse queries
851864
$parsed = $this->parseQueries($queries);
@@ -875,7 +888,7 @@ public function find(array $queries = []): array
875888
$offsetClause = isset($parsed['offset']) ? ' OFFSET {offset:UInt64}' : '';
876889
$sql = "
877890
SELECT {$selectColumns}
878-
FROM {$escapedTable}{$whereClause}{$orderClause}{$limitClause}{$offsetClause}
891+
FROM {$fromTable}{$whereClause}{$orderClause}{$limitClause}{$offsetClause}
879892
FORMAT TabSeparated
880893
";
881894

@@ -894,6 +907,7 @@ public function count(array $queries = []): int
894907
{
895908
$tableName = $this->getTableName();
896909
$escapedTable = $this->escapeIdentifier($this->database) . '.' . $this->escapeIdentifier($tableName);
910+
$fromTable = $escapedTable . ($this->useFinal ? ' FINAL' : '');
897911

898912
// Parse queries - we only need filters and params
899913
$parsed = $this->parseQueries($queries);
@@ -915,7 +929,7 @@ public function count(array $queries = []): int
915929

916930
$sql = "
917931
SELECT COUNT(*) as count
918-
FROM {$escapedTable}{$whereClause}
932+
FROM {$fromTable}{$whereClause}
919933
FORMAT TabSeparated
920934
";
921935

@@ -1316,6 +1330,7 @@ public function sumByPeriod(string $metric, string $period, array $queries = [])
13161330
{
13171331
$tableName = $this->getTableName();
13181332
$escapedTable = $this->escapeIdentifier($this->database) . '.' . $this->escapeIdentifier($tableName);
1333+
$fromTable = $escapedTable . ($this->useFinal ? ' FINAL' : '');
13191334

13201335
// Build query constraints
13211336
$allQueries = [
@@ -1344,7 +1359,7 @@ public function sumByPeriod(string $metric, string $period, array $queries = [])
13441359

13451360
$sql = "
13461361
SELECT sum(value) as total
1347-
FROM {$escapedTable}{$whereClause}
1362+
FROM {$fromTable}{$whereClause}
13481363
FORMAT TabSeparated
13491364
";
13501365

tests/Usage/UsageBase.php

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,7 +162,6 @@ public function testIncrementingDefaultBehavior(): void
162162

163163
$sum = $this->usage->sumByPeriod('increment-test', '1h');
164164
$this->assertEquals(12, $sum);
165-
166165
}, 2);
167166
}
168167

0 commit comments

Comments
 (0)