Commit 2338520
authored
fix (hql): fixing hql with inner traversals (#718)
<!-- greptile_comment -->
<h2>Greptile Overview</h2>
<h3>Greptile Summary</h3>
Optimized HQL compiler to handle inner traversals in WHERE clause
comparisons. Previously, comparing properties from different variables
(e.g., `_::{login}::EQ(toUser::{login})`) would generate inefficient
code with unnecessary `G::from_iter` calls. The fix introduces
`PropertyEq` and `PropertyNeq` operators that detect simple property
access patterns and generate direct `get_property()` calls instead.
**Key Changes:**
- Added `is_simple_property_traversal()` helper that identifies
property-only traversals (no graph navigation)
- Created `PropertyEq` and `PropertyNeq` boolean operators for optimized
property comparisons
- Updated Equal/NotEqual handling in `traversal_validation.rs` to use
optimized path for simple cases
- Added comprehensive test coverage with GitHub graph and document
embedding schemas
**Impact:**
- Enables queries like `CheckFollowsEdge` that filter edges by comparing
properties across variables
- Generates more efficient Rust code for common property comparison
patterns
- Maintains backward compatibility by falling back to full traversal
parsing for complex cases
<details><summary><h3>Important Files Changed</h3></summary>
File Analysis
| Filename | Score | Overview |
|----------|-------|----------|
| helix-db/src/helixc/analyzer/methods/traversal_validation.rs | 5/5 |
Added `is_simple_property_traversal` helper function and optimized
Equal/NotEqual operators to use PropertyEq/PropertyNeq for simple
property access, avoiding unnecessary `G::from_iter` calls |
| helix-db/src/helixc/generator/bool_ops.rs | 5/5 | Added PropertyEq and
PropertyNeq boolean operators that generate optimized property
comparison code using `get_property` instead of creating full traversals
|
| helix-db/src/helixc/generator/traversal_steps.rs | 5/5 | Updated
WhereRef Display implementation to handle new PropertyEq/PropertyNeq
boolean operators with unreachable guard for reserved properties |
| hql-tests/tests/user_test_2/queries.hx | 5/5 | New GitHub-style graph
queries including `CheckFollowsEdge` query that uses inner traversal
comparison pattern `_::{login}::EQ(toUser::{login})` |
</details>
</details>
<details><summary><h3>Sequence Diagram</h3></summary>
```mermaid
sequenceDiagram
participant User as HQL Query
participant Analyzer as traversal_validation.rs
participant BoolOps as bool_ops.rs
participant Generator as traversal_steps.rs
participant Output as Generated Rust Code
User->>Analyzer: WHERE(_::{login}::EQ(toUser::{login}))
Analyzer->>Analyzer: Validate BooleanOpType::Equal
Analyzer->>Analyzer: Check if RHS is ExpressionType::Traversal
Analyzer->>Analyzer: Call is_simple_property_traversal()
alt Simple property traversal
Analyzer->>Analyzer: Detected: toUser::{login}
Analyzer->>BoolOps: Create PropertyEq(var: "toUser", property: "login")
BoolOps->>Generator: Pass PropertyEq to WhereRef
Generator->>Output: Generate: toUser.get_property("login").map_or(false, |w| w == v)
else Complex traversal
Analyzer->>Analyzer: Parse full traversal with validate_traversal()
Analyzer->>BoolOps: Create Eq with GeneratedValue::Traversal
BoolOps->>Generator: Pass Eq with traversal
Generator->>Output: Generate: G::from_iter(...) comparison
end
```
</details>
<!-- greptile_other_comments_section -->
<!-- /greptile_comment -->File tree
10 files changed
+501
-41
lines changed- helix-db/src/helixc
- analyzer/methods
- generator
- hql-tests
- tests
- user_test_2
- user_test_3
10 files changed
+501
-41
lines changedLines changed: 96 additions & 35 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
5 | | - | |
| 5 | + | |
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
97 | 136 | | |
98 | 137 | | |
99 | 138 | | |
| |||
1170 | 1209 | | |
1171 | 1210 | | |
1172 | 1211 | | |
1173 | | - | |
| 1212 | + | |
| 1213 | + | |
| 1214 | + | |
| 1215 | + | |
| 1216 | + | |
| 1217 | + | |
| 1218 | + | |
| 1219 | + | |
| 1220 | + | |
| 1221 | + | |
| 1222 | + | |
| 1223 | + | |
| 1224 | + | |
| 1225 | + | |
| 1226 | + | |
| 1227 | + | |
| 1228 | + | |
| 1229 | + | |
| 1230 | + | |
| 1231 | + | |
| 1232 | + | |
| 1233 | + | |
| 1234 | + | |
| 1235 | + | |
| 1236 | + | |
| 1237 | + | |
1174 | 1238 | | |
1175 | 1239 | | |
1176 | 1240 | | |
| |||
1192 | 1256 | | |
1193 | 1257 | | |
1194 | 1258 | | |
1195 | | - | |
1196 | | - | |
| 1259 | + | |
| 1260 | + | |
| 1261 | + | |
| 1262 | + | |
| 1263 | + | |
| 1264 | + | |
| 1265 | + | |
| 1266 | + | |
| 1267 | + | |
| 1268 | + | |
| 1269 | + | |
| 1270 | + | |
| 1271 | + | |
| 1272 | + | |
| 1273 | + | |
| 1274 | + | |
| 1275 | + | |
| 1276 | + | |
1197 | 1277 | | |
1198 | 1278 | | |
1199 | 1279 | | |
| |||
1205 | 1285 | | |
1206 | 1286 | | |
1207 | 1287 | | |
1208 | | - | |
1209 | | - | |
1210 | | - | |
1211 | | - | |
| 1288 | + | |
| 1289 | + | |
| 1290 | + | |
| 1291 | + | |
| 1292 | + | |
1212 | 1293 | | |
1213 | | - | |
1214 | | - | |
1215 | | - | |
1216 | | - | |
1217 | | - | |
1218 | | - | |
1219 | | - | |
1220 | | - | |
| 1294 | + | |
| 1295 | + | |
1221 | 1296 | | |
1222 | 1297 | | |
1223 | 1298 | | |
| |||
1239 | 1314 | | |
1240 | 1315 | | |
1241 | 1316 | | |
1242 | | - | |
1243 | | - | |
1244 | | - | |
1245 | | - | |
1246 | | - | |
1247 | | - | |
1248 | | - | |
1249 | | - | |
1250 | | - | |
1251 | | - | |
1252 | | - | |
1253 | | - | |
1254 | | - | |
1255 | | - | |
1256 | | - | |
1257 | 1317 | | |
1258 | 1318 | | |
1259 | | - | |
1260 | | - | |
1261 | | - | |
1262 | | - | |
| 1319 | + | |
| 1320 | + | |
| 1321 | + | |
| 1322 | + | |
| 1323 | + | |
1263 | 1324 | | |
1264 | 1325 | | |
1265 | 1326 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
| 21 | + | |
| 22 | + | |
21 | 23 | | |
22 | 24 | | |
23 | 25 | | |
| |||
30 | 32 | | |
31 | 33 | | |
32 | 34 | | |
| 35 | + | |
| 36 | + | |
33 | 37 | | |
34 | 38 | | |
35 | 39 | | |
| |||
100 | 104 | | |
101 | 105 | | |
102 | 106 | | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
103 | 129 | | |
104 | 130 | | |
105 | 131 | | |
| |||
241 | 267 | | |
242 | 268 | | |
243 | 269 | | |
| 270 | + | |
| 271 | + | |
244 | 272 | | |
245 | 273 | | |
246 | 274 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
476 | 476 | | |
477 | 477 | | |
478 | 478 | | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
479 | 482 | | |
480 | 483 | | |
481 | 484 | | |
| |||
501 | 504 | | |
502 | 505 | | |
503 | 506 | | |
| 507 | + | |
| 508 | + | |
504 | 509 | | |
505 | 510 | | |
506 | 511 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
11 | 11 | | |
12 | 12 | | |
13 | 13 | | |
14 | | - | |
15 | | - | |
| 14 | + | |
| 15 | + | |
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
20 | 20 | | |
21 | 21 | | |
22 | 22 | | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
0 commit comments