fix filters

This commit is contained in:
2026-02-16 06:45:55 -05:00
parent 4b8e424085
commit c8ada180ce

View File

@@ -1197,7 +1197,11 @@ handle_query :: proc(engine: ^dynamodb.Storage_Engine, request: ^HTTP_Request, r
defer dynamodb.query_result_destroy(&result)
// Apply FilterExpression
filtered_items := apply_filter_to_items(request.body, result.items, attr_names, attr_values)
filtered_items, filter_ok := apply_filter_to_items(request.body, result.items, attr_names, attr_values)
if !filter_ok {
make_error_response(response, .ValidationException, "Invalid FilterExpression")
return
}
scanned_count := len(result.items)
// Apply ProjectionExpression
@@ -1245,7 +1249,11 @@ handle_query :: proc(engine: ^dynamodb.Storage_Engine, request: ^HTTP_Request, r
defer dynamodb.query_result_destroy(&result)
// ---- Apply FilterExpression (post-query filter) ----
filtered_items := apply_filter_to_items(request.body, result.items, attr_names, attr_values)
filtered_items, filter_ok := apply_filter_to_items(request.body, result.items, attr_names, attr_values)
if !filter_ok {
make_error_response(response, .ValidationException, "Invalid FilterExpression")
return
}
scanned_count := len(result.items)
// ---- Apply ProjectionExpression ----
@@ -1364,9 +1372,15 @@ handle_scan :: proc(engine: ^dynamodb.Storage_Engine, request: ^HTTP_Request, re
}
defer dynamodb.scan_result_destroy(&result)
filtered_items := apply_filter_to_items(request.body, result.items, attr_names, attr_values)
// Apply FilterExpression
filtered_items, filter_ok := apply_filter_to_items(request.body, result.items, attr_names, attr_values)
if !filter_ok {
make_error_response(response, .ValidationException, "Invalid FilterExpression")
return
}
scanned_count := len(result.items)
// Apply ProjectionExpression
projection, has_proj := dynamodb.parse_projection_expression(request.body, attr_names)
defer { // This block just frees the cloned string and projection slice
if has_proj && len(projection) > 0 {
@@ -1410,8 +1424,12 @@ handle_scan :: proc(engine: ^dynamodb.Storage_Engine, request: ^HTTP_Request, re
}
defer dynamodb.scan_result_destroy(&result)
// ---- Apply FilterExpression ----
filtered_items := apply_filter_to_items(request.body, result.items, attr_names, attr_values)
// ---- Apply FilterExpression (post-scan filter) ----
filtered_items, filter_ok := apply_filter_to_items(request.body, result.items, attr_names, attr_values)
if !filter_ok {
make_error_response(response, .ValidationException, "Invalid FilterExpression")
return
}
scanned_count := len(result.items)
// ---- Apply ProjectionExpression ----
@@ -1459,15 +1477,15 @@ apply_filter_to_items :: proc(
items: []dynamodb.Item,
attr_names: Maybe(map[string]string),
attr_values: map[string]dynamodb.Attribute_Value,
) -> []dynamodb.Item {
) -> (filtered_items: []dynamodb.Item, ok: bool) {
filter_expr, has_filter := dynamodb.parse_filter_expression_string(request_body)
if !has_filter {
return items // no filter, return as-is
return items, true
}
filter_node, filter_ok := dynamodb.parse_filter_expression(filter_expr, attr_names, attr_values)
if !filter_ok || filter_node == nil {
return items // failed to parse, return unfiltered
return nil, false
}
defer {
dynamodb.filter_node_destroy(filter_node)
@@ -1481,7 +1499,7 @@ apply_filter_to_items :: proc(
}
}
return filtered[:]
return filtered[:], true
}
// ============================================================================