From 13b1ddecad12bfc8667c06108f9f712a1aadbfbe Mon Sep 17 00:00:00 2001 From: kosay Date: Tue, 7 Jan 2025 05:55:09 +0900 Subject: [PATCH] fix(firestore): correct cursor flipping in limit_to_last (#28137) --- .../lib/google/cloud/firestore/query.rb | 4 +- .../collection_reference/query_test.rb | 40 +++++++++++++++++++ 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/google-cloud-firestore/lib/google/cloud/firestore/query.rb b/google-cloud-firestore/lib/google/cloud/firestore/query.rb index f881540fc815..9e0fd6f2958d 100644 --- a/google-cloud-firestore/lib/google/cloud/firestore/query.rb +++ b/google-cloud-firestore/lib/google/cloud/firestore/query.rb @@ -493,12 +493,12 @@ def limit_to_last num new_start_at = new_query.end_at.dup if new_end_at new_end_at.before = !new_end_at.before - new_query.end_at = new_end_at end if new_start_at new_start_at.before = !new_start_at.before - new_query.start_at = new_start_at end + new_query.end_at = new_end_at + new_query.start_at = new_start_at end new_query.limit = Google::Protobuf::Int32Value.new value: num diff --git a/google-cloud-firestore/test/google/cloud/firestore/collection_reference/query_test.rb b/google-cloud-firestore/test/google/cloud/firestore/collection_reference/query_test.rb index c77989428139..7cd652114740 100644 --- a/google-cloud-firestore/test/google/cloud/firestore/collection_reference/query_test.rb +++ b/google-cloud-firestore/test/google/cloud/firestore/collection_reference/query_test.rb @@ -154,6 +154,46 @@ assert_results_enum results_enum end + it "runs a query with order, start_at, and limit_to_last" do + expected_query = Google::Cloud::Firestore::V1::StructuredQuery.new( + end_at: Google::Cloud::Firestore::V1::Cursor.new(values: [Google::Cloud::Firestore::Convert.raw_to_value("foo")], before: false), + from: [Google::Cloud::Firestore::V1::StructuredQuery::CollectionSelector.new(collection_id: "messages")], + order_by: [ + Google::Cloud::Firestore::V1::StructuredQuery::Order.new( + field: Google::Cloud::Firestore::V1::StructuredQuery::FieldReference.new(field_path: "name"), + direction: :DESCENDING), + Google::Cloud::Firestore::V1::StructuredQuery::Order.new( + field: Google::Cloud::Firestore::V1::StructuredQuery::FieldReference.new(field_path: "__name__"), + direction: :ASCENDING)], + limit: Google::Protobuf::Int32Value.new(value: 2) + ) + firestore_mock.expect :run_query, query_results_descending_enum, run_query_args(expected_query, parent: collection.parent_path) + + results_enum = collection.order(:name).order(firestore.document_id, :desc).start_at(:foo).limit_to_last(2).get + + assert_results_enum results_enum + end + + it "runs a query with order, end_at, and limit_to_last" do + expected_query = Google::Cloud::Firestore::V1::StructuredQuery.new( + start_at: Google::Cloud::Firestore::V1::Cursor.new(values: [Google::Cloud::Firestore::Convert.raw_to_value("bar")], before: true), + from: [Google::Cloud::Firestore::V1::StructuredQuery::CollectionSelector.new(collection_id: "messages")], + order_by: [ + Google::Cloud::Firestore::V1::StructuredQuery::Order.new( + field: Google::Cloud::Firestore::V1::StructuredQuery::FieldReference.new(field_path: "name"), + direction: :DESCENDING), + Google::Cloud::Firestore::V1::StructuredQuery::Order.new( + field: Google::Cloud::Firestore::V1::StructuredQuery::FieldReference.new(field_path: "__name__"), + direction: :ASCENDING)], + limit: Google::Protobuf::Int32Value.new(value: 2) + ) + firestore_mock.expect :run_query, query_results_descending_enum, run_query_args(expected_query, parent: collection.parent_path) + + results_enum = collection.order(:name).order(firestore.document_id, :desc).end_at(:bar).limit_to_last(2).get + + assert_results_enum results_enum + end + it "updates limit but does not reflip cursors when calling limit_to_last more than once" do expected_query = Google::Cloud::Firestore::V1::StructuredQuery.new( start_at: Google::Cloud::Firestore::V1::Cursor.new(values: [Google::Cloud::Firestore::Convert.raw_to_value("bar")], before: true),