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
//! Amazon Timestream (`timestream`) awsJson1_0 service for fakecloud.
//!
//! One crate serves BOTH the Timestream **Write** and Timestream **Query**
//! SDK clients. AWS ships them as two separate SDK clients
//! (`aws-sdk-timestreamwrite` / `aws-sdk-timestreamquery`), but both share the
//! same service family and the SAME awsJson1_0 target prefix
//! `Timestream_20181101.<Operation>`, so fakecloud routes both to this single
//! handler over a shared, account-partitioned state store: databases and
//! tables are created on the write side and read back by the query side.
//!
//! 30 distinct operations (19 write + 15 query, with `DescribeEndpoints`,
//! `ListTagsForResource`, `TagResource`, and `UntagResource` shared):
//!
//! * **Databases** -- `CreateDatabase` mints
//! `arn:aws:timestream:<region>:<account>:database/<name>` and stores the
//! optional `KmsKeyId`, `TableCount`, `CreationTime`; `DescribeDatabase` /
//! `ListDatabases` / `UpdateDatabase` / `DeleteDatabase` (deleting a database
//! that still holds tables is a `ValidationException`).
//! * **Tables** -- `CreateTable` under a database, ARN
//! `.../database/<db>/table/<name>`, `RetentionProperties`,
//! `MagneticStoreWriteProperties`, and `Schema` (composite partition key)
//! echoed back; status `ACTIVE`; `Describe` / `List` (filtered by
//! `DatabaseName`) / `Update` / `Delete`.
//! * **Ingestion** -- `WriteRecords` validates each record (dimensions,
//! measure name/value/type, time/unit, version) against the table, merges
//! `CommonAttributes`, stores the points in a bounded in-memory buffer so
//! they are queryable, and returns `RecordsIngested`. Malformed records come
//! back as `RejectedRecords` inside a `RejectedRecordsException`.
//! * **Query** -- `Query` runs a real, bounded SQL handler over the ingested
//! points (see "Honest gap" below), `PrepareQuery` returns `ColumnInfo` +
//! `Parameters`, `CancelQuery` tears down an in-flight query id. Round-trips
//! a `NextToken`.
//! * **Scheduled queries** -- full CRUD (`Create` / `Describe` / `List` /
//! `Update` / `Delete`) plus `ExecuteScheduledQuery`, state persisted.
//! * **Batch load** -- `CreateBatchLoadTask` / `Describe` / `List` / `Resume`.
//! * **Account settings** -- `DescribeAccountSettings` / `UpdateAccountSettings`
//! (`MaxQueryTCU`, `QueryPricingModel`).
//! * **Endpoint discovery** -- `DescribeEndpoints` returns an `Endpoints` list
//! whose `Address` points back at the fakecloud host serving the request
//! (derived from the `Host` header) with a large `CachePeriodInMinutes`, so a
//! real SDK's discovery step resolves back to fakecloud.
//! * **Tagging** -- ARN-keyed `TagResource` / `UntagResource` /
//! `ListTagsForResource`.
//!
//! Every operation runs model-driven input validation first (required / enum /
//! range), then real, account-partitioned, persisted behavior.
//!
//! Honest gap -- the query SQL subset: a faithful Timestream SQL engine (the
//! full Trino-derived time-series dialect) is out of scope. [`query`] implements
//! a real, bounded interpreter for the shapes the SDK/e2e/conformance exercise:
//! `SELECT * FROM "db"."table"`, `SELECT COUNT(*) FROM "db"."table"`, an
//! optional `WHERE time > ago(<n><unit>)` / `WHERE time <op> <literal>` time
//! filter, `ORDER BY time [ASC|DESC]`, and `LIMIT <n>`. Ingested points come
//! back as rows with AWS-shaped `ColumnInfo`/`Datum` typing (one column per
//! dimension, `measure_name`, `measure_value::<type>`, `time`). Query shapes
//! beyond this subset return a well-formed `ValidationException` naming the
//! unsupported construct rather than a wrong or empty success. Endpoint
//! discovery's optional auto-mode in the AWS SDK forces `https://<address>`, so
//! the e2e drives the default (non-discovery) client pinned to fakecloud and
//! calls `DescribeEndpoints` explicitly to prove the host echo.
pub use ;
pub use ;