Skip to content

Commit 757d10e

Browse files
committed
Add namespace and namespaceAvailableAfter to precompile method
1 parent 335d1ed commit 757d10e

2 files changed

Lines changed: 66 additions & 4 deletions

File tree

Sources/DataTransferObjects/Query/CustomQuery+CompileDown.swift

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,12 @@ public extension CustomQuery {
1515
/// @warn Both precompile AND compileToRunnableQuery need to be run before a query can safely be handed to Druid!
1616
///
1717
/// @see compileToRunnableQuery
18-
func precompile(namespace: String? = nil, organizationAppIDs: [UUID], isSuperOrg: Bool) throws -> CustomQuery {
18+
func precompile(
19+
namespace: String? = nil,
20+
namespaceAvailableAfter: Date? = nil,
21+
organizationAppIDs: [UUID],
22+
isSuperOrg: Bool
23+
) throws -> CustomQuery {
1924
guard (compilationStatus ?? .notCompiled) == .notCompiled else {
2025
throw QueryGenerationError.compilationStatusError
2126
}
@@ -36,7 +41,13 @@ public extension CustomQuery {
3641
}
3742

3843
// Apply base filters and data source
39-
query = try Self.applyBaseFilters(namespace: namespace, query: query, organizationAppIDs: organizationAppIDs, isSuperOrg: isSuperOrg)
44+
query = try Self.applyBaseFilters(
45+
namespace: namespace,
46+
namespaceAvailableAfter: namespaceAvailableAfter,
47+
query: query,
48+
organizationAppIDs: organizationAppIDs,
49+
isSuperOrg: isSuperOrg
50+
)
4051

4152
// Update compilationStatus so the next steps in the pipeline are sure the query has been precompiled
4253
query.compilationStatus = .precompiled
@@ -136,7 +147,13 @@ public extension CustomQuery {
136147
}
137148

138149
extension CustomQuery {
139-
static func applyBaseFilters(namespace: String?, query: CustomQuery, organizationAppIDs: [UUID]?, isSuperOrg: Bool) throws -> CustomQuery {
150+
static func applyBaseFilters(
151+
namespace: String?,
152+
namespaceAvailableAfter: Date?,
153+
query: CustomQuery,
154+
organizationAppIDs: [UUID]?,
155+
isSuperOrg: Bool
156+
) throws -> CustomQuery {
140157
// make an editable copy of the query
141158
var query = query
142159

@@ -173,9 +190,20 @@ extension CustomQuery {
173190
"com.telemetrydeck.compacted"
174191
]
175192

193+
// Calculate earliest interval date, to compare against namespaceAvailableAfter
194+
var earliestIntervalDate = Date.distantFuture
195+
for interval in query.intervals ?? [] {
196+
earliestIntervalDate = min(interval.beginningDate, earliestIntervalDate)
197+
}
198+
for relativeInterval in query.relativeIntervals ?? [] {
199+
let interval = QueryTimeInterval.from(relativeTimeInterval: relativeInterval)
200+
earliestIntervalDate = min(interval.beginningDate, earliestIntervalDate)
201+
}
202+
203+
// Decide the data source based on the data source property and namespaces
176204
if let dataSource = query.dataSource, allowedDataSourceNames.contains(dataSource.name) {
177205
query.dataSource = .init(dataSource.name)
178-
} else if let namespace {
206+
} else if let namespace, (namespaceAvailableAfter ?? Date.distantPast) < earliestIntervalDate {
179207
query.dataSource = .init(namespace)
180208
} else {
181209
query.dataSource = .init("telemetry-signals")

Tests/QueryGenerationTests/CompileDownTests.swift

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -287,4 +287,38 @@ final class CompileDownTests: XCTestCase {
287287
let compiledQuery = try precompiledQuery.compileToRunnableQuery()
288288
XCTAssertEqual(compiledQuery.dataSource?.name, "com.telemetrydeck.test")
289289
}
290+
291+
func testNamespaceWithAvailabilityDateInTheFuture() throws {
292+
let intervals: [QueryTimeInterval] = [
293+
.init(beginningDate: Date(iso8601String: "2023-04-01T00:00:00.000Z")!, endDate: Date(iso8601String: "2023-05-31T00:00:00.000Z")!),
294+
]
295+
296+
var query = CustomQuery(queryType: .timeseries, intervals: intervals, granularity: .day)
297+
query.dataSource = nil
298+
let precompiledQuery = try query.precompile(
299+
namespace: "some-unknown-namespace",
300+
namespaceAvailableAfter: Date(iso8601String: "2024-12-01T00:00:00.000Z")!,
301+
organizationAppIDs: [appID1, appID2],
302+
isSuperOrg: false
303+
)
304+
let compiledQuery = try precompiledQuery.compileToRunnableQuery()
305+
XCTAssertEqual(compiledQuery.dataSource?.name, "telemetry-signals")
306+
}
307+
308+
func testNamespaceWithAvailabilityDateInThePast() throws {
309+
let intervals: [QueryTimeInterval] = [
310+
.init(beginningDate: Date(iso8601String: "2023-04-01T00:00:00.000Z")!, endDate: Date(iso8601String: "2023-05-31T00:00:00.000Z")!),
311+
]
312+
313+
var query = CustomQuery(queryType: .timeseries, intervals: intervals, granularity: .day)
314+
query.dataSource = nil
315+
let precompiledQuery = try query.precompile(
316+
namespace: "some-unknown-namespace",
317+
namespaceAvailableAfter: Date(iso8601String: "2022-12-01T00:00:00.000Z")!,
318+
organizationAppIDs: [appID1, appID2],
319+
isSuperOrg: false
320+
)
321+
let compiledQuery = try precompiledQuery.compileToRunnableQuery()
322+
XCTAssertEqual(compiledQuery.dataSource?.name, "some-unknown-namespace")
323+
}
290324
}

0 commit comments

Comments
 (0)