Skip to content

Commit e74dddc

Browse files
committed
feat: Add optimizer hint syntax to set a priority in request options
1 parent 05c1980 commit e74dddc

File tree

2 files changed

+38
-4
lines changed

2 files changed

+38
-4
lines changed

lib/arel/visitors/spanner.rb

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -91,10 +91,17 @@ def visit_Arel_Nodes_OptimizerHints o, collector
9191
StalenessHint.new min_read_timestamp: time
9292
next
9393
end
94-
next unless v.start_with? "read_timestamp:"
95-
time = Time.xmlschema v.delete_prefix("read_timestamp:")
96-
collector.hints[:staleness] =
97-
StalenessHint.new read_timestamp: time
94+
if v.start_with? "read_timestamp:"
95+
time = Time.xmlschema v.delete_prefix("read_timestamp:")
96+
collector.hints[:staleness] =
97+
StalenessHint.new read_timestamp: time
98+
next
99+
end
100+
next unless v.start_with? "priority:"
101+
priority = v.delete_prefix("priority:").strip.to_sym
102+
collector.hints[:request_options] ||=
103+
Google::Cloud::Spanner::V1::RequestOptions.new
104+
collector.hints[:request_options].priority = priority
98105
end
99106
collector
100107
end

test/activerecord_spanner_mock_server/spanner_active_record_with_mock_server_test.rb

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,6 +1067,19 @@ def test_join_hint
10671067
assert_equal sql, execute_sql_request.sql
10681068
end
10691069

1070+
def test_query_priority_hint
1071+
sql = "SELECT `singers`.* FROM `singers`"
1072+
@mock.put_statement_result sql, MockServerTests::create_random_singers_result(4)
1073+
Singer.optimizer_hints("priority: PRIORITY_LOW").all.each do |singer|
1074+
refute_nil singer.id, "singer.id should not be nil"
1075+
end
1076+
select_requests = @mock.requests.select { |req| req.is_a?(Google::Cloud::Spanner::V1::ExecuteSqlRequest) && req.sql == sql }
1077+
select_requests.each do |request|
1078+
assert request.request_options
1079+
assert_equal :PRIORITY_LOW, request.request_options.priority
1080+
end
1081+
end
1082+
10701083
def test_query_annotate_request_tag
10711084
sql = "SELECT `singers`.* FROM `singers` /* request_tag: selecting all singers */"
10721085
@mock.put_statement_result sql, MockServerTests::create_random_singers_result(4)
@@ -1080,6 +1093,20 @@ def test_query_annotate_request_tag
10801093
end
10811094
end
10821095

1096+
def test_query_priority_hint_and_request_tag
1097+
sql = "SELECT `singers`.* FROM `singers` /* request_tag: selecting all singers */"
1098+
@mock.put_statement_result sql, MockServerTests::create_random_singers_result(4)
1099+
Singer.annotate("request_tag: selecting all singers").optimizer_hints("priority: PRIORITY_LOW").all.each do |singer|
1100+
refute_nil singer.id, "singer.id should not be nil"
1101+
end
1102+
select_requests = @mock.requests.select { |req| req.is_a?(Google::Cloud::Spanner::V1::ExecuteSqlRequest) && req.sql == sql }
1103+
select_requests.each do |request|
1104+
assert request.request_options
1105+
assert_equal :PRIORITY_LOW, request.request_options.priority
1106+
assert_equal "selecting all singers", request.request_options.request_tag
1107+
end
1108+
end
1109+
10831110
def test_query_annotate_transaction_tag
10841111
sql = "SELECT `singers`.* FROM `singers` /* transaction_tag: selecting all singers */"
10851112
@mock.put_statement_result sql, MockServerTests::create_random_singers_result(4)

0 commit comments

Comments
 (0)