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)
|
defer dynamodb.query_result_destroy(&result)
|
||||||
|
|
||||||
// Apply FilterExpression
|
// 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)
|
scanned_count := len(result.items)
|
||||||
|
|
||||||
// Apply ProjectionExpression
|
// Apply ProjectionExpression
|
||||||
@@ -1245,7 +1249,11 @@ handle_query :: proc(engine: ^dynamodb.Storage_Engine, request: ^HTTP_Request, r
|
|||||||
defer dynamodb.query_result_destroy(&result)
|
defer dynamodb.query_result_destroy(&result)
|
||||||
|
|
||||||
// ---- Apply FilterExpression (post-query filter) ----
|
// ---- 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)
|
scanned_count := len(result.items)
|
||||||
|
|
||||||
// ---- Apply ProjectionExpression ----
|
// ---- Apply ProjectionExpression ----
|
||||||
@@ -1364,9 +1372,15 @@ handle_scan :: proc(engine: ^dynamodb.Storage_Engine, request: ^HTTP_Request, re
|
|||||||
}
|
}
|
||||||
defer dynamodb.scan_result_destroy(&result)
|
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)
|
scanned_count := len(result.items)
|
||||||
|
|
||||||
|
// Apply ProjectionExpression
|
||||||
projection, has_proj := dynamodb.parse_projection_expression(request.body, attr_names)
|
projection, has_proj := dynamodb.parse_projection_expression(request.body, attr_names)
|
||||||
defer { // This block just frees the cloned string and projection slice
|
defer { // This block just frees the cloned string and projection slice
|
||||||
if has_proj && len(projection) > 0 {
|
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)
|
defer dynamodb.scan_result_destroy(&result)
|
||||||
|
|
||||||
// ---- Apply FilterExpression ----
|
// ---- Apply FilterExpression (post-scan 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)
|
scanned_count := len(result.items)
|
||||||
|
|
||||||
// ---- Apply ProjectionExpression ----
|
// ---- Apply ProjectionExpression ----
|
||||||
@@ -1459,15 +1477,15 @@ apply_filter_to_items :: proc(
|
|||||||
items: []dynamodb.Item,
|
items: []dynamodb.Item,
|
||||||
attr_names: Maybe(map[string]string),
|
attr_names: Maybe(map[string]string),
|
||||||
attr_values: map[string]dynamodb.Attribute_Value,
|
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)
|
filter_expr, has_filter := dynamodb.parse_filter_expression_string(request_body)
|
||||||
if !has_filter {
|
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)
|
filter_node, filter_ok := dynamodb.parse_filter_expression(filter_expr, attr_names, attr_values)
|
||||||
if !filter_ok || filter_node == nil {
|
if !filter_ok || filter_node == nil {
|
||||||
return items // failed to parse, return unfiltered
|
return nil, false
|
||||||
}
|
}
|
||||||
defer {
|
defer {
|
||||||
dynamodb.filter_node_destroy(filter_node)
|
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