fix filters
This commit is contained in:
36
main.odin
36
main.odin
@@ -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
|
||||
}
|
||||
|
||||
// ============================================================================
|
||||
|
||||
Reference in New Issue
Block a user