Skip to content

Commit 240a650

Browse files
committed
feat: expose GET /actors/usage, GET /actors/logs, GET /actors/logs/export, GET /routes/history
1 parent 3c45fc1 commit 240a650

File tree

564 files changed

+23600
-13560
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

564 files changed

+23600
-13560
lines changed

CLAUDE.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
- Do not use cat, hexdump, perl, or sed. Always edit files directly.
2-
- If attempting to use Cargo, use `nix-shell --command 'cargo ...'`
2+
- If attempting to use Cargo, use `nix-shell --command 'cargo ...'`
3+
- Public API specs live in sdks/api/fern/
4+
- When modifying sdks/api/fern/, run ./scripts/fern/gen.sh to regenerate the related libraries

Cargo.lock

Lines changed: 26 additions & 67 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 4 additions & 1 deletion
Large diffs are not rendered by default.

packages/common/clickhouse-user-query/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ authors.workspace = true
66
license.workspace = true
77

88
[dependencies]
9-
clickhouse = "0.12"
9+
clickhouse = "0.11.2"
1010
thiserror = "1.0"
1111
serde = { version = "1.0", features = ["derive"] }
1212

Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
use clickhouse_user_query::*;
2+
3+
fn main() {
4+
// Create a schema with string properties
5+
let schema = Schema::new(vec![
6+
Property::new("username".to_string(), false, PropertyType::String).unwrap(),
7+
Property::new("email".to_string(), false, PropertyType::String).unwrap(),
8+
Property::new("tags".to_string(), true, PropertyType::String).unwrap(),
9+
])
10+
.unwrap();
11+
12+
println!("=== Case Sensitivity Demo ===\n");
13+
14+
// Example 1: Case-sensitive string equality
15+
println!("1. Case-sensitive equality:");
16+
let query1 = QueryExpr::StringEqual {
17+
property: "username".to_string(),
18+
map_key: None,
19+
value: "JohnDoe".to_string(),
20+
case_sensitive: true,
21+
};
22+
let builder1 = UserDefinedQueryBuilder::new(&schema, &query1).unwrap();
23+
println!(" Query: {}", builder1.where_expr());
24+
println!(" -> Will match: 'JohnDoe'");
25+
println!(" -> Won't match: 'johndoe', 'JOHNDOE'\n");
26+
27+
// Example 2: Case-insensitive string equality
28+
println!("2. Case-insensitive equality:");
29+
let query2 = QueryExpr::StringEqual {
30+
property: "username".to_string(),
31+
map_key: None,
32+
value: "JohnDoe".to_string(),
33+
case_sensitive: false,
34+
};
35+
let builder2 = UserDefinedQueryBuilder::new(&schema, &query2).unwrap();
36+
println!(" Query: {}", builder2.where_expr());
37+
println!(" -> Will match: 'JohnDoe', 'johndoe', 'JOHNDOE', 'jOhNdOe'\n");
38+
39+
// Example 3: Case-sensitive regex matching
40+
println!("3. Case-sensitive regex:");
41+
let query3 = QueryExpr::StringMatchRegex {
42+
property: "email".to_string(),
43+
map_key: None,
44+
pattern: "^[A-Z].*@example\\.com$".to_string(),
45+
case_sensitive: true,
46+
};
47+
let builder3 = UserDefinedQueryBuilder::new(&schema, &query3).unwrap();
48+
println!(" Query: {}", builder3.where_expr());
49+
println!(" Pattern: ^[A-Z].*@example\\.com$");
50+
println!(" -> Will match: '[email protected]'");
51+
println!(" -> Won't match: '[email protected]'\n");
52+
53+
// Example 4: Case-insensitive regex matching
54+
println!("4. Case-insensitive regex:");
55+
let query4 = QueryExpr::StringMatchRegex {
56+
property: "email".to_string(),
57+
map_key: None,
58+
pattern: "admin|support".to_string(),
59+
case_sensitive: false,
60+
};
61+
let builder4 = UserDefinedQueryBuilder::new(&schema, &query4).unwrap();
62+
println!(" Query: {}", builder4.where_expr());
63+
println!(" Pattern: admin|support (with (?i) prefix)");
64+
println!(" -> Will match: '[email protected]', '[email protected]', '[email protected]'\n");
65+
66+
// Example 5: Case-insensitive IN clause
67+
println!("5. Case-insensitive IN clause:");
68+
let query5 = QueryExpr::StringIn {
69+
property: "username".to_string(),
70+
map_key: None,
71+
values: vec!["Admin".to_string(), "Support".to_string()],
72+
case_sensitive: false,
73+
};
74+
let builder5 = UserDefinedQueryBuilder::new(&schema, &query5).unwrap();
75+
println!(" Query: {}", builder5.where_expr());
76+
println!(" -> Will match: 'admin', 'ADMIN', 'support', 'SUPPORT'\n");
77+
78+
// Example 6: Complex query with mixed case sensitivity
79+
println!("6. Complex query with mixed sensitivity:");
80+
let query6 = QueryExpr::And {
81+
exprs: vec![
82+
QueryExpr::StringEqual {
83+
property: "username".to_string(),
84+
map_key: None,
85+
value: "Admin".to_string(),
86+
case_sensitive: false, // Case-insensitive username
87+
},
88+
QueryExpr::StringMatchRegex {
89+
property: "tags".to_string(),
90+
map_key: Some("role".to_string()),
91+
pattern: "^(Admin|Manager)$".to_string(),
92+
case_sensitive: true, // Case-sensitive role
93+
},
94+
],
95+
};
96+
let builder6 = UserDefinedQueryBuilder::new(&schema, &query6).unwrap();
97+
println!(" Query: {}", builder6.where_expr());
98+
println!(" -> Username matches 'admin' (any case)");
99+
println!(" -> Role must be exactly 'Admin' or 'Manager' (case-sensitive)");
100+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
use clickhouse_user_query::*;
2+
3+
fn main() {
4+
// Define a schema with properties that can be grouped by
5+
let schema = Schema::new(vec![
6+
Property::new("datacenter_id".to_string(), false, PropertyType::String)
7+
.unwrap()
8+
.with_group_by(true),
9+
Property::new("tags".to_string(), true, PropertyType::String)
10+
.unwrap()
11+
.with_group_by(true),
12+
Property::new("cpu_millicores".to_string(), false, PropertyType::Number)
13+
.unwrap()
14+
.with_group_by(false),
15+
])
16+
.unwrap();
17+
18+
// Example 1: Group by simple property
19+
let query_expr = QueryExpr::NumberGreater {
20+
property: "cpu_millicores".to_string(),
21+
map_key: None,
22+
value: 1000.0,
23+
};
24+
25+
let key_path = KeyPath::new("datacenter_id".to_string());
26+
let builder =
27+
UserDefinedQueryBuilder::new_with_group_by(&schema, &query_expr, Some(&key_path)).unwrap();
28+
29+
println!("Simple property GROUP BY:");
30+
println!("WHERE clause: {}", builder.where_expr());
31+
println!("GROUP BY clause: {:?}", builder.group_by_expr());
32+
println!();
33+
34+
// Example 2: Group by map property with key
35+
let key_path = KeyPath::with_map_key("tags".to_string(), "region".to_string());
36+
let builder =
37+
UserDefinedQueryBuilder::new_with_group_by(&schema, &query_expr, Some(&key_path)).unwrap();
38+
39+
println!("Map property with key GROUP BY:");
40+
println!("WHERE clause: {}", builder.where_expr());
41+
println!("GROUP BY clause: {:?}", builder.group_by_expr());
42+
println!();
43+
44+
// Example 3: No group by
45+
let builder = UserDefinedQueryBuilder::new_with_group_by(&schema, &query_expr, None).unwrap();
46+
47+
println!("No GROUP BY:");
48+
println!("WHERE clause: {}", builder.where_expr());
49+
println!("GROUP BY clause: {:?}", builder.group_by_expr());
50+
}

0 commit comments

Comments
 (0)