@@ -65,10 +65,10 @@ TEST(QueryTest, Constructor) {
65
65
const ResourcePath path{" rooms" , " Firestore" , " messages" , " 0001" };
66
66
Query query (path);
67
67
68
- ASSERT_EQ (1 , query.order_bys ().size ());
68
+ ASSERT_EQ (1 , query.normalized_order_bys ().size ());
69
69
EXPECT_EQ (FieldPath::kDocumentKeyPath ,
70
- query.order_bys ()[0 ].field ().CanonicalString ());
71
- EXPECT_EQ (true , query.order_bys ()[0 ].ascending ());
70
+ query.normalized_order_bys ()[0 ].field ().CanonicalString ());
71
+ EXPECT_EQ (true , query.normalized_order_bys ()[0 ].ascending ());
72
72
73
73
ASSERT_EQ (0 , query.explicit_order_bys ().size ());
74
74
}
@@ -78,12 +78,13 @@ TEST(QueryTest, OrderBy) {
78
78
.AddingOrderBy (testutil::OrderBy (Field (" length" ),
79
79
Direction::Descending));
80
80
81
- ASSERT_EQ (2 , query.order_bys ().size ());
82
- EXPECT_EQ (" length" , query.order_bys ()[0 ].field ().CanonicalString ());
83
- EXPECT_EQ (false , query.order_bys ()[0 ].ascending ());
81
+ ASSERT_EQ (2 , query.normalized_order_bys ().size ());
82
+ EXPECT_EQ (" length" ,
83
+ query.normalized_order_bys ()[0 ].field ().CanonicalString ());
84
+ EXPECT_EQ (false , query.normalized_order_bys ()[0 ].ascending ());
84
85
EXPECT_EQ (FieldPath::kDocumentKeyPath ,
85
- query.order_bys ()[1 ].field ().CanonicalString ());
86
- EXPECT_EQ (false , query.order_bys ()[1 ].ascending ());
86
+ query.normalized_order_bys ()[1 ].field ().CanonicalString ());
87
+ EXPECT_EQ (false , query.normalized_order_bys ()[1 ].ascending ());
87
88
88
89
ASSERT_EQ (1 , query.explicit_order_bys ().size ());
89
90
EXPECT_EQ (" length" , query.explicit_order_bys ()[0 ].field ().CanonicalString ());
@@ -770,64 +771,64 @@ TEST(QueryTest, UniqueIds) {
770
771
TEST (QueryTest, ImplicitOrderBy) {
771
772
auto base_query = testutil::Query (" foo" );
772
773
// Default is ascending
773
- ASSERT_EQ (base_query.order_bys (),
774
+ ASSERT_EQ (base_query.normalized_order_bys (),
774
775
std::vector<core::OrderBy>{
775
776
testutil::OrderBy (FieldPath::kDocumentKeyPath , " asc" )});
776
777
777
778
// Explicit key ordering is respected
778
779
ASSERT_EQ (
779
780
base_query
780
781
.AddingOrderBy (testutil::OrderBy (FieldPath::kDocumentKeyPath , " asc" ))
781
- .order_bys (),
782
+ .normalized_order_bys (),
782
783
std::vector<OrderBy>{
783
784
testutil::OrderBy (FieldPath::kDocumentKeyPath , " asc" )});
784
785
ASSERT_EQ (
785
786
base_query
786
787
.AddingOrderBy (testutil::OrderBy (FieldPath::kDocumentKeyPath , " desc" ))
787
- .order_bys (),
788
+ .normalized_order_bys (),
788
789
std::vector<OrderBy>{
789
790
testutil::OrderBy (FieldPath::kDocumentKeyPath , " desc" )});
790
791
791
792
ASSERT_EQ (
792
793
base_query.AddingOrderBy (testutil::OrderBy (" foo" , " asc" ))
793
794
.AddingOrderBy (testutil::OrderBy (FieldPath::kDocumentKeyPath , " asc" ))
794
- .order_bys (),
795
+ .normalized_order_bys (),
795
796
(std::vector<OrderBy>{
796
797
testutil::OrderBy (" foo" , " asc" ),
797
798
testutil::OrderBy (FieldPath::kDocumentKeyPath , " asc" )}));
798
799
799
800
ASSERT_EQ (
800
801
base_query.AddingOrderBy (testutil::OrderBy (" foo" , " asc" ))
801
802
.AddingOrderBy (testutil::OrderBy (FieldPath::kDocumentKeyPath , " desc" ))
802
- .order_bys (),
803
+ .normalized_order_bys (),
803
804
(std::vector<OrderBy>{
804
805
testutil::OrderBy (" foo" , " asc" ),
805
806
testutil::OrderBy (FieldPath::kDocumentKeyPath , " desc" )}));
806
807
807
808
// Inequality filters add order bys
808
- ASSERT_EQ (
809
- base_query. AddingFilter ( testutil::Filter ( " foo " , " < " , 5 )). order_bys (),
810
- (std::vector<OrderBy>{
811
- testutil::OrderBy (" foo" , " asc" ),
812
- testutil::OrderBy (FieldPath::kDocumentKeyPath , " asc" )}));
809
+ ASSERT_EQ (base_query. AddingFilter ( testutil::Filter ( " foo " , " < " , 5 ))
810
+ . normalized_order_bys (),
811
+ (std::vector<OrderBy>{
812
+ testutil::OrderBy (" foo" , " asc" ),
813
+ testutil::OrderBy (FieldPath::kDocumentKeyPath , " asc" )}));
813
814
814
815
// Descending order by applies to implicit key ordering
815
- ASSERT_EQ (
816
- base_query. AddingOrderBy ( testutil::OrderBy ( " foo " , " desc " )). order_bys (),
817
- (std::vector<OrderBy>{
818
- testutil::OrderBy (" foo" , " desc" ),
819
- testutil::OrderBy (FieldPath::kDocumentKeyPath , " desc" )}));
816
+ ASSERT_EQ (base_query. AddingOrderBy ( testutil::OrderBy ( " foo " , " desc " ))
817
+ . normalized_order_bys (),
818
+ (std::vector<OrderBy>{
819
+ testutil::OrderBy (" foo" , " desc" ),
820
+ testutil::OrderBy (FieldPath::kDocumentKeyPath , " desc" )}));
820
821
ASSERT_EQ (base_query.AddingOrderBy (testutil::OrderBy (" foo" , " asc" ))
821
822
.AddingOrderBy (testutil::OrderBy (" bar" , " desc" ))
822
- .order_bys (),
823
+ .normalized_order_bys (),
823
824
(std::vector<OrderBy>{
824
825
testutil::OrderBy (" foo" , " asc" ),
825
826
testutil::OrderBy (" bar" , " desc" ),
826
827
testutil::OrderBy (FieldPath::kDocumentKeyPath , " desc" ),
827
828
}));
828
829
ASSERT_EQ (base_query.AddingOrderBy (testutil::OrderBy (" foo" , " desc" ))
829
830
.AddingOrderBy (testutil::OrderBy (" bar" , " asc" ))
830
- .order_bys (),
831
+ .normalized_order_bys (),
831
832
(std::vector<OrderBy>{
832
833
testutil::OrderBy (" foo" , " desc" ),
833
834
testutil::OrderBy (" bar" , " asc" ),
@@ -917,6 +918,58 @@ TEST(QueryTest, MatchesAllDocuments) {
917
918
EXPECT_FALSE (query.MatchesAllDocuments ());
918
919
}
919
920
921
+ TEST (QueryTest, OrderByForAggregateAndNonAggregate) {
922
+ auto col = testutil::Query (" coll" );
923
+
924
+ // Build two identical queries
925
+ auto query1 = col.AddingFilter (testutil::Filter (" foo" , " >" , 1 ));
926
+ auto query2 = col.AddingFilter (testutil::Filter (" foo" , " >" , 1 ));
927
+
928
+ // Compute an aggregate and non-aggregate target from the queries
929
+ auto aggregateTarget = query1.ToAggregateTarget ();
930
+ auto target = query2.ToTarget ();
931
+
932
+ EXPECT_EQ (aggregateTarget.order_bys ().size (), 0 );
933
+
934
+ ASSERT_EQ (target.order_bys ().size (), 2 );
935
+ EXPECT_EQ (target.order_bys ()[0 ].direction (), Direction::Ascending);
936
+ EXPECT_EQ (target.order_bys ()[0 ].field ().CanonicalString (), " foo" );
937
+ EXPECT_EQ (target.order_bys ()[1 ].direction (), Direction::Ascending);
938
+ EXPECT_EQ (target.order_bys ()[1 ].field ().CanonicalString (), " __name__" );
939
+ }
940
+
941
+ TEST (QueryTest, GeneratedOrderBysNotAffectedByPreviouslyMemoizedTargets) {
942
+ auto col = testutil::Query (" coll" );
943
+
944
+ // Build two identical queries
945
+ auto query1 = col.AddingFilter (testutil::Filter (" foo" , " >" , 1 ));
946
+ auto query2 = col.AddingFilter (testutil::Filter (" foo" , " >" , 1 ));
947
+
948
+ // query1 - first to aggregate target, then to non-aggregate target
949
+ auto aggregateTarget1 = query1.ToAggregateTarget ();
950
+ auto target1 = query1.ToTarget ();
951
+
952
+ // query2 - first to aggregate target, then to non-aggregate target
953
+ auto target2 = query2.ToTarget ();
954
+ auto aggregateTarget2 = query2.ToAggregateTarget ();
955
+
956
+ EXPECT_EQ (aggregateTarget1.order_bys ().size (), 0 );
957
+
958
+ EXPECT_EQ (aggregateTarget2.order_bys ().size (), 0 );
959
+
960
+ ASSERT_EQ (target1.order_bys ().size (), 2 );
961
+ EXPECT_EQ (target1.order_bys ()[0 ].direction (), Direction::Ascending);
962
+ EXPECT_EQ (target1.order_bys ()[0 ].field ().CanonicalString (), " foo" );
963
+ EXPECT_EQ (target1.order_bys ()[1 ].direction (), Direction::Ascending);
964
+ EXPECT_EQ (target1.order_bys ()[1 ].field ().CanonicalString (), " __name__" );
965
+
966
+ ASSERT_EQ (target2.order_bys ().size (), 2 );
967
+ EXPECT_EQ (target2.order_bys ()[0 ].direction (), Direction::Ascending);
968
+ EXPECT_EQ (target2.order_bys ()[0 ].field ().CanonicalString (), " foo" );
969
+ EXPECT_EQ (target2.order_bys ()[1 ].direction (), Direction::Ascending);
970
+ EXPECT_EQ (target2.order_bys ()[1 ].field ().CanonicalString (), " __name__" );
971
+ }
972
+
920
973
} // namespace core
921
974
} // namespace firestore
922
975
} // namespace firebase
0 commit comments